void CFileDataIO::WriteTag(const CTag& tag) { try { WriteUInt8(tag.GetType()); if (!tag.GetName().IsEmpty()) { WriteString(tag.GetName(),utf8strNone); } else { WriteUInt16(1); WriteUInt8(tag.GetNameID()); } switch (tag.GetType()) { case TAGTYPE_HASH16: // Do NOT use this to transfer any tags for at least half a year!! WriteHash(CMD4Hash(tag.GetHash())); break; case TAGTYPE_STRING: WriteString(tag.GetStr(), utf8strRaw); // Always UTF8 break; case TAGTYPE_UINT64: WriteUInt64(tag.GetInt()); break; case TAGTYPE_UINT32: WriteUInt32(tag.GetInt()); break; case TAGTYPE_FLOAT32: WriteFloat(tag.GetFloat()); break; case TAGTYPE_BSOB: WriteBsob(tag.GetBsob(), tag.GetBsobSize()); break; case TAGTYPE_UINT16: WriteUInt16(tag.GetInt()); break; case TAGTYPE_UINT8: WriteUInt8(tag.GetInt()); break; case TAGTYPE_BLOB: // NOTE: This will break backward compatibility with met files for eMule versions prior to 0.44a // and any aMule prior to SVN 26/02/2005 WriteUInt32(tag.GetBlobSize()); Write(tag.GetBlob(), tag.GetBlobSize()); break; default: //TODO: Support more tag types // With the if above, this should NEVER happen. AddLogLineNS(CFormat(wxT("CFileDataIO::WriteTag: Unknown tag: type=0x%02X")) % tag.GetType()); wxFAIL; break; } } catch (...) { AddLogLineNS(wxT("Exception in CDataIO:WriteTag")); throw; } }
void CAbstractFile::AddTagUnique(const CTag &rTag) { ArrayOfCTag::iterator it = m_taglist.begin(); for (; it != m_taglist.end(); ++it) { if ( ( ((*it).GetNameID() != 0 && (*it).GetNameID() == rTag.GetNameID()) || (!(*it).GetName().IsEmpty() && !rTag.GetName().IsEmpty() && (*it).GetName() == rTag.GetName()) ) && (*it).GetType() == rTag.GetType()){ m_taglist.erase(it); m_taglist.insert(it, rTag); return; } } m_taglist.push_back(rTag); }
CTag* CAbstractFile::GetTag(LPCSTR tagname) const { for (int i = 0; i < taglist.GetSize(); i++){ CTag* pTag = taglist[i]; if (pTag->GetNameID()==0 && CmpED2KTagName(pTag->GetName(), tagname)==0) return pTag; } return NULL; }
CGroupTag::CGroupTag(CTag &tag) { //tag m_eType = TT_GROUP; m_strName = tag.GetName(); m_fMaxTimeLength = tag.GetMaxTimeLength(); m_vOffsetPos = tag.GetOffsetPos(); m_qOffsetRot = tag.GetOffsetRot(); this->AddNewTagInfo(tag.CurrentTagInfo()); }