void CChoiceTypeInfoFunctions::SkipChoiceDefault(CObjectIStream& in, TTypeInfo objectType) { const CChoiceTypeInfo* choiceType = CTypeConverter<CChoiceTypeInfo>::SafeCast(objectType); BEGIN_OBJECT_FRAME_OF2(in, eFrameChoice, choiceType); in.BeginChoice(choiceType); BEGIN_OBJECT_FRAME_OF(in, eFrameChoiceVariant); TMemberIndex index = in.BeginChoiceVariant(choiceType); if ( index == kInvalidMember ) in.ThrowError(in.fFormatError,"choice variant id expected"); const CVariantInfo* variantInfo = choiceType->GetVariantInfo(index); if (variantInfo->GetId().IsAttlist()) { const CMemberInfo* memberInfo = dynamic_cast<const CMemberInfo*>( choiceType->GetVariants().GetItemInfo(index)); memberInfo->SkipMember(in); in.EndChoiceVariant(); index = in.BeginChoiceVariant(choiceType); if ( index == kInvalidMember ) in.ThrowError(in.fFormatError,"choice variant id expected"); variantInfo = choiceType->GetVariantInfo(index); } in.SetTopMemberId(variantInfo->GetId()); variantInfo->SkipVariant(in); in.EndChoiceVariant(); END_OBJECT_FRAME_OF(in); in.EndChoice(); END_OBJECT_FRAME_OF(in); }
void CChoiceTypeInfoFunctions::WriteChoiceDefault(CObjectOStream& out, TTypeInfo objectType, TConstObjectPtr objectPtr) { const CChoiceTypeInfo* choiceType = CTypeConverter<CChoiceTypeInfo>::SafeCast(objectType); BEGIN_OBJECT_FRAME_OF3(out, eFrameChoice, choiceType, objectPtr); out.BeginChoice(choiceType); TMemberIndex index = choiceType->GetVariants().FirstIndex(); const CVariantInfo* variantInfo = choiceType->GetVariantInfo(index); if (variantInfo->GetId().IsAttlist()) { const CMemberInfo* memberInfo = dynamic_cast<const CMemberInfo*>( choiceType->GetVariants().GetItemInfo(index)); memberInfo->WriteMember(out,objectPtr); } index = choiceType->GetIndex(objectPtr); if ( index == kInvalidMember ) out.ThrowError(out.fInvalidData, "cannot write empty choice"); variantInfo = choiceType->GetVariantInfo(index); BEGIN_OBJECT_FRAME_OF2(out, eFrameChoiceVariant, variantInfo->GetId()); out.BeginChoiceVariant(choiceType, variantInfo->GetId()); variantInfo->WriteVariant(out, objectPtr); out.EndChoiceVariant(); END_OBJECT_FRAME_OF(out); out.EndChoice(); END_OBJECT_FRAME_OF(out); }
void CObjectOStream::CopyNamedType(TTypeInfo namedTypeInfo, TTypeInfo objectType, CObjectStreamCopier& copier) { #ifndef VIRTUAL_MID_LEVEL_IO BEGIN_OBJECT_2FRAMES_OF2(copier, eFrameNamed, namedTypeInfo); copier.In().BeginNamedType(namedTypeInfo); BeginNamedType(namedTypeInfo); CopyObject(objectType, copier); EndNamedType(); copier.In().EndNamedType(); END_OBJECT_2FRAMES_OF(copier); #else BEGIN_OBJECT_FRAME_OF2(copier.In(), eFrameNamed, namedTypeInfo); copier.In().BeginNamedType(namedTypeInfo); CopyObject(objectType, copier); copier.In().EndNamedType(); END_OBJECT_FRAME_OF(copier.In()); #endif }