00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00040 #include <global.h>
00041 #include <sproto.h>
00042
00043 #include <newclient.h>
00044 #include <newserver.h>
00045 #include <loader.h>
00046 #include <image.h>
00047
00053 void set_face_mode_cmd(char *buf, int len, socket_struct *ns) {
00054 int mask = (atoi(buf)&CF_FACE_CACHE), mode = (atoi(buf)&~CF_FACE_CACHE);
00055
00056 if (mode == CF_FACE_NONE) {
00057 ns->facecache = 1;
00058 } else if (mode != CF_FACE_PNG) {
00059 SockList sl;
00060
00061 SockList_Init(&sl);
00062 SockList_AddPrintf(&sl, "drawinfo %d %s", NDI_RED, "Warning - send unsupported face mode. Will use Png");
00063 Send_With_Handling(ns, &sl);
00064 SockList_Term(&sl);
00065 #ifdef ESRV_DEBUG
00066 LOG(llevDebug, "set_face_mode_cmd: Invalid mode from client: %d\n", mode);
00067 #endif
00068 }
00069 if (mask) {
00070 ns->facecache = 1;
00071 }
00072 }
00073
00080 void send_face_cmd(char *buff, int len, socket_struct *ns) {
00081 long tmpnum = atoi(buff);
00082 short facenum = tmpnum&0xffff;
00083
00084 if (facenum != 0)
00085 esrv_send_face(ns, facenum, 1);
00086 }
00087
00096 void esrv_send_face(socket_struct *ns, short face_num, int nocache) {
00097 SockList sl;
00098 int fallback;
00099
00100 if (face_num <= 0 || face_num >= nrofpixmaps) {
00101 LOG(llevError, "esrv_send_face (%d) out of bounds??\n", face_num);
00102 return;
00103 }
00104
00105 SockList_Init(&sl);
00106 fallback = get_face_fallback(ns->faceset, face_num);
00107
00108 if (facesets[fallback].faces[face_num].data == NULL) {
00109 LOG(llevError, "esrv_send_face: faces[%d].data == NULL\n", face_num);
00110 return;
00111 }
00112
00113 if (ns->facecache && !nocache) {
00114 SockList_AddString(&sl, "face2 ");
00115 SockList_AddShort(&sl, face_num);
00116 SockList_AddChar(&sl, fallback);
00117 SockList_AddInt(&sl, facesets[fallback].faces[face_num].checksum);
00118 SockList_AddString(&sl, new_faces[face_num].name);
00119 Send_With_Handling(ns, &sl);
00120 } else {
00121 SockList_AddString(&sl, "image2 ");
00122 SockList_AddInt(&sl, face_num);
00123 SockList_AddChar(&sl, fallback);
00124 SockList_AddInt(&sl, facesets[fallback].faces[face_num].datalen);
00125 SockList_AddData(&sl, facesets[fallback].faces[face_num].data, facesets[fallback].faces[face_num].datalen);
00126 Send_With_Handling(ns, &sl);
00127 }
00128 ns->faces_sent[face_num] |= NS_FACESENT_FACE;
00129 SockList_Term(&sl);
00130 }
00131
00138 void send_image_info(socket_struct *ns, char *params) {
00139 SockList sl;
00140 int i;
00141
00142 SockList_Init(&sl);
00143 SockList_AddPrintf(&sl, "replyinfo image_info\n%d\n%d\n", nrofpixmaps-1, bmaps_checksum);
00144 for (i = 0; i < MAX_FACE_SETS; i++) {
00145 if (facesets[i].prefix) {
00146 SockList_AddPrintf(&sl, "%d:%s:%s:%d:%s:%s:%s",
00147 i, facesets[i].prefix, facesets[i].fullname,
00148 facesets[i].fallback, facesets[i].size,
00149 facesets[i].extension, facesets[i].comment);
00150 }
00151 }
00152 Send_With_Handling(ns, &sl);
00153 SockList_Term(&sl);
00154 }
00155
00165 void send_image_sums(socket_struct *ns, char *params) {
00166 int start, stop;
00167 short i;
00168 char *cp;
00169 SockList sl;
00170
00171 SockList_Init(&sl);
00172
00173 start = atoi(params);
00174 for (cp = params; *cp != '\0'; cp++)
00175 if (*cp == ' ')
00176 break;
00177
00178 stop = atoi(cp);
00179 if (stop < start
00180 || *cp == '\0'
00181 || (stop-start) > 1000
00182 || stop >= nrofpixmaps) {
00183 SockList_AddPrintf(&sl, "replyinfo image_sums %d %d", start, stop);
00184 Send_With_Handling(ns, &sl);
00185 SockList_Term(&sl);
00186 return;
00187 }
00188 SockList_AddPrintf(&sl, "replyinfo image_sums %d %d ", start, stop);
00189
00190 for (i = start; i <= stop; i++) {
00191 int faceset;
00192
00193 if (SockList_Avail(&sl) < 2+4+1+1+strlen(new_faces[i].name)+1) {
00194 LOG(llevError, "send_image_sums: buffer overflow, rejecting range %d..%d\n", start, stop);
00195 SockList_Reset(&sl);
00196 SockList_AddPrintf(&sl, "replyinfo image_sums %d %d", start, stop);
00197 Send_With_Handling(ns, &sl);
00198 SockList_Term(&sl);
00199 return;
00200 }
00201
00202 SockList_AddShort(&sl, i);
00203 ns->faces_sent[i] |= NS_FACESENT_FACE;
00204
00205 faceset = get_face_fallback(ns->faceset, i);
00206 SockList_AddInt(&sl, facesets[faceset].faces[i].checksum);
00207 SockList_AddChar(&sl, faceset);
00208 SockList_AddLen8Data(&sl, new_faces[i].name, strlen(new_faces[i].name)+1);
00209 }
00210 Send_With_Handling(ns, &sl);
00211 SockList_Term(&sl);
00212 }