]> andersk Git - libfaim.git/blobdiff - src/search.c
- Fri Mar 23 05:42:11 UTC 2001
[libfaim.git] / src / search.c
index 649a9fce978659017a54671e8d56d42fcd0aca8b..a1024125b1b25dcdf1c3fca9d78f3641046f7333 100644 (file)
@@ -35,58 +35,46 @@ faim_export unsigned long aim_usersearch_address(struct aim_session_t *sess,
 }
 
 
-faim_internal unsigned long aim_parse_searcherror(struct aim_session_t *sess, struct command_rx_struct *command) 
+static int error(struct aim_session_t *sess, aim_module_t *mod, struct command_rx_struct *rx, aim_modsnac_t *snac, unsigned char *data, int datalen)
 {
-  u_int i, ret;
-  int snacid;
+  int ret = 0;
   rxcallback_t userfunc;
-  struct aim_snac_t *snac;
+  struct aim_snac_t *snac2;
 
-  i = 6;
-
-  snacid = aimutil_get32(command->data+i);
-  i += 4;
-  
-  if(!(snac = aim_remsnac(sess, snacid))) {
-    faimdprintf(sess, 2, "faim: couldn't get a snac for %d, probably should crash.\n", snacid);
+  /* XXX the modules interface should have already retrieved this for us */
+  if(!(snac2 = aim_remsnac(sess, snac->id))) {
+    faimdprintf(sess, 2, "couldn't get a snac for 0x%08lx\n", snac->id);
     return 0;
   }
 
-  if((userfunc = aim_callhandler(sess, command->conn, 0x000a, 0x0001)))
-    ret = userfunc(sess, command, snac->data /* address */);
-  else
-    ret = 0;
+  if ((userfunc = aim_callhandler(sess, rx->conn, snac->family, snac->subtype)))
+    ret = userfunc(sess, rx, snac2->data /* address */);
 
-  if(snac) {
-    if(snac->data)
-      free(snac->data);
-    free(snac);
+  /* XXX freesnac()? */
+  if (snac2) {
+    if(snac2->data)
+      free(snac2->data);
+    free(snac2);
   }
 
   return ret;
 }
-       
-  
-faim_internal unsigned long aim_parse_searchreply(struct aim_session_t *sess, struct command_rx_struct *command)
+
+static int reply(struct aim_session_t *sess, aim_module_t *mod, struct command_rx_struct *rx, aim_modsnac_t *snac, unsigned char *data, int datalen)
 {
-  u_int i, j, m, ret;
-  int snacid;
+  unsigned int j, m, ret = 0;
   struct aim_tlvlist_t *tlvlist;
   char *cur = NULL, *buf = NULL;
   rxcallback_t userfunc;
-  struct aim_snac_t *snac;
-
-  i = 6;
+  struct aim_snac_t *snac2;
 
-  snacid = aimutil_get32(command->data+i);
-  i += 4;
-
-  if(!(snac = aim_remsnac(sess, snacid))) {
-    faimdprintf(sess, 2, "faim: couldn't get a snac for %d, probably should crash.\n", snacid);
+  if (!(snac2 = aim_remsnac(sess, snac->id))) {
+    faimdprintf(sess, 2, "faim: couldn't get a snac for 0x%08lx\n", snac->id);
     return 0;
   }
 
-  tlvlist = aim_readtlvchain(command->data+i, command->commandlen-i);
+  if (!(tlvlist = aim_readtlvchain(data, datalen)))
+    return 0;
 
   j = 0;
 
@@ -104,15 +92,14 @@ faim_internal unsigned long aim_parse_searchreply(struct aim_session_t *sess, st
 
   aim_freetlvchain(&tlvlist);
 
-  if((userfunc = aim_callhandler(sess, command->conn, 0x000a, 0x0003)))
-    ret = userfunc(sess, command, snac->data /* address */, j, buf);
-  else
-    ret = 0;
+  if ((userfunc = aim_callhandler(sess, rx->conn, snac->family, snac->subtype)))
+    ret = userfunc(sess, rx, snac2->data /* address */, j, buf);
 
-  if(snac) {
-    if(snac->data)
-      free(snac->data);
-    free(snac);
+  /* XXX freesnac()? */
+  if(snac2) {
+    if(snac2->data)
+      free(snac2->data);
+    free(snac2);
   }
 
   if(buf)
@@ -120,3 +107,31 @@ faim_internal unsigned long aim_parse_searchreply(struct aim_session_t *sess, st
 
   return ret;
 }
+
+static int snachandler(struct aim_session_t *sess, aim_module_t *mod, struct command_rx_struct *rx, aim_modsnac_t *snac, unsigned char *data, int datalen)
+{
+
+  faimdprintf(sess, 0, "%s: snachandler: got %x/%x\n", mod->name, snac->family, snac->subtype);
+
+  if (snac->family != mod->family)
+    return 0;
+
+  if (snac->subtype == 0x0001)
+    return error(sess, mod, rx, snac, data, datalen);
+  else if (snac->subtype == 0x0003)
+    return reply(sess, mod, rx, snac, data, datalen);
+
+  return 0;
+}
+
+faim_internal int search_modfirst(struct aim_session_t *sess, aim_module_t *mod)
+{
+
+  mod->family = 0x000a;
+  mod->version = 0x0000;
+  mod->flags = 0;
+  strncpy(mod->name, "search", sizeof(mod->name));
+  mod->snachandler = snachandler;
+
+  return 0;
+}
This page took 0.035331 seconds and 4 git commands to generate.