Changeset e1e59a7 for aim.c


Ignore:
Timestamp:
Oct 10, 2009, 9:24:18 PM (15 years ago)
Author:
Nelson Elhage <nelhage@mit.edu>
Branches:
master, release-1.10, release-1.4, release-1.5, release-1.6, release-1.7, release-1.8, release-1.9
Children:
69c3878
Parents:
737b8f1 (diff), 1fdca1b (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:
Merge branch 'unicode-fixes'
File:
1 edited

Legend:

Unmodified
Added
Removed
  • aim.c

    rc79a047 r1fdca1b  
    249249}
    250250
     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
     259int owl_aim_do_send(const char *to, const char *msg, int flags) /* noproto */
     260{
     261  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
     298  return(ret);
     299}
     300
    251301int owl_aim_send_im(const char *to, const char *msg)
    252302{
    253   int ret;
    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 */
    258   return(ret);
     303  return owl_aim_do_send(to, msg, 0);
    259304}
    260305
    261306int owl_aim_send_awaymsg(const char *to, const char *msg)
    262307{
    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);
     308  return owl_aim_do_send(to, msg, AIM_IMFLAGS_AWAY);
    269309}
    270310
     
    11491189  owl_message *m;
    11501190  char *stripmsg, *nz_screenname, *wrapmsg;
    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     }
     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);
    12051201  } else {
    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));
     1202    realmsg = owl_strdup(args->msg);
     1203  }
     1204
     1205  if (!realmsg) {
     1206    realmsg = owl_strdup("[Error decoding incoming IM]");
    12271207  }
    12281208
     
    12691249  }
    12701250
    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  
     1251  owl_free(realmsg);
     1252
    12861253  return(1);
    12871254}
Note: See TracChangeset for help on using the changeset viewer.