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.3 by root, Sun Sep 10 13:43:33 2006 UTC vs.
Revision 1.15 by root, Sat Dec 16 22:14:42 2006 UTC

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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines