Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • aim.c

    r1fdca1b rc79a047  
    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 
    259 int owl_aim_do_send(const char *to, const char *msg, int flags) /* noproto */
     251int owl_aim_send_im(const char *to, const char *msg)
    260252{
    261253  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 */
    298258  return(ret);
    299259}
    300260
    301 int owl_aim_send_im(const char *to, const char *msg)
    302 {
    303   return owl_aim_do_send(to, msg, 0);
    304 }
    305 
    306261int owl_aim_send_awaymsg(const char *to, const char *msg)
    307262{
    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);
    309269}
    310270
     
    11891149  owl_message *m;
    11901150  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    }
    12011205  } 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));
    12071227  }
    12081228
     
    12491269  }
    12501270
    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 
    12531286  return(1);
    12541287}
Note: See TracChangeset for help on using the changeset viewer.