ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/socket/image.C
(Generate patch)

Comparing deliantra/server/socket/image.C (file contents):
Revision 1.1 by elmex, Sun Aug 13 17:16:05 2006 UTC vs.
Revision 1.9 by root, Thu Dec 14 01:59:10 2006 UTC

1/*
2 * static char *rcsid_init_c =
3 * "$Id: image.C,v 1.1 2006/08/13 17:16:05 elmex Exp $";
4 */
5
6/* 1/*
7 CrossFire, A Multiplayer game for X-windows 2 CrossFire, A Multiplayer game for X-windows
8 3
9 Copyright (C) 2001 Mark Wedel 4 Copyright (C) 2001 Mark Wedel
10 Copyright (C) 1992 Frank Tore Johansen 5 Copyright (C) 1992 Frank Tore Johansen
21 16
22 You should have received a copy of the GNU General Public License 17 You should have received a copy of the GNU General Public License
23 along with this program; if not, write to the Free Software 18 along with this program; if not, write to the Free Software
24 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
25 20
26 The author can be reached via e-mail to crossfire-devel@real-time.com 21 The author can be reached via e-mail to <crossfire@schmorp.de>
27*/ 22*/
28 23
29/** \file 24/** \file
30 * Image related communication 25 * Image related communication
31 * 26 *
45#include <loader.h> 40#include <loader.h>
46 41
47#define MAX_FACE_SETS 20 /**< Maximum number of image sets the program will handle */ 42#define MAX_FACE_SETS 20 /**< Maximum number of image sets the program will handle */
48 43
49/** Information about one image */ 44/** Information about one image */
50typedef struct FaceInfo { 45typedef struct FaceInfo
46{
47
51 uint8 *data; /**< image data */ 48 uint8 *data; /**< image data */
49
52 uint16 datalen; /**< length of the xpm data */ 50 uint16 datalen; /**< length of the xpm data */
51
53 uint32 checksum; /**< Checksum of face data */ 52 uint32 checksum; /**< Checksum of face data */
54} FaceInfo; 53} FaceInfo;
55 54
56/** Information about one face set */ 55/** Information about one face set */
57typedef struct { 56typedef struct
57{
58
58 char *prefix; /**< */ 59 char *prefix; /**< */
59 char *fullname; 60 char *fullname;
61
60 uint8 fallback; /**< faceset to use when an image is not found in this faceset */ 62 uint8 fallback; /**< faceset to use when an image is not found in this faceset */
61 char *size; 63 char *size;
62 char *extension; 64 char *extension;
63 char *comment; 65 char *comment;
66
64 FaceInfo *faces; /**< images in this faceset */ 67 FaceInfo *faces; /**< images in this faceset */
65} FaceSets; 68} FaceSets;
66 69
67static FaceSets facesets[MAX_FACE_SETS]; /**< All facesets */ 70static FaceSets facesets[MAX_FACE_SETS]; /**< All facesets */
68 71
69/** 72/**
70 * Checks specified faceset is valid 73 * Checks specified faceset is valid
71 * \param fsn faceset number 74 * \param fsn faceset number
72 */ 75 */
76int
73int is_valid_faceset(int fsn) 77is_valid_faceset (int fsn)
74{ 78{
75 if (fsn >=0 && fsn < MAX_FACE_SETS && facesets[fsn].prefix) return TRUE; 79 if (fsn >= 0 && fsn < MAX_FACE_SETS && facesets[fsn].prefix)
80 return TRUE;
76 return FALSE; 81 return FALSE;
77} 82}
78 83
79/** 84/**
80 * Frees all faceset information 85 * Frees all faceset information
81 */ 86 */
87void
82void free_socket_images(void) 88free_socket_images (void)
83{ 89{
84 int num,q; 90 int num, q;
85 91
86 for(num=0;num<MAX_FACE_SETS; num++) { 92 for (num = 0; num < MAX_FACE_SETS; num++)
93 {
87 if (facesets[num].prefix) { 94 if (facesets[num].prefix)
95 {
88 for (q=0; q<nrofpixmaps; q++) 96 for (q = 0; q < nrofpixmaps; q++)
89 if (facesets[num].faces[q].data) free(facesets[num].faces[q].data); 97 if (facesets[num].faces[q].data)
98 free (facesets[num].faces[q].data);
90 free(facesets[num].prefix); 99 free (facesets[num].prefix);
91 free(facesets[num].fullname); 100 free (facesets[num].fullname);
92 free(facesets[num].size); 101 free (facesets[num].size);
93 free(facesets[num].extension); 102 free (facesets[num].extension);
94 free(facesets[num].comment); 103 free (facesets[num].comment);
95 free(facesets[num].faces); 104 free (facesets[num].faces);
96 } 105 }
97 } 106 }
98} 107}
99 108
100/** 109/**
101 * This returns the set we will actually use when sending 110 * This returns the set we will actually use when sending
107 * 116 *
108 * \param faceset faceset to check 117 * \param faceset faceset to check
109 * \param imageno image number 118 * \param imageno image number
110 * 119 *
111 */ 120 */
121static int
112static int get_face_fallback(int faceset, int imageno) 122get_face_fallback (int faceset, int imageno)
113{ 123{
114 /* faceset 0 is supposed to have every image, so just return. Doing 124 /* faceset 0 is supposed to have every image, so just return. Doing
115 * so also prevents infinite loops in the case if it not having 125 * so also prevents infinite loops in the case if it not having
116 * the face, but in that case, we are likely to crash when we try 126 * the face, but in that case, we are likely to crash when we try
117 * to access the data, but that is probably preferable to an infinite 127 * to access the data, but that is probably preferable to an infinite
118 * loop. 128 * loop.
119 */ 129 */
120 if (faceset==0) return 0; 130 if (faceset == 0)
131 return 0;
121 132
122 if (!facesets[faceset].prefix) { 133 if (!facesets[faceset].prefix)
134 {
123 LOG(llevError,"get_face_fallback called with unused set (%d)?\n", faceset); 135 LOG (llevError, "get_face_fallback called with unused set (%d)?\n", faceset);
124 return 0; /* use default set */ 136 return 0; /* use default set */
125 } 137 }
126 if (facesets[faceset].faces[imageno].data) return faceset; 138 if (facesets[faceset].faces[imageno].data)
139 return faceset;
127 return get_face_fallback(facesets[faceset].fallback, imageno); 140 return get_face_fallback (facesets[faceset].fallback, imageno);
128} 141}
129 142
130/** 143/**
131 * Checks fallback are correctly defined. 144 * Checks fallback are correctly defined.
132 * This is a simple recursive function that makes sure the fallbacks 145 * This is a simple recursive function that makes sure the fallbacks
133 * are all proper (eg, the fall back to defined sets, and also 146 * are all proper (eg, the fall back to defined sets, and also
134 * eventually fall back to 0). At the top level, togo is set to MAX_FACE_SETS, 147 * eventually fall back to 0). At the top level, togo is set to MAX_FACE_SETS,
135 * if togo gets to zero, it means we have a loop. 148 * if togo gets to zero, it means we have a loop.
136 * This is only run when we first load the facesets. 149 * This is only run when we first load the facesets.
137 */ 150 */
151static void
138static void check_faceset_fallback(int faceset, int togo) 152check_faceset_fallback (int faceset, int togo)
139{ 153{
140 int fallback = facesets[faceset].fallback; 154 int fallback = facesets[faceset].fallback;
141 155
142 /* proper case - falls back to base set */ 156 /* proper case - falls back to base set */
143 if (fallback == 0) return; 157 if (fallback == 0)
158 return;
144 159
145 if (!facesets[fallback].prefix) { 160 if (!facesets[fallback].prefix)
161 {
146 LOG(llevError,"Face set %d falls to non set faceset %d\n", faceset, fallback); 162 LOG (llevError, "Face set %d falls to non set faceset %d\n", faceset, fallback);
147 abort(); 163 abort ();
148 } 164 }
149 togo--; 165 togo--;
150 if (togo == 0) { 166 if (togo == 0)
167 {
151 LOG(llevError,"Infinite loop found in facesets. aborting.\n"); 168 LOG (llevError, "Infinite loop found in facesets. aborting.\n");
152 abort(); 169 abort ();
153 } 170 }
154 check_faceset_fallback(fallback, togo); 171 check_faceset_fallback (fallback, togo);
155} 172}
156 173
157#define MAX_IMAGE_SIZE 10000 174#define MAX_IMAGE_SIZE 10000
158 175
159/** 176/**
171 * The server itself does not care what the image data is - to the server, 188 * The server itself does not care what the image data is - to the server,
172 * it is just data it needs to allocate. As such, the code is written 189 * it is just data it needs to allocate. As such, the code is written
173 * to do such. 190 * to do such.
174 */ 191 */
175 192
193void
176void read_client_images(void) 194read_client_images (void)
177{ 195{
178 char filename[400]; 196 char filename[400];
179 char buf[HUGE_BUF]; 197 char buf[HUGE_BUF];
180 char *cp, *cps[7]; 198 char *cp, *cps[7];
181 FILE *infile; 199 FILE *infile;
182 int num,len,compressed, fileno,i, badline; 200 int num, len, compressed, fileno, i, badline;
183 201
184 memset(facesets, 0, sizeof(facesets)); 202 memset (facesets, 0, sizeof (facesets));
185 sprintf(filename,"%s/image_info",settings.datadir); 203 sprintf (filename, "%s/image_info", settings.datadir);
186 if ((infile=open_and_uncompress(filename, 0, &compressed))==NULL) { 204 if ((infile = open_and_uncompress (filename, 0, &compressed)) == NULL)
205 {
187 LOG(llevError,"Unable to open %s\n", filename); 206 LOG (llevError, "Unable to open %s\n", filename);
188 abort(); 207 abort ();
189 } 208 }
190 while (fgets(buf, HUGE_BUF-1, infile)!=NULL) { 209 while (fgets (buf, HUGE_BUF - 1, infile) != NULL)
191 badline=0; 210 {
211 badline = 0;
192 212
193 if (buf[0] == '#') continue; 213 if (buf[0] == '#')
214 continue;
194 if (!(cps[0] = strtok(buf, ":"))) badline=1; 215 if (!(cps[0] = strtok (buf, ":")))
195 for (i=1; i<7; i++) { 216 badline = 1;
217 for (i = 1; i < 7; i++)
218 {
196 if (!(cps[i] = strtok(NULL, ":"))) badline=1; 219 if (!(cps[i] = strtok (NULL, ":")))
197 } 220 badline = 1;
198 if (badline) { 221 }
222 if (badline)
223 {
199 LOG(llevError,"Bad line in image_info file, ignoring line:\n %s", buf); 224 LOG (llevError, "Bad line in image_info file, ignoring line:\n %s", buf);
200 } else { 225 }
226 else
227 {
201 len = atoi(cps[0]); 228 len = atoi (cps[0]);
202 if (len >=MAX_FACE_SETS) { 229 if (len >= MAX_FACE_SETS)
230 {
203 LOG(llevError,"To high a setnum in image_info file: %d > %d\n", 231 LOG (llevError, "To high a setnum in image_info file: %d > %d\n", len, MAX_FACE_SETS);
204 len, MAX_FACE_SETS); 232 abort ();
205 abort(); 233 }
206 }
207 facesets[len].prefix = strdup_local(cps[1]); 234 facesets[len].prefix = strdup_local (cps[1]);
208 facesets[len].fullname = strdup_local(cps[2]); 235 facesets[len].fullname = strdup_local (cps[2]);
209 facesets[len].fallback = atoi(cps[3]); 236 facesets[len].fallback = atoi (cps[3]);
210 facesets[len].size = strdup_local(cps[4]); 237 facesets[len].size = strdup_local (cps[4]);
211 facesets[len].extension = strdup_local(cps[5]); 238 facesets[len].extension = strdup_local (cps[5]);
212 facesets[len].comment = strdup_local(cps[6]); 239 facesets[len].comment = strdup_local (cps[6]);
213 } 240 }
214 } 241 }
215 close_and_delete(infile,compressed); 242 close_and_delete (infile, compressed);
216 for (i=0; i<MAX_FACE_SETS; i++) { 243 for (i = 0; i < MAX_FACE_SETS; i++)
217 if (facesets[i].prefix) check_faceset_fallback(i, MAX_FACE_SETS);
218 } 244 {
245 if (facesets[i].prefix)
246 check_faceset_fallback (i, MAX_FACE_SETS);
247 }
219 /* Loaded the faceset information - now need to load up the 248 /* Loaded the faceset information - now need to load up the
220 * actual faces. 249 * actual faces.
221 */ 250 */
222 251
223 for (fileno=0; fileno<MAX_FACE_SETS; fileno++) { 252 for (fileno = 0; fileno < MAX_FACE_SETS; fileno++)
253 {
224 /* if prefix is not set, this is not used */ 254 /* if prefix is not set, this is not used */
225 if (!facesets[fileno].prefix) continue; 255 if (!facesets[fileno].prefix)
256 continue;
226 facesets[fileno].faces = (FaceInfo *) calloc(nrofpixmaps, sizeof(FaceInfo)); 257 facesets[fileno].faces = (FaceInfo *) calloc (nrofpixmaps, sizeof (FaceInfo));
227 258
228 sprintf(filename,"%s/crossfire.%d",settings.datadir, fileno); 259 sprintf (filename, "%s/crossfire.%d", settings.datadir, fileno);
229 LOG(llevDebug,"Loading image file %s\n", filename); 260 LOG (llevDebug, "Loading image file %s\n", filename);
230 261
231 if ((infile = open_and_uncompress(filename,0,&compressed))==NULL) { 262 if ((infile = open_and_uncompress (filename, 0, &compressed)) == NULL)
263 {
232 LOG(llevError,"Unable to open %s\n", filename); 264 LOG (llevError, "Unable to open %s\n", filename);
233 abort(); 265 abort ();
234 } 266 }
235 while(fgets(buf, HUGE_BUF-1, infile)!=NULL) { 267 while (fgets (buf, HUGE_BUF - 1, infile) != NULL)
268 {
236 if(strncmp(buf,"IMAGE ",6)!=0) { 269 if (strncmp (buf, "IMAGE ", 6) != 0)
270 {
237 LOG(llevError,"read_client_images:Bad image line - not IMAGE, instead\n%s",buf); 271 LOG (llevError, "read_client_images:Bad image line - not IMAGE, instead\n%s", buf);
238 abort(); 272 abort ();
239 } 273 }
240 num = atoi(buf+6); 274 num = atoi (buf + 6);
241 if (num<0 || num>=nrofpixmaps) { 275 if (num < 0 || num >= nrofpixmaps)
276 {
242 LOG(llevError,"read_client_images: Image num %d not in 0..%d\n%s", 277 LOG (llevError, "read_client_images: Image num %d not in 0..%d\n%s", num, nrofpixmaps, buf);
243 num,nrofpixmaps,buf); 278 abort ();
244 abort(); 279 }
245 }
246 /* Skip accross the number data */ 280 /* Skip accross the number data */
247 for (cp=buf+6; *cp!=' '; cp++) ; 281 for (cp = buf + 6; *cp != ' '; cp++);
248 len = atoi(cp); 282 len = atoi (cp);
249 if (len==0 || len>MAX_IMAGE_SIZE) { 283 if (len == 0 || len > MAX_IMAGE_SIZE)
250 LOG(llevError,"read_client_images: length not valid: %d > %d \n%s", 284 {
251 len,MAX_IMAGE_SIZE,buf); 285 LOG (llevError, "read_client_images: length not valid: %d > %d \n%s", len, MAX_IMAGE_SIZE, buf);
252 abort(); 286 abort ();
253 } 287 }
254 /* We don't actualy care about the name if the image that 288 /* We don't actualy care about the name of the image that
255 * is embedded in the image file, so just ignore it. 289 * is embedded in the image file, so just ignore it.
256 */ 290 */
257 facesets[fileno].faces[num].datalen = len; 291 facesets[fileno].faces[num].datalen = len;
258 facesets[fileno].faces[num].data = (uint8*) malloc(len); 292 facesets[fileno].faces[num].data = (uint8 *) malloc (len);
259 if ((i=fread(facesets[fileno].faces[num].data, len, 1, infile))!=1) { 293 if ((i = fread (facesets[fileno].faces[num].data, len, 1, infile)) != 1)
294 {
260 LOG(llevError,"read_client_images: Did not read desired amount of data, wanted %d, got %d\n%s", 295 LOG (llevError, "read_client_images: Did not read desired amount of data, wanted %d, got %d\n%s", len, i, buf);
261 len, i, buf); 296 abort ();
262 abort(); 297 }
263 }
264 facesets[fileno].faces[num].checksum=0; 298 facesets[fileno].faces[num].checksum = 0;
265 for (i=0; i<len; i++) { 299 for (i = 0; i < len; i++)
300 {
266 ROTATE_RIGHT(facesets[fileno].faces[num].checksum); 301 ROTATE_RIGHT (facesets[fileno].faces[num].checksum);
267 facesets[fileno].faces[num].checksum += facesets[fileno].faces[num].data[i]; 302 facesets[fileno].faces[num].checksum += facesets[fileno].faces[num].data[i];
268 facesets[fileno].faces[num].checksum &= 0xffffffff; 303 facesets[fileno].faces[num].checksum &= 0xffffffff;
269 } 304 }
270 } 305 }
271 close_and_delete(infile,compressed); 306 close_and_delete (infile, compressed);
272 } /* For fileno < MAX_FACE_SETS */ 307 } /* For fileno < MAX_FACE_SETS */
273} 308}
274 309
275/** 310/**
276 * Client tells us what type of faces it wants. Also sets 311 * Client tells us what type of faces it wants. Also sets
277 * the caching attribute. 312 * the caching attribute.
278 * 313 *
279 */ 314 */
280 315
316void
281void SetFaceMode(char *buf, int len, NewSocket *ns) 317SetFaceMode (char *buf, int len, NewSocket *ns)
282{ 318{
283 char tmp[256];
284
285 int mask =(atoi(buf) & CF_FACE_CACHE), mode=(atoi(buf) & ~CF_FACE_CACHE); 319 int mask = (atoi (buf) & CF_FACE_CACHE), mode = (atoi (buf) & ~CF_FACE_CACHE);
286 320
287 if (mode==CF_FACE_NONE) { 321 if (mode == CF_FACE_NONE)
288 ns->facecache=1; 322 ns->facecache = 1;
289 } else if (mode!=CF_FACE_PNG) { 323 else if (mode != CF_FACE_PNG)
324 {
325 packet sl;
290 sprintf(tmp,"drawinfo %d %s", NDI_RED,"Warning - send unsupported face mode. Will use Png"); 326 sl.printf ("drawinfo %d %s", NDI_RED, "Warning - send unsupported face mode. Will use Png");
291 Write_String_To_Socket(ns, tmp, strlen(tmp)); 327 ns->send_packet (sl);
292#ifdef ESRV_DEBUG
293 LOG(llevDebug,"SetFaceMode: Invalid mode from client: %d\n", mode);
294#endif
295 } 328 }
329
296 if (mask) { 330 if (mask)
297 ns->facecache=1; 331 ns->facecache = 1;
298 }
299} 332}
300 333
301/** 334/**
302 * Client has requested pixmap that it somehow missed getting. 335 * Client has requested pixmap that it somehow missed getting.
303 * This will be called often if the client is 336 * This will be called often if the client is
304 * caching images. 337 * caching images.
305 */ 338 */
306 339
340void
307void SendFaceCmd(char *buff, int len, NewSocket *ns) 341SendFaceCmd (char *buff, int len, NewSocket * ns)
308{ 342{
309 long tmpnum = atoi(buff); 343 long tmpnum = atoi (buff);
310 short facenum=tmpnum & 0xffff; 344 short facenum = tmpnum & 0xffff;
311 345
312 if(facenum!=0) 346 if (facenum != 0)
313 esrv_send_face(ns, facenum,1); 347 esrv_send_face (ns, facenum, 1);
314} 348}
315 349
316/** 350/**
317 * Sends a face to a client if they are in pixmap mode 351 * Sends a face to a client if they are in pixmap mode
318 * nothing gets sent in bitmap mode. 352 * nothing gets sent in bitmap mode.
320 * this is needed for the askface, in which we really do want to send the 354 * this is needed for the askface, in which we really do want to send the
321 * face (and askface is the only place that should be setting it). Otherwise, 355 * face (and askface is the only place that should be setting it). Otherwise,
322 * we look at the facecache, and if set, send the image name. 356 * we look at the facecache, and if set, send the image name.
323 */ 357 */
324 358
359void
325void esrv_send_face(NewSocket *ns,short face_num, int nocache) 360esrv_send_face (NewSocket *ns, short face_num, int nocache)
326{ 361{
327 SockList sl;
328 char fallback; 362 char fallback;
329 363
330 if (face_num <= 0 || face_num >= nrofpixmaps) { 364 if (face_num <= 0 || face_num >= nrofpixmaps)
365 {
331 LOG(llevError,"esrv_send_face (%d) out of bounds??\n",face_num); 366 LOG (llevError, "esrv_send_face (%d) out of bounds??\n", face_num);
332 return; 367 return;
333 } 368 }
334 369
335 sl.buf = (unsigned char*) malloc(MAXSOCKBUF); 370 packet sl;
336 fallback = get_face_fallback(ns->faceset, face_num); 371 fallback = get_face_fallback (ns->faceset, face_num);
337 372
338 if (facesets[fallback].faces[face_num].data == NULL) { 373 if (facesets[fallback].faces[face_num].data == NULL)
374 {
339 LOG(llevError,"esrv_send_face: faces[%d].data == NULL\n",face_num); 375 LOG (llevError, "esrv_send_face: faces[%d].data == NULL\n", face_num);
340 return; 376 return;
341 } 377 }
342 378
343 if (ns->facecache && !nocache) { 379 if (ns->facecache && !nocache)
380 {
381 sl << (ns->image2 ? "face2 " : "face1 ")
382 << uint16 (face_num);
383
344 if (ns->image2) 384 if (ns->image2)
345 strcpy((char*)sl.buf, "face2 "); 385 sl << uint8 (fallback);
346 else if (ns->sc_version >= 1026)
347 strcpy((char*)sl.buf, "face1 ");
348 else
349 strcpy((char*)sl.buf, "face ");
350 386
351 sl.len=strlen((const char*)sl.buf); 387 sl << uint32 (facesets[fallback].faces[face_num].checksum)
352 SockList_AddShort(&sl, face_num); 388 << new_faces[face_num].name;
353 if (ns->image2) 389
354 SockList_AddChar(&sl, fallback);
355 if (ns->sc_version >= 1026)
356 SockList_AddInt(&sl, facesets[fallback].faces[face_num].checksum);
357 strcpy((char*)sl.buf + sl.len, new_faces[face_num].name);
358 sl.len += strlen(new_faces[face_num].name);
359 Send_With_Handling(ns, &sl); 390 Send_With_Handling (ns, &sl);
391 }
392 else
360 } 393 {
361 else { 394 sl << (ns->image2 ? "image2 " : "image ")
395 << uint32 (face_num);
396
362 if (ns->image2) 397 if (ns->image2)
363 strcpy((char*)sl.buf, "image2 "); 398 sl << uint8 (fallback);
364 else 399
365 strcpy((char*)sl.buf, "image ");
366 sl.len=strlen((char*)sl.buf);
367 SockList_AddInt(&sl, face_num);
368 if (ns->image2)
369 SockList_AddChar(&sl, fallback);
370 SockList_AddInt(&sl, facesets[fallback].faces[face_num].datalen);
371 memcpy(sl.buf+sl.len, facesets[fallback].faces[face_num].data,
372 facesets[fallback].faces[face_num].datalen);
373 sl.len += facesets[fallback].faces[face_num].datalen; 400 sl << uint32 (facesets[fallback].faces[face_num].datalen)
401 << data (facesets[fallback].faces[face_num].data, facesets[fallback].faces[face_num].datalen);
402
374 Send_With_Handling(ns, &sl); 403 Send_With_Handling (ns, &sl);
375 } 404 }
405
376 ns->faces_sent[face_num] |= NS_FACESENT_FACE; 406 ns->faces_sent[face_num] |= NS_FACESENT_FACE;
377 free(sl.buf);
378} 407}
379 408
380/** 409/**
381 * Sends the number of images, checksum of the face file, 410 * Sends the number of images, checksum of the face file,
382 * and the image_info file information. See the doc/Developers/protocol 411 * and the image_info file information. See the doc/Developers/protocol
383 * if you want further detail. 412 * if you want further detail.
384 */ 413 */
385 414
415void
386void send_image_info(NewSocket *ns, char *params) 416send_image_info (NewSocket * ns, char *params)
387{ 417{
388 SockList sl; 418 packet sl;
389 int i;
390 419
391 sl.buf = (unsigned char *) malloc(MAXSOCKBUF);
392
393 sprintf((char*)sl.buf,"replyinfo image_info\n%d\n%d\n", nrofpixmaps-1, bmaps_checksum); 420 sl.printf ("replyinfo image_info\n%d\n%d\n", nrofpixmaps - 1, bmaps_checksum);
421
394 for (i=0; i<MAX_FACE_SETS; i++) { 422 for (int i = 0; i < MAX_FACE_SETS; i++)
395 if (facesets[i].prefix) { 423 if (facesets[i].prefix)
396 sprintf((char*)sl.buf + strlen((const char*)sl.buf), "%d:%s:%s:%d:%s:%s:%s", 424 sl.printf ("%d:%s:%s:%d:%s:%s:%s",
397 i, facesets[i].prefix, facesets[i].fullname, facesets[i].fallback, 425 i, facesets[i].prefix, facesets[i].fullname, facesets[i].fallback,
398 facesets[i].size, facesets[i].extension, facesets[i].comment); 426 facesets[i].size, facesets[i].extension, facesets[i].comment);
399 } 427
400 }
401 sl.len = strlen((const char*)sl.buf);
402 Send_With_Handling(ns, &sl); 428 Send_With_Handling (ns, &sl);
403 free(sl.buf);
404} 429}
405 430
406/** 431/**
407 * Sends requested face information. 432 * Sends requested face information.
408 * \param ns socket to send to 433 * \param ns socket to send to
410 * 435 *
411 * For each image in [start..stop] sends 436 * For each image in [start..stop] sends
412 * - checksum 437 * - checksum
413 * - name 438 * - name
414 */ 439 */
440void
415void send_image_sums(NewSocket *ns, char *params) 441send_image_sums (NewSocket * ns, char *params)
416{ 442{
417 int start, stop; 443 int start, stop;
418 short i;
419 char qq;
420 char *cp, buf[MAX_BUF]; 444 char *cp, buf[MAX_BUF];
421 SockList sl;
422 445
423 sl.buf = (unsigned char *) malloc(MAXSOCKBUF); 446 packet sl;
424 447
425 start = atoi(params); 448 start = atoi (params);
426 for (cp = params; *cp != '\0'; cp++) 449 for (cp = params; *cp != '\0'; cp++)
427 if (*cp == ' ') break; 450 if (*cp == ' ')
451 break;
428 452
429 stop = atoi(cp); 453 stop = atoi (cp);
430 if (stop < start || *cp == '\0' || (stop-start)>1000 || stop >= nrofpixmaps) { 454 if (stop < start || *cp == '\0' || (stop - start) > 1000 || stop >= nrofpixmaps)
455 {
456 sl.printf ("replyinfo image_sums %d %d", start, stop);
457 ns->send_packet (sl);
458 sl.reset ();
459 return;
460 }
461
431 sprintf(buf,"replyinfo image_sums %d %d", start, stop); 462 sl.printf ("replyinfo image_sums %d %d ", start, stop);
432 cs_write_string(ns, buf, strlen(buf));
433 return;
434 }
435 sprintf((char*)sl.buf,"replyinfo image_sums %d %d ", start, stop);
436 463
437 sl.len = strlen((const char*)sl.buf);
438
439 for (i=start; i<=stop; i++) { 464 for (int i = start; i <= stop; i++)
440 SockList_AddShort(&sl, i); 465 {
441 ns->faces_sent[i] |= NS_FACESENT_FACE; 466 ns->faces_sent[i] |= NS_FACESENT_FACE;
442 467
443 qq = get_face_fallback(ns->faceset, i); 468 int qq = get_face_fallback (ns->faceset, i);
444 SockList_AddInt(&sl, facesets[qq].faces[i].checksum);
445 SockList_AddChar(&sl, qq);
446 469
447 qq = strlen(new_faces[i].name); 470 sl << uint16 (i)
448 SockList_AddChar(&sl, ( char )( qq + 1 )); 471 << uint32 (facesets[qq].faces[i].checksum)
449 strcpy((char*)sl.buf + sl.len, new_faces[i].name); 472 << uint8 (qq)
450 sl.len += qq; 473 << data8 (&new_faces[i].name, new_faces[i].name.length () + 1);
451 SockList_AddChar(&sl, 0);
452 } 474 }
475
453 /* It would make more sense to catch this pre-emptively in the code above. 476 /* It would make more sense to catch this pre-emptively in the code above.
454 * however, if this really happens, we probably just want to cut down the 477 * however, if this really happens, we probably just want to cut down the
455 * size to less than 1000, since that is what we claim the protocol would 478 * size to less than 1000, since that is what we claim the protocol would
456 * support. 479 * support.
457 */ 480 */
458 if (sl.len >= MAXSOCKBUF) { 481 if (sl.length () >= MAXSOCKBUF)
482 {
459 LOG(llevError,"send_image_send: buffer overrun, %d > %d\n", sl.len, MAXSOCKBUF); 483 LOG (llevError, "send_image_send: buffer overrun, %d > %d\n", sl.length (), MAXSOCKBUF);
460 abort(); 484 abort ();
461 } 485 }
486
462 Send_With_Handling(ns, &sl); 487 Send_With_Handling (ns, &sl);
463 free(sl.buf);
464} 488}
489

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines