this patch adds support for protocol plugins in the fifo.cpp area. 

What has been changed in the interface ? The buddy fields.
Before this a buddy was an uin or an user alias. The new buddy is like:
  buddy := uin | [EMAIL PROTECTED]
  uin := icq's uin
  protocol := any registered CProtoPlugin::Name()
  alias := any char. @ is escaped with @@

This maintains compatibilty in all cases except in aliases with @.

Eg:
   [EMAIL PROTECTED] is juam in the aim protocol
   juam is juam in the icq protocol
   12345678 is a uin in the icq protocol

All CICQDaemon::icq* calls were changed to CICQDaemon::Proto* (the exceptions 
were the sms commands). The only command that is not working is ui_message, 
becouse it needs some change in the qt-gui.

Regards,
        Juan.
-- 
Buenos Aires, Argentina                          9°C with winds at 14 km/h WSW




diff -ur -x Makefile -x 'config*' -x 'Makefile*' -x CVS -x '*.m4' -x .deps -x .libs -x autom4te.cache -x '*.moc' -x '*.o' -x '*.la' -x stamp-h1 cvs/include/licq_icqd.h licq/include/licq_icqd.h
--- cvs/include/licq_icqd.h	2003-07-02 12:07:49.000000000 -0300
+++ licq/include/licq_icqd.h	2003-07-08 18:50:01.000000000 -0300
@@ -276,11 +276,11 @@
   int RegisterProtoPlugin();
   char *ProtoPluginName(unsigned long);
 
