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; }
void ModelViewBinder<IdType>::unload() { bind_to_view( nullptr ); m_id = IdType(); }
inline IdType get() const { assert(type == IdType::type_number); return IdType(id); }