--- deliantra/server/socket/image.C 2006/08/29 08:01:38 1.2 +++ deliantra/server/socket/image.C 2006/09/10 13:43:33 1.3 @@ -1,6 +1,7 @@ + /* * static char *rcsid_init_c = - * "$Id: image.C,v 1.2 2006/08/29 08:01:38 root Exp $"; + * "$Id: image.C,v 1.3 2006/09/10 13:43:33 root Exp $"; */ /* @@ -47,21 +48,29 @@ #define MAX_FACE_SETS 20 /**< Maximum number of image sets the program will handle */ /** Information about one image */ -typedef struct FaceInfo { - uint8 *data; /**< image data */ - uint16 datalen; /**< length of the xpm data */ - uint32 checksum; /**< Checksum of face data */ +typedef struct FaceInfo +{ + + uint8 *data; /**< image data */ + + uint16 datalen; /**< length of the xpm data */ + + uint32 checksum; /**< Checksum of face data */ } FaceInfo; /** Information about one face set */ -typedef struct { - char *prefix; /**< */ - char *fullname; - uint8 fallback; /**< faceset to use when an image is not found in this faceset */ - char *size; - char *extension; - char *comment; - FaceInfo *faces; /**< images in this faceset */ +typedef struct +{ + + char *prefix; /**< */ + char *fullname; + + uint8 fallback; /**< faceset to use when an image is not found in this faceset */ + char *size; + char *extension; + char *comment; + + FaceInfo *faces; /**< images in this faceset */ } FaceSets; static FaceSets facesets[MAX_FACE_SETS]; /**< All facesets */ @@ -70,29 +79,35 @@ * Checks specified faceset is valid * \param fsn faceset number */ -int is_valid_faceset(int fsn) +int +is_valid_faceset (int fsn) { - if (fsn >=0 && fsn < MAX_FACE_SETS && facesets[fsn].prefix) return TRUE; - return FALSE; + if (fsn >= 0 && fsn < MAX_FACE_SETS && facesets[fsn].prefix) + return TRUE; + return FALSE; } /** * Frees all faceset information */ -void free_socket_images(void) +void +free_socket_images (void) { - int num,q; + int num, q; - for(num=0;num=MAX_FACE_SETS) { - LOG(llevError,"To high a setnum in image_info file: %d > %d\n", - len, MAX_FACE_SETS); - abort(); + else + { + len = atoi (cps[0]); + if (len >= MAX_FACE_SETS) + { + LOG (llevError, "To high a setnum in image_info file: %d > %d\n", len, MAX_FACE_SETS); + abort (); } - facesets[len].prefix = strdup_local(cps[1]); - facesets[len].fullname = strdup_local(cps[2]); - facesets[len].fallback = atoi(cps[3]); - facesets[len].size = strdup_local(cps[4]); - facesets[len].extension = strdup_local(cps[5]); - facesets[len].comment = strdup_local(cps[6]); + facesets[len].prefix = strdup_local (cps[1]); + facesets[len].fullname = strdup_local (cps[2]); + facesets[len].fallback = atoi (cps[3]); + facesets[len].size = strdup_local (cps[4]); + facesets[len].extension = strdup_local (cps[5]); + facesets[len].comment = strdup_local (cps[6]); } } - close_and_delete(infile,compressed); - for (i=0; i=nrofpixmaps) { - LOG(llevError,"read_client_images: Image num %d not in 0..%d\n%s", - num,nrofpixmaps,buf); - abort(); + num = atoi (buf + 6); + if (num < 0 || num >= nrofpixmaps) + { + LOG (llevError, "read_client_images: Image num %d not in 0..%d\n%s", num, nrofpixmaps, buf); + abort (); } - /* Skip accross the number data */ - for (cp=buf+6; *cp!=' '; cp++) ; - len = atoi(cp); - if (len==0 || len>MAX_IMAGE_SIZE) { - LOG(llevError,"read_client_images: length not valid: %d > %d \n%s", - len,MAX_IMAGE_SIZE,buf); - abort(); + /* Skip accross the number data */ + for (cp = buf + 6; *cp != ' '; cp++); + len = atoi (cp); + if (len == 0 || len > MAX_IMAGE_SIZE) + { + LOG (llevError, "read_client_images: length not valid: %d > %d \n%s", len, MAX_IMAGE_SIZE, buf); + abort (); } - /* We don't actualy care about the name if the image that - * is embedded in the image file, so just ignore it. - */ - facesets[fileno].faces[num].datalen = len; - facesets[fileno].faces[num].data = (uint8*) malloc(len); - if ((i=fread(facesets[fileno].faces[num].data, len, 1, infile))!=1) { - LOG(llevError,"read_client_images: Did not read desired amount of data, wanted %d, got %d\n%s", - len, i, buf); - abort(); + /* We don't actualy care about the name if the image that + * is embedded in the image file, so just ignore it. + */ + facesets[fileno].faces[num].datalen = len; + facesets[fileno].faces[num].data = (uint8 *) malloc (len); + if ((i = fread (facesets[fileno].faces[num].data, len, 1, infile)) != 1) + { + LOG (llevError, "read_client_images: Did not read desired amount of data, wanted %d, got %d\n%s", len, i, buf); + abort (); } - facesets[fileno].faces[num].checksum=0; - for (i=0; ifacecache=1; - } else if (mode!=CF_FACE_PNG) { - sprintf(tmp,"drawinfo %d %s", NDI_RED,"Warning - send unsupported face mode. Will use Png"); - Write_String_To_Socket(ns, tmp, strlen(tmp)); + if (mode == CF_FACE_NONE) + { + ns->facecache = 1; + } + else if (mode != CF_FACE_PNG) + { + sprintf (tmp, "drawinfo %d %s", NDI_RED, "Warning - send unsupported face mode. Will use Png"); + Write_String_To_Socket (ns, tmp, strlen (tmp)); #ifdef ESRV_DEBUG - LOG(llevDebug,"SetFaceMode: Invalid mode from client: %d\n", mode); + LOG (llevDebug, "SetFaceMode: Invalid mode from client: %d\n", mode); #endif } - if (mask) { - ns->facecache=1; + if (mask) + { + ns->facecache = 1; } } @@ -304,13 +350,14 @@ * caching images. */ -void SendFaceCmd(char *buff, int len, NewSocket *ns) +void +SendFaceCmd (char *buff, int len, NewSocket * ns) { - long tmpnum = atoi(buff); - short facenum=tmpnum & 0xffff; + long tmpnum = atoi (buff); + short facenum = tmpnum & 0xffff; - if(facenum!=0) - esrv_send_face(ns, facenum,1); + if (facenum != 0) + esrv_send_face (ns, facenum, 1); } /** @@ -322,59 +369,63 @@ * we look at the facecache, and if set, send the image name. */ -void esrv_send_face(NewSocket *ns,short face_num, int nocache) +void +esrv_send_face (NewSocket * ns, short face_num, int nocache) { - SockList sl; - char fallback; + SockList sl; + char fallback; - if (face_num <= 0 || face_num >= nrofpixmaps) { - LOG(llevError,"esrv_send_face (%d) out of bounds??\n",face_num); - return; - } - - sl.buf = (unsigned char*) malloc(MAXSOCKBUF); - fallback = get_face_fallback(ns->faceset, face_num); - - if (facesets[fallback].faces[face_num].data == NULL) { - LOG(llevError,"esrv_send_face: faces[%d].data == NULL\n",face_num); - return; - } - - if (ns->facecache && !nocache) { - if (ns->image2) - strcpy((char*)sl.buf, "face2 "); - else if (ns->sc_version >= 1026) - strcpy((char*)sl.buf, "face1 "); - else - strcpy((char*)sl.buf, "face "); - - sl.len=strlen((const char*)sl.buf); - SockList_AddShort(&sl, face_num); - if (ns->image2) - SockList_AddChar(&sl, fallback); - if (ns->sc_version >= 1026) - SockList_AddInt(&sl, facesets[fallback].faces[face_num].checksum); - strcpy((char*)sl.buf + sl.len, new_faces[face_num].name); - sl.len += strlen(new_faces[face_num].name); - Send_With_Handling(ns, &sl); - } - else { - if (ns->image2) - strcpy((char*)sl.buf, "image2 "); - else - strcpy((char*)sl.buf, "image "); - sl.len=strlen((char*)sl.buf); - SockList_AddInt(&sl, face_num); - if (ns->image2) - SockList_AddChar(&sl, fallback); - SockList_AddInt(&sl, facesets[fallback].faces[face_num].datalen); - memcpy(sl.buf+sl.len, facesets[fallback].faces[face_num].data, - facesets[fallback].faces[face_num].datalen); - sl.len += facesets[fallback].faces[face_num].datalen; - Send_With_Handling(ns, &sl); + if (face_num <= 0 || face_num >= nrofpixmaps) + { + LOG (llevError, "esrv_send_face (%d) out of bounds??\n", face_num); + return; + } + + sl.buf = (unsigned char *) malloc (MAXSOCKBUF); + fallback = get_face_fallback (ns->faceset, face_num); + + if (facesets[fallback].faces[face_num].data == NULL) + { + LOG (llevError, "esrv_send_face: faces[%d].data == NULL\n", face_num); + return; + } + + if (ns->facecache && !nocache) + { + if (ns->image2) + strcpy ((char *) sl.buf, "face2 "); + else if (ns->sc_version >= 1026) + strcpy ((char *) sl.buf, "face1 "); + else + strcpy ((char *) sl.buf, "face "); + + sl.len = strlen ((const char *) sl.buf); + SockList_AddShort (&sl, face_num); + if (ns->image2) + SockList_AddChar (&sl, fallback); + if (ns->sc_version >= 1026) + SockList_AddInt (&sl, facesets[fallback].faces[face_num].checksum); + strcpy ((char *) sl.buf + sl.len, new_faces[face_num].name); + sl.len += strlen (new_faces[face_num].name); + Send_With_Handling (ns, &sl); + } + else + { + if (ns->image2) + strcpy ((char *) sl.buf, "image2 "); + else + strcpy ((char *) sl.buf, "image "); + sl.len = strlen ((char *) sl.buf); + SockList_AddInt (&sl, face_num); + if (ns->image2) + SockList_AddChar (&sl, fallback); + SockList_AddInt (&sl, facesets[fallback].faces[face_num].datalen); + memcpy (sl.buf + sl.len, facesets[fallback].faces[face_num].data, facesets[fallback].faces[face_num].datalen); + sl.len += facesets[fallback].faces[face_num].datalen; + Send_With_Handling (ns, &sl); } - ns->faces_sent[face_num] |= NS_FACESENT_FACE; - free(sl.buf); + ns->faces_sent[face_num] |= NS_FACESENT_FACE; + free (sl.buf); } /** @@ -383,24 +434,27 @@ * if you want further detail. */ -void send_image_info(NewSocket *ns, char *params) +void +send_image_info (NewSocket * ns, char *params) { - SockList sl; - int i; + SockList sl; + int i; - sl.buf = (unsigned char *) malloc(MAXSOCKBUF); + sl.buf = (unsigned char *) malloc (MAXSOCKBUF); - sprintf((char*)sl.buf,"replyinfo image_info\n%d\n%d\n", nrofpixmaps-1, bmaps_checksum); - for (i=0; i1000 || stop >= nrofpixmaps) { - sprintf(buf,"replyinfo image_sums %d %d", start, stop); - cs_write_string(ns, buf, strlen(buf)); - return; - } - sprintf((char*)sl.buf,"replyinfo image_sums %d %d ", start, stop); - - sl.len = strlen((const char*)sl.buf); - - for (i=start; i<=stop; i++) { - SockList_AddShort(&sl, i); - ns->faces_sent[i] |= NS_FACESENT_FACE; - - qq = get_face_fallback(ns->faceset, i); - SockList_AddInt(&sl, facesets[qq].faces[i].checksum); - SockList_AddChar(&sl, qq); - - qq = strlen(new_faces[i].name); - SockList_AddChar(&sl, ( char )( qq + 1 )); - strcpy((char*)sl.buf + sl.len, new_faces[i].name); - sl.len += qq; - SockList_AddChar(&sl, 0); - } - /* It would make more sense to catch this pre-emptively in the code above. - * however, if this really happens, we probably just want to cut down the - * size to less than 1000, since that is what we claim the protocol would - * support. - */ - if (sl.len >= MAXSOCKBUF) { - LOG(llevError,"send_image_send: buffer overrun, %d > %d\n", sl.len, MAXSOCKBUF); - abort(); + int start, stop; + short i; + char qq; + char *cp, buf[MAX_BUF]; + SockList sl; + + sl.buf = (unsigned char *) malloc (MAXSOCKBUF); + + start = atoi (params); + for (cp = params; *cp != '\0'; cp++) + if (*cp == ' ') + break; + + stop = atoi (cp); + if (stop < start || *cp == '\0' || (stop - start) > 1000 || stop >= nrofpixmaps) + { + sprintf (buf, "replyinfo image_sums %d %d", start, stop); + cs_write_string (ns, buf, strlen (buf)); + return; + } + sprintf ((char *) sl.buf, "replyinfo image_sums %d %d ", start, stop); + + sl.len = strlen ((const char *) sl.buf); + + for (i = start; i <= stop; i++) + { + SockList_AddShort (&sl, i); + ns->faces_sent[i] |= NS_FACESENT_FACE; + + qq = get_face_fallback (ns->faceset, i); + SockList_AddInt (&sl, facesets[qq].faces[i].checksum); + SockList_AddChar (&sl, qq); + + qq = strlen (new_faces[i].name); + SockList_AddChar (&sl, (char) (qq + 1)); + strcpy ((char *) sl.buf + sl.len, new_faces[i].name); + sl.len += qq; + SockList_AddChar (&sl, 0); + } + /* It would make more sense to catch this pre-emptively in the code above. + * however, if this really happens, we probably just want to cut down the + * size to less than 1000, since that is what we claim the protocol would + * support. + */ + if (sl.len >= MAXSOCKBUF) + { + LOG (llevError, "send_image_send: buffer overrun, %d > %d\n", sl.len, MAXSOCKBUF); + abort (); } - Send_With_Handling(ns, &sl); - free(sl.buf); + Send_With_Handling (ns, &sl); + free (sl.buf); }