00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
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();
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
00098 unknown4 = rhs.getUnknown1_4();
00099 IP = rhs.getIP();
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
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;
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
00259 return;
00260 }
00261 privateList[frd.getQQ()] = frd;
00262 }
00263
00264 void FriendList::updateFriend( const QQFriend &frd)
00265 {
00266 deleteFriend(frd.getQQ());
00267 addFriend(frd);
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
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
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