This patch gets the console plugin working with multiple protocols.
At the moment only sending/receiving messages is supported with msn (can't add users yet), and changing status changes to the same status for all protocols (can anyone think of a nice way of changing status for different protocols? I don't really see the point, because if you're away, you're away, but I think some people like to have different status's?).
Another (similar) problem is messaging users with the same alias, I haven't figured out how that's best dealt with - perhaps give a list of users to select from. Ideas?
Needs testing!
? console.diff Index: console.cpp =================================================================== RCS file: /cvsroot/licq/console/src/console.cpp,v retrieving revision 1.85 diff -u -r1.85 console.cpp --- console.cpp 3 Jun 2004 05:35:16 -0000 1.85 +++ console.cpp 7 Jun 2004 09:07:51 -0000 @@ -241,7 +241,8 @@ { // Register with the daemon, we want to receive all signals m_nPipe = _licqDaemon->RegisterPlugin(SIGNAL_ALL); - m_bExit = false; + m_bExit = false; + _licqDaemon->AddProtocolPlugins(); licqDaemon = _licqDaemon; m_nCurrentGroup = gUserManager.DefaultGroup(); @@ -511,10 +512,10 @@ break; case SIGNAL_UPDATExUSER: { - if (s->Uin() == gUserManager.OwnerUin() && s->SubSignal() == USER_STATUS + if (gUserManager.FindOwner(s->Id(), s->PPID()) != NULL && s->SubSignal() == USER_STATUS || s->SubSignal() == USER_EVENTS) PrintStatus(); - ICQUser *u = gUserManager.FetchUser(s->Uin(), LOCK_R); + ICQUser *u = gUserManager.FetchUser(s->Id(), s->PPID(), LOCK_R); if (u != NULL) { if (u->GetInGroup(m_nGroupType, m_nCurrentGroup)) @@ -534,6 +535,12 @@ case SIGNAL_ADDxSERVERxLIST: licqDaemon->icqRenameUser(s->Uin()); break; + case SIGNAL_NEWxPROTO_PLUGIN: + //ignore for now + break; + case SIGNAL_EVENTxID: + AddEventTag(s->Id(), s->PPID(), s->Argument()); + break; default: gLog.Warn("%sInternal error: CLicqConsole::ProcessSignal(): Unknown signal command received from daemon: %ld.\n", L_WARNxSTR, s->Signal()); @@ -542,6 +549,27 @@ delete s; } +/*--------------------------------------------------------------------------- + * CLicqConsole::AddEventTag + *-------------------------------------------------------------------------*/ +void CLicqConsole::AddEventTag(char *_szId, unsigned long _nPPID, unsigned long _nEventTag) +{ + if (!_szId || !_nPPID || !_nEventTag) + return; + + CData *data; + unsigned short i; + for (i = 1; i <= MAX_CON; i++) + { + data = (CData *)winCon[i]->data; + if (strcmp(data->szId, _szId) == 0 && data->nPPID == _nPPID) + { + winCon[i]->event = _nEventTag; + break; + } + } +} + /*--------------------------------------------------------------------------- * CLicqConsole::ProcessEvent @@ -555,6 +583,12 @@ return; } + if (e->SNAC() == 0) { + // Not from ICQ + ProcessDoneEvent(e); //FIXME + return; + } + switch (e->SNAC()) { // Event commands for a user @@ -698,7 +732,7 @@ } if (win == NULL) { - gLog.Warn("%sInternal error: CLicqConsole::ProcessEvent(): Unknown event from daemon: %d.\n", + gLog.Warn("%sInternal error: CLicqConsole::ProcessDoneEvent(): Unknown event from daemon: %d.\n", L_WARNxSTR, e->SubCommand()); return; } @@ -1423,16 +1457,16 @@ /*--------------------------------------------------------------------------- * CLicqConsole::UserCommand_Info *-------------------------------------------------------------------------*/ -void CLicqConsole::UserCommand_Info(unsigned long nUin, char *) +void CLicqConsole::UserCommand_Info(const char *szId, unsigned long nPPID, char *) { - ICQUser *u = gUserManager.FetchUser(nUin, LOCK_R); + ICQUser *u = gUserManager.FetchUser(szId, nPPID, LOCK_R); if (u == NULL) return; // First put this console into edit mode winMain->fProcessInput = &CLicqConsole::InputInfo; winMain->state = STATE_QUERY; - winMain->data = new CData(nUin); + winMain->data = new CData(szId, nPPID); winMain->wprintf("%C%A" "(G)eneral Info\n" @@ -1440,9 +1474,9 @@ "(W)ork Info\n" "(A)bout Info\n" "(U)pdate Info\n" - "for %s (%ld)? %C%Z", + "for %s (%s)? %C%Z", m_cColorQuery->nColor, m_cColorQuery->nAttr, - u->GetAlias(), nUin, COLOR_WHITE, A_BOLD); + u->GetAlias(), szId, COLOR_WHITE, A_BOLD); winMain->RefreshWin(); gUserManager.DropUser(u); } @@ -1464,21 +1498,21 @@ switch(tolower(cIn)) { case 'g': - PrintInfo_General(data->nUin); + PrintInfo_General(data->szId, data->nPPID); break; case 'm': - PrintInfo_More(data->nUin); + PrintInfo_More(data->szId, data->nPPID); break; case 'w': - PrintInfo_Work(data->nUin); + PrintInfo_Work(data->szId, data->nPPID); break; case 'a': - PrintInfo_About(data->nUin); + PrintInfo_About(data->szId, data->nPPID); break; case 'u': winMain->wprintf("%C%AUpdate info...", m_cColorInfo->nColor, m_cColorInfo->nAttr); - winMain->event = licqDaemon->icqRequestMetaInfo(data->nUin); + winMain->event = licqDaemon->icqRequestMetaInfo(data->szId); winMain->state = STATE_PENDING; return; case '\r': @@ -1510,9 +1544,9 @@ /*--------------------------------------------------------------------------- * CLicqConsole::UserCommand_View *-------------------------------------------------------------------------*/ -void CLicqConsole::UserCommand_View(unsigned long nUin, char *) +void CLicqConsole::UserCommand_View(const char *szId, unsigned long nPPID, char *) { - ICQUser *u = gUserManager.FetchUser(nUin, LOCK_W); + ICQUser *u = gUserManager.FetchUser(szId, nPPID, LOCK_W); if (u == NULL) return; @@ -1542,13 +1576,14 @@ // Do we want to accept the file transfer? if (e->SubCommand() == ICQ_CMDxSUB_FILE) - FileChatOffer(e->Sequence(), u->Uin()); + //FIXME + //FileChatOffer(e->Sequence(), u->Uin()); delete e; gUserManager.DropUser(u); //PrintUsers(); //PrintStatus(); - ProcessSignal(new CICQSignal(SIGNAL_UPDATExUSER, USER_EVENTS, nUin)); + ProcessSignal(new CICQSignal(SIGNAL_UPDATExUSER, USER_EVENTS, szId, nPPID)); } else { @@ -1562,20 +1597,20 @@ /*--------------------------------------------------------------------------- * CLicqConsole::UserCommand_Remove *-------------------------------------------------------------------------*/ -void CLicqConsole::UserCommand_Remove(unsigned long nUin, char *) +void CLicqConsole::UserCommand_Remove(const char *szId, unsigned long nPPID, char *) { - ICQUser *u = gUserManager.FetchUser(nUin, LOCK_R); + ICQUser *u = gUserManager.FetchUser(szId, nPPID, LOCK_R); if (u == NULL) return; // First put this console into edit mode winMain->fProcessInput = &CLicqConsole::InputRemove; winMain->state = STATE_QUERY; - winMain->data = new CData(nUin); + winMain->data = new CData(szId, nPPID); - winMain->wprintf("%C%ARemove %s (%ld) from contact list (y/N)? %C%Z", + winMain->wprintf("%C%ARemove %s (%s) from contact list (y/N)? %C%Z", m_cColorQuery->nColor, m_cColorQuery->nAttr, - u->GetAlias(), nUin, COLOR_WHITE, A_BOLD); + u->GetAlias(), szId, COLOR_WHITE, A_BOLD); winMain->RefreshWin(); gUserManager.DropUser(u); } @@ -1597,7 +1632,7 @@ // The input is done if (strncasecmp(data->szQuery, "yes", strlen(data->szQuery)) == 0) { - licqDaemon->RemoveUserFromList(data->nUin); + licqDaemon->RemoveUserFromList(data->szId, data->nPPID); winMain->wprintf("%C%AUser removed.\n", m_cColorInfo->nColor, m_cColorInfo->nAttr); } @@ -1626,16 +1661,16 @@ /*--------------------------------------------------------------------------- * CLicqConsole::UserCommand_FetchAutoResponse *-------------------------------------------------------------------------*/ -void CLicqConsole::UserCommand_FetchAutoResponse(unsigned long nUin, char *) +void CLicqConsole::UserCommand_FetchAutoResponse(const char *szId, unsigned long nPPID, char *) { - ICQUser *u = gUserManager.FetchUser(nUin, LOCK_R); - winMain->wprintf("%C%AFetching auto-response for %s (%ld)...", + ICQUser *u = gUserManager.FetchUser(szId, nPPID, LOCK_R); + winMain->wprintf("%C%AFetching auto-response for %s (%s)...", m_cColorInfo->nColor, m_cColorInfo->nAttr, - u->GetAlias(), nUin); + u->GetAlias(), szId); winMain->RefreshWin(); gUserManager.DropUser(u); - winMain->event = licqDaemon->icqFetchAutoResponse(nUin); + winMain->event = licqDaemon->icqFetchAutoResponse(szId, nPPID); // InputMessage just to catch the cancel key winMain->fProcessInput = &CLicqConsole::InputMessage; winMain->data = NULL; @@ -1694,9 +1729,9 @@ /*--------------------------------------------------------------------------- * CLicqConsole::UserCommand_History *-------------------------------------------------------------------------*/ -void CLicqConsole::UserCommand_History(unsigned long nUin, char *szArg) +void CLicqConsole::UserCommand_History(const char *szId, unsigned long nPPID, char *szArg) { - ICQUser *u = gUserManager.FetchUser(nUin, LOCK_R); + ICQUser *u = gUserManager.FetchUser(szId, nPPID, LOCK_R); HistoryList lHistory; if (!u->GetHistory(lHistory)) { @@ -1705,9 +1740,10 @@ return; } char szFrom[32]; - if (gUserManager.OwnerUin() == nUin) - strcpy(szFrom, "Server"); - else + //TODO: FIX THIS: + //if (gUserManager.OwnerUin() == nUin) + // strcpy(szFrom, "Server"); + //else strcpy(szFrom, u->GetAlias()); gUserManager.DropUser(u); @@ -1780,19 +1816,19 @@ /*--------------------------------------------------------------------------- * CLicqConsole::UserCommand_Msg *-------------------------------------------------------------------------*/ -void CLicqConsole::UserCommand_Msg(unsigned long nUin, char *) +void CLicqConsole::UserCommand_Msg(const char *szId, unsigned long nPPID, char *) { - ICQUser *u = gUserManager.FetchUser(nUin, LOCK_R); + ICQUser *u = gUserManager.FetchUser(szId, nPPID, LOCK_R); if (u == NULL) return; // First put this console into edit mode winMain->fProcessInput = &CLicqConsole::InputMessage; winMain->state = STATE_MLE; - winMain->data = new DataMsg(nUin); + winMain->data = new DataMsg(szId, nPPID); - winMain->wprintf("%BEnter message to %b%s%B (%b%ld%B):\n", u->GetAlias(), - nUin); + winMain->wprintf("%BEnter message to %b%s%B (%b%s%B):\n", u->GetAlias(), + szId); winMain->RefreshWin(); gUserManager.DropUser(u); } @@ -1801,10 +1837,10 @@ /*--------------------------------------------------------------------------- * SendDirect *-------------------------------------------------------------------------*/ -static bool SendDirect(unsigned long nUin, char c) +static bool SendDirect(const char *szId, unsigned long nPPID, char c) { bool bDirect = (c != 's'); - ICQUser *u = gUserManager.FetchUser(nUin, LOCK_R); + ICQUser *u = gUserManager.FetchUser(szId, nPPID, LOCK_R); if (u != NULL) { if (u->SocketDesc(ICQ_CHNxNONE) == -1 && @@ -1860,11 +1896,11 @@ } *sz = '\0'; sz++; - bool bDirect = SendDirect(data->nUin, *sz); + bool bDirect = SendDirect(data->szId, data->nPPID, *sz); winMain->wprintf("%C%ASending message %s...", m_cColorInfo->nColor, m_cColorInfo->nAttr, !bDirect ? "through the server" : "direct"); - winMain->event = licqDaemon->icqSendMessage(data->nUin, data->szMsg, + winMain->event = licqDaemon->ProtoSendMessage(data->szId, data->nPPID, data->szMsg, bDirect, *sz == 'u'); winMain->state = STATE_PENDING; break; @@ -1879,7 +1915,7 @@ { winMain->wprintf("%C%ASending message through the server...", m_cColorInfo->nColor, m_cColorInfo->nAttr); - winMain->event = licqDaemon->icqSendMessage(data->nUin, data->szMsg, + winMain->event = licqDaemon->ProtoSendMessage(data->szId, data->nPPID, data->szMsg, false, false); winMain->state = STATE_PENDING; } @@ -1901,16 +1937,16 @@ /*--------------------------------------------------------------------------- * CLicqConsole::UserCommand_SendFile *-------------------------------------------------------------------------*/ -void CLicqConsole::UserCommand_SendFile(unsigned long nUin, char *) +void CLicqConsole::UserCommand_SendFile(const char *szId, unsigned long nPPID, char *) { // Get the file name winMain->fProcessInput = &CLicqConsole::InputSendFile; winMain->state = STATE_LE; - winMain->data = new DataSendFile(nUin); + winMain->data = new DataSendFile(szId, nPPID); - ICQUser *u = gUserManager.FetchUser(nUin, LOCK_R); - winMain->wprintf("%BEnter file to send to %b%s%B (%b%ld%B):\n", - u->GetAlias(), nUin); + ICQUser *u = gUserManager.FetchUser(szId, nPPID, LOCK_R); + winMain->wprintf("%BEnter file to send to %b%s%B (%b%s%B):\n", + u->GetAlias(), szId); winMain->RefreshWin(); gUserManager.DropUser(u); } @@ -1989,7 +2025,7 @@ *sz = '\0'; sz++; - bool bDirect = SendDirect(data->nUin, *sz); + bool bDirect = SendDirect(data->szId, data->nPPID, *sz); bDirect = true; // XXX hack winMain->wprintf("%C%ASending File %s...", m_cColorInfo->nColor, m_cColorInfo->nAttr, @@ -1998,8 +2034,8 @@ ConstFileList lFileList; lFileList.push_back(strdup(data->szFileName)); - winMain->event = licqDaemon->icqFileTransfer(data->nUin, data->szFileName, - data->szDescription, lFileList, ICQ_TCPxMSG_NORMAL, + winMain->event = licqDaemon->icqFileTransfer(strtoul(data->szId, (char **)NULL, 10), + data->szFileName, data->szDescription, lFileList, ICQ_TCPxMSG_NORMAL, !bDirect); break; } @@ -2013,7 +2049,7 @@ /*--------------------------------------------------------------------------- * CLicqConsole::UserCommand_SetAutoResponse *-------------------------------------------------------------------------*/ -void CLicqConsole::UserCommand_SetAutoResponse(unsigned long nUin, char *) +void CLicqConsole::UserCommand_SetAutoResponse(const char *szId, unsigned long nPPID, char *) { // First put this console into edit mode winMain->fProcessInput = &CLicqConsole::InputAutoResponse; @@ -2071,16 +2107,16 @@ /*--------------------------------------------------------------------------- * CLicqConsole::UserCommand_Url *-------------------------------------------------------------------------*/ -void CLicqConsole::UserCommand_Url(unsigned long nUin, char *) +void CLicqConsole::UserCommand_Url(const char *szId, unsigned long nPPID, char *) { // First put this console into edit mode winMain->fProcessInput = &CLicqConsole::InputUrl; winMain->state = STATE_LE; - winMain->data = new DataUrl(nUin); + winMain->data = new DataUrl(szId, nPPID); - ICQUser *u = gUserManager.FetchUser(nUin, LOCK_R); + ICQUser *u = gUserManager.FetchUser(szId, nPPID, LOCK_R); winMain->wprintf("%BEnter URL to %b%s%B (%b%ld%B): ", - u->GetAlias(), nUin); + u->GetAlias(), szId); winMain->RefreshWin(); gUserManager.DropUser(u); } @@ -2135,11 +2171,11 @@ } *sz = '\0'; sz++; - bool bDirect = SendDirect(data->nUin, *sz); + bool bDirect = SendDirect(data->szId, data->nPPID, *sz); winMain->wprintf("%C%ASending URL %s...", m_cColorInfo->nColor, m_cColorInfo->nAttr, !bDirect ? "through the server" : "direct"); - winMain->event = licqDaemon->icqSendUrl(data->nUin, data->szUrl, + winMain->event = licqDaemon->ProtoSendUrl(data->szId, data->nPPID, data->szUrl, data->szDesc, bDirect, *sz == 'u'); winMain->state = STATE_PENDING; @@ -2155,7 +2191,7 @@ { winMain->wprintf("%C%ASending URL through the server...", m_cColorInfo->nColor, m_cColorInfo->nAttr); - winMain->event = licqDaemon->icqSendUrl(data->nUin, data->szUrl, + winMain->event = licqDaemon->ProtoSendUrl(data->szId, data->nPPID, data->szUrl, data->szDesc, false, false); winMain->state = STATE_PENDING; } @@ -2177,16 +2213,16 @@ /*--------------------------------------------------------------------------- * CLicqConsole::UserCommand_Sms *-------------------------------------------------------------------------*/ -void CLicqConsole::UserCommand_Sms(unsigned long nUin, char *) +void CLicqConsole::UserCommand_Sms(const char *szId, unsigned long nPPID, char *) { - ICQUser *u = gUserManager.FetchUser(nUin, LOCK_R); + ICQUser *u = gUserManager.FetchUser(szId, nPPID, LOCK_R); if (u == NULL) return; // First put this console into edit mode winMain->fProcessInput = &CLicqConsole::InputSms; winMain->state = STATE_MLE; - winMain->data = new DataSms(nUin); + winMain->data = new DataSms(szId, nPPID); winMain->wprintf("%BEnter SMS to %b%s%B (%b%s%B):\n", u->GetAlias(), u->GetCellularNumber()); winMain->RefreshWin(); @@ -2231,11 +2267,11 @@ } *sz = '\0'; sz++; - ICQUser *u = gUserManager.FetchUser(data->nUin, LOCK_R); + ICQUser *u = gUserManager.FetchUser(data->szId, data->nPPID, LOCK_R); winMain->wprintf("%C%ASending SMS to %s ...", m_cColorInfo->nColor, m_cColorInfo->nAttr, u->GetCellularNumber()); winMain->event = licqDaemon->icqSendSms(u->GetCellularNumber(), - data->szMsg, data->nUin); + data->szMsg, strtoul(data->szId, (char **)NULL, 0)); gUserManager.DropUser(u); winMain->state = STATE_PENDING; break; @@ -2282,15 +2318,15 @@ *sz = '\0'; if (data->bUrgent) { - winMain->wprintf("%C%AGranting authorizing to %lu...", m_cColorInfo->nColor, - m_cColorInfo->nAttr, data->nUin); - winMain->event = licqDaemon->icqAuthorizeGrant(data->nUin, data->szMsg); + winMain->wprintf("%C%AGranting authorizing to %s...", m_cColorInfo->nColor, + m_cColorInfo->nAttr, data->szId); + winMain->event = licqDaemon->icqAuthorizeGrant(strtoul(data->szId, (char **)NULL, 10), data->szMsg); } else { - winMain->wprintf("%C%ARefusing authorizing to %lu...", m_cColorInfo->nColor, - m_cColorInfo->nAttr, data->nUin); - winMain->event = licqDaemon->icqAuthorizeRefuse(data->nUin, data->szMsg); + winMain->wprintf("%C%ARefusing authorizing to %s...", m_cColorInfo->nColor, + m_cColorInfo->nAttr, data->szId); + winMain->event = licqDaemon->icqAuthorizeRefuse(strtoul(data->szId, (char **)NULL, 10), data->szMsg); } winMain->fProcessInput = &CLicqConsole::InputCommand; @@ -2490,14 +2526,14 @@ // Back to 0 for you! data->nPos = 0; - data->nUin = atol(sz); + data->szId = sz; - if (data->nUin != 0) + if (data->szId != 0) { winMain->wprintf("%C%ASearching:\n", m_cColorInfo->nColor, m_cColorInfo->nAttr); - winMain->event = licqDaemon->icqSearchByUin(data->nUin); + winMain->event = licqDaemon->icqSearchByUin(strtoul(data->szId, (char **)NULL, 10)); winMain->state = STATE_PENDING; return; @@ -2980,12 +3016,12 @@ /*--------------------------------------------------------------------------- * CLicqConsole::FileChatOffer *-------------------------------------------------------------------------*/ -void CLicqConsole::FileChatOffer(unsigned long _nSequence, unsigned long _nUin) +void CLicqConsole::FileChatOffer(unsigned long _nSequence, const char *_szId, unsigned long _nPPID) { // Get y or n winMain->fProcessInput = &CLicqConsole::InputFileChatOffer; winMain->state = STATE_QUERY; - winMain->data = new DataFileChatOffer(_nSequence, _nUin); + winMain->data = new DataFileChatOffer(_nSequence, _szId, _nPPID); winMain->wprintf("%C%ADo you wish to accept this request? (y/N) %C%Z", m_cColorQuery->nColor, m_cColorQuery->nAttr, COLOR_WHITE, A_BOLD); winMain->RefreshWin(); @@ -3013,7 +3049,7 @@ // Make the ftman CFileTransferManager *ftman = new CFileTransferManager(licqDaemon, - data->nUin); + strtoul(data->szId, (char **)NULL, 10)); ftman->SetUpdatesEnabled(1); m_lFileStat.push_back(ftman); @@ -3022,7 +3058,7 @@ ftman->ReceiveFiles(home); // XXX hack unsigned long dummy[2] = { 0, 0}; - licqDaemon->icqFileTransferAccept(data->nUin, ftman->LocalPort(), + licqDaemon->icqFileTransferAccept(strtoul(data->szId, (char **)NULL, 10), ftman->LocalPort(), data->nSequence, dummy, true); winMain->fProcessInput = &CLicqConsole::InputCommand; @@ -3054,12 +3090,12 @@ // XXX hack unsigned long dummy[2] = { 0, 0 }; - licqDaemon->icqFileTransferRefuse(data->nUin, data->szReason, + licqDaemon->icqFileTransferRefuse(strtoul(data->szId, (char **)NULL, 10), data->szReason, data->nSequence, dummy, true); // We are done now - winMain->wprintf("%ARefusing file from %ld with reason: %Z%s\n", - A_BOLD, data->nUin, A_BOLD, data->szReason); + winMain->wprintf("%ARefusing file from %s with reason: %Z%s\n", + A_BOLD, data->szId, A_BOLD, data->szReason); winMain->fProcessInput = &CLicqConsole::InputCommand; if(winMain->data) @@ -3076,9 +3112,9 @@ /*------------------------------------------------------------------------- * CLicqConsole::UserCommand_Secure *-----------------------------------------------------------------------*/ -void CLicqConsole::UserCommand_Secure(unsigned long nUin, char *szStatus) +void CLicqConsole::UserCommand_Secure(const char *szId, unsigned long nPPID, char *szStatus) { - ICQUser *u = gUserManager.FetchUser(nUin, LOCK_R); + ICQUser *u = gUserManager.FetchUser(szId, nPPID, LOCK_R); if(!licqDaemon->CryptoEnabled()) { @@ -3115,14 +3151,20 @@ winMain->wprintf("%ARequest secure channel with %s ... ", A_BOLD, u->GetAlias()); gUserManager.DropUser(u); - winMain->event = licqDaemon->icqOpenSecureChannel(nUin); + char *p; + unsigned long uin = strtoul(szId, &p,10); + if( (p == 0 || (p && !*p)) && nPPID == LICQ_PPID ) + winMain->event = licqDaemon->icqOpenSecureChannel(uin); } else if(strcasecmp(szStatus, "close") == 0) { winMain->wprintf("%AClose secure channel with %s ... ", A_BOLD, u->GetAlias()); gUserManager.DropUser(u); - winMain->event = licqDaemon->icqCloseSecureChannel(nUin); + char *p; + unsigned long uin = strtoul(szId, &p,10); + if( (p == 0 || (p && !*p)) && nPPID == LICQ_PPID ) + winMain->event = licqDaemon->icqCloseSecureChannel(uin); } else { @@ -3141,7 +3183,12 @@ // Get the input now winMain->fProcessInput = &CLicqConsole::InputUserSelect; winMain->state = STATE_LE; - winMain->data = new DataUserSelect(gUserManager.OwnerUin()); + + char sz[20]; + //TODO which owner + sprintf(sz, "%lu", gUserManager.OwnerUin()); + + winMain->data = new DataUserSelect(sz, LICQ_PPID); ICQOwner *o = gUserManager.FetchOwner(LOCK_R); winMain->wprintf("%A%CEnter your password for %s (%lu):%C%Z\n", A_BOLD, Index: console.h =================================================================== RCS file: /cvsroot/licq/console/src/console.h,v retrieving revision 1.36 diff -u -r1.36 console.h --- console.h 23 Jun 2003 16:13:46 -0000 1.36 +++ console.h 7 Jun 2004 09:07:52 -0000 @@ -29,12 +29,19 @@ struct SUser { char szKey[32]; - unsigned long nUin; + char szId[32]; + unsigned long nPPID; char *szLine; bool bOffline; const struct SColorMap *color; }; +struct SContact +{ + char *szId; + unsigned long nPPID; +}; + struct SMacro { char szMacro[32]; @@ -95,6 +102,7 @@ char *CurrentGroupName(); void SwitchToCon(unsigned short nCon); void CreateUserList(); + void AddEventTag(char *, unsigned long, unsigned long); void InputCommand(int cIn); void InputLogWindow(int cIn); @@ -123,10 +131,10 @@ void PrintUsers(); void PrintHelp(); void PrintHistory(HistoryList &, unsigned short, unsigned short, const char *); - void PrintInfo_General(unsigned long); - void PrintInfo_More(unsigned long); - void PrintInfo_Work(unsigned long); - void PrintInfo_About(unsigned long); + void PrintInfo_General(const char *, unsigned long); + void PrintInfo_More(const char *, unsigned long); + void PrintInfo_Work(const char *, unsigned long); + void PrintInfo_About(const char *, unsigned long); void PrintFileStat(CFileTransferManager *); void PrintMacros(); @@ -162,27 +170,39 @@ void TabStatus(char *, struct STabCompletion &); void TabSet(char *, struct STabCompletion &); - void UserCommand_Info(unsigned long nUin, char *); - void UserCommand_Msg(unsigned long nUin, char *); - void UserCommand_View(unsigned long nUin, char *); - void UserCommand_SendFile(unsigned long nUin, char *); - void UserCommand_Url(unsigned long nUin, char *); - void UserCommand_Sms(unsigned long nUin, char *); - void UserCommand_History(unsigned long nUin, char *); - void UserCommand_Remove(unsigned long nUin, char *); - void UserCommand_FetchAutoResponse(unsigned long nUin, char *); - void UserCommand_SetAutoResponse(unsigned long nUin, char *); - void UserCommand_Secure(unsigned long nUin, char *); + void UserCommand_Info(const char *szId, unsigned long nPPID, char *); + void UserCommand_Msg(const char *szId, unsigned long nPPID, char *); + void UserCommand_View(const char *szId, unsigned long nPPID, char *); + void UserCommand_SendFile(const char *szId, unsigned long nPPID, char *); + void UserCommand_Url(const char *szId, unsigned long nPPID, char *); + void UserCommand_Sms(const char *szId, unsigned long nPPID, char *); + void UserCommand_History(const char *szId, unsigned long nPPID, char *); + void UserCommand_Remove(const char *szId, unsigned long nPPID, char *); + void UserCommand_FetchAutoResponse(const char *szId, unsigned long nPPID, char *); + void UserCommand_SetAutoResponse(const char *szId, unsigned long nPPID, char *); + void UserCommand_Secure(const char *szId, unsigned long nPPID, char *); + //void UserCommand_Info(unsigned long nUin, char *); + //void UserCommand_Msg(unsigned long nUin, char *); + //void UserCommand_View(unsigned long nUin, char *); + //void UserCommand_SendFile(unsigned long nUin, char *); + //void UserCommand_Url(unsigned long nUin, char *); + //void UserCommand_Sms(unsigned long nUin, char *); + //void UserCommand_History(unsigned long nUin, char *); + //void UserCommand_Remove(unsigned long nUin, char *); + //void UserCommand_FetchAutoResponse(unsigned long nUin, char *); + //void UserCommand_SetAutoResponse(unsigned long nUin, char *); + //void UserCommand_Secure(unsigned long nUin, char *); void Command_Search(); void Beep() { printf("\a"); fflush(stdout); } - void FileChatOffer(unsigned long, unsigned long); + void FileChatOffer(unsigned long, const char *, unsigned long); void RegistrationWizard(); void InputRegistrationWizard(int cIn); void UserSelect(); void InputUserSelect(int cIn); bool ParseMacro(char *); unsigned long GetUinFromArg(char **); + struct SContact GetContactFromArg(char **); }; Index: console_menu.cpp =================================================================== RCS file: /cvsroot/licq/console/src/console_menu.cpp,v retrieving revision 1.35 diff -u -r1.35 console_menu.cpp --- console_menu.cpp 23 Jun 2003 16:13:46 -0000 1.35 +++ console_menu.cpp 7 Jun 2004 09:07:54 -0000 @@ -150,6 +150,9 @@ PluginsList l; PluginsListIter it; licqDaemon->PluginList(l); + ProtoPluginsList p1; + ProtoPluginsListIter pit; + licqDaemon->ProtoPluginList(p1); PrintBoxTop("Plugins", COLOR_BLUE, 70); for (it = l.begin(); it != l.end(); it++) { @@ -159,6 +162,13 @@ (*it)->BuildTime(), (*it)->Status()); PrintBoxRight(70); } + for (pit = p1.begin(); pit != p1.end(); pit++) + { + PrintBoxLeft(); + winMain->wprintf("[%3d] %s v%s", (*pit)->Id(), (*pit)->Name(), + (*pit)->Version()); + PrintBoxRight(70); + } PrintBoxBottom(70); } @@ -304,7 +314,6 @@ } // Try to change groups - int nUin = atol(szArg); bool bAlert = false; while (*szArg != '\0' && *szArg != ' ') szArg++; @@ -315,19 +324,21 @@ bAlert = true; } - if (!licqDaemon->AddUserToList(nUin)) + if (!licqDaemon->AddUserToList(szArg, LICQ_PPID)) { - winMain->wprintf("%CAdding user %lu failed (duplicate user or invalid uin).\n", - COLOR_RED, nUin); + winMain->wprintf("%CAdding user %s failed (duplicate user or invalid uin).\n", + COLOR_RED, szArg); return; } - winMain->wprintf("%C%AAdded user %ld.\n", + winMain->wprintf("%C%AAdded user %s.\n", m_cColorInfo->nColor, m_cColorInfo->nAttr, - nUin); + szArg); if (bAlert) { + //TODO: fix this for other protocols + int nUin = atol(szArg); licqDaemon->icqAlertUser(nUin); winMain->wprintf("%C%AAlerted user %ld they were added.\n", m_cColorInfo->nColor, m_cColorInfo->nAttr, @@ -363,7 +374,7 @@ // Try to change groups int nUin = atol(szArg); - + if (nUin == 0) { winMain->wprintf("%CUIN must be non-zero.\n", COLOR_RED); @@ -373,7 +384,7 @@ // Get the input now winMain->fProcessInput = &CLicqConsole::InputAuthorize; winMain->state = STATE_MLE; - DataMsg *data = new DataMsg(nUin); + DataMsg *data = new DataMsg(szArg, LICQ_PPID); data->bUrgent = bGrant; winMain->data = data; @@ -422,23 +433,34 @@ return; } - ICQOwner *o = gUserManager.FetchOwner(LOCK_R); - if (nStatus == ICQ_STATUS_OFFLINE) + ProtoPluginsList p1; + ProtoPluginsListIter it; + licqDaemon->ProtoPluginList(p1); + for (it = p1.begin(); it != p1.end(); it++) { - gUserManager.DropOwner(); - licqDaemon->icqLogoff(); - return; - } - if (bInvisible) - nStatus |= ICQ_STATUS_FxPRIVATE; + unsigned long nPPID = (*it)->PPID(); + ICQOwner *o = gUserManager.FetchOwner(nPPID, LOCK_R); + if (nStatus == ICQ_STATUS_OFFLINE) + { + gUserManager.DropOwner(nPPID); + licqDaemon->ProtoLogoff(nPPID); + continue; + } + if (bInvisible) + nStatus |= ICQ_STATUS_FxPRIVATE; - // call the right function - bool b = o->StatusOffline(); - gUserManager.DropOwner(); - if (b) - licqDaemon->icqLogon(nStatus); - else - licqDaemon->icqSetStatus(nStatus); + // call the right function + bool b = o->StatusOffline(); + gUserManager.DropOwner(nPPID); + if (b) + { + licqDaemon->ProtoLogon(nPPID, nStatus); + } + else + { + licqDaemon->ProtoSetStatus(nPPID, nStatus); + } + } } @@ -462,15 +484,13 @@ for (it = m_lUsers.begin(); it != m_lUsers.end(); it++) { - u = gUserManager.FetchUser((*it)->nUin, LOCK_R); - winMain->wprintf("%s %A-%Z %lu\n", u->GetAlias(), A_BOLD, A_BOLD, u->Uin()); + u = gUserManager.FetchUser((*it)->szId, (*it)->nPPID, LOCK_R); + winMain->wprintf("%s %A-%Z %s\n", u->GetAlias(), A_BOLD, A_BOLD, u->IdString()); gUserManager.DropUser(u); } } - - /*--------------------------------------------------------------------------- * CLicqConsole::GetUinFromArg *-------------------------------------------------------------------------*/ @@ -533,7 +553,7 @@ if (nUin == 0) { - FOR_EACH_USER_START(LOCK_R) + FOR_EACH_PROTO_USER_START(LICQ_PPID, LOCK_R) { if (strcasecmp(szAlias, pUser->GetAlias()) == 0) { @@ -541,7 +561,7 @@ FOR_EACH_USER_BREAK; } } - FOR_EACH_USER_END + FOR_EACH_PROTO_USER_END if (nUin == 0) { winMain->wprintf("%CInvalid user: %A%s\n", COLOR_RED, A_BOLD, szAlias); @@ -567,6 +587,86 @@ return nUin; } +/*--------------------------------------------------------------------------- + * CLicqConsole::GetContactFromArg + *-------------------------------------------------------------------------*/ +struct SContact CLicqConsole::GetContactFromArg(char **p_szArg) +{ + char *szAlias, *szCmd; + char *szArg = *p_szArg; + struct SContact scon; + scon.szId = NULL; + + if (szArg == NULL) { + return scon; + } + + // Check if the alias is quoted + if (szArg[0] == '"') + { + szAlias = &szArg[1]; + szCmd = strchr(&szArg[1], '"'); + if (szCmd == NULL) + { + winMain->wprintf("%CUnbalanced quotes.\n", COLOR_RED); + return scon; + } + *szCmd++ = '\0'; + szCmd = strchr(szCmd, ' '); + } + //TODO - fix this + //else if (szArg[0] == '#') + //{ + // *p_szArg = NULL; + // return gUserManager.OwnerUin(); + //} + //else if (szArg[0] == '$') + //{ + // *p_szArg = NULL; + // return winMain->nLastUin; + //} + else + { + szAlias = szArg; + szCmd = strchr(szArg, ' '); + } + + if (szCmd != NULL) + { + *szCmd++ = '\0'; + STRIP(szCmd); + } + *p_szArg = szCmd; + + FOR_EACH_USER_START(LOCK_R) + { + if (strcasecmp(szAlias, pUser->GetAlias()) == 0) + { + scon.szId = pUser->IdString(); + scon.nPPID = pUser->PPID(); + FOR_EACH_PROTO_USER_BREAK; + } + } + FOR_EACH_USER_END + if (scon.szId == NULL) + { + winMain->wprintf("%CInvalid user: %A%s\n", COLOR_RED, A_BOLD, szAlias); + scon.szId = NULL; + scon.nPPID = (unsigned long)-1; + return scon; + } + + //TODO + // Save this as the last user + //if (winMain->nLastUin != nUin) + //{ + // winMain->nLastUin = nUin; + // PrintStatus(); + //} + + return scon; +} + /*--------------------------------------------------------------------------- @@ -575,14 +675,12 @@ void CLicqConsole::MenuMessage(char *szArg) { char *sz = szArg; - unsigned long nUin = GetUinFromArg(&sz); + struct SContact scon = GetContactFromArg(&sz); - if (nUin == gUserManager.OwnerUin()) - winMain->wprintf("%CYou can't send messages to yourself!\n", COLOR_RED); - else if (nUin == 0) - winMain->wprintf("%CYou must specify a user to send a message to.\n", COLOR_RED); - else if (nUin != (unsigned long)-1) - UserCommand_Msg(nUin, sz); + if (!scon.szId && scon.nPPID != (unsigned long)-1) + winMain->wprintf("%CYou must specify a user to send a message to.\n", COLOR_RED); + else if (scon.nPPID != (unsigned long)-1) + UserCommand_Msg(scon.szId, scon.nPPID, sz); } @@ -591,15 +689,20 @@ *-------------------------------------------------------------------------*/ void CLicqConsole::MenuInfo(char *szArg) { + char *sz = szArg; unsigned long nUin = GetUinFromArg(&sz); if (nUin == gUserManager.OwnerUin()) winMain->wprintf("%CSetting personal info not implemented yet.\n", COLOR_RED); - else if (nUin == 0) - UserCommand_Info(gUserManager.OwnerUin(), sz); - else if (nUin != (unsigned long)-1) - UserCommand_Info(nUin, sz); + else if (nUin == 0) { + //TODO: fix this.. + char szUin[24]; + sprintf(szUin, "%lu", gUserManager.OwnerUin()); + UserCommand_Info(szUin, LICQ_PPID, sz); + } else if (nUin != (unsigned long)-1) + UserCommand_Info(szArg, LICQ_PPID, sz); + } @@ -616,7 +719,9 @@ else if (nUin == 0) winMain->wprintf("%CYou must specify a user to send a URL to.\n", COLOR_RED); else if (nUin != (unsigned long)-1) - UserCommand_Url(nUin, sz); + //TODO: fix this.. + UserCommand_Url(szArg, LICQ_PPID, sz); + } @@ -631,7 +736,8 @@ if (nUin == 0) winMain->wprintf("%CInvalid user\n", COLOR_RED); else if (nUin != (unsigned long)-1) - UserCommand_Sms(nUin, sz); + //TODO: fix this.. + UserCommand_Sms(szArg, LICQ_PPID, sz); } @@ -640,21 +746,28 @@ *-------------------------------------------------------------------------*/ void CLicqConsole::MenuView(char *szArg) { - char *sz = szArg; - unsigned long nUin = GetUinFromArg(&sz); - if (nUin == 0) + char *sz = szArg; + char *szId = NULL; + unsigned long nPPID = (unsigned long)-1; + //unsigned long nUin = GetUinFromArg(&sz); + struct SContact scon = GetContactFromArg(&sz); + + if (scon.szId == 0) { // Do nothing if there are no events pending if (ICQUser::getNumUserEvents() == 0) return; - // Do system messages first - ICQOwner *o = gUserManager.FetchOwner(LOCK_R); + // Do icq system messages first + ICQOwner *o = gUserManager.FetchOwner(LICQ_PPID, LOCK_R); unsigned short nNumMsg = o->NewMessages(); gUserManager.DropOwner(); if (nNumMsg > 0) { - UserCommand_View(gUserManager.OwnerUin(), NULL); + //TODO which owner? + char szUin[24]; + sprintf(szUin, "%lu", gUserManager.OwnerUin()); + UserCommand_View(szUin, LICQ_PPID, NULL); return; } @@ -663,17 +776,22 @@ { if (pUser->NewMessages() > 0 && pUser->Touched() <= t) { - nUin = pUser->Uin(); + szId = pUser->IdString(); + nPPID = pUser->PPID(); t = pUser->Touched(); } } FOR_EACH_USER_END - if (nUin != 0) UserCommand_View(nUin, NULL); + if (szId != NULL) + { + UserCommand_View(szId, nPPID, NULL); + } } - else if (nUin != (unsigned long)-1) + else if (scon.szId != NULL) { - UserCommand_View(nUin, sz); + UserCommand_View(scon.szId, scon.nPPID, sz); } + } @@ -690,7 +808,8 @@ else if (nUin == 0) winMain->wprintf("%CYou must specify a user to talk to.\n", COLOR_RED); else if (nUin != (unsigned long)-1) - UserCommand_Secure(nUin, sz); + //TODO: fix this.. + UserCommand_Secure(szArg, LICQ_PPID, sz); } @@ -724,7 +843,8 @@ } } else if (nUin != (unsigned long)-1) - UserCommand_SendFile(nUin, sz); + //TODO: fix this.. + UserCommand_SendFile(szArg, LICQ_PPID, sz); } @@ -742,7 +862,7 @@ for (unsigned short i = 0; i < winMain->Cols() - 10; i++) waddch(winMain->Win(), ACS_HLINE); waddch(winMain->Win(), '\n'); - ICQOwner *o = gUserManager.FetchOwner(LOCK_R); + ICQOwner *o = gUserManager.FetchOwner(LICQ_PPID, LOCK_R); winMain->wprintf("%B%CAuto response:\n%b%s\n", COLOR_WHITE, o->AutoResponse()); gUserManager.DropOwner(); @@ -754,9 +874,9 @@ wattroff(winMain->Win(), A_BOLD); } else if (nUin == 0) - UserCommand_SetAutoResponse(nUin, sz); + UserCommand_SetAutoResponse(NULL, LICQ_PPID, sz); else if (nUin != (unsigned long)-1) - UserCommand_FetchAutoResponse(nUin, sz); + UserCommand_FetchAutoResponse(NULL, LICQ_PPID, sz); } @@ -773,7 +893,7 @@ else if (nUin == 0) winMain->wprintf("%CYou must specify a user to remove.\n", COLOR_RED); else if (nUin != (unsigned long)-1) - UserCommand_Remove(nUin, sz); + UserCommand_Remove(szArg, LICQ_PPID, sz); } @@ -788,7 +908,7 @@ if (nUin == 0) winMain->wprintf("%CYou must specify a user to view history.\n", COLOR_RED); else if (nUin != (unsigned long)-1) - UserCommand_History(nUin, sz); + UserCommand_History(szArg, LICQ_PPID, sz); } Index: console_print.cpp =================================================================== RCS file: /cvsroot/licq/console/src/console_print.cpp,v retrieving revision 1.39 diff -u -r1.39 console_print.cpp --- console_print.cpp 22 Jun 2003 22:28:10 -0000 1.39 +++ console_print.cpp 7 Jun 2004 09:07:55 -0000 @@ -288,7 +288,8 @@ s = new SUser; sprintf(s->szKey, "%05u%010lu", pUser->Status(), pUser->Touched() ^ 0xFFFFFFFF); - s->nUin = pUser->Uin(); + sprintf(s->szId, "%lu", pUser->Uin()); + s->nPPID = LICQ_PPID; s->bOffline = pUser->StatusOffline(); unsigned long iStatus = pUser->StatusFull(); @@ -498,10 +499,10 @@ /*--------------------------------------------------------------------------- * CLicqConsole::PrintInfo_General *-------------------------------------------------------------------------*/ -void CLicqConsole::PrintInfo_General(unsigned long nUin) +void CLicqConsole::PrintInfo_General(const char *szId, unsigned long nPPID) { // Print the users info to the main window - ICQUser *u = gUserManager.FetchUser(nUin, LOCK_R); + ICQUser *u = gUserManager.FetchUser(szId, nPPID, LOCK_R); if (u == NULL) return; // Some IP, Real IP and last seen stuff @@ -574,10 +575,10 @@ /*--------------------------------------------------------------------------- * CLicqConsole::PrintInfo_More *-------------------------------------------------------------------------*/ -void CLicqConsole::PrintInfo_More(unsigned long nUin) +void CLicqConsole::PrintInfo_More(const char *szId, unsigned long nPPID) { // Print the users info to the main window - ICQUser *u = gUserManager.FetchUser(nUin, LOCK_R); + ICQUser *u = gUserManager.FetchUser(szId, nPPID, LOCK_R); if (u == NULL) return; wattron(winMain->Win(), A_BOLD); @@ -620,10 +621,10 @@ /*--------------------------------------------------------------------------- * CLicqConsole::PrintInfo_Work *-------------------------------------------------------------------------*/ -void CLicqConsole::PrintInfo_Work(unsigned long nUin) +void CLicqConsole::PrintInfo_Work(const char *szId, unsigned long nPPID) { // Print the users info to the main window - ICQUser *u = gUserManager.FetchUser(nUin, LOCK_R); + ICQUser *u = gUserManager.FetchUser(szId, nPPID, LOCK_R); if (u == NULL) return; wattron(winMain->Win(), A_BOLD); @@ -670,10 +671,10 @@ /*---------------------------------------------------------------------------- * CLicqConsole::PrintInfo_About *--------------------------------------------------------------------------*/ -void CLicqConsole::PrintInfo_About(unsigned long nUin) +void CLicqConsole::PrintInfo_About(const char *szId, unsigned long nPPID) { // Print the user's about info to the main window - ICQUser *u = gUserManager.FetchUser(nUin, LOCK_R); + ICQUser *u = gUserManager.FetchUser(szId, nPPID, LOCK_R); if (u == NULL) return; wattron(winMain->Win(), A_BOLD); Index: event_data.h =================================================================== RCS file: /cvsroot/licq/console/src/event_data.h,v retrieving revision 1.11 diff -u -r1.11 event_data.h --- event_data.h 23 Jun 2003 16:13:46 -0000 1.11 +++ event_data.h 7 Jun 2004 09:07:56 -0000 @@ -5,9 +5,10 @@ class CData { public: - CData (unsigned long n) - { nUin = n; nPos = 0; szQuery[0] = '\0'; } - unsigned long nUin; + CData (const char *i, unsigned long n) + { szId = i; nPPID = n, nPos = 0; szQuery[0] = '\0'; } + const char *szId; + unsigned long nPPID; unsigned short nPos; char szQuery[80]; }; @@ -16,7 +17,7 @@ class DataMsg : public CData { public: - DataMsg(unsigned long n) : CData(n) + DataMsg(const char *i, unsigned long n) : CData(i, n) { szMsg[0] = '\0'; bUrgent = false; bServer = false; } char szMsg[1024]; bool bUrgent; @@ -27,7 +28,7 @@ class DataSendFile : public CData { public: - DataSendFile(unsigned long n) : CData(n) + DataSendFile(const char *i, unsigned long n) : CData(i, n) { szFileName[0] = '\0'; szDescription[0] = '\0'; bUrgent = false; } char szFileName[512]; char szDescription[512]; @@ -38,7 +39,7 @@ class DataAutoResponse : public CData { public: - DataAutoResponse() : CData(0) + DataAutoResponse() : CData(NULL, 0) { szRsp[0] = '\0'; } char szRsp[1024]; }; @@ -47,7 +48,7 @@ class DataUrl : public CData { public: - DataUrl(unsigned long n) : CData(n) + DataUrl(const char *i, unsigned long n) : CData(i, n) { szUrl[0] = '\0'; szDesc[0] = '\0'; bUrgent = false; bServer = false; } char szUrl[1024]; char szDesc[1024]; @@ -58,14 +59,14 @@ class DataSms : public CData { public: - DataSms(unsigned long n) : CData(n) + DataSms(const char *i, unsigned long n) : CData(i, n) { szMsg[0] = '\0'; } char szMsg[1024]; }; class DataRegWizard : public CData { public: - DataRegWizard(unsigned long n = 0) : CData(n) + DataRegWizard(const char *i = NULL, unsigned long n = 0) : CData(i, n) { szOption[0] = '\0'; szPassword1[0] = '\0'; szPassword2[0] = '\0'; szUin[0] = '\0'; nState = 0; } char szOption[80]; char szPassword1[80]; @@ -77,7 +78,7 @@ class DataUserSelect : public CData { public: - DataUserSelect(unsigned long n) : CData(n) + DataUserSelect(const char *i, unsigned long n) : CData(i, n) { szPassword[0] = '\0'; } char szPassword[80]; }; @@ -85,7 +86,7 @@ class DataSearch : public CData { public: - DataSearch() : CData(0) + DataSearch() : CData(NULL, 0) { szAlias[0] = szFirstName[0] = szLastName[0] = szEmail[0] = szCity[0] = szState[0] = szCoName[0] = szCoDept[0] = szCoPos[0] = '\0'; nState = nMinAge = nMaxAge = nGender = nLanguage = nCountryCode = 0; @@ -113,7 +114,7 @@ class DataFileChatOffer : public CData { public: - DataFileChatOffer(unsigned long _nSeq, unsigned long _nUin) : CData(_nUin) + DataFileChatOffer(unsigned long _nSeq, const char *i, unsigned long n) : CData(i, n) { szReason[0] = '\0'; nSequence = _nSeq; } char szReason[256]; unsigned long nSequence; Index: window.h =================================================================== RCS file: /cvsroot/licq/console/src/window.h,v retrieving revision 1.10 diff -u -r1.10 window.h --- window.h 22 Jun 2003 22:28:10 -0000 1.10 +++ window.h 7 Jun 2004 09:07:56 -0000 @@ -42,6 +42,7 @@ InputState state; CData *data; unsigned long nLastUin; + //struct SContact sLastContact; unsigned short nLastHistory; protected: WINDOW *win;