From: Jon K. <em...@us...> - 2004-11-18 13:49:44
|
Update of /cvsroot/licq/qt-gui/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv5247/plugins/qt-gui/src Modified Files: ewidgets.cpp ewidgets.h mainwin.cpp mainwin.h sigman.cpp sigman.h usereventdlg.cpp usereventdlg.h wharf.cpp Log Message: Allow messages to contain an id (should be the socket of the conversation) to allow protocol plugins that support having more than one user in a conversation. MSN utilizes this. We can't add users to the conversation from Licq, but can see and communicate with them if a remote user adds someone. There are a few crashes I believe.. please find them and report them to the list :) Index: ewidgets.cpp =================================================================== RCS file: /cvsroot/licq/qt-gui/src/ewidgets.cpp,v retrieving revision 1.85 retrieving revision 1.86 diff -u -d -r1.85 -r1.86 --- ewidgets.cpp 27 May 2004 07:30:00 -0000 1.85 +++ ewidgets.cpp 18 Nov 2004 13:49:26 -0000 1.86 @@ -711,7 +711,7 @@ addMsg( _e->UserEvent() ); } -void CMessageViewWidget::addMsg(CUserEvent* e ) +void CMessageViewWidget::addMsg(CUserEvent* e, const char *_szId, unsigned long _nPPID) { QDateTime date; date.setTime_t(e->Time()); @@ -723,8 +723,9 @@ { - ICQUser *u = gUserManager.FetchUser(m_szId, m_nPPID, LOCK_R); - if (u != NULL) + ICQUser *u = _szId ? gUserManager.FetchUser(_szId, _nPPID, LOCK_R) : + gUserManager.FetchUser(m_szId, m_nPPID, LOCK_R); + if (u) { codec = UserCodec::codecForICQUser(u); if (e->Direction() == D_RECEIVER) @@ -737,9 +738,8 @@ break; } } - - gUserManager.DropUser(u); } + gUserManager.DropUser(u); } if (e->Direction() != D_RECEIVER) Index: ewidgets.h =================================================================== RCS file: /cvsroot/licq/qt-gui/src/ewidgets.h,v retrieving revision 1.33 retrieving revision 1.34 diff -u -d -r1.33 -r1.34 --- ewidgets.h 11 Jun 2004 22:56:10 -0000 1.33 +++ ewidgets.h 18 Nov 2004 13:49:26 -0000 1.34 @@ -17,6 +17,7 @@ class CUserEvent; class ICQEvent; class CMainWindow; +class ICQUser; bool QueryUser(QWidget *, QString, QString, QString, bool bConfirmYes=false, QString szConfirm=NULL, bool bConfirmNo=false, QString szConfirmNo=NULL); int QueryUser(QWidget *, QString, QString, QString, QString); @@ -167,7 +168,7 @@ QWidget* parent=0, const char * name =0); virtual ~CMessageViewWidget(); public slots: - virtual void addMsg(CUserEvent *); + virtual void addMsg(CUserEvent *, const char * = 0, unsigned long = 0); void addMsg(ICQEvent *); }; Index: mainwin.cpp =================================================================== RCS file: /cvsroot/licq/qt-gui/src/mainwin.cpp,v retrieving revision 1.337 retrieving revision 1.338 diff -u -d -r1.337 -r1.338 --- mainwin.cpp 10 Oct 2004 15:35:18 -0000 1.337 +++ mainwin.cpp 18 Nov 2004 13:49:26 -0000 1.338 @@ -695,7 +695,13 @@ this, SLOT(slot_protocolPlugin(unsigned long))); connect (licqSigMan, SIGNAL(signal_eventTag(const char *, unsigned long, unsigned long)), this, SLOT(slot_eventTag(const char *, unsigned long, unsigned long))); - + connect (licqSigMan, SIGNAL(signal_socket(const char *, unsigned long, int)), + this, SLOT(slot_socket(const char *, unsigned long, int))); + connect (licqSigMan, SIGNAL(signal_convoJoin(const char *, unsigned long, int)), + this, SLOT(slot_convoJoin(const char *, unsigned long, int))); + connect (licqSigMan, SIGNAL(signal_convoLeave(const char *, unsigned long, int)), + this, SLOT(slot_convoLeave(const char *, unsigned long, int))); + m_bInMiniMode = false; updateStatus(); updateEvents(); @@ -1393,9 +1399,9 @@ gUserManager.DropUser(u); if (bCallUserView) - callFunction(mnuUserView, szId, nPPID); + callFunction(mnuUserView, szId, nPPID, sig->Argument2()); if (bCallSendMsg) - callFunction(mnuUserSendMsg, szId, nPPID); + callFunction(mnuUserSendMsg, szId, nPPID, sig->Argument2()); } else gUserManager.DropUser(u); @@ -1542,13 +1548,14 @@ if (m_bTabbedChatting && userEventTabDlg) { if (sig->SubSignal() == USER_TYPING) - userEventTabDlg->gotTyping(u); + userEventTabDlg->gotTyping(u, sig->Argument()); userEventTabDlg->updateTabLabel(u); } else #endif if (sig->SubSignal() == USER_TYPING) { + // First, update the window if available #if QT_VERSION < 300 QListIterator<UserSendCommon> it(licqUserSend ); #else @@ -1557,12 +1564,26 @@ UserEventCommon *e = 0; for (; it.current(); ++it) - if ((*it)->Id() && strcmp((*it)->Id(), szId) == 0 && - (*it)->PPID() == nPPID) + { + if ((*it)->PPID() == MSN_PPID) { + // For protocols that use the convo id + if ((*it)->ConvoId() == sig->Argument() && (*it)->PPID() == nPPID) + { + e = static_cast<UserSendCommon *>(*it); + e->gotTyping(u->GetTyping()); + } + } + else + { + // For protocols that don't use a convo id + if (strcmp((*it)->Id(), szId) == 0 && (*it)->PPID() == nPPID) + { e = static_cast<UserSendCommon*>(*it); e->gotTyping(u->GetTyping()); + } } + } } gUserManager.DropUser(u); @@ -1700,6 +1721,66 @@ } // Switch } +void CMainWindow::slot_socket(const char *szId, unsigned long nPPID, int nConvoId) +{ + // Add the user to an ongoing conversation +#if QT_VERSION < 300 + QListIterator<UserSendCommon> it(licqUserSend); +#else + QPtrListIterator<UserSendCommon> it(licqUserSend); +#endif + for (; it.current(); ++it) + { + if (strcmp((*it)->Id(), szId) == 0 && (*it)->PPID() == nPPID) + { + if ((*it)->ConvoId() == -1) + { + (*it)->SetConvoId(nConvoId); + break; + } + } + } +} + +void CMainWindow::slot_convoJoin(const char *szId, unsigned long nPPID, int nConvoId) +{ + // Add the user to an ongoing conversation +#if QT_VERSION < 300 + QListIterator<UserSendCommon> it(licqUserSend); +#else + QPtrListIterator<UserSendCommon> it(licqUserSend); +#endif + for (; it.current(); ++it) + { + if ((*it)->ConvoId() == nConvoId) + { + (*it)->convoJoin(szId); + return; + } + } + + // No conversation shown, so make one + +} + +void CMainWindow::slot_convoLeave(const char *szId, unsigned long nPPID, int nConvoId) +{ + // Add the user to an ongoing conversation +#if QT_VERSION < 300 + QListIterator<UserSendCommon> it(licqUserSend); +#else + QPtrListIterator<UserSendCommon> it(licqUserSend); +#endif + for (; it.current(); ++it) + { + if ((*it)->ConvoId() == nConvoId) + { + (*it)->convoLeave(szId); + return; + } + } +} + //-----CMainWindow::updateUserWin----------------------------------------------- void CMainWindow::updateUserWin() { @@ -2143,6 +2224,9 @@ if (u == 0) return; + // For multi user conversations (i.e. in MSN) + int nConvoId = -1; + // set default function to read or send depending on whether or not // there are new messages int fcn = (u->NewMessages() == 0 ? mnuUserSendMsg : mnuUserView); @@ -2153,6 +2237,7 @@ for (unsigned short i = 0; i < u->NewMessages(); i++) if (u->EventPeek(i)->SubCommand() == ICQ_CMDxSUB_MSG) { + nConvoId = u->EventPeek(i)->Socket(); fcn = mnuUserSendMsg; break; } @@ -2191,7 +2276,7 @@ } } - callFunction(fcn, _szId, _nPPID); + callFunction(fcn, _szId, _nPPID, nConvoId); } void CMainWindow::callDefaultFunction(QListViewItem *i) @@ -2448,7 +2533,7 @@ //-----CMainWindow::callICQFunction------------------------------------------- UserEventCommon *CMainWindow::callFunction(int fcn, const char *szId, - unsigned long nPPID) + unsigned long nPPID, int nConvoId) { if (szId == 0 || nPPID == 0) return NULL; @@ -2496,32 +2581,38 @@ if (!m_bMsgChatView) break; for (; it.current(); ++it) - if ((*it)->Id() && strcmp((*it)->Id(), szId) == 0 && - (*it)->PPID() == nPPID) + // Protocols (MSN only atm) that support convo ids are differentiated from + // the icq protocol because the convo id will be the server socket.. which does + // not meet the requirement that convo ids must be unique for each conversation. + if ( ((nPPID == MSN_PPID && (*it)->PPID() == MSN_PPID) && ((*it)->FindUserInConvo(const_cast<char *>(szId)) || + ((*it)->ConvoId() == nConvoId && (*it)->ConvoId() != -1))) || + ((*it)->FindUserInConvo(const_cast<char *>(szId)) && (*it)->PPID() == nPPID)) { - e = static_cast<UserSendCommon*>(*it); + e = static_cast<UserSendCommon*>(*it); + //if (!e->FindUserInConvo(const_cast<char *>(szId))) + // e->convoJoin(szId); #if QT_VERSION >= 300 - if (userEventTabDlg && userEventTabDlg->tabExists(e)) - { - userEventTabDlg->show(); - userEventTabDlg->selectTab(e); - userEventTabDlg->raise(); + if (userEventTabDlg && userEventTabDlg->tabExists(e)) + { + userEventTabDlg->show(); + userEventTabDlg->selectTab(e); + userEventTabDlg->raise(); #ifdef USE_KDE - KWin::setActiveWindow(userEventTabDlg->winId()); + KWin::setActiveWindow(userEventTabDlg->winId()); #endif - } - else + } + else #endif - { - e->show(); - if (!qApp->activeWindow() || !qApp->activeWindow()->inherits("UserEventCommon")) - { - e->raise(); + { + e->show(); + if (!qApp->activeWindow() || !qApp->activeWindow()->inherits("UserEventCommon")) + { + e->raise(); #ifdef USE_KDE - KWin::setActiveWindow(e->winId()); + KWin::setActiveWindow(e->winId()); #endif - } - } + } + } return e; } } @@ -2779,7 +2870,7 @@ if (u->EventPeek(i)->SubCommand() == ICQ_CMDxSUB_MSG) { gUserManager.DropUser(u); - callFunction(mnuUserSendMsg, szId, nPPID); + callFunction(mnuUserSendMsg, szId, nPPID, u->EventPeek(i)->Socket()); return; } } Index: mainwin.h =================================================================== RCS file: /cvsroot/licq/qt-gui/src/mainwin.h,v retrieving revision 1.130 retrieving revision 1.131 diff -u -d -r1.130 -r1.131 --- mainwin.h 2 Oct 2004 15:57:15 -0000 1.130 +++ mainwin.h 18 Nov 2004 13:49:26 -0000 1.131 @@ -103,7 +103,7 @@ virtual ~CMainWindow(); bool RemoveUserFromList(unsigned long, QWidget *); bool RemoveUserFromGroup(GroupType gtype, unsigned long group, unsigned long, QWidget *); - UserEventCommon *callFunction(int fcn, const char *, unsigned long); + UserEventCommon *callFunction(int fcn, const char *, unsigned long, int = -1); bool RemoveUserFromList(const char *, unsigned long, QWidget *); bool RemoveUserFromGroup(GroupType, unsigned long, const char *, unsigned long, QWidget *); @@ -317,6 +317,9 @@ void callFileFunction (const char *); void callUrlFunction (const char *); void callUserFunction(int); + void slot_socket(const char *, unsigned long, int); + void slot_convoJoin(const char *, unsigned long, int); + void slot_convoLeave(const char *, unsigned long, int); //TODO //void callUserFunction(const char *, unsigned long); void slot_userfinished(const char *, unsigned long); Index: sigman.cpp =================================================================== RCS file: /cvsroot/licq/qt-gui/src/sigman.cpp,v retrieving revision 1.30 retrieving revision 1.31 diff -u -d -r1.30 -r1.31 --- sigman.cpp 15 Sep 2004 15:14:08 -0000 1.30 +++ sigman.cpp 18 Nov 2004 13:49:26 -0000 1.31 @@ -120,6 +120,15 @@ case SIGNAL_EVENTxID: emit signal_eventTag(s->Id(), s->PPID(), s->Argument()); break; + case SIGNAL_SOCKET: + emit signal_socket(s->Id(), s->PPID(), s->Argument()); + break; + case SIGNAL_CONVOxJOIN: + emit signal_convoJoin(s->Id(), s->PPID(), s->Argument()); + break; + case SIGNAL_CONVOxLEAVE: + emit signal_convoLeave(s->Id(), s->PPID(), s->Argument()); + break; default: gLog.Warn("%sInternal error: CSignalManager::ProcessSignal(): Unknown signal command received from daemon: %ld.\n", L_WARNxSTR, s->Signal()); Index: sigman.h =================================================================== RCS file: /cvsroot/licq/qt-gui/src/sigman.h,v retrieving revision 1.11 retrieving revision 1.12 diff -u -d -r1.11 -r1.12 --- sigman.h 3 Jun 2004 01:57:25 -0000 1.11 +++ sigman.h 18 Nov 2004 13:49:26 -0000 1.12 @@ -38,7 +38,10 @@ void signal_ui_message(const char *, unsigned long); void signal_protocolPlugin(unsigned long); void signal_eventTag(const char *, unsigned long, unsigned long); - + void signal_socket(const char *, unsigned long, int); + void signal_convoJoin(const char *, unsigned long, int); + void signal_convoLeave(const char *, unsigned long, int); + // Event signals void signal_doneOwnerFcn(ICQEvent *); void signal_doneUserFcn(ICQEvent *); Index: usereventdlg.cpp =================================================================== RCS file: /cvsroot/licq/qt-gui/src/usereventdlg.cpp,v retrieving revision 1.162 retrieving revision 1.163 diff -u -d -r1.162 -r1.163 --- usereventdlg.cpp 10 Oct 2004 15:35:18 -0000 1.162 +++ usereventdlg.cpp 18 Nov 2004 13:49:26 -0000 1.163 @@ -23,6 +23,9 @@ #include "config.h" #endif +#include <algorithm> +#include <utility> + #include <assert.h> #include <qaccel.h> #include <qcheckbox.h> @@ -75,6 +78,9 @@ #include "xpm/chatChangeFg.xpm" [...1011 lines suppressed...] { nfoNumber->setData(codec->toUnicode(u->GetCellularNumber())); @@ -2946,7 +3102,7 @@ // Take care of typing notification now tmrSendTyping->stop(); connect(mleSend, SIGNAL(textChanged()), this, SLOT(slot_textChanged())); - server->ProtoTypingNotification(m_szId, m_nPPID, false); + server->ProtoTypingNotification(m_lUsers.front().c_str(), m_nPPID, false, m_nConvoId); unsigned long icqEventTag = 0; if (m_lnEventTag.size()) @@ -2967,7 +3123,7 @@ //TODO in daemon icqEventTag = server->icqSendSms(nfoNumber->text().latin1(), mleSend->text().utf8().data(), - strtoul(m_szId, (char **)NULL, 10)); + strtoul(m_lUsers.front().c_str(), (char **)NULL, 10)); m_lnEventTag.push_back(icqEventTag); UserSendCommon::sendButton(); Index: usereventdlg.h =================================================================== RCS file: /cvsroot/licq/qt-gui/src/usereventdlg.h,v retrieving revision 1.65 retrieving revision 1.66 diff -u -d -r1.65 -r1.66 --- usereventdlg.h 2 Jun 2004 14:35:50 -0000 1.65 +++ usereventdlg.h 18 Nov 2004 13:49:27 -0000 1.66 @@ -20,10 +20,19 @@ #define USEREVENTDLG_H #include <qwidget.h> +#include <functional> #include <list> +#include <string> +#include <utility> + +using std::binary_function; +using std::list; +using std::pair; +using std::string; #include "licq_color.h" #include "licq_filetransfer.h" +#include "licq_message.h" class QTabWidget; class QBoxLayout; @@ -56,6 +65,17 @@ class MLView; /* ----------------------------------------------------------------------------- */ +typedef pair<CUserEvent *, char *> MessageIter; + +struct OrderMessages : public binary_function<const MessageIter &, const MessageIter &, bool> +{ + bool operator()(const MessageIter& m1, const MessageIter& m2) + { + return (m1.first->Time() < m2.first->Time()); + } +}; + +/* ----------------------------------------------------------------------------- */ class UserEventTabDlg : public QWidget { Q_OBJECT @@ -69,8 +89,9 @@ void replaceTab(QWidget *oldTab, UserEventCommon *newTab); bool tabIsSelected(QWidget *tab); bool tabExists(QWidget *tab); + void updateConvoLabel(UserEventCommon *tab); void updateTabLabel(ICQUser *u); - void gotTyping(ICQUser *u); + void gotTyping(ICQUser *u, int); private: CETabWidget *tabw; @@ -98,10 +119,14 @@ char *Id() { return m_szId; } unsigned long PPID() { return m_nPPID; } - + int ConvoId() { return m_nConvoId; } + list<string>& ConvoUsers() { return m_lUsers; } + void SetConvoId(int n) { m_nConvoId = n; } + + bool FindUserInConvo(char *); void AddEventTag(unsigned long n) { if (n) m_lnEventTag.push_back(n); } void gotTyping(unsigned short); - + enum type { UC_MESSAGE, UC_URL, @@ -114,6 +139,7 @@ QTextCodec *codec; bool m_bOwner; char *m_szId; + list<string> m_lUsers; unsigned long m_nPPID; QBoxLayout* top_lay, *top_hlay; CICQDaemon *server; @@ -129,12 +155,13 @@ QTimer *tmrTime, *tmrTyping; bool m_bDeleteUser; QString m_sBaseTitle, m_sProgressMsg; - + int m_nConvoId; + // ID of the higest event we've processed. Helps determine // which events we already processed in the ctor. int m_highestEventId; - virtual void UserUpdated(CICQSignal *, ICQUser *) = 0; + virtual void UserUpdated(CICQSignal *, char * = 0, unsigned long = 0) = 0; void SetGeneralInfo(ICQUser *); protected slots: @@ -183,7 +210,7 @@ void generateReply(); void sendMsg(QString txt); void updateNextButton(); - virtual void UserUpdated(CICQSignal *, ICQUser *); + virtual void UserUpdated(CICQSignal *, char * = 0, unsigned long = 0); protected slots: void slot_close(); @@ -214,11 +241,14 @@ virtual ~UserSendCommon(); void setText(const QString& txt); + void convoJoin(const char *); + void convoLeave(const char *); + #if QT_VERSION >= 300 virtual void windowActivationChange(bool oldActive); #endif int clearDelay; - + signals: void autoCloseNotify(); void updateUser(CICQSignal*); @@ -239,7 +269,7 @@ QTimer *tmrSendTyping; void RetrySend(ICQEvent *e, bool bOnline, unsigned short nLevel); - virtual void UserUpdated(CICQSignal *, ICQUser *); + virtual void UserUpdated(CICQSignal *, char * = 0, unsigned long = 0); virtual bool sendDone(ICQEvent *) = 0; bool checkSecure(); Index: wharf.cpp =================================================================== RCS file: /cvsroot/licq/qt-gui/src/wharf.cpp,v retrieving revision 1.54 retrieving revision 1.55 diff -u -d -r1.54 -r1.55 --- wharf.cpp 10 Oct 2004 15:35:19 -0000 1.54 +++ wharf.cpp 18 Nov 2004 13:49:27 -0000 1.55 @@ -698,7 +698,7 @@ { XWindowAttributes a; XGetWindowAttributes(qt_xdisplay(), ev->xreparent.parent, &a); - move((a.width - width()) / 2, (a.height - height()) / 2); + // move((a.width - width()) / 2, (a.height - height()) / 2); } return QWidget::x11Event(ev); } |