ZFPROPERTY_TYPE_DECLARE_SERIALIZE_TO_DEFINE(ZFCallback, ZFCallback)
{
    if(v.callbackSerializeCustomType() != zfnull)
    {
        if(v.callbackSerializeCustomData() == zfnull)
        {
            ZFSerializableUtil::errorOccurred(outErrorHintToAppend, zfText("missing callback serialize custom data"));
            return zffalse;
        }
        serializableData.itemClassSet(ZFPropertyTypeId_ZFCallback);

        serializableData.attributeSet(ZFSerializableKeyword_ZFCallback_callbackType, v.callbackSerializeCustomType());

        ZFSerializableData customData = v.callbackSerializeCustomData()->copy();
        customData.categorySet(ZFSerializableKeyword_ZFCallback_callbackData);
        serializableData.elementAdd(customData);

        return zftrue;
    }

    switch(v.callbackType())
    {
        case ZFCallbackTypeDummy:
            serializableData.itemClassSet(ZFSerializableKeyword_null);
            break;
        case ZFCallbackTypeMethod:
        {
            serializableData.itemClassSet(ZFPropertyTypeId_ZFCallback);
            ZFSerializableData methodData;
            if(!ZFMethodToSerializableData(methodData, v.callbackMethod(), outErrorHintToAppend))
            {
                return zffalse;
            }
            methodData.categorySet(ZFSerializableKeyword_ZFCallback_method);
            serializableData.elementAdd(methodData);
        }
            break;
        case ZFCallbackTypeMemberMethod:
        {
            ZFSerializableUtil::errorOccurred(outErrorHintToAppend,
                zfText("member method callback is not supported"));
            return zffalse;
        }
            break;
        case ZFCallbackTypeRawFunction:
            serializableData.itemClassSet(ZFPropertyTypeId_ZFCallback);
            ZFSerializableUtil::errorOccurred(outErrorHintToAppend,
                zfText("raw function is not supported"));
            return zffalse;
        default:
            zfCoreCriticalShouldNotGoHere();
            return zffalse;
    }

    return zftrue;
}
Пример #2
0
zfbool ZFEnum::serializableOnSerializeCategoryToData(ZF_IN_OUT ZFSerializableData &ownerData,
                                                     ZF_IN ZFSerializable *referencedOwnerOrNull,
                                                     ZF_OUT_OPT zfstring *outErrorHintToAppend /* = zfnull */)
{
    if(!zfsuperI(ZFSerializable)::serializableOnSerializeCategoryToData(ownerData, referencedOwnerOrNull, outErrorHintToAppend)) {return zffalse;}
    zfself *ref = ZFCastZFObject(zfself *, referencedOwnerOrNull);

    { // enum
        ZFSerializableData categoryData;
        categoryData.itemClassSet(ZFSerializableKeyword_node);
        categoryData.categorySet(ZFSerializableKeyword_ZFEnum_enum);
        categoryData.propertyValueSet(this->enumName());

        zfbool needAdd = zftrue;
        if(ref != zfnull)
        {
            if(ref->enumValue() == this->enumValue())
            {
                needAdd = zffalse;
            }
        }
        if(needAdd)
        {
            const ZFSerializableData *refInfo = this->serializableRefInfoGetForCategory(ZFSerializableKeyword_ZFEnum_enum);
            if(refInfo != zfnull)
            {
                ZFSerializableData tmpData;
                if(!refInfo->referenceLoadTo(tmpData, outErrorHintToAppend))
                {
                    return zffalse;
                }
                ZFSerializableUtil::resolveReferencedData(categoryData, *refInfo);
            }
            else if(this->enumValue() == ZFEnumValueInvalid)
            {
                needAdd = zffalse;
            }
        }
        if(needAdd)
        {
            ownerData.elementAdd(categoryData);
        }
    }
    return zftrue;
}