licq_interests.diff is a first attemp to check for the Users 's personal interests i know that the right thing (...) would be to store the array of interests in this first patch my aproach is to "render" the string.
qt_interests.diff is my aproach to add it to the Users Info Dialog.. Note that it display de info in About dialog. (and i don't know yet why) (i am not a c++ programer) Feel free to test, fix, and comment. The main thing. Store the array as Eg: interests_n = 3 interests_sz_1 = C, AWK ... Interests_cat_1 = 68000 .... ? So...do you think i should change this code to save the array? Regards, Juan.
? licqd_personal.diff Index: include/licq_events.h =================================================================== RCS file: /cvsroot/licq/licq/include/licq_events.h,v retrieving revision 1.13 diff -u -1 -b -p -r1.13 licq_events.h --- include/licq_events.h 1 Dec 2001 15:50:40 -0000 1.13 +++ include/licq_events.h 16 Apr 2002 22:04:06 -0000 @@ -292,2 +292,3 @@ const unsigned long USER_ABOUT const unsigned long USER_SECURITY = 9; +const unsigned long USER_INTERESTS = 10; Index: include/licq_user.h =================================================================== RCS file: /cvsroot/licq/licq/include/licq_user.h,v retrieving revision 1.23 diff -u -1 -b -p -r1.23 licq_user.h --- include/licq_user.h 20 Mar 2002 06:35:46 -0000 1.23 +++ include/licq_user.h 16 Apr 2002 22:04:06 -0000 @@ -163,2 +163,3 @@ public: void SaveAboutInfo(); + void SaveInterestsInfo(); void SaveExtInfo(); @@ -212,2 +213,3 @@ public: char *GetAbout() { return m_szAbout; } + char *GetInterests() { return m_szInterests; } @@ -294,3 +296,4 @@ public: void SetAbout(const char *n) { SetString(&m_szAbout, n); SaveAboutInfo(); } - + // Personal Interets Info + void SetInterests( const char *n) { SetString(&m_szInterests,n); SaveInterestsInfo(); } // Licq Info @@ -416,2 +419,3 @@ protected: void LoadAboutInfo(); + void LoadInterestsInfo(); void LoadLicqInfo(); @@ -505,2 +509,4 @@ protected: char *m_szAbout; + // Personal Interests + char *m_szInterests; Index: src/icqd-srv.cpp =================================================================== RCS file: /cvsroot/licq/licq/src/icqd-srv.cpp,v retrieving revision 1.29 diff -u -1 -b -p -r1.29 icqd-srv.cpp --- src/icqd-srv.cpp 9 Apr 2002 20:58:59 -0000 1.29 +++ src/icqd-srv.cpp 16 Apr 2002 22:04:07 -0000 @@ -1125,2 +1125,24 @@ void CICQDaemon::ProcessLocationFam(cons +static const char * info_category2str( unsigned short cat ) +{ struct _table + { unsigned short cat ; + const char * str ; + } ; + static struct _table t[] = + { + { 0x0068, "Computer" } + }; + unsigned i; + const char *ret = "unknown"; + + for( i=0 ; i < sizeof(t)/sizeof(*t) ; i++ ) + { if( cat == t[i].cat ) + { ret = t[i].str; + break; + } + } + + return ret; +} + //--------ProcessBuddyFam-------------------------------------------------- @@ -2446,8 +2468,39 @@ void CICQDaemon::ProcessVariousFam(CBuff // personal interests info + unsigned int n_info; + unsigned short category; + char s[MAX_DATA_LEN]={0}; + char *tmp; + const char *szCat; + int len=sizeof(s); + #define sz_sep ": " + + gLog.Info("%sPersonal Interests Info on %s (%ld).\n", L_SRVxSTR, + u->GetAlias(), u ->Uin()); + + n_info = msg.UnpackChar() ; + for ( ; n_info > 0 ; n_info -- ) + { /* To do less work i save the interests as only one + * string. (versus Interests1,...,InterestsN,ICat1..ICatN) + */ + + category=msg.UnpackUnsignedShort(); + tmp = msg.UnpackString(); + szCat = info_category2str(category); + + len -= strlen(tmp) + strlen(sz_sep) + strlen(szCat) + 1 ; + if( len > 0 ) + { strcat(s,szCat); + strcat(s,sz_sep); + strcat(s,tmp); + strcat(s,"\n"); + } + else + break; + delete tmp; + } - char * buf; - - gLog.Unknown("%spersonal interests: %04hx\n%s\n", L_UNKNOWNxSTR, - nSubSequence, packet.print(buf)); - delete [] buf; + // save the user infomation + u->SetInterests( s ); + u->SetEnableSave(true); + u->SaveInterestsInfo(); @@ -2456,2 +2509,4 @@ void CICQDaemon::ProcessVariousFam(CBuff + PushPluginSignal(new CICQSignal(SIGNAL_UPDATExUSER, USER_INTERESTS, + u->Uin())); break; Index: src/user.cpp =================================================================== RCS file: /cvsroot/licq/licq/src/user.cpp,v retrieving revision 1.36 diff -u -1 -b -p -r1.36 user.cpp --- src/user.cpp 19 Mar 2002 06:54:24 -0000 1.36 +++ src/user.cpp 16 Apr 2002 22:04:08 -0000 @@ -795,2 +795,3 @@ bool ICQUser::LoadInfo() LoadAboutInfo(); + LoadInterestsInfo(); LoadLicqInfo(); @@ -871,2 +872,11 @@ void ICQUser::LoadAboutInfo() +//-----ICQUser::LoadInterestsInfo----------------------------------------------- +void ICQUser::LoadInterestsInfo() +{ + // read in the fields, checking for errors each timei + char szTemp[MAX_DATA_LEN]; + m_fConf.SetSection("user"); + m_fConf.ReadStr("Interests", szTemp, ""); SetAbout(szTemp); + +} //-----ICQUser::LoadLicqInfo------------------------------------------------- @@ -999,2 +1009,4 @@ ICQUser::~ICQUser() free( m_szAbout ); + if( m_szInterests ) + free( m_szInterests ); if ( m_szCustomAutoResponse ) @@ -1089,2 +1101,4 @@ void ICQUser::Init(unsigned long _nUin) m_szAbout = NULL; + // Personal Interests + m_szInterests = NULL; @@ -1156,2 +1170,3 @@ void ICQUser::SetDefaults() SetAbout(szTemp); + SetInterests(szTemp); SetCustomAutoResponse(szTemp); @@ -1847,2 +1862,25 @@ void ICQUser::SaveAboutInfo() +//-----ICQUser::SaveInterestsInfo--------------------------------------------- +void ICQUser::SaveInterestsInfo() +{ + if (!EnableSave()) return; + + if (!m_fConf.ReloadFile()) + { gLog.Error("%sError opening '%s' for reading.\n" + "%sSee log for details.\n", + L_ERRORxSTR, m_fConf.FileName(), L_BLANKxSTR); + return ; + } + + m_fConf.SetSection("user"); + m_fConf.WriteStr("Interests", m_szInterests); + + if (!m_fConf.FlushFile()) + { gLog.Error("%sError opening '%s' for writing.\n" + "%sSee log for details.\n", L_ERRORxSTR, + m_fConf.FileName(), L_BLANKxSTR); + + return; + } +}
Index: userinfodlg.cpp =================================================================== RCS file: /cvsroot/licq/qt-gui/src/userinfodlg.cpp,v retrieving revision 1.39 diff -u -1 -b -p -r1.39 userinfodlg.cpp --- userinfodlg.cpp 8 Apr 2002 16:12:56 -0000 1.39 +++ userinfodlg.cpp 16 Apr 2002 22:03:13 -0000 @@ -71,2 +71,3 @@ UserInfoDlg::UserInfoDlg(CICQDaemon *s, CreateAbout(); + CreateInterests(); CreateHistory(); @@ -83,2 +84,3 @@ UserInfoDlg::UserInfoDlg(CICQDaemon *s, tabs->addTab(tabList[AboutInfo].tab, tabList[AboutInfo].label); + tabs->addTab(tabList[InterestsInfo].tab, tabList[InterestsInfo].label); tabs->addTab(tabList[HistoryInfo].tab, tabList[HistoryInfo].label); @@ -801,3 +803,3 @@ void UserInfoDlg::SetAbout(ICQUser *u) mleAbout->setText(aboutstr); - + cout << aboutstr ; if (bDropUser) gUserManager.DropUser(u); @@ -816,2 +818,53 @@ void UserInfoDlg::SaveAbout() +// ----Personal Interests-------------------------------------------------- +void UserInfoDlg::CreateInterests() +{ + tabList[InterestsInfo].label = tr("&Interests"); + tabList[InterestsInfo].tab = new QVBox(this, tabList[InterestsInfo].label.latin1()); + tabList[InterestsInfo].loaded = false; + + QVBox *p = (QVBox *)tabList[InterestsInfo].tab; + + p->setMargin(8); + p->setSpacing(8); + + lblInterests = new QLabel(tr("Interests:"), p); + mleInterests = new MLEditWrap(true, p); + mleInterests->setReadOnly(!m_bOwner); + +} + +void UserInfoDlg::SetInterests(ICQUser *u) +{ + tabList[InterestsInfo].loaded = true; + bool bDropUser = false; + + if (u == NULL) + { + u = gUserManager.FetchUser(m_nUin, LOCK_R); + if (u == NULL) return; + bDropUser = true; + } + + QTextCodec * codec = UserCodec::codecForICQUser(u); + + QString intereststr = codec->toUnicode(u->GetInterests()); + intereststr.replace(QRegExp("\r"), ""); + mleInterests->setText(intereststr); + + if (bDropUser) gUserManager.DropUser(u); + +} + +void UserInfoDlg::SaveInterests() +{ + ICQUser *u = gUserManager.FetchUser(m_nUin, LOCK_W); + if (u == NULL) return; + + QTextCodec * codec = UserCodec::codecForICQUser(u); + + u->SetInterests(codec->fromUnicode(mleInterests->text())); + gUserManager.DropUser(u); +} + //-----LastCounters-------------------------------------------------------- @@ -1194,2 +1247,3 @@ void UserInfoDlg::updateTab(const QStrin { + cout << txt; if (txt == tabList[GeneralInfo].label) @@ -1234,2 +1288,12 @@ void UserInfoDlg::updateTab(const QStrin } + else if( txt == tabList[InterestsInfo].label) + { + btnMain3->setText(tr("&Update")); + btnMain2->setText(m_bOwner ? tr("Retrieve") : tr("&Save")); + btnMain3->setEnabled(true); + btnMain2->setEnabled(true); + currentTab = InterestsInfo; + if (!tabList[InterestsInfo].loaded) + SetInterests(NULL); + } else if (txt == tabList[HistoryInfo].label) @@ -1276,2 +1340,5 @@ void UserInfoDlg::SaveSettings() break; + case InterestsInfo: + SaveInterests(); + break; case HistoryInfo: @@ -1314,2 +1381,3 @@ void UserInfoDlg::slotRetrieve() case AboutInfo: icqEventTag = server->icqRequestMetaInfo(m_nUin); break; + case InterestsInfo: icqEventTag = server->icqRequestMetaInfo(m_nUin); break; } @@ -1397,2 +1465,3 @@ void UserInfoDlg::slotUpdate() case AboutInfo: icqEventTag = server->icqSetAbout(codec->fromUnicode(mleAbout->text())); break; + // case InterestsInfo: icqEventTag = server->icqSetInterests(codec->fromUnicode(mleInterests->text()));break case HistoryInfo: ShowHistoryNext(); break; @@ -1469,2 +1538,5 @@ void UserInfoDlg::updatedUser(CICQSignal SetAbout(u); + break; + case USER_INTERESTS: + SetInterests(u); break; Index: userinfodlg.h =================================================================== RCS file: /cvsroot/licq/qt-gui/src/userinfodlg.h,v retrieving revision 1.16 diff -u -1 -b -p -r1.16 userinfodlg.h --- userinfodlg.h 5 Mar 2002 17:32:04 -0000 1.16 +++ userinfodlg.h 16 Apr 2002 22:03:13 -0000 @@ -52,2 +52,3 @@ public: AboutInfo, + InterestsInfo, HistoryInfo, @@ -114,2 +115,7 @@ protected: + // Interests + void CreateInterests(); + QLabel *lblInterests; + MLEditWrap *mleInterests; + // Last Counters @@ -139,2 +145,3 @@ protected: void SetAbout(ICQUser *); + void SetInterests(ICQUser *); void SetLastCountersInfo(ICQUser *); @@ -144,2 +151,3 @@ protected: void SaveAbout(); + void SaveInterests();