-  void PluginUIViewEvent(unsigned long nUin) {
-  	PushPluginSignal(new CICQSignal(SIGNAL_UI_VIEWEVENT, 0, nUin, 0, 0));
+  void PluginUIViewEvent(const char *szId, unsigned long nPPID ) {
+    PushPluginSignal(new CICQSignal(SIGNAL_UI_VIEWEVENT, 0, szId, nPPID, 0, 0));
   }
-  void PluginUIMessage(unsigned long nUin ) {
-  	PushPluginSignal(new CICQSignal(SIGNAL_UI_MESSAGE,0,nUin, 0,0));
+  void PluginUIMessage(const char *szId, unsigned long nPPID) {
+    PushPluginSignal(new CICQSignal(SIGNAL_UI_MESSAGE, 0, szId, nPPID, 0,0));
   }
 
   void UpdateAllUsers();
diff -ur -x Makefile -x 'config*' -x 'Makefile*' -x CVS -x '*.m4' -x .deps -x .libs -x autom4te.cache -x '*.moc' -x '*.o' -x '*.la' -x stamp-h1 cvs/plugins/qt-gui/src/userinfodlg.cpp licq/plugins/qt-gui/src/userinfodlg.cpp
diff -ur -x Makefile -x 'config*' -x 'Makefile*' -x CVS -x '*.m4' -x .deps -x .libs -x autom4te.cache -x '*.moc' -x '*.o' -x '*.la' -x stamp-h1 cvs/src/fifo.cpp licq/src/fifo.cpp
--- cvs/src/fifo.cpp	2003-05-24 09:26:43.000000000 -0300
+++ licq/src/fifo.cpp	2003-07-09 00:02:55.000000000 -0300
@@ -160,46 +160,157 @@
 }
 
 
-/*! \brief Given an ascii string get the uin
+static bool buffer_is_uin(const char *buffer)
+{
+  unsigned len = 0;
+  
+  for( ; buffer && isdigit(*buffer) ; buffer++ , len++ )
+    ;
+
+  return (len>0 && len <= MAX_UIN_DIGITS) && *buffer=='\0';
+}
+
+static bool buffer_get_ids(CICQDaemon *d, char *buffer, 
+                           char **szId, unsigned long *nPPID, 
+                           bool *missing_protocol)
+{
+  bool found = false;
+  char *write = buffer;
+
+  *missing_protocol = true;
+  *szId = write;
+  for( ; *buffer && !found ; buffer++ )
+  {
+    if( *buffer == '@' ) 
+    {
+      if( *(buffer+1)== '@' ) // @@ -> @
+      {
+        buffer++;
+        *write = '@';
+        write++;
+      }
+      else
+        found = true;
+    }
+    else
+    {
+      *write = *buffer;
+      write++;
+    }
+  }
+  *write = 0;
+  
+  if( found )
+  { 
+    ProtoPluginsList l;
+    ProtoPluginsListIter it;
+
+    found = false;
+    *missing_protocol = false;
+    
+    d->ProtoPluginList(l);
+    for( it = l.begin() ; !found && it != l.end() ; it++)
+    {
+      if( !strcmp( (*it)->Name(), buffer) )
+      {
+        *nPPID = (*it)->Id();
+        found = true;
+      }
+    }
+  }
+
+  return found;
+}
+
+/*! \brief Given an ascii string gets the szId and the nPPID
  *
- *  Given an ascii string get the uin
- *  1. If all chars are digits then:
- *    a) if bList flag is on, check if it is in the list
- *    b) else return 
- *  2. If that fail try with alias Params.
+ *  -# If all chars are digits then:
+ *    -# asume it is an icq's uin, and if bList flag is on, then check if it 
+ *       is in the list
+ *  -# If that fail try with alias Params.
  * 
- *  \param  buff     buffer to convert
- *  \param  bOnList  fail if buff is an uin number and it is not in user list
- *  \param  nUin     address where the uin is saved
+ *  \param  buff     string to convert
+ *  \param  bOnList  fail if #buff is not in the list
+ *  \param  szId     address where the szId is returned
+ *  \param  nPPID    address where the nPPID is returned
  *
  * \returns true on success
  */
-bool atouin( const char *buff, bool bOnList, unsigned long *nUin)
-{
-  const char *p;
-
+static bool atoid( const char *buff, bool bOnList, 
+                   char **szId, unsigned long *nPPID,
+                   CICQDaemon *daemon)
+{ 
+  char *_szId = 0;
+  unsigned long _nPPID = 0;
+  bool ret = false, missing_protocol=true;
+  char *s = 0;
+  
   if (buff == NULL) 
-    return false; 
-
-  for( p=buff; isdigit(*p) ; p++ )
-    ;
-  if( *p == '\0' && bOnList && gUserManager.IsOnList(atol(buff)) || 
-      *p == '\0' && !bOnList)
-    *nUin = atol(buff);
-  else
+    ret = false; 
+  else if( (s=strdup(buff)) == 0 )
+    ret  = false;
+  else if ( buffer_is_uin(buff) && 
+           ((bOnList && gUserManager.IsOnList(buff, LICQ_PPID)) || !bOnList  ))
+  {
+    _nPPID = LICQ_PPID;
+    _szId = s;
+    ret = true;
+  }
+  else if( buffer_get_ids(daemon, s, &_szId, &_nPPID, &missing_protocol) )
   {
-    *nUin = 0; 
-    FOR_EACH_USER_START(LOCK_R)
+    if(bOnList)
     {
-      if (strcasecmp(buff, pUser->GetAlias()) == 0)
+      FOR_EACH_PROTO_USER_START(_nPPID, LOCK_R)
       {
-        *nUin = pUser->Uin();
-        FOR_EACH_USER_BREAK;
+        if( strcasecmp(_szId, pUser->GetAlias()) == 0)
+        {
+          ret = true;
+          FOR_EACH_PROTO_USER_BREAK
+        }
       }
+      FOR_EACH_PROTO_USER_END
+    }
+    else
+      ret = false;
+  }
+  else if( missing_protocol )
+  {  
+     /* assume ICQ */
+    _nPPID = LICQ_PPID;
+    
+    FOR_EACH_PROTO_USER_START(_nPPID, LOCK_R)
+    {
+        if( strcasecmp(s, pUser->GetAlias()) == 0)
+        {
+          _szId = (char *) malloc(26);
+          if( _szId )
+          { 
+            sprintf(_szId, "%ld", pUser->Uin() );
+            ret = true;
+          }
+          FOR_EACH_PROTO_USER_BREAK
+        }
     }
-    FOR_EACH_USER_END
+    FOR_EACH_PROTO_USER_END
+    free(s);
+    s = 0;
   }
-  return !(*nUin == 0);
+  else
+  {
+    free(s);
+    s = 0;
+    ret = false;
+  }
+
+  if( ret )
+  {
+    if( szId )
+      *szId = _szId;
+    if( nPPID )
+      *nPPID = _nPPID;
+  }
+  
+  return ret;
 }
 
 // status 
@@ -275,8 +386,8 @@
 static int fifo_message ( int argc, const char *const *argv, void *data)
 {
   CICQDaemon *d = (CICQDaemon *) data;;
-  unsigned long nUin; 
-  const char *szUin = argv[1];
+  unsigned long nPPID;
+  char *szId = 0;
 
   if( argc < 3 )
   {
@@ -284,10 +395,12 @@
     return -1;
   }
 
-  if( atouin(szUin,false,&nUin) )
-    d->icqSendMessage(nUin, argv[2], false, false);
+  if( atoid(argv[1], false, &szId, &nPPID, d) )
+    d->ProtoSendMessage(szId, nPPID, argv[2], false, false);
   else
-    ReportBadBuddy(argv[0],szUin);
+    ReportBadBuddy(argv[0], argv[1]);
+
+  free(szId);
 
   return 0;
 }
@@ -295,9 +408,10 @@
 // url <buddy> <url> [<description>]
 static int fifo_url ( int argc, const char *const *argv, void *data)
 {
-  unsigned long nUin;
   const char *szDescr;
   CICQDaemon *d = (CICQDaemon *) data;
+  unsigned long nPPID;
+  char *szId = 0;
 
   if( argc < 3 )
   {
@@ -305,14 +419,16 @@
     return -1;
   }
 
-  if( atouin (argv[1],false,&nUin) )
+  if( atoid(argv[1], false, &szId, &nPPID, d) )
   {
     szDescr = (argc > 3) ? argv[3] : "" ;
-    d->icqSendUrl(nUin, argv[2], szDescr, false, false);
+    d->ProtoSendUrl(szId, nPPID, argv[2], szDescr, false, false);
   }
   else
     ReportBadBuddy(argv[0],argv[1]);
 
+  free(szId);
+
   return 0;
 }
 
@@ -320,8 +436,8 @@
 static int fifo_sms(int argc, const char *const *argv, void *data)
 {
   CICQDaemon *d = (CICQDaemon *) data;
-  unsigned long nUin;
-  const char *szUin = argv[1];
+  unsigned long nPPID;
+  char *szId = 0;
 
   if (argc < 3)
   {
@@ -329,22 +445,30 @@
     return -1;
   }
 
-  if (atouin(szUin, false, &nUin))
-  {
-    ICQUser *u = gUserManager.FetchUser(nUin, LOCK_R);
-    if (u != NULL)
+  if (atoid(argv[1], false, &szId, &nPPID, d) )
+  { 
+    if( nPPID == LICQ_PPID )
     {
-      const char *szNumber = u->GetCellularNumber();
-      if (strlen(szNumber))
-        d->icqSendSms(szNumber, argv[2], nUin);
-      else
-        gLog.Error("%sUnable to send SMS to %lu, no SMS number found.\n", L_ERRORxSTR, nUin);
+      ICQUser *u = gUserManager.FetchUser(szId, nPPID, LOCK_R);
+      if (u != NULL)
+      {
+        const char *szNumber = u->GetCellularNumber();
+        if (strlen(szNumber))
+          d->icqSendSms(szNumber, argv[2], u->Uin() );
+        else
+          gLog.Error("%sUnable to send SMS to %s, no SMS number found.\n",
+                     L_ERRORxSTR, szId);
 
-      gUserManager.DropUser(u);
+        gUserManager.DropUser(u);
+      }
     }
+    else
+      gLog.Info("%s `%s': bad protol. ICQ only alowed\n", L_FIFOxSTR, argv[0]);
+
+    free(szId);
   }
   else
-    ReportBadBuddy(argv[0],szUin);
+    ReportBadBuddy(argv[0], argv[1]);
 
   return 0;
 }
@@ -375,14 +499,14 @@
     return -1;
   }
 
-  // TODO: its safe to call strerror ?
   if ( !Redirect(argv[1]) )
   {
     gLog.Warn("%s %s: redirection to \"%s\" failed: %s.\n",
               L_WARNxSTR,argv[0], argv[1],strerror(errno));
   }
   else
-    gLog.Info("%s %s: output redirected to \"%s\".\n", L_INITxSTR, argv[0],argv[1]);
+    gLog.Info("%s %s: output redirected to \"%s\".\n", L_INITxSTR, argv[0],
+             argv[1]);
 
   return 0;
 }
@@ -402,9 +526,10 @@
 
 // adduser <buddy>
 static int fifo_adduser ( int argc, const char *const *argv, void *data)
-{
-  unsigned long nUin;
+{ 
   CICQDaemon *d = (CICQDaemon *) data;
+  unsigned long nPPID;
+  char *szId = 0;
 
   if( argc  == 1 )
   {
@@ -412,10 +537,11 @@
     return -1;
   }
 
-  if( atouin(argv[1],false,&nUin) )
-    d->AddUserToList(nUin);
+  if( atoid(argv[1], false, &szId, &nPPID, d) )
+    d->AddUserToList(szId, nPPID);
   else
     ReportBadBuddy(argv[0],argv[1]);
+  free(szId);
 
   return 0;
 }
@@ -423,33 +549,36 @@
 // userinfo <buddy>
 static int fifo_userinfo ( int argc, const char *const *argv, void *data)
 {
-  unsigned long nUin;
-  ICQUser *u;
   CICQDaemon *d = (CICQDaemon *) data;
+  unsigned long nPPID;
+  char *szId = 0; 
+  ICQUser *u;
+  int ret = -1; 
 
   if ( argc == 1 )
-  {
     ReportMissingParams(argv[0]);
-    return -1;
-  }
-
-  if( !atouin(argv[1],true,&nUin) )
-  {
+  else if( !atoid(argv[1], true, &szId, &nPPID, d) )
     ReportBadBuddy(argv[0],argv[1]);
-    return -1;
-  }
-
-  u = gUserManager.FetchUser(nUin, LOCK_R);
-  if (u == NULL)
-    gLog.Warn("%s %s: user %ld not on contact list, not retrieving"
-              "info.\n", L_WARNxSTR,argv[0],nUin);
+  else if( nPPID != LICQ_PPID )
+     gLog.Info("%s `%s': bad protol. ICQ only alowed\n", L_FIFOxSTR, argv[0]);
   else
   {
-    gUserManager.DropUser(u);
-    d->icqRequestMetaInfo(nUin);
+    u = gUserManager.FetchUser(szId, nPPID, LOCK_R);
+    if (u == NULL)
+      gLog.Warn("%s %s: user %s not on contact list, not retrieving"
+                "info.\n", L_WARNxSTR, argv[0], szId);
+    else
+    {
+      unsigned long nUin = u->Uin();
+      gUserManager.DropUser(u);
+      d->icqRequestMetaInfo(nUin);
+      ret = 0;
+    }
   }
-
-  return 0;
+  
+  free( szId );
+  
+  return ret;
 }
 
 // exit
@@ -464,18 +593,28 @@
 static int fifo_ui_viewevent ( int argc, const char *const *argv, void *data)
 {
   CICQDaemon *d = (CICQDaemon *) data; 
-  unsigned long nUin;
-
+  unsigned long nPPID;
+  char *szId = 0; 
+  char *none = "0";
+  
   if( argc ==1 )
-    nUin = 0;
-  else if( !atouin(argv[1],true,&nUin) )
   {
-    ReportBadBuddy(argv[0],argv[1]);
-    return -1;
+    szId = none;
+    nPPID = 0;
   }
+  else if( !atoid(argv[1], true, &szId, &nPPID, d) )
+  {  
+    ReportBadBuddy(argv[0],argv[1]);
+    free(szId);
 
-  d->PluginUIViewEvent(nUin);
+    return 0;
+  }
   
+  d->PluginUIViewEvent(szId, nPPID);
+
+  if( szId != none )
+    free(szId);
+
   return 0;
 }
 
@@ -483,21 +622,23 @@
 static int fifo_ui_message ( int argc, const char *const *argv, void *data)
 {
   CICQDaemon *d = (CICQDaemon *) data;
-  unsigned long nUin;
-  int nRet=0;
+  unsigned long nPPID = 0;
+  char *szId = 0;
+  int nRet = 0;
 
   if ( argc == 1 )
   {
     ReportMissingParams(argv[0]);
     nRet = -1;
-  } 
-  else if( atouin(argv[1],true,&nUin) )
-    d->PluginUIMessage(nUin);
+  }
+  else if( atoid(argv[1], true, &szId, &nPPID, d) )
+    d->PluginUIMessage(szId, nPPID);
   else
   {
     ReportBadBuddy(argv[0],argv[1]);
     return -1;
   }
+  free(szId);
 
   return nRet;
 }

Attachment: pgp00000.pgp
Description: signature

Reply via email to