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.4 by root, Thu Sep 14 22:34:05 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 if 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]; 319 char tmp[256];
284 320
285 int mask =(atoi(buf) & CF_FACE_CACHE), mode=(atoi(buf) & ~CF_FACE_CACHE); 321 int mask = (atoi (buf) & CF_FACE_CACHE), mode = (atoi (buf) & ~CF_FACE_CACHE);
286 322
287 if (mode==CF_FACE_NONE) { 323 if (mode == CF_FACE_NONE)
324 {
288 ns->facecache=1; 325 ns->facecache = 1;
326 }
289 } else if (mode!=CF_FACE_PNG) { 327 else if (mode != CF_FACE_PNG)
328 {
290 sprintf(tmp,"drawinfo %d %s", NDI_RED,"Warning - send unsupported face mode. Will use Png"); 329 sprintf (tmp, "drawinfo %d %s", NDI_RED, "Warning - send unsupported face mode. Will use Png");
291 Write_String_To_Socket(ns, tmp, strlen(tmp)); 330 Write_String_To_Socket (ns, tmp, strlen (tmp));
292#ifdef ESRV_DEBUG 331#ifdef ESRV_DEBUG
293 LOG(llevDebug,"SetFaceMode: Invalid mode from client: %d\n", mode); 332 LOG (llevDebug, "SetFaceMode: Invalid mode from client: %d\n", mode);
294#endif 333#endif
295 } 334 }
296 if (mask) { 335 if (mask)
336 {
297 ns->facecache=1; 337 ns->facecache = 1;
298 } 338 }
299} 339}
300 340
301/** 341/**
302 * Client has requested pixmap that it somehow missed getting. 342 * Client has requested pixmap that it somehow missed getting.
303 * This will be called often if the client is 343 * This will be called often if the client is
304 * caching images. 344 * caching images.
305 */ 345 */
306 346
347void
307void SendFaceCmd(char *buff, int len, NewSocket *ns) 348SendFaceCmd (char *buff, int len, NewSocket * ns)
308{ 349{
309 long tmpnum = atoi(buff); 350 long tmpnum = atoi (buff);
310 short facenum=tmpnum & 0xffff; 351 short facenum = tmpnum & 0xffff;
311 352
312 if(facenum!=0) 353 if (facenum != 0)
313 esrv_send_face(ns, facenum,1); 354 esrv_send_face (ns, facenum, 1);
314} 355}
315 356
316/** 357/**
317 * Sends a face to a client if they are in pixmap mode 358 * Sends a face to a client if they are in pixmap mode
318 * nothing gets sent in bitmap mode. 359 * nothing gets sent in bitmap mode.
320 * this is needed for the askface, in which we really do want to send the 361 * 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, 362 * 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. 363 * we look at the facecache, and if set, send the image name.
323 */ 364 */
324 365
366void
325void esrv_send_face(NewSocket *ns,short face_num, int nocache) 367esrv_send_face (NewSocket * ns, short face_num, int nocache)
326{ 368{
327 SockList sl; 369 SockList sl;
328 char fallback; 370 char fallback;
329 371
330 if (face_num <= 0 || face_num >= nrofpixmaps) { 372 if (face_num <= 0 || face_num >= nrofpixmaps)
373 {
331 LOG(llevError,"esrv_send_face (%d) out of bounds??\n",face_num); 374 LOG (llevError, "esrv_send_face (%d) out of bounds??\n", face_num);
332 return; 375 return;
333 } 376 }
334 377
335 sl.buf = (unsigned char*) malloc(MAXSOCKBUF); 378 sl.buf = (unsigned char *) malloc (MAXSOCKBUF);
336 fallback = get_face_fallback(ns->faceset, face_num); 379 fallback = get_face_fallback (ns->faceset, face_num);
337 380
338 if (facesets[fallback].faces[face_num].data == NULL) { 381 if (facesets[fallback].faces[face_num].data == NULL)
382 {
339 LOG(llevError,"esrv_send_face: faces[%d].data == NULL\n",face_num); 383 LOG (llevError, "esrv_send_face: faces[%d].data == NULL\n", face_num);
340 return; 384 return;
341 } 385 }
342 386
343 if (ns->facecache && !nocache) { 387 if (ns->facecache && !nocache)
388 {
344 if (ns->image2) 389 if (ns->image2)
345 strcpy((char*)sl.buf, "face2 "); 390 strcpy ((char *) sl.buf, "face2 ");
346 else if (ns->sc_version >= 1026) 391 else if (ns->sc_version >= 1026)
347 strcpy((char*)sl.buf, "face1 "); 392 strcpy ((char *) sl.buf, "face1 ");
348 else 393 else
349 strcpy((char*)sl.buf, "face "); 394 strcpy ((char *) sl.buf, "face ");
350 395
351 sl.len=strlen((const char*)sl.buf); 396 sl.len = strlen ((const char *) sl.buf);
352 SockList_AddShort(&sl, face_num); 397 SockList_AddShort (&sl, face_num);
353 if (ns->image2) 398 if (ns->image2)
354 SockList_AddChar(&sl, fallback); 399 SockList_AddChar (&sl, fallback);
355 if (ns->sc_version >= 1026) 400 if (ns->sc_version >= 1026)
356 SockList_AddInt(&sl, facesets[fallback].faces[face_num].checksum); 401 SockList_AddInt (&sl, facesets[fallback].faces[face_num].checksum);
357 strcpy((char*)sl.buf + sl.len, new_faces[face_num].name); 402 strcpy ((char *) sl.buf + sl.len, new_faces[face_num].name);
358 sl.len += strlen(new_faces[face_num].name); 403 sl.len += strlen (new_faces[face_num].name);
359 Send_With_Handling(ns, &sl); 404 Send_With_Handling (ns, &sl);
405 }
406 else
360 } 407 {
361 else {
362 if (ns->image2) 408 if (ns->image2)
363 strcpy((char*)sl.buf, "image2 "); 409 strcpy ((char *) sl.buf, "image2 ");
364 else 410 else
365 strcpy((char*)sl.buf, "image "); 411 strcpy ((char *) sl.buf, "image ");
366 sl.len=strlen((char*)sl.buf); 412 sl.len = strlen ((char *) sl.buf);
367 SockList_AddInt(&sl, face_num); 413 SockList_AddInt (&sl, face_num);
368 if (ns->image2) 414 if (ns->image2)
369 SockList_AddChar(&sl, fallback); 415 SockList_AddChar (&sl, fallback);
370 SockList_AddInt(&sl, facesets[fallback].faces[face_num].datalen); 416 SockList_AddInt (&sl, facesets[fallback].faces[face_num].datalen);
371 memcpy(sl.buf+sl.len, facesets[fallback].faces[face_num].data, 417 memcpy (sl.buf + sl.len, facesets[fallback].faces[face_num].data, facesets[fallback].faces[face_num].datalen);
372 facesets[fallback].faces[face_num].datalen);
373 sl.len += facesets[fallback].faces[face_num].datalen; 418 sl.len += facesets[fallback].faces[face_num].datalen;
374 Send_With_Handling(ns, &sl); 419 Send_With_Handling (ns, &sl);
375 } 420 }
376 ns->faces_sent[face_num] |= NS_FACESENT_FACE; 421 ns->faces_sent[face_num] |= NS_FACESENT_FACE;
377 free(sl.buf); 422 free (sl.buf);
378} 423}
379 424
380/** 425/**
381 * Sends the number of images, checksum of the face file, 426 * Sends the number of images, checksum of the face file,
382 * and the image_info file information. See the doc/Developers/protocol 427 * and the image_info file information. See the doc/Developers/protocol
383 * if you want further detail. 428 * if you want further detail.
384 */ 429 */
385 430
431void
386void send_image_info(NewSocket *ns, char *params) 432send_image_info (NewSocket * ns, char *params)
387{ 433{
388 SockList sl; 434 SockList sl;
389 int i; 435 int i;
390 436
391 sl.buf = (unsigned char *) malloc(MAXSOCKBUF); 437 sl.buf = (unsigned char *) malloc (MAXSOCKBUF);
392 438
393 sprintf((char*)sl.buf,"replyinfo image_info\n%d\n%d\n", nrofpixmaps-1, bmaps_checksum); 439 sprintf ((char *) sl.buf, "replyinfo image_info\n%d\n%d\n", nrofpixmaps - 1, bmaps_checksum);
394 for (i=0; i<MAX_FACE_SETS; i++) { 440 for (i = 0; i < MAX_FACE_SETS; i++)
441 {
395 if (facesets[i].prefix) { 442 if (facesets[i].prefix)
443 {
396 sprintf((char*)sl.buf + strlen((const char*)sl.buf), "%d:%s:%s:%d:%s:%s:%s", 444 sprintf ((char *) sl.buf + strlen ((const char *) sl.buf), "%d:%s:%s:%d:%s:%s:%s",
397 i, facesets[i].prefix, facesets[i].fullname, facesets[i].fallback, 445 i, facesets[i].prefix, facesets[i].fullname, facesets[i].fallback,
398 facesets[i].size, facesets[i].extension, facesets[i].comment); 446 facesets[i].size, facesets[i].extension, facesets[i].comment);
399 } 447 }
400 } 448 }
401 sl.len = strlen((const char*)sl.buf); 449 sl.len = strlen ((const char *) sl.buf);
402 Send_With_Handling(ns, &sl); 450 Send_With_Handling (ns, &sl);
403 free(sl.buf); 451 free (sl.buf);
404} 452}
405 453
406/** 454/**
407 * Sends requested face information. 455 * Sends requested face information.
408 * \param ns socket to send to 456 * \param ns socket to send to
410 * 458 *
411 * For each image in [start..stop] sends 459 * For each image in [start..stop] sends
412 * - checksum 460 * - checksum
413 * - name 461 * - name
414 */ 462 */
463void
415void send_image_sums(NewSocket *ns, char *params) 464send_image_sums (NewSocket * ns, char *params)
416{ 465{
417 int start, stop; 466 int start, stop;
418 short i; 467 short i;
419 char qq; 468 char qq;
420 char *cp, buf[MAX_BUF]; 469 char *cp, buf[MAX_BUF];
421 SockList sl; 470 SockList sl;
422 471
423 sl.buf = (unsigned char *) malloc(MAXSOCKBUF); 472 sl.buf = (unsigned char *) malloc (MAXSOCKBUF);
424 473
425 start = atoi(params); 474 start = atoi (params);
426 for (cp = params; *cp != '\0'; cp++) 475 for (cp = params; *cp != '\0'; cp++)
427 if (*cp == ' ') break; 476 if (*cp == ' ')
477 break;
428 478
429 stop = atoi(cp); 479 stop = atoi (cp);
430 if (stop < start || *cp == '\0' || (stop-start)>1000 || stop >= nrofpixmaps) { 480 if (stop < start || *cp == '\0' || (stop - start) > 1000 || stop >= nrofpixmaps)
481 {
431 sprintf(buf,"replyinfo image_sums %d %d", start, stop); 482 sprintf (buf, "replyinfo image_sums %d %d", start, stop);
432 cs_write_string(ns, buf, strlen(buf)); 483 cs_write_string (ns, buf, strlen (buf));
433 return; 484 return;
434 } 485 }
435 sprintf((char*)sl.buf,"replyinfo image_sums %d %d ", start, stop); 486 sprintf ((char *) sl.buf, "replyinfo image_sums %d %d ", start, stop);
436 487
437 sl.len = strlen((const char*)sl.buf); 488 sl.len = strlen ((const char *) sl.buf);
438 489
439 for (i=start; i<=stop; i++) { 490 for (i = start; i <= stop; i++)
491 {
440 SockList_AddShort(&sl, i); 492 SockList_AddShort (&sl, i);
441 ns->faces_sent[i] |= NS_FACESENT_FACE; 493 ns->faces_sent[i] |= NS_FACESENT_FACE;
442 494
443 qq = get_face_fallback(ns->faceset, i); 495 qq = get_face_fallback (ns->faceset, i);
444 SockList_AddInt(&sl, facesets[qq].faces[i].checksum); 496 SockList_AddInt (&sl, facesets[qq].faces[i].checksum);
445 SockList_AddChar(&sl, qq); 497 SockList_AddChar (&sl, qq);
446 498
447 qq = strlen(new_faces[i].name); 499 qq = strlen (new_faces[i].name);
448 SockList_AddChar(&sl, ( char )( qq + 1 )); 500 SockList_AddChar (&sl, (char) (qq + 1));
449 strcpy((char*)sl.buf + sl.len, new_faces[i].name); 501 strcpy ((char *) sl.buf + sl.len, new_faces[i].name);
450 sl.len += qq; 502 sl.len += qq;
451 SockList_AddChar(&sl, 0); 503 SockList_AddChar (&sl, 0);
452 } 504 }
453 /* It would make more sense to catch this pre-emptively in the code above. 505 /* 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 506 * 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 507 * size to less than 1000, since that is what we claim the protocol would
456 * support. 508 * support.
457 */ 509 */
458 if (sl.len >= MAXSOCKBUF) { 510 if (sl.len >= MAXSOCKBUF)
511 {
459 LOG(llevError,"send_image_send: buffer overrun, %d > %d\n", sl.len, MAXSOCKBUF); 512 LOG (llevError, "send_image_send: buffer overrun, %d > %d\n", sl.len, MAXSOCKBUF);
460 abort(); 513 abort ();
461 } 514 }
462 Send_With_Handling(ns, &sl); 515 Send_With_Handling (ns, &sl);
463 free(sl.buf); 516 free (sl.buf);
464} 517}

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines