Changes in aim.c [1fdca1b:c79a047]
Legend:
- Unmodified
- Added
- Removed
-
aim.c
r1fdca1b rc79a047 249 249 } 250 250 251 /* 252 * I got these constants by skimming libfaim/im.c 253 * 254 * "UNICODE" actually means "UCS-2BE". 255 */ 256 #define AIM_CHARSET_ISO_8859_1 0x0003 257 #define AIM_CHARSET_UNICODE 0x0002 258 259 int owl_aim_do_send(const char *to, const char *msg, int flags) /* noproto */ 251 int owl_aim_send_im(const char *to, const char *msg) 260 252 { 261 253 int ret; 262 char *encoded; 263 struct aim_sendimext_args args; 264 gsize len; 265 266 encoded = g_convert(msg, -1, "ISO-8859-1", "UTF-8", NULL, &len, NULL); 267 if (encoded) { 268 owl_function_debugmsg("Encoded outgoing AIM as ISO-8859-1"); 269 args.charset = AIM_CHARSET_ISO_8859_1; 270 args.charsubset = 0; 271 args.flags = AIM_IMFLAGS_ISO_8859_1; 272 } else { 273 owl_function_debugmsg("Encoding outgoing IM as UCS-2BE"); 274 encoded = g_convert(msg, -1, "UCS-2BE", "UTF-8", NULL, &len, NULL); 275 if (!encoded) { 276 /* 277 * TODO: Strip or HTML-encode characters, or figure out how to 278 * send in a differen charset. 279 */ 280 owl_function_error("Unable to encode outgoing AIM message in UCS-2"); 281 return 1; 282 } 283 284 args.charset = AIM_CHARSET_UNICODE; 285 args.charsubset = 0; 286 args.flags = AIM_IMFLAGS_UNICODE; 287 } 288 289 args.destsn = to; 290 args.msg = encoded; 291 args.msglen = len; 292 args.flags |= flags; 293 294 ret=aim_im_sendch1_ext(owl_global_get_aimsess(&g), &args); 295 296 owl_free(encoded); 297 254 255 ret=aim_im_sendch1(owl_global_get_aimsess(&g), to, 0, msg); 256 257 /* I don't know how to check for an error yet */ 298 258 return(ret); 299 259 } 300 260 301 int owl_aim_send_im(const char *to, const char *msg)302 {303 return owl_aim_do_send(to, msg, 0);304 }305 306 261 int owl_aim_send_awaymsg(const char *to, const char *msg) 307 262 { 308 return owl_aim_do_send(to, msg, AIM_IMFLAGS_AWAY); 263 int ret; 264 265 ret=aim_im_sendch1(owl_global_get_aimsess(&g), to, AIM_IMFLAGS_AWAY, msg); 266 267 /* I don't know how to check for an error yet */ 268 return(ret); 309 269 } 310 270 … … 1189 1149 owl_message *m; 1190 1150 char *stripmsg, *nz_screenname, *wrapmsg; 1191 char *realmsg = NULL; 1192 1193 if (!args->msg) { 1194 realmsg = owl_strdup(""); 1195 } else if (args->icbmflags & AIM_IMFLAGS_UNICODE) { 1196 realmsg = g_convert(args->msg, args->msglen, "UTF-8", "UCS-2BE", 1197 NULL, NULL, NULL); 1198 } else if(args->icbmflags & AIM_IMFLAGS_ISO_8859_1) { 1199 realmsg = g_convert(args->msg, args->msglen, "UTF-8", "ISO-8859-1", 1200 NULL, NULL, NULL); 1151 char realmsg[8192+1] = ""; 1152 /* int clienttype = AIM_CLIENTTYPE_UNKNOWN; */ 1153 1154 /* clienttype = aim_fingerprintclient(args->features, args->featureslen); */ 1155 1156 /* 1157 printf("icbm: sn = \"%s\"\n", userinfo->sn); 1158 printf("icbm: probable client type: %d\n", clienttype); 1159 printf("icbm: warnlevel = %f\n", aim_userinfo_warnlevel(userinfo)); 1160 printf("icbm: flags = 0x%04x = ", userinfo->flags); 1161 printuserflags(userinfo->flags); 1162 printf("\n"); 1163 */ 1164 1165 /* 1166 printf("icbm: membersince = %lu\n", userinfo->membersince); 1167 printf("icbm: onlinesince = %lu\n", userinfo->onlinesince); 1168 printf("icbm: idletime = 0x%04x\n", userinfo->idletime); 1169 printf("icbm: capabilities = %s = 0x%08lx\n", (userinfo->present & AIM_USERINFO_PRESENT_CAPABILITIES) ? "present" : "not present", userinfo->capabilities); 1170 */ 1171 1172 /* 1173 printf("icbm: icbmflags = "); 1174 if (args->icbmflags & AIM_IMFLAGS_AWAY) printf("away "); 1175 if (args->icbmflags & AIM_IMFLAGS_ACK) printf("ackrequest "); 1176 if (args->icbmflags & AIM_IMFLAGS_OFFLINE) printf("offline "); 1177 if (args->icbmflags & AIM_IMFLAGS_BUDDYREQ) printf("buddyreq "); 1178 if (args->icbmflags & AIM_IMFLAGS_HASICON) printf("hasicon "); 1179 printf("\n"); 1180 */ 1181 1182 /* 1183 if (args->icbmflags & AIM_IMFLAGS_CUSTOMCHARSET) { 1184 printf("icbm: encoding flags = {%04x, %04x}\n", args->charset, args->charsubset); 1185 } 1186 */ 1187 1188 /* 1189 * Quickly convert it to eight bit format, replacing non-ASCII UNICODE 1190 * characters with their equivelent HTML entity. 1191 */ 1192 if (args->icbmflags & AIM_IMFLAGS_UNICODE) { 1193 int i; 1194 1195 for (i=0; i<args->msglen; i+=2) { 1196 fu16_t uni; 1197 1198 uni = ((args->msg[i] & 0xff) << 8) | (args->msg[i+1] & 0xff); 1199 if ((uni < 128) || ((uni >= 160) && (uni <= 255))) { /* ISO 8859-1 */ 1200 snprintf(realmsg+strlen(realmsg), sizeof(realmsg)-strlen(realmsg), "%c", uni); 1201 } else { /* something else, do UNICODE entity */ 1202 snprintf(realmsg+strlen(realmsg), sizeof(realmsg)-strlen(realmsg), "&#%04x;", uni); 1203 } 1204 } 1201 1205 } else { 1202 realmsg = owl_strdup(args->msg); 1203 } 1204 1205 if (!realmsg) { 1206 realmsg = owl_strdup("[Error decoding incoming IM]"); 1206 /* 1207 * For non-UNICODE encodings (ASCII and ISO 8859-1), there is 1208 * no need to do anything special here. Most 1209 * terminals/whatever will be able to display such characters 1210 * unmodified. 1211 * 1212 * Beware that PC-ASCII 128 through 159 are _not_ actually 1213 * defined in ASCII or ISO 8859-1, and you should send them as 1214 * UNICODE. WinAIM will send these characters in a UNICODE 1215 * message, so you need to do so as well. 1216 * 1217 * You may not think it necessary to handle UNICODE messages. 1218 * You're probably wrong. For one thing, Microsoft "Smart 1219 * Quotes" will be sent by WinAIM as UNICODE (not HTML UNICODE, 1220 * but real UNICODE). If you don't parse UNICODE at all, your 1221 * users will get a blank message instead of the message 1222 * containing Smart Quotes. 1223 * 1224 */ 1225 if (args->msg && args->msglen) 1226 strncpy(realmsg, args->msg, sizeof(realmsg)); 1207 1227 } 1208 1228 … … 1249 1269 } 1250 1270 1251 owl_free(realmsg); 1252 1271 /* 1272 if (realmsg) { 1273 int i = 0; 1274 while (realmsg[i] == '<') { 1275 if (realmsg[i] == '<') { 1276 while (realmsg[i] != '>') 1277 i++; 1278 i++; 1279 } 1280 } 1281 tmpstr = realmsg+i; 1282 faimtest_handlecmd(sess, conn, userinfo, tmpstr); 1283 } 1284 */ 1285 1253 1286 return(1); 1254 1287 }
Note: See TracChangeset
for help on using the changeset viewer.