bool CTag::WriteNewEd2kTag(CFileDataIO* data, EUtf8Str eStrEncode) const { // Write tag type uint8 uType; if (IsInt()) { if (m_uVal <= 0xFF) { uType = TAGTYPE_UINT8; } else if (m_uVal <= 0xFFFF) { uType = TAGTYPE_UINT16; } else if (m_uVal <= 0xFFFFFFFF) { uType = TAGTYPE_UINT32; } else { uType = TAGTYPE_UINT64; } } else if (IsStr()) { uint16 uStrValLen = GetRawSize(*m_pstrVal, eStrEncode); if (uStrValLen >= 1 && uStrValLen <= 16) { uType = TAGTYPE_STR1 + uStrValLen - 1; } else { uType = TAGTYPE_STRING; } } else { uType = m_uType; } // Write tag name if (!m_Name.IsEmpty()) { data->WriteUInt8(uType); data->WriteString(m_Name,utf8strNone); } else { wxASSERT( m_uName != 0 ); data->WriteUInt8(uType | 0x80); data->WriteUInt8(m_uName); } // Write tag data switch (uType) { case TAGTYPE_STRING: data->WriteString(*m_pstrVal,eStrEncode); break; case TAGTYPE_UINT64: data->WriteUInt64(m_uVal); break; case TAGTYPE_UINT32: data->WriteUInt32(m_uVal); break; case TAGTYPE_UINT16: data->WriteUInt16(m_uVal); break; case TAGTYPE_UINT8: data->WriteUInt8(m_uVal); break; case TAGTYPE_FLOAT32: //#warning Endianess problem? data->Write(&m_fVal, 4); break; case TAGTYPE_HASH16: data->WriteHash(*m_hashVal); break; case TAGTYPE_BLOB: data->WriteUInt32(m_nSize); data->Write(m_pData, m_nSize); break; default: // See comment on the default: of CTag::CTag(const CFileDataIO& data, bool bOptUTF8) if (uType >= TAGTYPE_STR1 && uType <= TAGTYPE_STR16) { // Sending '0' as len size makes it not write the len on the IO file. // This is because this tag types send the len as their type. data->WriteString(*m_pstrVal,eStrEncode,0); } else { printf("%s; Unknown tag: type=0x%02X\n", __FUNCTION__, uType); wxFAIL; return false; } break; } return true; }
u64 CISOFileReader::GetDataSize() const { return GetRawSize(); }