mirror of
https://github.com/alliedmodders/sourcemod.git
synced 2025-12-06 18:08:36 +00:00
- 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
88 lines
2.4 KiB
C++
Executable File
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;
|
|
} |