コード例 #1
0
ファイル: jsonreader.cpp プロジェクト: SSE4/vmf-1
static std::shared_ptr<MetadataInternal> parseMetadataFromNode(JSONNode& metadataNode, const std::vector<std::shared_ptr<MetadataSchema>>& schemas)
{
    auto schemaIter = metadataNode.find(ATTR_METADATA_SCHEMA);
    auto descIter = metadataNode.find(ATTR_METADATA_DESCRIPTION);
    auto idIter = metadataNode.find(ATTR_ID);
    if(schemaIter == metadataNode.end() || descIter == metadataNode.end() || idIter == metadataNode.end())
        VMF_EXCEPTION(vmf::IncorrectParamException, "Metadata item has no schema name, description name or id");

    auto schema = schemas.begin();
    for(; schema != schemas.end(); schema++)
        if((*schema)->getName() == schemaIter->as_string())
            break;

    if(schema == schemas.end())
        VMF_EXCEPTION(vmf::IncorrectParamException, "Unknown schema for metadata item");

    std::shared_ptr<MetadataDesc> spDesc;
    if( (spDesc = (*schema)->findMetadataDesc(descIter->as_string())) == nullptr)
        VMF_EXCEPTION(vmf::IncorrectParamException, "Unknown description for metadata item");

    std::shared_ptr<MetadataInternal> spMetadataInternal(new MetadataInternal(spDesc));
    spMetadataInternal->setId(idIter->as_int());

    auto frameIdxLoIter = metadataNode.find(ATTR_METADATA_FRAME_IDX_LO);
    auto frameIdxHiIter = metadataNode.find(ATTR_METADATA_FRAME_IDX_HI);
    auto nFramesLoIter = metadataNode.find(ATTR_METADATA_NFRAMES_LO);
    auto nFramesHiIter = metadataNode.find(ATTR_METADATA_NFRAMES_HI);
    auto timeLoIter = metadataNode.find(ATTR_METADATA_TIMESTAMP_LO);
    auto timeHiIter = metadataNode.find(ATTR_METADATA_TIMESTAMP_HI);
    auto durationLoIter = metadataNode.find(ATTR_METADATA_DURATION_LO);
    auto durationHiIter = metadataNode.find(ATTR_METADATA_DURATION_HI);

    if (frameIdxLoIter != metadataNode.end() && frameIdxHiIter != metadataNode.end())
    {
        unsigned long lo = frameIdxLoIter->as_int();
        unsigned long hi = frameIdxHiIter->as_int();
        long long frmIdx = ((long long)hi << 32) | lo;

        if (nFramesLoIter != metadataNode.end() && nFramesHiIter != metadataNode.end())
        {
            unsigned long lo = nFramesLoIter->as_int();
            unsigned long hi = nFramesHiIter->as_int();
            long long numFrm = ((long long)hi << 32) | lo;
            spMetadataInternal->setFrameIndex(frmIdx, numFrm);
        }
        else
            spMetadataInternal->setFrameIndex(frmIdx);
    }
    if (timeLoIter != metadataNode.end() && timeHiIter != metadataNode.end())
    {
        unsigned long lo = timeLoIter->as_int();
        unsigned long hi = timeHiIter->as_int();
        long long time = ((long long)hi << 32) | lo;

        if (durationLoIter != metadataNode.end() && durationHiIter != metadataNode.end())
        {
            unsigned long lo = durationLoIter->as_int();
            unsigned long hi = durationHiIter->as_int();
            long long dur = ((long long)hi << 32) | lo;
            spMetadataInternal->setTimestamp(time, dur);
        }
        else
            spMetadataInternal->setTimestamp(time);
    }

    auto metadataFieldsArrayIter = metadataNode.find(TAG_FIELDS_ARRAY);
    if(metadataFieldsArrayIter == metadataNode.end())
        VMF_EXCEPTION(vmf::IncorrectParamException, "No metadata fields array");

    for(auto fieldNode = metadataFieldsArrayIter->begin(); fieldNode != metadataFieldsArrayIter->end(); fieldNode++)
    {
        FieldDesc fieldDesc;
        auto fieldNameIter = fieldNode->find(ATTR_NAME);
        auto fieldValueIter = fieldNode->find(ATTR_VALUE);
        if(fieldNameIter == fieldNode->end() || fieldValueIter == fieldNode->end() )
            VMF_EXCEPTION(vmf::IncorrectParamException, "Missing field name or field value");

        vmf::Variant field_value;
        spDesc->getFieldDesc(fieldDesc, fieldNameIter->as_string());
        field_value.fromString(fieldDesc.type, fieldValueIter->as_string());
        spMetadataInternal->setFieldValue(fieldNameIter->as_string(), field_value);
    }

    auto referencesArrayIter = metadataNode.find(TAG_METADATA_REFERENCES_ARRAY);
    if(referencesArrayIter != metadataNode.end())
    {
        for(auto referenceNode = referencesArrayIter->begin(); referenceNode != referencesArrayIter->end(); referenceNode++)
        {
            auto referenceIdIter = referenceNode->find(ATTR_ID);
            if(referenceIdIter == referenceNode->end()) VMF_EXCEPTION(vmf::IncorrectParamException, "Missing reference 'id'");

            auto referenceNameIter = referenceNode->find(ATTR_NAME);
            if(referenceNameIter == referenceNode->end()) VMF_EXCEPTION(vmf::IncorrectParamException, "Missing reference 'name'");

            spMetadataInternal->vRefs.push_back(std::make_pair(IdType(referenceIdIter->as_int()), referenceNameIter->as_string()));
        }
    }

    return spMetadataInternal;
}
コード例 #2
0
	void ModelViewBinder<IdType>::unload()
	{
		bind_to_view( nullptr );
		m_id = IdType();
	}
コード例 #3
0
ファイル: typedId.hpp プロジェクト: AMDmi3/alacarte
	inline IdType get() const
	{
		assert(type == IdType::type_number);

		return IdType(id);
	}