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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines