200 lines
5.2 KiB
C
200 lines
5.2 KiB
C
/**
|
|||
|
|
* @file GoExtParams.c
|
||
|
|
*
|
||
|
|
* @internal
|
||
|
|
* Copyright (C) 2017-2021 by LMI Technologies Inc.
|
||
|
|
* Licensed under the MIT License.
|
||
|
|
* Redistributed files must retain the above copyright notice.
|
||
|
|
*/
|
||
|
|
|
||
|
|
#include <GoSdk/Tools/GoExtParams.h>
|
||
|
|
#include <GoSdk/GoUtils.h>
|
||
|
|
|
||
|
|
kBeginClassEx(Go, GoExtParams)
|
||
|
|
kAddVMethod(GoExtParams, kObject, VRelease)
|
||
|
|
kEndClassEx()
|
||
|
|
|
||
|
|
GoFx(kStatus) GoExtParams_Construct(GoExtParams* params, kObject sensor, kAlloc allocator)
|
||
|
|
{
|
||
|
|
kAlloc alloc = kAlloc_Fallback(allocator);
|
||
|
|
kStatus status;
|
||
|
|
|
||
|
|
kCheck(kAlloc_GetObject(alloc, kTypeOf(GoExtParams), params));
|
||
|
|
|
||
|
|
if (!kSuccess(status = GoExtParams_Init(*params, kTypeOf(GoExtParams), sensor, alloc)))
|
||
|
|
{
|
||
|
|
kAlloc_FreeRef(alloc, params);
|
||
|
|
}
|
||
|
|
|
||
|
|
return status;
|
||
|
|
}
|
||
|
|
|
||
|
|
GoFx(kStatus) GoExtParams_Init(GoExtParams params, kType type, kObject sensor, kAlloc alloc)
|
||
|
|
{
|
||
|
|
kObjR(GoExtParams, params);
|
||
|
|
kStatus exception;
|
||
|
|
|
||
|
|
kCheck(kObject_Init(params, type, alloc));
|
||
|
|
kZero(obj->params);
|
||
|
|
kZero(obj->xml);
|
||
|
|
kZero(obj->nodesToMerge);
|
||
|
|
|
||
|
|
obj->sensor = sensor;
|
||
|
|
|
||
|
|
kTry
|
||
|
|
{
|
||
|
|
kTest(kArrayList_Construct(&obj->params, kTypeOf(GoExtParam), 0, alloc));
|
||
|
|
kTest(kArrayList_Construct(&obj->nodesToMerge, kTypeOf(kPointer), 0, alloc));
|
||
|
|
}
|
||
|
|
kCatch(&exception)
|
||
|
|
{
|
||
|
|
GoExtParams_VRelease(params);
|
||
|
|
kEndCatch(exception);
|
||
|
|
}
|
||
|
|
|
||
|
|
return kOK;
|
||
|
|
}
|
||
|
|
|
||
|
|
GoFx(kStatus) GoExtParams_VRelease(GoExtParams params)
|
||
|
|
{
|
||
|
|
kObj(GoExtParams, params);
|
||
|
|
kSize i;
|
||
|
|
for (i = 0; i < kArrayList_Count(obj->params); i++)
|
||
|
|
{
|
||
|
|
GoExtParam param = *kArrayList_AtT(obj->params, i, GoExtParam);
|
||
|
|
kCheck(kDestroyRef(¶m));
|
||
|
|
}
|
||
|
|
|
||
|
|
kCheck(kDestroyRef(&obj->params));
|
||
|
|
kCheck(kDestroyRef(&obj->nodesToMerge));
|
||
|
|
kCheck(kObject_VRelease(params));
|
||
|
|
|
||
|
|
return kOK;
|
||
|
|
}
|
||
|
|
|
||
|
|
GoFx(kStatus) GoExtParams_Read(GoExtParams params, kXml xml, kXmlItem item)
|
||
|
|
{
|
||
|
|
kObj(GoExtParams, params);
|
||
|
|
kXmlItem paramItem = kNULL;
|
||
|
|
kType paramType;
|
||
|
|
kText32 typeVal;
|
||
|
|
kStatus exception;
|
||
|
|
kSize i;
|
||
|
|
|
||
|
|
obj->xml = xml;
|
||
|
|
|
||
|
|
kCheck(kArrayList_Clear(obj->nodesToMerge));
|
||
|
|
|
||
|
|
for (i = 0; i < kXml_ChildCount(xml, item); i++)
|
||
|
|
{
|
||
|
|
GoExtParam param = kNULL;
|
||
|
|
kBool insertParam = kFALSE;
|
||
|
|
|
||
|
|
paramItem = kXml_ChildAt(xml, item, i);
|
||
|
|
|
||
|
|
if (kSuccess(kXml_AttrText(xml, paramItem, "type", typeVal, kCountOf(typeVal))) &&
|
||
|
|
!kIsNull((paramType = GoExtUtils_GetKType(typeVal))))
|
||
|
|
{
|
||
|
|
kTry
|
||
|
|
{
|
||
|
|
if (i >= kArrayList_Count(obj->params)
|
||
|
|
|| kIsNull(param = kArrayList_AsT(obj->params, i, GoExtParam))
|
||
|
|
|| !kObject_Is(param, paramType))
|
||
|
|
{
|
||
|
|
if (!kIsNull(param))
|
||
|
|
{
|
||
|
|
kTest(kArrayList_RemoveT(obj->params, i, ¶m));
|
||
|
|
kDisposeRef(¶m);
|
||
|
|
}
|
||
|
|
kTest(GoExtParam_Construct(¶m, paramType, obj->sensor, kObject_Alloc(params)));
|
||
|
|
insertParam = kTRUE;
|
||
|
|
}
|
||
|
|
|
||
|
|
kTest(GoExtParam_Read(param, xml, paramItem));
|
||
|
|
|
||
|
|
if (insertParam)
|
||
|
|
{
|
||
|
|
if (i >= kArrayList_Count(obj->params))
|
||
|
|
kTest(kArrayList_AddT(obj->params, ¶m));
|
||
|
|
else
|
||
|
|
kTest(kArrayList_InsertT(obj->params, i, ¶m));
|
||
|
|
}
|
||
|
|
}
|
||
|
|
kCatch(&exception)
|
||
|
|
{
|
||
|
|
kDestroyRef(¶m);
|
||
|
|
kEndCatch(exception);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
kCheck(kArrayList_AddT(obj->nodesToMerge, ¶mItem));
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
return kOK;
|
||
|
|
}
|
||
|
|
|
||
|
|
GoFx(kStatus) GoExtParams_Write(GoExtParams params, kXml xml, kXmlItem item)
|
||
|
|
{
|
||
|
|
kObj(GoExtParams, params);
|
||
|
|
kSize i;
|
||
|
|
|
||
|
|
for (i = 0; i < kArrayList_Count(obj->params); i++)
|
||
|
|
{
|
||
|
|
GoExtParam param = *kArrayList_AtT(obj->params, i, GoExtParam);
|
||
|
|
kXmlItem valueItem = kNULL;
|
||
|
|
|
||
|
|
kCheck(kXml_AddItem(xml, item, GoExtParam_Id(param), &valueItem));
|
||
|
|
kCheck(GoExtParam_Write(param, xml, valueItem));
|
||
|
|
}
|
||
|
|
|
||
|
|
// XML merge intentionally omitted due to the dynamic nature of the Tools element. Replaced
|
||
|
|
// with unrecognized node insertion
|
||
|
|
for (i = 0; i < kArrayList_Count(obj->nodesToMerge); i++)
|
||
|
|
{
|
||
|
|
kXmlItem mergeItem = *kArrayList_AtT(obj->nodesToMerge, i, kXmlItem);
|
||
|
|
|
||
|
|
kCheck(kXml_CopyItem(xml, item, kNULL, obj->xml, mergeItem, kNULL));
|
||
|
|
}
|
||
|
|
|
||
|
|
return kOK;
|
||
|
|
}
|
||
|
|
|
||
|
|
GoFx(kSize) GoExtParams_ParameterCount(GoExtParams params)
|
||
|
|
{
|
||
|
|
kObj(GoExtParams, params);
|
||
|
|
|
||
|
|
return kArrayList_Count(obj->params);
|
||
|
|
}
|
||
|
|
|
||
|
|
GoFx(GoExtParam) GoExtParams_ParameterAt(GoExtParams params, kSize index)
|
||
|
|
{
|
||
|
|
kObj(GoExtParams, params);
|
||
|
|
|
||
|
|
if (index >= kArrayList_Count(obj->params))
|
||
|
|
{
|
||
|
|
return kNULL;
|
||
|
|
}
|
||
|
|
|
||
|
|
return *kArrayList_AtT(obj->params, index, GoExtParam);
|
||
|
|
}
|
||
|
|
|
||
|
|
GoFx(GoExtParam) GoExtParams_FindParameterById(GoExtParams params, const kChar* id)
|
||
|
|
{
|
||
|
|
kObj(GoExtParams, params);
|
||
|
|
kSize i;
|
||
|
|
|
||
|
|
for (i = 0; i < kArrayList_Count(obj->params); i++)
|
||
|
|
{
|
||
|
|
GoExtParam value = *kArrayList_AtT(obj->params, i, GoExtParam);
|
||
|
|
|
||
|
|
if (strcmp(id, GoExtParam_Id(value)) == 0)
|
||
|
|
{
|
||
|
|
return value;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
return kNULL;
|
||
|
|
}
|