]> andersk Git - libfaim.git/blobdiff - src/misc.c
Hmmm.
[libfaim.git] / src / misc.c
index 8b83e1e66552e578b32c706b3f86575c70da51e9..dcb978063e7852d751f5913dabb370cac3ca1d0e 100644 (file)
@@ -204,27 +204,35 @@ faim_export unsigned long aim_bos_setbuddylist(struct aim_session_t *sess,
  */
 faim_export unsigned long aim_bos_setprofile(struct aim_session_t *sess,
                                             struct aim_conn_t *conn, 
-                                            char *profile,
-                                            char *awaymsg,
+                                            const char *profile,
+                                            const char *awaymsg,
                                             unsigned short caps)
 {
   struct command_tx_struct *newpacket;
   int i = 0, tmp, caplen;
+  static const char defencoding[] = {"text/aolrtf; charset=\"us-ascii\""};
 
-  if (!(newpacket = aim_tx_new(sess, conn, AIM_FRAMETYPE_OSCAR, 0x0002, 1152+strlen(profile)+1+(awaymsg?strlen(awaymsg):0))))
+  i = 10;
+  if (profile)
+    i += 4+strlen(defencoding)+4+strlen(profile);
+  if (awaymsg)
+    i += 4+strlen(defencoding)+4+strlen(awaymsg);
+  i += 4+512; /* for capabilities */
+
+  if (!(newpacket = aim_tx_new(sess, conn, AIM_FRAMETYPE_OSCAR, 0x0002, i)))
     return -1;
 
-  i += aim_putsnac(newpacket->data, 0x0002, 0x004, 0x0000, sess->snac_nextid);
-  i += aim_puttlv_str(newpacket->data+i, 0x0001, strlen("text/aolrtf; charset=\"us-ascii\""), "text/x-aolrtf; charset=\"us-ascii\"");
-  i += aim_puttlv_str(newpacket->data+i, 0x0002, strlen(profile), profile);
-  /* why do we send this twice?  */
-  i += aim_puttlv_str(newpacket->data+i, 0x0003, strlen("text/aolrtf; charset=\"us-ascii\""), "text/x-aolrtf; charset=\"us-ascii\"");
-  
-  /* Away message -- we send this no matter what, even if its blank */
-  if (awaymsg)
+  i = aim_putsnac(newpacket->data, 0x0002, 0x004, 0x0000, sess->snac_nextid);
+
+  if (profile) {
+    i += aim_puttlv_str(newpacket->data+i, 0x0001, strlen(defencoding), defencoding);
+    i += aim_puttlv_str(newpacket->data+i, 0x0002, strlen(profile), profile);
+  }
+
+  if (awaymsg) {
+    i += aim_puttlv_str(newpacket->data+i, 0x0003, strlen(defencoding), defencoding);
     i += aim_puttlv_str(newpacket->data+i, 0x0004, strlen(awaymsg), awaymsg);
-  else
-    i += aim_puttlv_str(newpacket->data+i, 0x0004, 0x0000, NULL);
+  }
 
   /* Capability information. */
  
@@ -487,41 +495,45 @@ faim_export unsigned long aim_bos_reqbuddyrights(struct aim_session_t *sess,
 }
 
 /*
- * aim_send_warning(struct aim_session_t *sess, 
- *                  struct aim_conn_t *conn, char *destsn, int anon)
- * send a warning to destsn.
- * anon is anonymous or not;
- *  AIM_WARN_ANON anonymous
+ * Send a warning to destsn.
+ * 
+ * Flags:
+ *  AIM_WARN_ANON  Send as an anonymous (doesn't count as much)
  *
- * returns -1 on error (couldn't alloc packet), next snacid on success.
+ * returns -1 on error (couldn't alloc packet), 0 on success. 
  *
  */
-faim_export int aim_send_warning(struct aim_session_t *sess, struct aim_conn_t *conn, char *destsn, int anon)
+faim_export int aim_send_warning(struct aim_session_t *sess, struct aim_conn_t *conn, const char *destsn, unsigned long flags)
 {
-  struct command_tx_struct *newpacket;
-  int curbyte;
+       struct command_tx_struct *newpacket;
+       int curbyte;
+       unsigned short outflags = 0x0000;
 
-  if (!(newpacket = aim_tx_new(sess, conn, AIM_FRAMETYPE_OSCAR, 0x0002, strlen(destsn)+13)))
-    return -1;
+       if (!(newpacket = aim_tx_new(sess, conn, AIM_FRAMETYPE_OSCAR, 0x0002, 
+                                       strlen(destsn)+13)))
+               return -1;
 
-  newpacket->lock = 1;
+       newpacket->lock = 1;
 
-  curbyte  = 0;
-  curbyte += aim_putsnac(newpacket->data+curbyte,
-                        0x0004, 0x0008, 0x0000, sess->snac_nextid);
+       curbyte  = 0;
+       curbyte += aim_putsnac(newpacket->data+curbyte,
+                       0x0004, 0x0008, 0x0000, sess->snac_nextid);
 
-  curbyte += aimutil_put16(newpacket->data+curbyte, (anon & AIM_WARN_ANON)?1:0);
+       if (flags & AIM_WARN_ANON)
+               outflags |= 0x0001;
 
-  curbyte += aimutil_put8(newpacket->data+curbyte, strlen(destsn));
+       curbyte += aimutil_put16(newpacket->data+curbyte, outflags); 
+       curbyte += aimutil_put8(newpacket->data+curbyte, strlen(destsn));
+       curbyte += aimutil_putstr(newpacket->data+curbyte, destsn, strlen(destsn));
 
-  curbyte += aimutil_putstr(newpacket->data+curbyte, destsn, strlen(destsn));
+       newpacket->commandlen = curbyte;
+       newpacket->lock = 0;
 
-  newpacket->commandlen = curbyte;
-  newpacket->lock = 0;
+       aim_tx_enqueue(sess, newpacket);
 
-  aim_tx_enqueue(sess, newpacket);
+       aim_cachesnac(sess, 0x0004, 0x0008, 0x0000, destsn, strlen(destsn)+1);
 
-  return (sess->snac_nextid++);
+       return 0;
 }
 
 /*
This page took 0.036852 seconds and 4 git commands to generate.