Files
handleaiuinew/env/LMI/include/GoSdk/Messages/GoDataSet.c
T

194 lines
4.3 KiB
C
Raw Normal View History

2024-05-18 23:53:26 +08:00
/**
* @file GoDataSet.c
*
* @internal
* Copyright (C) 2016-2021 by LMI Technologies Inc.
* Licensed under the MIT License.
* Redistributed files must retain the above copyright notice.
*/
#include <GoSdk/Messages/GoDataSet.h>
kBeginClassEx(Go, GoDataSet)
//serialization versions
kAddVersion(GoDataSet, "kdat6", "4.0.0.0", "GoDataSet-0", WriteDat6V0, ReadDat6V0)
//virtual methods
kAddVMethod(GoDataSet, kObject, VRelease)
kAddVMethod(GoDataSet, kObject, VInitClone)
kAddVMethod(GoDataSet, kObject, VSize)
kEndClassEx()
GoFx(kStatus) GoDataSet_Construct(GoDataSet* set, kAlloc allocator)
{
kAlloc alloc = kAlloc_Fallback(allocator);
kStatus status;
kCheck(kAlloc_GetObject(alloc, kTypeOf(GoDataSet), set));
if (!kSuccess(status = GoDataSet_Init(*set, kTypeOf(GoDataSet), alloc)))
{
kAlloc_FreeRef(alloc, set);
}
return status;
}
GoFx(kStatus) GoDataSet_Init(GoDataSet set, kType type, kAlloc alloc)
{
kObjR(GoDataSet, set);
kCheck(kObject_Init(set, type, alloc));
obj->senderId = 0;
kZero(obj->content);
return kOK;
}
GoFx(kStatus) GoDataSet_VInitClone(GoDataSet set, GoDataSet source, kAlloc alloc)
{
kObjR(GoDataSet, set);
kObjNR(GoDataSet, srcObj, source);
kStatus status;
kCheck(GoDataSet_Init(set, kObject_Type(source), alloc));
kTry
{
obj->senderId = srcObj->senderId;
kTest(kObject_Clone(&obj->content, srcObj->content, alloc));
}
kCatch(&status)
{
GoDataSet_VRelease(set);
kEndCatch(status);
}
return kOK;
}
GoFx(kStatus) GoDataSet_VRelease(GoDataSet set)
{
kObjR(GoDataSet, set);
kCheck(kObject_Dispose(obj->content));
kCheck(kObject_VRelease(set));
return kOK;
}
GoFx(kStatus) GoDataSet_Allocate(GoDataSet set, kSize minimumCapacity)
{
kObjR(GoDataSet, set);
kCheck(kDisposeRef(&obj->content));
kCheck(kArrayList_Construct(&obj->content, kTypeOf(kObject), minimumCapacity, kObject_Alloc(set)));
return kOK;
}
GoFx(kStatus) GoDataSet_Add(GoDataSet set, kObject item)
{
kObjR(GoDataSet, set);
if (kIsNull(obj->content))
{
kCheck(GoDataSet_Allocate(set, 1));
}
kCheck(kArrayList_AddT(obj->content, &item));
return kOK;
}
GoFx(kSize) GoDataSet_VSize(GoDataSet set)
{
kObjR(GoDataSet, set);
return sizeof(GoDataSetClass) + (kIsNull(obj->content) ? 0 : kObject_Size(obj->content));
}
GoFx(kStatus) GoDataSet_WriteDat6V0(GoDataSet set, kSerializer serializer)
{
kObjR(GoDataSet, set);
kCheck(kSerializer_BeginWrite(serializer, kTypeOf(k16u), kFALSE));
kCheck(kSerializer_Write32u(serializer, obj->senderId));
kCheck(kSerializer_EndWrite(serializer));
kCheck(kSerializer_WriteObject(serializer, obj->content));
return kOK;
}
GoFx(kStatus) GoDataSet_ReadDat6V0Header(GoDataSet set, kSerializer serializer, k32u* senderId)
{
// Read and store the message attributes data length ("attrSize")
// to determine how many attributes to read.
//
// If this fails, the EndRead() could assert so skip the EndRead() if BeginRead() fails.
kCheck(kSerializer_BeginRead(serializer, kTypeOf(k16u), kFALSE));
kTry
{
kTest(kSerializer_Read32u(serializer, senderId));
}
kFinally
{
// Automatically flush any unread data and free serializer read section.
// Ignore errors.
kSerializer_EndRead(serializer);
kEndFinally();
}
return kOK;
}
GoFx(kStatus) GoDataSet_ReadDat6V0(GoDataSet set, kSerializer serializer, kAlloc alloc)
{
kObjR(GoDataSet, set);
kStatus status;
kCheck(GoDataSet_Init(set, kTypeOf(GoDataSet), alloc));
kTry
{
kTest(GoDataSet_ReadDat6V0Header(set, serializer, &obj->senderId));
kTest(kSerializer_ReadObject(serializer, &obj->content, alloc));
}
kCatch(&status)
{
GoDataSet_VRelease(set);
kEndCatch(status);
}
return kOK;
}
GoFx(k32u) GoDataSet_SenderId(GoDataSet set)
{
kObjR(GoDataSet, set);
return obj->senderId;
}
GoFx(kSize) GoDataSet_Count(GoDataSet set)
{
kObjR(GoDataSet, set);
return kArrayList_Count(obj->content);
}
GoFx(kObject) GoDataSet_At(GoDataSet set, kSize index)
{
kObjR(GoDataSet, set);
kAssert(index < kArrayList_Count(obj->content));
return kArrayList_AsT(obj->content, index, kObject);
}