sourcemod/extensions/json/extension.cpp
ProjectSky e1c5578324 feat: enhance JSON management with new rotation and value counting features
- Added ObjectRotate and ArrayRotate methods for rotating key-value pairs in JSON objects and arrays, respectively
- Introduced GetValCount method to retrieve the total number of values in immutable JSON documents
- Renamed all Float-related methods to Double in C++ interface (IJsonManager) for better precision clarity
- Fixed TypeAccess configuration in handle type registration to allow external extensions to create JSON handles by properly setting HTypeAccess_Create flag
- Renamed GetHandleType to GetJsonHandleType for better clarity and consistency
- Updated documentation to clarify usage and performance considerations for new methods
- Enhanced tests to cover rotation functionality and value counting in various JSON structures
2025-11-21 00:07:25 +08:00

88 lines
2.4 KiB
C++
Executable File

#include "extension.h"
#include "JsonManager.h"
JsonExtension g_JsonExt;
SMEXT_LINK(&g_JsonExt);
HandleType_t g_JsonType;
HandleType_t g_ArrIterType;
HandleType_t g_ObjIterType;
JsonHandler g_JsonHandler;
ArrIterHandler g_ArrIterHandler;
ObjIterHandler g_ObjIterHandler;
IJsonManager* g_pJsonManager;
bool JsonExtension::SDK_OnLoad(char* error, size_t maxlen, bool late)
{
sharesys->AddNatives(myself, g_JsonNatives);
sharesys->RegisterLibrary(myself, "json");
HandleAccess haDefault;
handlesys->InitAccessDefaults(nullptr, &haDefault);
haDefault.access[HandleAccess_Read] = 0;
haDefault.access[HandleAccess_Delete] = 0;
TypeAccess taDefault;
handlesys->InitAccessDefaults(&taDefault, nullptr);
taDefault.access[HTypeAccess_Create] = true;
HandleError err;
g_JsonType = handlesys->CreateType("JSON", &g_JsonHandler, 0, &taDefault, &haDefault, myself->GetIdentity(), &err);
if (!g_JsonType) {
snprintf(error, maxlen, "Failed to create JSON handle type (err: %d)", err);
return false;
}
g_ArrIterType = handlesys->CreateType("JSONArrIter", &g_ArrIterHandler, 0, &taDefault, &haDefault, myself->GetIdentity(), &err);
if (!g_ArrIterType) {
snprintf(error, maxlen, "Failed to create JSONArrIter handle type (err: %d)", err);
return false;
}
g_ObjIterType = handlesys->CreateType("JSONObjIter", &g_ObjIterHandler, 0, &taDefault, &haDefault, myself->GetIdentity(), &err);
if (!g_ObjIterType) {
snprintf(error, maxlen, "Failed to create JSONObjIter handle type (err: %d)", err);
return false;
}
if (g_pJsonManager) {
delete g_pJsonManager;
g_pJsonManager = nullptr;
}
g_pJsonManager = new(std::nothrow) JsonManager();
if (!g_pJsonManager) {
snprintf(error, maxlen, "Failed to create JSON manager instance");
return false;
}
return sharesys->AddInterface(myself, g_pJsonManager);
}
void JsonExtension::SDK_OnUnload()
{
handlesys->RemoveType(g_JsonType, myself->GetIdentity());
handlesys->RemoveType(g_ArrIterType, myself->GetIdentity());
handlesys->RemoveType(g_ObjIterType, myself->GetIdentity());
if (g_pJsonManager) {
delete g_pJsonManager;
g_pJsonManager = nullptr;
}
}
void JsonHandler::OnHandleDestroy(HandleType_t type, void* object)
{
delete (JsonValue*)object;
}
void ArrIterHandler::OnHandleDestroy(HandleType_t type, void* object)
{
delete (JsonArrIter*)object;
}
void ObjIterHandler::OnHandleDestroy(HandleType_t type, void* object)
{
delete (JsonObjIter*)object;
}