diff --git a/Sources/Plasma/PubUtilLib/plVault/Pch.h b/Sources/Plasma/PubUtilLib/plVault/Pch.h index 9bba4423..9edf74ce 100644 --- a/Sources/Plasma/PubUtilLib/plVault/Pch.h +++ b/Sources/Plasma/PubUtilLib/plVault/Pch.h @@ -62,6 +62,7 @@ You can contact Cyan Worlds, Inc. by email legal@cyan.com // 'Old' system is full of compiler warnings at /W4, so just hide them #pragma warning(push, 0) #include +#include #include #include diff --git a/Sources/Plasma/PubUtilLib/plVault/plVaultNodeAccess.cpp b/Sources/Plasma/PubUtilLib/plVault/plVaultNodeAccess.cpp index f844cace..29da7bc8 100644 --- a/Sources/Plasma/PubUtilLib/plVault/plVaultNodeAccess.cpp +++ b/Sources/Plasma/PubUtilLib/plVault/plVaultNodeAccess.cpp @@ -48,37 +48,6 @@ You can contact Cyan Worlds, Inc. by email legal@cyan.com #include "Pch.h" #pragma hdrstop -//============================================================================ -// Volatile Vault Node Fields - be very careful when adding to this -//============================================================================ -struct NodeTypeToVolatileField { - unsigned nodeType; - uint64_t volatileFields; -}; - -NodeTypeToVolatileField volatileFieldList[] = { - {plVault::kNodeType_PlayerInfo, VaultPlayerInfoNode::kOnline | VaultPlayerInfoNode::kAgeInstName | VaultPlayerInfoNode::kAgeInstUuid}, - {0, 0} -}; - -//============================================================================ -uint64_t GetNodeVolatileFields(NetVaultNode* node) { - uint64_t volatileFields = 0; - unsigned index = 0; - - while (volatileFieldList[index].nodeType != 0) { - if (node->GetNodeType() == volatileFieldList[index].nodeType) { - volatileFields |= volatileFieldList[index].volatileFields; - break; - } - - ++index; - } - - return volatileFields; -} - - /***************************************************************************** * * VaultTextNoteNode @@ -99,170 +68,66 @@ enum EAgeInfoFields { #ifdef CLIENT void VaultTextNoteNode::SetVisitInfo (const plAgeInfoStruct & info) { - - ARRAY(wchar_t) buf; - + plStringStream str; + for (unsigned i = 0; i < kNumAgeInfoFields; ++i) { switch (i) { - case kAgeFilename: { - wchar_t src[128]; - StrToUnicode(src, info.GetAgeFilename(), arrsize(src)); - unsigned len = StrLen(src); - wchar_t * dst = buf.New(len); - memcpy(dst, src, len * sizeof(src[0])); - } + case kAgeFilename: + str << info.GetAgeFilename(); break; - - case kAgeInstName: { - wchar_t src[128]; - StrToUnicode(src, info.GetAgeInstanceName(), arrsize(src)); - unsigned len = StrLen(src); - wchar_t * dst = buf.New(len); - memcpy(dst, src, len * sizeof(src[0])); - } + case kAgeInstName: + str << info.GetAgeInstanceName(); break; - - case kAgeUserName: { - wchar_t src[128]; - StrToUnicode(src, info.GetAgeUserDefinedName(), arrsize(src)); - unsigned len = StrLen(src); - wchar_t * dst = buf.New(len); - memcpy(dst, src, len * sizeof(src[0])); - } + case kAgeUserName: + str << info.GetAgeUserDefinedName(); break; - - case kAgeDesc: { - wchar_t src[128]; - StrToUnicode(src, info.GetAgeDescription(), arrsize(src)); - unsigned len = StrLen(src); - wchar_t * dst = buf.New(len); - memcpy(dst, src, len * sizeof(src[0])); - } + case kAgeDesc: + str << info.GetAgeDescription(); break; - - case kAgeInstGuid: { - plUUID guid = *info.GetAgeInstanceGuid(); - wchar_t src[64]; - wcsncpy(src, guid.AsString().ToWchar(), 64); - unsigned len = StrLen(src); - wchar_t * dst = buf.New(len); - memcpy(dst, src, len * sizeof(src[0])); - } + case kAgeInstGuid: + str << info.GetAgeInstanceGuid()->AsString(); break; - - case kAgeLanguage: { - wchar_t src[32]; - StrPrintf(src, arrsize(src), L"%u", info.GetAgeLanguage()); - unsigned len = StrLen(src); - wchar_t * dst = buf.New(len); - memcpy(dst, src, len * sizeof(src[0])); - } + case kAgeLanguage: + str << info.GetAgeLanguage(); break; - - case kAgeSequence: { - wchar_t src[32]; - StrPrintf(src, arrsize(src), L"%u", info.GetAgeSequenceNumber()); - unsigned len = StrLen(src); - wchar_t * dst = buf.New(len); - memcpy(dst, src, len * sizeof(src[0])); - } + case kAgeSequence: + str << info.GetAgeSequenceNumber(); break; - DEFAULT_FATAL(i); + DEFAULT_FATAL(i); } - - wchar_t * sep = buf.New(1); - *sep = L'|'; + + str << "|"; } - - wchar_t * term = buf.New(1); - *term = 0; - - SetNoteText(buf.Ptr()); + + SetNoteText(str.GetString()); } #endif //============================================================================ #ifdef CLIENT bool VaultTextNoteNode::GetVisitInfo (plAgeInfoStruct * info) { + std::vector toks = GetNoteText().Split("|"); + hsAssert(toks.size() == kNumAgeInfoFields, "visit text note malformed--discarding"); + if (toks.size() != kNumAgeInfoFields) + return false; - wchar_t * mem; - const wchar_t * str = mem = wcsdup(GetNoteText()); - - for (unsigned i = 0; i < kNumAgeInfoFields; ++i) { - - wchar_t token[1024]; - switch (i) { - case kAgeFilename: { - StrTokenize(&str, token, arrsize(token), L"|", 1); - if (StrLen(token) > 0) { - char ansi[1024]; - StrToAnsi(ansi, token, arrsize(ansi)); - info->SetAgeFilename(ansi); - } - } - break; - - case kAgeInstName: { - StrTokenize(&str, token, arrsize(token), L"|", 1); - if (StrLen(token) > 0) { - char ansi[1024]; - StrToAnsi(ansi, token, arrsize(ansi)); - info->SetAgeInstanceName(ansi); - } - } - break; - - case kAgeUserName: { - StrTokenize(&str, token, arrsize(token), L"|", 1); - if (StrLen(token) > 0) { - char ansi[1024]; - StrToAnsi(ansi, token, arrsize(ansi)); - info->SetAgeUserDefinedName(ansi); - } - } - break; - - case kAgeDesc: { - StrTokenize(&str, token, arrsize(token), L"|", 1); - if (StrLen(token) > 0) { - char ansi[1024]; - StrToAnsi(ansi, token, arrsize(ansi)); - info->SetAgeDescription(ansi); - } - } - break; - - case kAgeInstGuid: { - StrTokenize(&str, token, arrsize(token), L"|", 1); - if (StrLen(token) > 0) { - plUUID uuid(plString::FromWchar(token)); - info->SetAgeInstanceGuid(&uuid); - } - } - break; - - case kAgeLanguage: { - StrTokenize(&str, token, arrsize(token), L"|", 1); - if (StrLen(token) > 0) { - info->SetAgeLanguage(StrToUnsigned(token, nil, 10)); - } - } - break; - - case kAgeSequence: { - StrTokenize(&str, token, arrsize(token), L"|", 1); - if (StrLen(token) > 0) { - info->SetAgeSequenceNumber(StrToUnsigned(token, nil, 10)); - } - } - break; - - DEFAULT_FATAL(i); - } + if (!toks[kAgeFilename].IsEmpty()) + info->SetAgeFilename(toks[kAgeFilename]); + if (!toks[kAgeInstName].IsEmpty()) + info->SetAgeInstanceName(toks[kAgeInstName]); + if (!toks[kAgeUserName].IsEmpty()) + info->SetAgeUserDefinedName(toks[kAgeUserName]); + if (!toks[kAgeDesc].IsEmpty()) + info->SetAgeDescription(toks[kAgeDesc]); + if (!toks[kAgeInstGuid].IsEmpty()) { + std::unique_ptr guid = std::make_unique(toks[kAgeInstGuid]); + info->SetAgeInstanceGuid(guid.get()); } - - free(mem); + if (!toks[kAgeLanguage].IsEmpty()) + info->SetAgeLanguage(toks[kAgeLanguage].ToUInt()); + if (!toks[kAgeSequence].IsEmpty()) + info->SetAgeSequenceNumber(toks[kAgeSequence].ToUInt()); return true; } #endif @@ -327,7 +192,7 @@ void VaultSDLNode::SetStateDataRecord (const plStateDataRecord * rec, unsigned w //============================================================================ #ifdef CLIENT -void VaultSDLNode::InitStateDataRecord (const wchar_t sdlRecName[], unsigned writeOptions) { +void VaultSDLNode::InitStateDataRecord (const plString& sdlRecName, unsigned writeOptions) { { plStateDataRecord * rec = new plStateDataRecord; bool exists = GetStateDataRecord(rec, 0); @@ -336,9 +201,7 @@ void VaultSDLNode::InitStateDataRecord (const wchar_t sdlRecName[], unsigned wri return; } - char aStr[MAX_PATH]; - StrToAnsi(aStr, sdlRecName, arrsize(aStr)); - if (plStateDescriptor * des = plSDLMgr::GetInstance()->FindDescriptor(aStr, plSDL::kLatestVersion)) { + if (plStateDescriptor * des = plSDLMgr::GetInstance()->FindDescriptor(sdlRecName, plSDL::kLatestVersion)) { plStateDataRecord rec(des); rec.SetFromDefaults(false); SetStateDataRecord(&rec, writeOptions|plSDL::kDontWriteDirtyFlag); @@ -555,44 +418,17 @@ const class plUnifiedTime * VaultAgeInfoNode::GetAgeTime () const { //============================================================================ #ifdef CLIENT void VaultAgeInfoNode::CopyFrom (const plAgeInfoStruct * info) { - wchar_t str[MAX_PATH]; - // age filename - if (info->HasAgeFilename()) { - StrToUnicode(str, info->GetAgeFilename(), arrsize(str)); - SetAgeFilename(str); - } - else { - SetAgeFilename(nil); - } + SetAgeFilename(info->HasAgeFilename() ? info->GetAgeFilename() : ""); // age instance name - if (info->HasAgeInstanceName()) { - StrToUnicode(str, info->GetAgeInstanceName(), arrsize(str)); - SetAgeInstanceName(str); - } - else { - SetAgeInstanceName(nil); - } - + SetAgeInstanceName(info->HasAgeInstanceName() ? info->GetAgeInstanceName() : ""); + // age user-defined name - if (info->HasAgeUserDefinedName()) { - StrToUnicode(str, info->GetAgeUserDefinedName(), arrsize(str)); - SetAgeUserDefinedName(str); - } - else { - SetAgeUserDefinedName(nil); - } + SetAgeUserDefinedName(info->HasAgeUserDefinedName() ? info->GetAgeUserDefinedName() : ""); // age description - // TODO - if (info->HasAgeDescription()) { -// StrToUnicode(str, info->GetAgeDescription(), arrsize(str)); -// SetAgeDescription(str); - } - else { -// SetAgeDescription(nil); - } + SetAgeDescription(info->HasAgeDescription() ? info->GetAgeDescription() : ""); // age sequence number SetAgeSequenceNumber(info->GetAgeSequenceNumber()); @@ -608,22 +444,17 @@ void VaultAgeInfoNode::CopyFrom (const plAgeInfoStruct * info) { //============================================================================ #ifdef CLIENT void VaultAgeInfoNode::CopyTo (plAgeInfoStruct * info) const { - char str[MAX_PATH]; - // age filename - StrToAnsi(str, GetAgeFilename(), arrsize(str)); - info->SetAgeFilename(str); + info->SetAgeFilename(GetAgeFilename()); // age instance name - StrToAnsi(str, GetAgeInstanceName(), arrsize(str)); - info->SetAgeInstanceName(str); + info->SetAgeInstanceName(GetAgeInstanceName()); // age user-defined name - StrToAnsi(str, GetAgeUserDefinedName(), arrsize(str)); - info->SetAgeUserDefinedName(str); + info->SetAgeUserDefinedName(GetAgeUserDefinedName()); // age description - // TODO + info->SetAgeDescription(GetAgeDescription()); // age sequence number info->SetAgeSequenceNumber(GetAgeSequenceNumber()); diff --git a/Sources/Plasma/PubUtilLib/plVault/plVaultNodeAccess.h b/Sources/Plasma/PubUtilLib/plVault/plVaultNodeAccess.h index 12a226cb..212242ae 100644 --- a/Sources/Plasma/PubUtilLib/plVault/plVaultNodeAccess.h +++ b/Sources/Plasma/PubUtilLib/plVault/plVaultNodeAccess.h @@ -64,11 +64,6 @@ struct plSpawnPointInfo; typedef std::vector plSpawnPointVec; #endif -//============================================================================ -// Volatile Vault Node Fields -//============================================================================ -uint64_t GetNodeVolatileFields(NetVaultNode* node); - //============================================================================ // NetVaultNodeAccess //============================================================================ @@ -83,22 +78,24 @@ private: }; #define VNODE_ACCESSOR(type, name, basename) \ - static const uint64_t k##name = NetVaultNode::k##basename; \ type Get##name () const { return base->Get##basename(); } \ void Set##name (type v) { base->Set##basename(v); } #define VNODE_BLOB(name, basename) \ - static const uint64_t k##name = NetVaultNode::k##basename; \ const uint8_t * Get##name () const { return base->Get##basename(); } \ size_t Get##name##Length () const { return base->Get##basename##Length(); } \ void Set##name (const uint8_t data[], size_t length) { base->Set##basename(data, length); } +#define VNODE_STRING(name, basename) \ + plString Get##name () const { return base->Get##basename(); } \ + void Set##name (const plString& v) { base->Set##basename(v); } + //============================================================================ // VaultPlayerNode //============================================================================ struct VaultPlayerNode : NetVaultNodeAccess { - VNODE_ACCESSOR(const wchar_t *, PlayerName, IString64_1); - VNODE_ACCESSOR(const wchar_t *, AvatarShapeName, String64_1); + VNODE_STRING ( PlayerName, IString64_1); + VNODE_STRING ( AvatarShapeName, String64_1); VNODE_ACCESSOR(int32_t, Disabled, Int32_1); VNODE_ACCESSOR(int32_t, Explorer, Int32_2); // explorer = 1, visitor = 0 VNODE_ACCESSOR(uint32_t, OnlineTime, UInt32_1); @@ -114,8 +111,8 @@ struct VaultPlayerNode : NetVaultNodeAccess { //============================================================================ struct VaultPlayerInfoNode : NetVaultNodeAccess { VNODE_ACCESSOR(uint32_t, PlayerId, UInt32_1); - VNODE_ACCESSOR(const wchar_t *, PlayerName, IString64_1); - VNODE_ACCESSOR(const wchar_t *, AgeInstName, String64_1); // name of age player is currently in + VNODE_STRING ( PlayerName, IString64_1); + VNODE_STRING ( AgeInstName, String64_1); // name of age player is currently in VNODE_ACCESSOR(plUUID, AgeInstUuid, Uuid_1); // guid of age player is currently in VNODE_ACCESSOR(int32_t, Online, Int32_1); // whether or not player is online VNODE_ACCESSOR(int32_t, CCRLevel, Int32_2); @@ -129,7 +126,7 @@ struct VaultPlayerInfoNode : NetVaultNodeAccess { //============================================================================ struct VaultFolderNode : NetVaultNodeAccess { VNODE_ACCESSOR(int32_t, FolderType, Int32_1); - VNODE_ACCESSOR(const wchar_t *, FolderName, String64_1); + VNODE_STRING ( FolderName, String64_1); VaultFolderNode (NetVaultNode * node) : NetVaultNodeAccess(node) { } }; @@ -154,8 +151,8 @@ struct VaultAgeInfoListNode : VaultFolderNode { //============================================================================ struct VaultChronicleNode : NetVaultNodeAccess { VNODE_ACCESSOR(int32_t, EntryType, Int32_1); - VNODE_ACCESSOR(const wchar_t *, EntryName, String64_1); - VNODE_ACCESSOR(const wchar_t *, EntryValue, Text_1); + VNODE_STRING ( EntryName, String64_1); + VNODE_STRING ( EntryValue, Text_1); VaultChronicleNode (NetVaultNode * node) : NetVaultNodeAccess(node) { } }; @@ -165,7 +162,7 @@ struct VaultChronicleNode : NetVaultNodeAccess { // VaultSDLNode //============================================================================ struct VaultSDLNode : NetVaultNodeAccess { - VNODE_ACCESSOR(const wchar_t *, SDLName, String64_1); + VNODE_STRING ( SDLName, String64_1); VNODE_ACCESSOR(int32_t, SDLIdent, Int32_1); VNODE_BLOB ( SDLData, Blob_1); @@ -174,7 +171,7 @@ struct VaultSDLNode : NetVaultNodeAccess { #ifdef CLIENT bool GetStateDataRecord (class plStateDataRecord * out, unsigned readOptions = 0); void SetStateDataRecord (const class plStateDataRecord * rec, unsigned writeOptions = 0); - void InitStateDataRecord (const wchar_t sdlRecName[], unsigned writeOptions = 0); + void InitStateDataRecord (const plString& sdlRecName, unsigned writeOptions = 0); #endif // def CLIENT }; @@ -206,7 +203,7 @@ struct VaultImageNode : NetVaultNodeAccess { enum ImageTypes { kNone=0, kJPEG=1, kPNG=2 }; VNODE_ACCESSOR(int32_t, ImageType, Int32_1); - VNODE_ACCESSOR(const wchar_t *, ImageTitle, String64_1); + VNODE_STRING ( ImageTitle, String64_1); VNODE_BLOB ( ImageData, Blob_1); VaultImageNode (NetVaultNode * node) : NetVaultNodeAccess(node) { } @@ -234,8 +231,8 @@ struct VaultCliImageNode : VaultImageNode { struct VaultTextNoteNode : NetVaultNodeAccess { VNODE_ACCESSOR(int32_t, NoteType, Int32_1); VNODE_ACCESSOR(int32_t, NoteSubType, Int32_2); - VNODE_ACCESSOR(const wchar_t *, NoteTitle, String64_1); - VNODE_ACCESSOR(const wchar_t *, NoteText, Text_1); + VNODE_STRING ( NoteTitle, String64_1); + VNODE_STRING ( NoteText, Text_1); VaultTextNoteNode (NetVaultNode * node) : NetVaultNodeAccess(node) { } @@ -252,7 +249,7 @@ struct VaultTextNoteNode : NetVaultNodeAccess { struct VaultAgeNode : NetVaultNodeAccess { VNODE_ACCESSOR(plUUID, AgeInstanceGuid, Uuid_1); VNODE_ACCESSOR(plUUID, ParentAgeInstanceGuid, Uuid_2); - VNODE_ACCESSOR(const wchar_t *, AgeName, String64_1); + VNODE_STRING ( AgeName, String64_1); VaultAgeNode (NetVaultNode * node) : NetVaultNodeAccess(node) { } }; @@ -261,12 +258,12 @@ struct VaultAgeNode : NetVaultNodeAccess { // VaultAgeInfoNode //============================================================================ struct VaultAgeInfoNode : NetVaultNodeAccess { - VNODE_ACCESSOR(const wchar_t *, AgeFilename, String64_2); // "Garden" - VNODE_ACCESSOR(const wchar_t *, AgeInstanceName, String64_3); // "Eder Kemo" - VNODE_ACCESSOR(const wchar_t *, AgeUserDefinedName, String64_4); // "Joe's" + VNODE_STRING ( AgeFilename, String64_2); // "Garden" + VNODE_STRING ( AgeInstanceName, String64_3); // "Eder Kemo" + VNODE_STRING ( AgeUserDefinedName, String64_4); // "Joe's" VNODE_ACCESSOR(plUUID, AgeInstanceGuid, Uuid_1); // 6278b081-342a-4229-ac1b-a0b8a2658390 VNODE_ACCESSOR(plUUID, ParentAgeInstanceGuid, Uuid_2); // 9192be7f-89ef-41bc-83db-79afe451e399 - VNODE_ACCESSOR(const wchar_t *, AgeDescription, Text_1); // "Stay out!" + VNODE_STRING ( AgeDescription, Text_1); // "Stay out!" VNODE_ACCESSOR(int32_t, AgeSequenceNumber, Int32_1); VNODE_ACCESSOR(int32_t, AgeLanguage, Int32_3); // The language of the client that made this age VNODE_ACCESSOR(uint32_t, AgeId, UInt32_1); @@ -299,7 +296,7 @@ struct VaultSystemNode : NetVaultNodeAccess { // VaultMarkerGameNode //============================================================================ struct VaultMarkerGameNode : NetVaultNodeAccess { - VNODE_ACCESSOR(const wchar_t *, GameName, Text_1); + VNODE_STRING ( GameName, Text_1); VNODE_ACCESSOR(plUUID, GameGuid, Uuid_1); VaultMarkerGameNode (NetVaultNode * node) : NetVaultNodeAccess(node) { }