Changeset 4176 for trunk/rms

Show
Ignore:
Timestamp:
08/05/05 22:44:09 (3 years ago)
Author:
emostar
Message:

Patch by Philip for some improvements that are utilized in his licqweb.
I removed an md5.h include... that isn't used, right?

Location:
trunk/rms/src
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • trunk/rms/src/rms.cpp

    r4144 r4176  
    4444const unsigned short CODE_VIEWxCHAT= 210; 
    4545const unsigned short CODE_VIEWxFILE = 211; 
     46const unsigned short CODE_STATUSxDONE = 212; 
    4647const unsigned short CODE_VIEWxTIME = 220; 
    4748const unsigned short CODE_VIEWxFLAGS = 221; 
     
    5354const unsigned short CODE_SECURExCLOSE = 227; 
    5455const unsigned short CODE_SECURExSTAT = 228; 
     56const unsigned short CODE_NOTIFYxON = 229; 
     57const unsigned short CODE_NOTIFYxOFF = 230; 
    5558const unsigned short CODE_VIEWxUNKNOWN = 299; 
    5659// 300 - further action required 
     
    7275const unsigned short CODE_ADDUSERxERROR = 503; 
    7376const unsigned short CODE_SECURExNOTCOMPILED = 504; 
     77 
     78const unsigned short CODE_NOTIFYxSTATUS = 600; 
     79const unsigned short CODE_NOTIFYxMESSAGE = 601; 
    7480 
    7581const unsigned short STATE_UIN = 1; 
     
    117123    "Open/close/check secure channel { <uin> [ <open|close> ] } ." }, 
    118124  { "STATUS", &CRMSClient::Process_STATUS, 
    119     "Set or show status.  Argument is new status, or blank to display current." }, 
     125    "Set or show status.  Argument is new status and protocol, or blank to display current. { [ <status>[.<protocol>] ] }." }, 
    120126  { "TERM", &CRMSClient::Process_TERM, 
    121127    "Terminate the licq daemon." }, 
     
    126132  { "SMS", &CRMSClient::Process_SMS, 
    127133    "Send an sms { <uin> }." }, 
     134  { "NOTIFY", &CRMSClient::Process_NOTIFY, 
     135    "Notify events" }, 
    128136}; 
    129137 
     
    197205      gLog.Error("Could not start server on port %u, " 
    198206                 "maybe this port is already in use?\n", nPort); 
    199       printf("Could not start server on port %u, " 
    200              "maybe this port is already in use?\n", nPort); 
    201207      return 1; 
    202208    }; 
     
    250256              if ((*iter)->Activity() == -1) 
    251257              { 
     258                clients.erase(iter); 
    252259                delete *iter; 
    253                 clients.erase(iter); 
    254260                if (clients.size() == 0 && log != NULL) 
    255261                  log->SetLogTypes(0); 
     
    347353  { 
    348354  case SIGNAL_UPDATExUSER: 
     355    if (s->SubSignal() == USER_STATUS) 
     356    { 
     357      ICQUser *u = gUserManager.FetchUser(s->Id(), s->PPID(), LOCK_R); 
     358      if (u) 
     359      { 
     360        ClientList::iterator iter; 
     361        for (iter = clients.begin(); iter != clients.end(); iter++) 
     362        { 
     363          if ((*iter)->m_bNotify) 
     364          { 
     365            char format[128], *ubuf; 
     366            strcpy(format, "%u %P %-20a %3m %s"); 
     367            ubuf = u->usprintf(format); 
     368            fprintf((*iter)->fs, "%d %s\n", CODE_NOTIFYxSTATUS, ubuf); 
     369            free(ubuf); 
     370            fflush((*iter)->fs); 
     371          } 
     372        } 
     373        gUserManager.DropUser(u); 
     374      } 
     375      break; 
     376    } 
     377    else if (s->SubSignal() == USER_EVENTS) 
     378    { 
     379      ICQUser *u = gUserManager.FetchUser(s->Id(), s->PPID(), LOCK_R); 
     380      if (u) 
     381      { 
     382        ClientList::iterator iter; 
     383        for (iter = clients.begin(); iter != clients.end(); iter++) 
     384        { 
     385          if ((*iter)->m_bNotify) 
     386          { 
     387            char format[128], *ubuf; 
     388            strcpy(format, "%u %P %3m"); 
     389            ubuf = u->usprintf(format); 
     390            fprintf((*iter)->fs, "%d %s\n", CODE_NOTIFYxMESSAGE, ubuf); 
     391            free(ubuf); 
     392            fflush((*iter)->fs); 
     393          } 
     394        } 
     395        gUserManager.DropUser(u); 
     396      } 
     397    } 
    349398  case SIGNAL_UPDATExLIST: 
    350399  case SIGNAL_LOGON: 
     
    401450 
    402451  gLog.Info("%sClient connected from %s.\n", L_RMSxSTR, sock.RemoteIpStr(buf)); 
    403  
    404452  fs = fdopen(sock.Descriptor(), "r+"); 
    405453  fprintf(fs, "Licq Remote Management Server v%s\n" 
     
    412460  m_nLogTypes = 0; 
    413461  data_line_pos = 0; 
     462  m_bNotify = false; 
    414463} 
    415464 
     
    593642      ICQOwner *o = gUserManager.FetchOwner(LOCK_R); 
    594643      bool ok = (strcmp(m_szCheckId, o->IdString()) == 0 && 
    595          strcmp(o->Password(), data_line) == 0); 
     644         (strcmp(o->Password(), data_line) == 0)); 
    596645      free(m_szCheckId); 
    597646      m_szCheckId = 0; 
     
    759808      if (o) 
    760809      { 
    761         fprintf(fs, "%d %s %s\n", CODE_STATUS, (*it)->Name(), o->StatusStr()); 
     810        fprintf(fs, "%d %s %s %s\n", CODE_STATUS, o->IdString(), (*it)->Name(), o->StatusStr()); 
    762811        gUserManager.DropOwner((*it)->PPID()); 
    763812      } 
    764813    } 
     814    fprintf(fs, "%d\n", CODE_STATUSxDONE); 
    765815    return fflush(fs); 
    766816  } 
    767817 
    768818  // Set status 
    769   unsigned long nStatus = StringToStatus(data_arg); 
     819  string strData(data_arg); 
     820  string::size_type nPos = strData.find_last_of("."); 
     821  if (nPos == string::npos) 
     822  { 
     823    unsigned long nStatus = StringToStatus(data_arg); 
     824    ProtoPluginsList l; 
     825    ProtoPluginsListIter it; 
     826    licqDaemon->ProtoPluginList(l); 
     827    for (it = l.begin(); it != l.end(); it++) 
     828    { 
     829      ChangeStatus((*it)->PPID(), nStatus, data_arg); 
     830    } 
     831  } 
     832  else 
     833  { 
     834    string strStatus(strData, 0, strData.find_last_of(".")); 
     835    string strProtocol(strData, strData.find_last_of(".")+1, strData.size()); 
     836    unsigned long nPPID = GetProtocol(strProtocol.c_str()); 
     837    char *szStatus = strdup(strStatus.c_str()); 
     838    unsigned long nStatus = StringToStatus(szStatus); 
     839    ChangeStatus(nPPID, nStatus, szStatus); 
     840    free(szStatus); 
     841  } 
     842  fprintf(fs, "%d Done setting status\n", CODE_STATUSxDONE); 
     843  return fflush(fs); 
     844} 
     845 
     846int CRMSClient::ChangeStatus(unsigned long nPPID, unsigned long nStatus, const char *szStatus) 
     847{ 
    770848  if (nStatus == INT_MAX) 
    771849  { 
    772850    fprintf(fs, "%d Invalid status.\n", CODE_INVALIDxSTATUS); 
    773     return fflush(fs); 
    774   } 
    775  
    776   ProtoPluginsList l; 
    777   ProtoPluginsListIter it; 
    778   licqDaemon->ProtoPluginList(l); 
    779   for (it = l.begin(); it != l.end(); it++) 
    780   { 
    781     if (nStatus == ICQ_STATUS_OFFLINE) 
    782     { 
    783       fprintf(fs, "%d [0] Logging off %s.\n", CODE_COMMANDxSTART, 
    784         (*it)->Name()); 
    785       fflush(fs); 
    786       licqDaemon->ProtoLogoff((*it)->PPID()); 
    787       fprintf(fs, "%d [0] Event done.\n", CODE_RESULTxSUCCESS); 
     851    return -1; 
     852  } 
     853  if (nStatus == ICQ_STATUS_OFFLINE) 
     854  { 
     855    fprintf(fs, "%d [0] Logging off %s.\n", CODE_COMMANDxSTART, szStatus); 
     856    fflush(fs); 
     857    licqDaemon->ProtoLogoff(nPPID); 
     858    fprintf(fs, "%d [0] Event done.\n", CODE_STATUSxDONE); 
     859    return 0; 
     860  } 
     861  else 
     862  { 
     863    ICQOwner *o = gUserManager.FetchOwner(nPPID, LOCK_R); 
     864    bool b = o->StatusOffline(); 
     865    gUserManager.DropOwner(nPPID); 
     866    unsigned long tag = 0; 
     867    if (b) 
     868    { 
     869      tag = licqDaemon->ProtoLogon(nPPID, nStatus); 
     870      fprintf(fs, "%d [%ld] Logging on to %s.\n", CODE_COMMANDxSTART, tag, szStatus); 
    788871    } 
    789872    else 
    790873    { 
    791       ICQOwner *o = gUserManager.FetchOwner((*it)->PPID(), LOCK_R); 
    792       bool b = o->StatusOffline(); 
    793       gUserManager.DropOwner((*it)->PPID()); 
    794       unsigned long tag = 0; 
    795       if (b) 
    796       { 
    797         tag = licqDaemon->ProtoLogon((*it)->PPID(), nStatus); 
    798         fprintf(fs, "%d [%ld] Logging on to %s.\n", CODE_COMMANDxSTART, tag, 
    799           (*it)->Name()); 
    800       } 
    801       else 
    802       { 
    803         tag = licqDaemon->ProtoSetStatus((*it)->PPID(), nStatus); 
    804         fprintf(fs, "%d [%ld] Setting status for %s.\n", CODE_COMMANDxSTART, 
    805           tag, (*it)->Name()); 
    806       } 
    807       tags.push_back(tag); 
    808     } 
    809   } 
    810    
    811   return fflush(fs); 
    812 } 
    813  
     874      tag = licqDaemon->ProtoSetStatus(nPPID, nStatus); 
     875      fprintf(fs, "%d [%ld] Setting status for %s.\n", CODE_COMMANDxSTART, tag, szStatus); 
     876    } 
     877    tags.push_back(tag); 
     878  } 
     879  return 0; 
     880} 
    814881 
    815882/*--------------------------------------------------------------------------- 
     
    9861053{ 
    9871054  //XXX Give a tag... 
     1055  m_szText[strlen(m_szText) - 1] = '\0'; 
    9881056  unsigned long tag = licqDaemon->ProtoSendMessage(m_szId, m_nPPID, m_szText, 
    9891057    false, ICQ_TCPxMSG_NORMAL); 
     
    12111279} 
    12121280 
     1281/*--------------------------------------------------------------------------- 
     1282 * CRMSClient::Process_NOTIFY 
     1283 * 
     1284 * Command: 
     1285 *   NOTIFY 
     1286 * 
     1287 * Response: 
     1288 *   CODE_NOTIFYxON|CODE_NOTIFYxOFF 
     1289 *   ... 
     1290 *-------------------------------------------------------------------------*/ 
     1291int CRMSClient::Process_NOTIFY() 
     1292{ 
     1293  m_bNotify = !m_bNotify; 
     1294 
     1295  if (m_bNotify) 
     1296    fprintf(fs, "%d Notify set ON.\n", CODE_NOTIFYxON); 
     1297  else 
     1298    fprintf(fs, "%d Notify set OFF.\n", CODE_NOTIFYxOFF); 
     1299 
     1300  return fflush(fs); 
     1301} 
    12131302 
    12141303/*--------------------------------------------------------------------------- 
     
    13051394    // Message 
    13061395    fprintf(fs, "%d Message Start\n", CODE_VIEWxTEXTxSTART); 
    1307     fprintf(fs, e->Text()); 
     1396    fprintf(fs, "%s", e->Text()); 
    13081397    fprintf(fs, "\n"); 
    13091398    fprintf(fs, "%d Message Complete\n", CODE_VIEWxTEXTxEND); 
  • trunk/rms/src/rms.h

    r4144 r4176  
    8383  int Process_REMUSER(); 
    8484  int Process_SECURE(); 
     85  int Process_NOTIFY(); 
    8586 
    8687protected: 
     
    9596  char *m_szCheckId; 
    9697  unsigned long m_nLogTypes; 
     98  bool m_bNotify; 
    9799 
    98100  unsigned long m_nUin; 
     
    109111  unsigned long GetProtocol(const char *); 
    110112  void ParseUser(const char *); 
     113  int ChangeStatus(unsigned long, unsigned long, const char *); 
    111114   
    112115  int Process_MESSAGE_text();