/** * Add a child tag to this one. The tag argument is reset to an empty tag. * * Be very careful that this method swallows the content of \e tag, leaving \e tag empty. * Thus, the following code won't work as expected: * \code * { * CECPacket *p = new CECPacket(whatever); * CECTag *t1 = new CECTag(whatever); * CECTag *t2 = new CECTag(whatever); * p->AddTag(*t1); * t1->AddTag(*t2); // t2 won't be part of p !!! * } * \endcode * * To get the desired results, the above should be replaced with something like: * * \code * { * CECPacket *p = new CECPacket(whatever); * CECTag *t1 = new CECTag(whatever); * CECTag *t2 = new CECTag(whatever); * t1->AddTag(*t2); * delete t2; // we can safely delete the now empty t2 here, because t1 holds its content * p->AddTag(*t1); * delete t1; // now p holds the content of both t1 and t2 * } * \endcode * * Then why copying? The answer is to enable simplifying the code like this: * * \code * { * CECPacket *p = new CECPacket(whatever); * CECTag t1(whatever); * t1.AddTag(CECTag(whatever)); // t2 is now created on-the-fly * p->AddTag(t1); // now p holds a copy of both t1 and t2 * } * \endcode * * @param tag a CECTag class instance to add. * @return \b true if tag was really added, * \b false when it was omitted through valuemap. */ bool CECTag::AddTag(const CECTag& tag, CValueMap* valuemap) { if (valuemap) { return valuemap->AddTag(tag, this); } // cannot have more than 64k tags wxASSERT(m_tagList.size() < 0xffff); // First add an empty tag. m_tagList.push_back(CECEmptyTag()); // Then exchange the data. The original tag will be destroyed right after this call anyway. // UGLY - GCC allows a reference to an in place constructed object only to be passed as const. // So pass it the way it wants it and then cheat and cast it back to non-const. :-/ CECTag& wtag = const_cast<CECTag&>(tag); wtag.swap(m_tagList.back()); return true; }
CEC_UpDownClient_Tag::CEC_UpDownClient_Tag(const CUpDownClient* client, EC_DETAIL_LEVEL detail_level, CValueMap *valuemap) : CECTag(EC_TAG_CLIENT, client->ECID()) { // General AddTag(CECTag(EC_TAG_CLIENT_NAME, client->GetUserName()), valuemap); AddTag(CECTag(EC_TAG_CLIENT_HASH, client->GetUserHash()), valuemap); AddTag(CECTag(EC_TAG_CLIENT_USER_ID, client->GetUserIDHybrid()), valuemap); AddTag(CECTag(EC_TAG_CLIENT_SCORE, client->GetScore()), valuemap); AddTag(CECTag(EC_TAG_CLIENT_SOFTWARE, client->GetClientSoft()), valuemap); AddTag(CECTag(EC_TAG_CLIENT_SOFT_VER_STR, client->GetSoftVerStr()), valuemap); AddTag(CECTag(EC_TAG_CLIENT_USER_IP, client->GetIP()), valuemap); AddTag(CECTag(EC_TAG_CLIENT_USER_PORT, client->GetUserPort()), valuemap); AddTag(CECTag(EC_TAG_CLIENT_FROM, (uint64)client->GetSourceFrom()), valuemap); AddTag(CECTag(EC_TAG_CLIENT_SERVER_IP, client->GetServerIP()), valuemap); AddTag(CECTag(EC_TAG_CLIENT_SERVER_PORT, client->GetServerPort()), valuemap); AddTag(CECTag(EC_TAG_CLIENT_SERVER_NAME, client->GetServerName()), valuemap); // Transfers to Client AddTag(CECTag(EC_TAG_CLIENT_UP_SPEED, client->GetUploadDatarate()), valuemap); if (client->GetDownloadState() == DS_DOWNLOADING || valuemap) { AddTag(CECTag(EC_TAG_CLIENT_DOWN_SPEED, (double)(client->GetKBpsDown())), valuemap); } AddTag(CECTag(EC_TAG_CLIENT_UPLOAD_SESSION, client->GetSessionUp()), valuemap); AddTag(CECTag(EC_TAG_PARTFILE_SIZE_XFER, client->GetTransferredDown()), valuemap); AddTag(CECTag(EC_TAG_CLIENT_UPLOAD_TOTAL, client->GetUploadedTotal()), valuemap); AddTag(CECTag(EC_TAG_CLIENT_DOWNLOAD_TOTAL, client->GetDownloadedTotal()), valuemap); AddTag(CECTag(EC_TAG_CLIENT_UPLOAD_STATE, client->GetUploadState()), valuemap); AddTag(CECTag(EC_TAG_CLIENT_DOWNLOAD_STATE, client->GetDownloadState()), valuemap); AddTag(CECTag(EC_TAG_CLIENT_IDENT_STATE, (uint64) client->GetCurrentIdentState()), valuemap); AddTag(CECTag(EC_TAG_CLIENT_EXT_PROTOCOL, client->ExtProtocolAvailable()), valuemap); // These are not needed atm. Keep them for now, maybe columns get reintroduced in client view. //AddTag(CECTag(EC_TAG_CLIENT_WAIT_TIME, client->GetWaitTime()), valuemap); //AddTag(CECTag(EC_TAG_CLIENT_XFER_TIME, client->GetUpStartTimeDelay()), valuemap); //AddTag(CECTag(EC_TAG_CLIENT_QUEUE_TIME, (uint64)(::GetTickCount() - client->GetWaitStartTime())), valuemap); //AddTag(CECTag(EC_TAG_CLIENT_LAST_TIME, (uint64)(::GetTickCount() - client->GetLastUpRequest())), valuemap); AddTag(CECTag(EC_TAG_CLIENT_WAITING_POSITION, client->GetUploadQueueWaitingPosition()), valuemap); AddTag(CECTag(EC_TAG_CLIENT_REMOTE_QUEUE_RANK, client->IsRemoteQueueFull() ? (uint16)0xffff : client->GetRemoteQueueRank()), valuemap); AddTag(CECTag(EC_TAG_CLIENT_OLD_REMOTE_QUEUE_RANK, client->GetOldRemoteQueueRank()), valuemap); AddTag(CECTag(EC_TAG_CLIENT_OBFUSCATION_STATUS, client->GetObfuscationStatus()), valuemap); AddTag(CECTag(EC_TAG_CLIENT_KAD_PORT, client->GetKadPort()), valuemap); AddTag(CECTag(EC_TAG_CLIENT_FRIEND_SLOT, client->GetFriendSlot()), valuemap); if (detail_level == EC_DETAIL_UPDATE) { return; } const CKnownFile* file = client->GetUploadFile(); if (file) { AddTag(CECTag(EC_TAG_PARTFILE_NAME, file->GetFileName().GetPrintable()), valuemap); AddTag(CECTag(EC_TAG_CLIENT_UPLOAD_FILE, file->ECID()), valuemap); } else { AddTag(CECIntTag(EC_TAG_CLIENT_UPLOAD_FILE, 0), valuemap); } const CPartFile* pfile = client->GetRequestFile(); AddTag(CECTag(EC_TAG_CLIENT_REQUEST_FILE, pfile ? pfile->ECID() : 0), valuemap); AddTag(CECTag(EC_TAG_CLIENT_REMOTE_FILENAME, client->GetClientFilename()), valuemap); if (detail_level != EC_DETAIL_INC_UPDATE) { return; } AddTag(CECTag(EC_TAG_CLIENT_DISABLE_VIEW_SHARED, client->HasDisabledSharedFiles()), valuemap); AddTag(CECTag(EC_TAG_CLIENT_VERSION, client->GetVersion()), valuemap); AddTag(CECTag(EC_TAG_CLIENT_MOD_VERSION, client->GetClientModString()), valuemap); AddTag(CECTag(EC_TAG_CLIENT_OS_INFO, client->GetClientOSInfo()), valuemap); AddTag(CECTag(EC_TAG_CLIENT_AVAILABLE_PARTS, client->GetAvailablePartCount()), valuemap); if (pfile) { const BitVector & partStatus = client->GetPartStatus(); if (partStatus.size() == pfile->GetPartCount()) { if (partStatus.AllTrue()) { // send just an empty tag for a full source AddTag(CECEmptyTag(EC_TAG_CLIENT_PART_STATUS), valuemap); } else { AddTag(CECTag(EC_TAG_CLIENT_PART_STATUS, partStatus.SizeBuffer(), partStatus.GetBuffer()), valuemap); } } AddTag(CECTag(EC_TAG_CLIENT_NEXT_REQUESTED_PART, client->GetNextRequestedPart()), valuemap); AddTag(CECTag(EC_TAG_CLIENT_LAST_DOWNLOADING_PART, client->GetLastDownloadingPart()), valuemap); } if (file) { const BitVector & upPartStatus = client->GetUpPartStatus(); if (upPartStatus.size() == file->GetPartCount()) { AddTag(CECTag(EC_TAG_CLIENT_UPLOAD_PART_STATUS, upPartStatus.SizeBuffer(), upPartStatus.GetBuffer()), valuemap); } } }
CEC_Prefs_Packet::CEC_Prefs_Packet(uint32 selection, EC_DETAIL_LEVEL pref_details, EC_DETAIL_LEVEL cat_details) : CECPacket(EC_OP_SET_PREFERENCES, pref_details) { if (selection & EC_PREFS_CATEGORIES) { if (theApp->glob_prefs->GetCatCount() > 1) { CECEmptyTag cats(EC_TAG_PREFS_CATEGORIES); for (unsigned int i = 0; i < theApp->glob_prefs->GetCatCount(); ++i) { CEC_Category_Tag catTag(i, cat_details); cats.AddTag(catTag); } AddTag(cats); } } if (selection & EC_PREFS_GENERAL) { CECEmptyTag user_prefs(EC_TAG_PREFS_GENERAL); user_prefs.AddTag(CECTag(EC_TAG_USER_NICK, thePrefs::GetUserNick())); user_prefs.AddTag(CECTag(EC_TAG_USER_HASH, thePrefs::GetUserHash())); user_prefs.AddTag(CECTag(EC_TAG_USER_HOST, thePrefs::GetYourHostname())); user_prefs.AddTag(CECTag(EC_TAG_GENERAL_CHECK_NEW_VERSION, thePrefs::GetCheckNewVersion())); AddTag(user_prefs); } if (selection & EC_PREFS_CONNECTIONS) { CECEmptyTag connPrefs(EC_TAG_PREFS_CONNECTIONS); connPrefs.AddTag(CECTag(EC_TAG_CONN_UL_CAP, thePrefs::GetMaxGraphUploadRate())); connPrefs.AddTag(CECTag(EC_TAG_CONN_DL_CAP, thePrefs::GetMaxGraphDownloadRate())); connPrefs.AddTag(CECTag(EC_TAG_CONN_MAX_UL, thePrefs::GetMaxUpload())); connPrefs.AddTag(CECTag(EC_TAG_CONN_MAX_DL, thePrefs::GetMaxDownload())); connPrefs.AddTag(CECTag(EC_TAG_CONN_SLOT_ALLOCATION, thePrefs::GetSlotAllocation())); connPrefs.AddTag(CECTag(EC_TAG_CONN_TCP_PORT, thePrefs::GetPort())); connPrefs.AddTag(CECTag(EC_TAG_CONN_UDP_PORT, thePrefs::GetUDPPort())); if (thePrefs::IsUDPDisabled()) { connPrefs.AddTag(CECEmptyTag(EC_TAG_CONN_UDP_DISABLE)); } connPrefs.AddTag(CECTag(EC_TAG_CONN_MAX_FILE_SOURCES, thePrefs::GetMaxSourcePerFile())); connPrefs.AddTag(CECTag(EC_TAG_CONN_MAX_CONN, thePrefs::GetMaxConnections())); if (thePrefs::DoAutoConnect()) { connPrefs.AddTag(CECEmptyTag(EC_TAG_CONN_AUTOCONNECT)); } if (thePrefs::Reconnect()) { connPrefs.AddTag(CECEmptyTag(EC_TAG_CONN_RECONNECT)); } if (thePrefs::GetNetworkED2K()) { connPrefs.AddTag(CECEmptyTag(EC_TAG_NETWORK_ED2K)); } if (thePrefs::GetNetworkKademlia()) { connPrefs.AddTag(CECEmptyTag(EC_TAG_NETWORK_KADEMLIA)); } AddTag(connPrefs); } if (selection & EC_PREFS_MESSAGEFILTER) { CECEmptyTag msg_prefs(EC_TAG_PREFS_MESSAGEFILTER); if (thePrefs::MustFilterMessages()) { msg_prefs.AddTag(CECEmptyTag(EC_TAG_MSGFILTER_ENABLED)); } if (thePrefs::IsFilterAllMessages()) { msg_prefs.AddTag(CECEmptyTag(EC_TAG_MSGFILTER_ALL)); } if (thePrefs::MsgOnlyFriends()) { msg_prefs.AddTag(CECEmptyTag(EC_TAG_MSGFILTER_FRIENDS)); } if (thePrefs::MsgOnlySecure()) { msg_prefs.AddTag(CECEmptyTag(EC_TAG_MSGFILTER_SECURE)); } if (thePrefs::IsFilterByKeywords()) { msg_prefs.AddTag(CECEmptyTag(EC_TAG_MSGFILTER_BY_KEYWORD)); } msg_prefs.AddTag(CECTag(EC_TAG_MSGFILTER_KEYWORDS, thePrefs::GetMessageFilterString())); AddTag(msg_prefs); } if (selection & EC_PREFS_REMOTECONTROLS) { CECEmptyTag rc_prefs(EC_TAG_PREFS_REMOTECTRL); rc_prefs.AddTag(CECTag(EC_TAG_WEBSERVER_PORT, thePrefs::GetWSPort())); if (thePrefs::GetWSIsEnabled()) { rc_prefs.AddTag(CECEmptyTag(EC_TAG_WEBSERVER_AUTORUN)); } if (!thePrefs::GetWSPass().IsEmpty()) { CMD4Hash passhash; wxCHECK2(passhash.Decode(thePrefs::GetWSPass()), /* Do nothing. */); rc_prefs.AddTag(CECTag(EC_TAG_PASSWD_HASH, passhash)); }