Main Page | Class Hierarchy | Class List | Directories | File List | Class Members | File Members

evafriendlist.cpp

Go to the documentation of this file.
00001 /***************************************************************************
00002  *   Copyright (C) 2004 by yunfan                                          *
00003  *   yunfan_zg@163.com                                                     *
00004  *                                                                         *
00005  *   This program is free software; you can redistribute it and/or modify  *
00006  *   it under the terms of the GNU General Public License as published by  *
00007  *   the Free Software Foundation; either version 2 of the License, or     *
00008  *   (at your option) any later version.                                   *
00009  *                                                                         *
00010  *   This program is distributed in the hope that it will be useful,       *
00011  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
00012  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
00013  *   GNU General Public License for more details.                          *
00014  *                                                                         *
00015  *   You should have received a copy of the GNU General Public License     *
00016  *   along with this program; if not, write to the                         *
00017  *   Free Software Foundation, Inc.,                                       *
00018  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
00019  ***************************************************************************/
00020  #include "evafriendlist.h"
00021  #include <stdio.h>
00022 
00023 QQFriend::sortItem QQFriend::field2Sort = Sort_Nick;
00024 
00025 QQFriend::QQFriend()
00026 {
00027         initalizeBuddy();
00028 } 
00029 
00030 QQFriend::QQFriend(const int qqid, short qqFace)
00031 {
00032         initalizeBuddy( qqid, qqFace);
00033 }
00034 
00035 QQFriend::QQFriend(const QQFriend &rhs)
00036 {
00037         *this = rhs;
00038 }
00039 
00040 void QQFriend::setFriendItem( const FriendItem &item)
00041 {
00042         qqNum = item.getQQ();
00043         face = item.getFace() ;
00044         age = item.getAge();
00045         gender = item.getGender();
00046         nick = item.getNick();
00047         extFlag = item.getExtFlag();
00048         commonFlag = item.getCommonFlag();
00049         loginTime = item.getLoginTime();
00050         idleTime = item.getIdleTime();
00051         lastRefreshTime = item.getLastRefreshTime();
00052 }
00053 
00054 void QQFriend::setFriendOnlineEntry( const FriendOnlineEntry &entry)
00055 {
00056         if(qqNum != entry.getQQ()) return;
00057         unknown4 = entry.getUnknown1_4();
00058         IP = entry.getIP();  // 4 bytes
00059         port = entry.getPort();
00060         unknown11 = entry.getUnknown2_11();
00061         status = entry.getStatus();
00062         unknown13_14 = entry.getUnknown3_13_14();
00063         memcpy(unknownKey, entry.getUnknownKey(), QQ_KEY_LENGTH);
00064         
00065         unknown31_32 = entry.getUnknown4_31_32();
00066         onlineExtFlag = entry.getExtFlag();
00067         onlineCommonFlag = entry.getCommFlag();
00068         unknown35_36 = entry.getUnknown5_35_36();
00069 }
00070 
00071 void QQFriend::setUserInformation( const ContactInfo &info)
00072 {
00073         userInfo = info;
00074         if(info.count()<5) {
00075                 return;
00076         }
00077         face = (short)(atoi(info.at(ContactInfo::Info_face).c_str()));
00078         age = (char)(atoi(info.at(ContactInfo::Info_age).c_str()));
00079         gender = (char)(atoi(info.at(ContactInfo::Info_gender).c_str()));
00080         nick  = info.at(ContactInfo::Info_nick);
00081 }
00082 
00083 QQFriend &QQFriend::operator=(const QQFriend &rhs)
00084 {
00085         qqNum = rhs.getQQ();
00086         face = rhs.getFace();
00087         age = rhs.getAge();
00088         gender = rhs.getGender();
00089         nick = rhs.getNick();   
00090         extFlag = rhs.getExtFlag();    
00091         commonFlag = rhs.getCommonFlag();  
00092 
00093         loginTime = rhs.getLoginTime();
00094         idleTime = rhs.getIdleTime();
00095         lastRefreshTime = rhs.getLastRefreshTime();
00096         
00097         //int qqNum;
00098         unknown4 = rhs.getUnknown1_4();
00099         IP = rhs.getIP();  // 4 bytes
00100         port = rhs.getPort();
00101         unknown11 = rhs.getUnknown2_11();
00102         status = rhs.getStatus();
00103         unknown13_14 = rhs.getUnknown3_13_14();
00104         memcpy(unknownKey, rhs.getUnknownKey(), QQ_KEY_LENGTH);
00105         unknown31_32 = rhs.getUnknown4_31_32();
00106         onlineExtFlag = rhs.getOnlineExtFlag();
00107         onlineCommonFlag = rhs.getOnlineCommFlag();
00108         unknown35_36 = rhs.getUnknown5_35_36();
00109         
00110         timeOnline = rhs.getOnlineTime();
00111         level = rhs.getLevel();
00112         hoursToLevelUp = rhs.getHoursToLevelUp();
00113         
00114         clientVersion = rhs.getVersion();
00115         
00116         mExtraInfo = rhs.getExtraInfo();
00117         mSignature = rhs.getSignature();
00118         mSignatureModifyTime = rhs.getSignatureModifyTime();
00119 
00120         m_Memo = rhs.getMemo();
00121 
00122         memcpy(fileSessionKey, rhs.getFileSessionKey(), QQ_KEY_LENGTH);
00123         
00124         userInfo = rhs.getUserInformation();
00125         
00126         field2Sort = rhs.getSortField();
00127         
00128         groupIndex = rhs.getGroupIndex();
00129         
00130         m_Sequence = rhs.getSequence();
00131 
00132         m_ChatFontSize = rhs.getChatFontSize();
00133         m_ChatFontColor = rhs.getChatFontColor();
00134         return *this;
00135 }
00136 
00137 int QQFriend::operator==(const QQFriend &rhs) const 
00138 {
00139         if( qqNum != rhs.getQQ()) return 0;
00140         return 1;
00141 }
00142 
00143 // for this part, we compare the field by field2Sort
00144 int QQFriend::operator<(const QQFriend &rhs) const 
00145 {
00146         switch(field2Sort){
00147                 case Sort_QQ:
00148                         if(qqNum< rhs.getQQ()) return 1;
00149                         break;
00150                 case Sort_Nick:
00151                         if(nick < rhs.getNick()) return 1;
00152                         break;
00153                 case Sort_Status:
00154                         if(status == rhs.getStatus())  return 1;
00155                         if(status == QQ_FRIEND_STATUS_ONLINE) return 1;
00156                         if(rhs.getStatus() == QQ_FRIEND_STATUS_ONLINE) return 0;
00157                         if(status == QQ_FRIEND_STATUS_LEAVE)  return 1;
00158                         if(rhs.getStatus() == QQ_FRIEND_STATUS_LEAVE) return 0;
00159                         return 1;
00160         }
00161         return 0;
00162 }
00163 
00164 void QQFriend::initalizeBuddy(const int qqid, short qqFace)
00165 {
00166         qqNum = qqid;
00167         face = qqFace;
00168         age = BUDDY_INVALID_FIELD;
00169         gender = BUDDY_INVALID_FIELD;
00170         char *temp = (char*)malloc(20 * sizeof(char));
00171         if(temp==NULL) {
00172                 fprintf(stderr, "Memomry not enough, exit.\n");
00173                 exit(0);
00174         }
00175         sprintf(temp,"%d",qqid);
00176         nick.assign(temp);
00177         free(temp);
00178         extFlag = BUDDY_INVALID_FIELD;
00179         commonFlag = BUDDY_INVALID_FIELD;
00180         loginTime = BUDDY_INVALID_FIELD;
00181         idleTime = BUDDY_INVALID_FIELD;
00182         lastRefreshTime = BUDDY_INVALID_FIELD;
00183         
00184         unknown4 = BUDDY_INVALID_FIELD;
00185         IP = 0;
00186         port = BUDDY_INVALID_FIELD;
00187         unknown11 = BUDDY_INVALID_FIELD;
00188         status = BUDDY_INVALID_FIELD;
00189         unknown13_14 = BUDDY_INVALID_FIELD;     
00190         memset(unknownKey, 0, QQ_KEY_LENGTH);
00191         unknown31_32 = BUDDY_INVALID_FIELD;
00192         onlineExtFlag = BUDDY_INVALID_FIELD;
00193         onlineCommonFlag = BUDDY_INVALID_FIELD;
00194         unknown35_36 = BUDDY_INVALID_FIELD;
00195         
00196         mExtraInfo = 0;
00197         mSignature = "";
00198         mSignatureModifyTime = 0;
00199 
00200         m_Memo.name = "";
00201         m_Memo.telephone = "";
00202         m_Memo.mobile = "";
00203         m_Memo.address = "";
00204         m_Memo.email = "";
00205         m_Memo.zipcode = "";
00206         m_Memo.note = "";
00207         
00208         clientVersion = BUDDY_INVALID_FIELD;
00209         memset(fileSessionKey, 0, QQ_KEY_LENGTH);
00210         
00211         groupIndex = 0;  // set default to zero, "My Buddies"
00212         
00213         timeOnline = 0;
00214         level = 0;
00215         hoursToLevelUp = 0;
00216         m_Sequence = 0;
00217 
00218         m_ChatFontSize = 9;
00219         m_ChatFontColor = 0;
00220 }
00221 
00222 void QQFriend::setOnlineTime(const unsigned int time ) 
00223 {
00224         timeOnline = time;
00225 }
00226 /*  ======================================================= */
00227 
00228 const bool FriendList::hasFriend(const int id) 
00229 {
00230         std::map<int, QQFriend>::iterator iter;
00231         iter = getFriendPosition(id);
00232         if( iter == privateList.end()) return false;
00233         else
00234                 return true;
00235 }
00236 
00237 QQFriend *FriendList::getFriend(const int id)
00238 {
00239         std::map<int, QQFriend>::iterator iter = getFriendPosition(id);
00240         if(iter == privateList.end()) return NULL;
00241         
00242         return &privateList[id];
00243 }
00244 
00245 bool FriendList::deleteFriend(const int id)
00246 {
00247         std::map<int, QQFriend>::iterator iter = getFriendPosition(id);
00248         if( iter == privateList.end()) return false;
00249         privateList.erase(iter);
00250         return true;
00251 }
00252 
00253 void FriendList::addFriend(const QQFriend &frd)
00254 {
00255         std::map<int, QQFriend>::iterator iter = getFriendPosition(frd.getQQ());
00256         if( iter != privateList.end()) {
00257                 privateList[frd.getQQ()].setGroupIndex(frd.getGroupIndex());
00258                 //updateFriend(frd);
00259                 return;
00260         }
00261         privateList[frd.getQQ()] = frd;
00262 }
00263 
00264 void FriendList::updateFriend( const QQFriend &frd)
00265 {
00266         deleteFriend(frd.getQQ());      // delete it first
00267         addFriend(frd);                   // add new one;
00268 }
00269 
00270 bool FriendList::updateFriendIP(const int id, const int ip)
00271 {
00272         std::map<int, QQFriend>::iterator iter = getFriendPosition(id);
00273         if(iter == privateList.end()) return false;
00274         
00275         privateList[id].setIP(ip);
00276         return true;
00277 }
00278 
00279 bool FriendList::updateFriendFace(const int id, const short face)
00280 {
00281         std::map<int, QQFriend>::iterator iter = getFriendPosition(id);
00282         if(iter == privateList.end()) return false;
00283         
00284         privateList[id].setFace(face);
00285         return true;
00286 }
00287 
00288 bool FriendList::updateFriendPort(const int id, const short p)
00289 {
00290         std::map<int, QQFriend>::iterator iter = getFriendPosition(id);
00291         if(iter == privateList.end()) return false;
00292         
00293         privateList[id].setPort(p);
00294         return true;
00295 }
00296 
00297 bool FriendList::updateFriendStatus(const int id, const char status)
00298 {
00299         std::map<int, QQFriend>::iterator iter = getFriendPosition(id);
00300         if(iter == privateList.end()) return false;
00301         privateList[id].setStatus(status);
00302         return true;
00303 }
00304 
00305 bool FriendList::updateFriendFileSessionKey(const int id, const unsigned char *key)
00306 {
00307         std::map<int, QQFriend>::iterator iter = getFriendPosition(id);
00308         if(iter == privateList.end()) return false;
00309         
00310         privateList[id].setFileSessionKey(key);
00311         return true;
00312 }
00313 
00314 bool FriendList::updateFriendGroupIndex(const int id, const int index)
00315 {
00316         std::map<int, QQFriend>::iterator iter = getFriendPosition(id);
00317         if(iter == privateList.end()) return false;
00318         
00319         privateList[id].setGroupIndex(index);
00320         return true;
00321 }
00322 
00323 bool FriendList::updateFriendLevel(const int id, const unsigned int online, const unsigned short level, const unsigned short hours)
00324 {
00325         std::map<int, QQFriend>::iterator iter = getFriendPosition(id);
00326         if(iter == privateList.end()) return false;
00327         
00328         privateList[id].setOnlineTime(online);
00329         privateList[id].setLevel(level);
00330         privateList[id].setHoursToLevelUp(hours);
00331         
00332         return true;
00333 }
00334 
00335 bool FriendList::addFriendItemTo( const int id, const FriendItem &item)
00336 {
00337         std::map<int, QQFriend>::iterator iter = getFriendPosition(id);
00338         if(iter == privateList.end()) return false;
00339         
00340         privateList[id].setFriendItem(item);
00341         return true;
00342 }
00343 
00344 bool FriendList::addOnlineFriendEntryTo( const int id, const FriendOnlineEntry & entry)
00345 {
00346         std::map<int, QQFriend>::iterator iter = getFriendPosition(id);
00347         if(iter == privateList.end()) return false;
00348         
00349         privateList[id].setFriendOnlineEntry(entry);
00350         return true;
00351 }
00352 
00353 bool FriendList::addContactInfoTo( const int id, const ContactInfo &info)
00354 {
00355         std::map<int, QQFriend>::iterator iter = getFriendPosition(id);
00356         if(iter == privateList.end()) return false;
00357         privateList[id].setUserInformation(info);
00358         return true;
00359 }
00360 
00361 const int FriendList::numberOfOnlines()
00362 {
00363         int onlines = 0;
00364         std::map<int, QQFriend>::iterator iter;
00365         for(iter =privateList.begin(); iter != privateList.end(); ++iter){
00366                 switch(iter->second.getStatus()){
00367                 case QQ_FRIEND_STATUS_ONLINE:
00368                         onlines++;
00369                         break;
00370                 case QQ_FRIEND_STATUS_OFFLINE:
00371                         break;
00372                 case QQ_FRIEND_STATUS_LEAVE:
00373                         onlines++;
00374                         break;
00375                 case QQ_FRIEND_STATUS_INVISIBLE:
00376                         break;
00377                 }
00378         }
00379         return onlines;
00380 }
00381 
00382 std::list<QQFriend> FriendList::getFriendsInGroupIndexOf( const int index)
00383 {
00384         std::list<QQFriend> groupFriends;
00385         std::map<int, QQFriend>::iterator iter;
00386         for(iter =privateList.begin(); iter != privateList.end(); ++iter){
00387                 if(index == (iter->second).getGroupIndex())
00388                         groupFriends.push_back(iter->second);
00389         }
00390         return groupFriends;
00391 }
00392 
00393 std::list<QQFriend> FriendList::getAllFriends( const int myId )
00394 {
00395         std::list<QQFriend> allFriends;
00396         std::map<int, QQFriend>::iterator iter;
00397         for(iter =privateList.begin(); iter != privateList.end(); ++iter){
00398                 allFriends.push_back(iter->second);
00399         }
00400         if(myId)
00401                 allFriends.push_back(QQFriend(myId, 0));
00402         QQFriend::sortItem order = QQFriend::getSortField();
00403         QQFriend::setSortField(QQFriend::Sort_QQ);
00404         allFriends.sort();
00405         QQFriend::setSortField(order);
00406         return allFriends;
00407 }
00408 
00409 std::map<int, QQFriend>::iterator FriendList::getFriendPosition(const int id)
00410 {
00411         return privateList.find(id);
00412 }
00413 
00414 bool FriendList::setExtraInfo(const int id, const short info)
00415 {
00416         std::map<int, QQFriend>::iterator iter = getFriendPosition(id);
00417         if(iter == privateList.end()) return false;
00418         
00419         privateList[id].setExtraInfo(info);
00420         return true;
00421 }
00422 
00423 const std::map< int, int > FriendList::getMemberSignatureList(const int start, const int myId, const bool hasSignature)
00424 {
00425         std::map< int, int > list;
00426         int count =0 ;
00427         std::list<QQFriend> qqList = getAllFriends(myId);
00428         std::list<QQFriend>::iterator qqIter;
00429         
00430         for(qqIter = qqList.begin(); qqIter != qqList.end(); ++qqIter){
00431                 //printf(" qq: %d\n", qqIter->getQQ());
00432                 if(qqIter->getQQ()>=start && (qqIter->hasSignature()|| (qqIter->getQQ() == myId && hasSignature))){
00433                         list[qqIter->getQQ()] = qqIter->getSignatureModifyTime();
00434                         count++;
00435                         if(count>99) break;
00436                 }
00437         }
00438         // printf("member signature size: %d(%d)\t friend size: %d\n", list.size(), count, privateList.size());
00439  return list;
00440 }
00441 
00442 bool FriendList::setSignature( const int id, const std::string sig, const unsigned int time )
00443 {
00444  std::map<int, QQFriend>::iterator iter = getFriendPosition(id);
00445  if(iter == privateList.end()) return false;
00446  
00447  privateList[id].setSignature(sig, time);
00448  return true; 
00449 }
00450 
00451 const std::list< int > FriendList::getUserHeadList(const int myId, const bool hasUserHead )
00452 {
00453  std::list<int> results;
00454  std::list<QQFriend> qqList = getAllFriends(myId);
00455  std::list<QQFriend>::iterator qqIter;
00456  
00457  for(qqIter = qqList.begin(); qqIter != qqList.end(); ++qqIter){
00458                 if( qqIter->hasUserHead() || (qqIter->getQQ() == myId && hasUserHead))
00459                         results.push_back(qqIter->getQQ());
00460         }
00461         return results;
00462 }
00463 
00464 bool FriendList::setMemo( const int id, const MemoItem& memo )
00465 {
00466         std::map<int, QQFriend>::iterator iter = getFriendPosition(id);
00467         if(iter == privateList.end()) return false;
00468         
00469         privateList[id].setMemo(memo);
00470         return true;    
00471 }
00472 

Generated on Mon May 15 20:48:40 2006 for libeva by  doxygen 1.4.4