예제 #1
0
파일: main.cpp 프로젝트: 01org/vmf
int main(int argc, char **argv)
{
    QApplication a(argc, argv);

    umf::initialize();

    std::string appPath = argv[0];
#ifdef WIN32
    char delim = '\\';
#else
    char delim = '/';
#endif
    size_t pos = appPath.find_last_of(delim);

    if (pos != std::string::npos)
    {
        workingPath = appPath.substr(0, pos);
    }

    if (QFile::exists(TEST_FILE))
        QFile::remove(TEST_FILE);

    QFile::copy(VIDEO_FILE.c_str(), "global_test.avi");

    const umf_string FILE_NAME = "global_test.avi";
    const umf_string SCHEMA_NAME = "demo-unicode-schema";
    const umf_string STRING_METADATA = "unicode-string-metadata";

    {
        auto schema = make_shared<MetadataSchema>(SCHEMA_NAME);
        auto desc = make_shared<MetadataDesc>(STRING_METADATA, Variant::type_string);
        schema->add(desc);
        MetadataStream stream;
        if (!stream.open(FILE_NAME, MetadataStream::Update))
        {
            cerr << "Failed to open file " << FILE_NAME << endl;
            return -1;
        }
        stream.addSchema(schema);
        auto metadata = make_shared<Metadata>(desc);
        // UTF-8 string with Russian text
        std::string str("\xD0\xBF\xD1\x80\xD0\xB8\xD0\xB2\xD0\xB5\xD1\x82\x21");
        metadata->addValue(str);
        stream.add(metadata);
        if (!stream.save())
        {
            cerr << "Failed to save file " << FILE_NAME << endl;
            return -1;
        }
        stream.close();
    }

    {
        MetadataStream stream;
        if (!stream.open(FILE_NAME, MetadataStream::ReadOnly))
        {
            cerr << "Failed to open file " << FILE_NAME << endl;
            return -1;
        }
        if (!stream.load(SCHEMA_NAME))
        {
            cerr << "Failed to load schema " << SCHEMA_NAME << endl;
            return -1;
        }
        auto stringMetadata = stream.queryByName(STRING_METADATA);
        auto savedMetadata = stringMetadata.at(0);
        std::string savedString = savedMetadata->at(0);
        QMessageBox::information(NULL, "UMF Demo Unicode", QString::fromUtf8(savedString.c_str()));
    }

    umf::terminate();
    return 0;
}
예제 #2
0
void generateEncryptedMetadata(MetadataStream &mdStream, EncryptionScope scope)
{
    mdStream.remove();
    mdStream.save();
    mdStream.close();
    mdStream.reopen(MetadataStream::OpenModeFlags::Update);

    // Create a GPS metadata field descriptions
    shared_ptr<MetadataSchema> gpsSchema(new MetadataSchema(GPS_SCHEMA_NAME));

    UMF_METADATA_BEGIN(GPS_DESC);
        UMF_FIELD_REAL(GPS_COORD_LAT_FIELD);
        UMF_FIELD_REAL(GPS_COORD_LNG_FIELD);
    UMF_METADATA_END(gpsSchema);

    //set encryption for all fields/metadata/schema/stream
    std::shared_ptr< MetadataDesc > metadesc = gpsSchema->findMetadataDesc(GPS_DESC);
    FieldDesc& field = metadesc->getFieldDesc(GPS_COORD_LNG_FIELD);
    if(scope == EncryptionScope::Whole)
    {
        mdStream.setUseEncryption(true);
    }
    else if(scope == EncryptionScope::AllSchema)
    {
        gpsSchema->setUseEncryption(true);
    }
    else if(scope == EncryptionScope::AllMetaDesc)
    {
        metadesc->setUseEncryption(true);
    }
    else if(scope == EncryptionScope::AllFieldDesc)
    {
        field.useEncryption = true;
    }

    cout << "Adding metadata schema '" << GPS_SCHEMA_NAME << "':" << endl;

    // Add schema to metadata stream
    mdStream.addSchema(gpsSchema);

    shared_ptr<Metadata> gpsMetadata;

    // Let there be an UFO moving around some point on Earth
    const int nPoints = 1<<10;
    for(int i = 0; i < nPoints; i++)
    {
        float lat = float(  37.235 + cos(i/25.0*2.0*PI) * 0.001);
        float lng = float(-115.811 + sin(i/25.0*2.0*PI) * 0.001);
        long long time = i;
        if (i<3) cout << "\t[" << i << "] 'lat " << lat << " lng " << lng << '\'' << " time " << time << endl;
        else cout << '.';

        // Create a metadata item
        gpsMetadata = shared_ptr<Metadata>(new Metadata(gpsSchema->findMetadataDesc(GPS_DESC)));

        //Encrypt specified fields/records or not
        bool encryptRecord = false, encryptField = false;
        if(i == 0)
        {
            if(scope == EncryptionScope::OneField)
            {
                encryptField = true;
            }
            if(scope == EncryptionScope::OneMetadata)
            {
                encryptRecord = true;
            }
        }

        // Fill item fields
        gpsMetadata->push_back(FieldValue(GPS_COORD_LAT_FIELD, lat, encryptField));
        gpsMetadata->push_back(FieldValue(GPS_COORD_LNG_FIELD, lng));
        gpsMetadata->setTimestamp(time);
        gpsMetadata->setUseEncryption(encryptRecord);

        // Add to metadata a new item
        mdStream.add(gpsMetadata);
    }
    cout << "\n\t" << nPoints << " items." << endl;
}
예제 #3
0
void XMPDataSource::saveXMPstructs()
{
    std::shared_ptr<SXMPMeta> tmpXMP = xmp;

    //Sometimes compressed&encoded data is bigger than the source data
    //but there's no need to compare their sizes and write the smallest one.
    //Because due to RDF's verbosity it happens only when the source data is small.
    //That's why the economy wouldn't be significant.
    if(compressor)
    {
        string buffer;
        XMP_OptionBits options = kXMP_ReadOnlyPacket | kXMP_UseCompactFormat;
        tmpXMP->SerializeToBuffer(&buffer, options, 0, NULL);
        vmf_rawbuffer compressed;
        compressor->compress(buffer, compressed);
        string encoded;
        XMPUtils::EncodeToBase64 (compressed.data(), compressed.size(), &encoded);

        //save compressed data as VMF metadata with corresponding schema
        MetadataStream cStream;
        cStream.addSchema(schemaCompression);
        shared_ptr<Metadata> cMetadata;
        cMetadata = make_shared<Metadata>(schemaCompression->findMetadataDesc(COMPRESSED_DATA_DESC_NAME));
        cMetadata->push_back(FieldValue(COMPRESSION_ALGO_PROP_NAME, compressor->getId()));
        cMetadata->push_back(FieldValue(COMPRESSED_DATA_PROP_NAME,  encoded));
        cStream.add(cMetadata);

        tmpXMP = make_shared<SXMPMeta>();
        std::shared_ptr<XMPMetadataSource> cMetaSource;
        std::shared_ptr<XMPSchemaSource> cSchemaSource;
        cSchemaSource = make_shared<XMPSchemaSource>(tmpXMP);
        cMetaSource = make_shared<XMPMetadataSource>(tmpXMP);
        if (!cMetaSource || !cSchemaSource)
        {
            VMF_EXCEPTION(DataStorageException, "Failed to create compressed metadata source or schema source");
        }

        try
        {
            cMetaSource->saveSchema(schemaCompression, cStream.getAll());
            cSchemaSource->save(schemaCompression);
        }
        catch(const XMP_Error& e)
        {
            VMF_EXCEPTION(DataStorageException, e.GetErrMsg());
        }
        catch(const std::exception& e)
        {
            VMF_EXCEPTION(DataStorageException, e.what());
        }
        IdType cNextId = 1;
        tmpXMP->SetProperty_Int64(VMF_NS, VMF_GLOBAL_NEXT_ID, cNextId);
    }

    //existing encryptor should mean that we need an encryption
    if(encryptor)
    {
        string buffer;
        XMP_OptionBits options = kXMP_ReadOnlyPacket | kXMP_UseCompactFormat;
        tmpXMP->SerializeToBuffer(&buffer, options, 0, NULL);
        vmf_rawbuffer encrypted;
        encryptor->encrypt(buffer, encrypted);
        string encoded;
        XMPUtils::EncodeToBase64(encrypted.data(), encrypted.size(), &encoded);

        //save encrypted data as VMF metadata with corresponding schema
        MetadataStream eStream;
        eStream.addSchema(schemaEncryption);
        shared_ptr<Metadata> eMetadata;
        eMetadata = make_shared<Metadata>(schemaEncryption->findMetadataDesc(ENCRYPTED_DATA_DESC_NAME));
        eMetadata->push_back(FieldValue(ENCRYPTION_HINT_PROP_NAME, encryptor->getHint()));
        eMetadata->push_back(FieldValue(ENCRYPTED_DATA_PROP_NAME, encoded));
        eStream.add(eMetadata);

        tmpXMP = make_shared<SXMPMeta>();
        std::shared_ptr<XMPMetadataSource> eMetaSource;
        std::shared_ptr<XMPSchemaSource> eSchemaSource;
        eSchemaSource = make_shared<XMPSchemaSource>(tmpXMP);
        eMetaSource = make_shared<XMPMetadataSource>(tmpXMP);
        if(!eMetaSource || !eSchemaSource)
        {
            VMF_EXCEPTION(DataStorageException, "Failed to create compressed metadata source or schema source");
        }

        try
        {
            eMetaSource->saveSchema(schemaEncryption, eStream.getAll());
            eSchemaSource->save(schemaEncryption);
        }
        catch(const XMP_Error& e)
        {
            VMF_EXCEPTION(DataStorageException, e.GetErrMsg());
        }
        catch(const std::exception& e)
        {
            VMF_EXCEPTION(DataStorageException, e.what());
        }
        IdType eNextId = 1;
        tmpXMP->SetProperty_Int64(VMF_NS, VMF_GLOBAL_NEXT_ID, eNextId);
    }

    if(xmpFile.CanPutXMP(*tmpXMP))
    {
        xmpFile.PutXMP(*tmpXMP);
    }
    else
    {
        VMF_EXCEPTION(InternalErrorException, "Can't write XMP data to file");
    }
}
예제 #4
0
파일: main.cpp 프로젝트: SSE4/vmf-1
int main(int argc, char *argv[])
{
    initialize();

    string appPath = argv[0];
#ifdef WIN32
    char delim = '\\';
#else
    char delim = '/';
#endif
    size_t pos = appPath.find_last_of(delim);

    if (pos != string::npos)
    {
        workingPath = appPath.substr(0, pos + 1);
    }

    // Copy test video file to another location.
    copyFile(VIDEO_FILE, "global_test.avi");

    cout << "VMF sample: read/write GPS location and time" << endl << endl;

    const string FILE_NAME = "global_test.avi";
    const string META_SOURCE_NAME = "test-id";
    const string GPS_DESC = "gps";
    const string GPS_COORD_FIELD = "GPS";
    const string GPS_TIME_FIELD = "Time";
    const string GPS_SCHEMA_NAME = "gps_schema";
    const string GPS_METADATA_ITEM1 = "lat=53.78,lng=132.46";
    const string GPS_METADATA_ITEM2 = "lat=53.28,lng=131.87";
    const string GPS_METADATA_ITEM3 = "lat=52.95,lng=131.41";
    const string GPS_METADATA_ITEM4 = "lat=52.49,lng=130.98";

    cout << "Adding metadata..." << endl;
    cout << "Opening file name '" << FILE_NAME << "'" << endl;

    // Open metadata stream
    MetadataStream mdStream;
    if (!mdStream.open(FILE_NAME, MetadataStream::ReadWrite))
    {
        cerr << "Can't open file " << FILE_NAME << endl;
        exit(1);
    }

    // Create a GPS metadata field descriptions
    vector<FieldDesc> fieldDesc;

    fieldDesc.push_back(FieldDesc(GPS_COORD_FIELD)); // GPS coordinate as string
    fieldDesc.push_back(FieldDesc(GPS_TIME_FIELD)); // Associated time as string

    // Create GPS metadata description
    shared_ptr<MetadataDesc> gpsDesc(new MetadataDesc(GPS_DESC, fieldDesc));

    // Create GPS metadata schema
    shared_ptr<MetadataSchema> gpsSchema(new MetadataSchema(GPS_SCHEMA_NAME));

    // Add description to the schema
    gpsSchema->add(gpsDesc);

    string t = "21.02.2013 18:35";
    cout << "Add metadata schema '" << GPS_SCHEMA_NAME << "'" << endl;

    // Add schema to metadata stream
    mdStream.addSchema(gpsSchema);

    shared_ptr<Metadata> gpsMetadata;

    t = "21.02.2013 18:45";
    cout << "Adding metadata's item '" << GPS_METADATA_ITEM1 << "' with associated time " << t << endl;

    // Create a metadata item
    gpsMetadata = shared_ptr<Metadata>(new Metadata(gpsDesc));

    // Fill item fields
    gpsMetadata->push_back(FieldValue(GPS_COORD_FIELD, GPS_METADATA_ITEM1));
    gpsMetadata->push_back(FieldValue(GPS_TIME_FIELD, t));

    // Add to metadata a new item
    mdStream.add(gpsMetadata);

    t = "21.02.2013 19:28";
    cout << "Adding metadata's item '" << GPS_METADATA_ITEM2 << "' with associated time " << t << endl;

    gpsMetadata = shared_ptr<Metadata>(new Metadata(gpsDesc));
    gpsMetadata->push_back(FieldValue(GPS_COORD_FIELD, GPS_METADATA_ITEM2));
    gpsMetadata->push_back(FieldValue(GPS_TIME_FIELD, t));
    mdStream.add(gpsMetadata);

    t = "21.02.2013 21:02";
    cout << "Adding metadata's item '" << GPS_METADATA_ITEM3 << "' with associated time " << t << endl;

    gpsMetadata = shared_ptr<Metadata>(new Metadata(gpsDesc));
    gpsMetadata->push_back(FieldValue(GPS_COORD_FIELD, GPS_METADATA_ITEM3));
    gpsMetadata->push_back(FieldValue(GPS_TIME_FIELD, t));
    mdStream.add(gpsMetadata);

    t = "21.02.2013 23:19";
    cout << "Adding metadata's item '" << GPS_METADATA_ITEM4 << "' with associated time " << t << endl;

    gpsMetadata = shared_ptr<Metadata>(new Metadata(gpsDesc));
    gpsMetadata->push_back(FieldValue(GPS_COORD_FIELD, GPS_METADATA_ITEM4));
    gpsMetadata->push_back(FieldValue(GPS_TIME_FIELD, t));
    mdStream.add(gpsMetadata);

    cout << "Save metadata" << endl << endl;

    // Save metadata to video file and close metadata stream
    mdStream.save();
    mdStream.close();

    cout << "Loading metadata..." << endl;
    cout << "Opening file name '" << FILE_NAME << "'" << endl;

    // Open new metadata stream to load and print saved metadata
    MetadataStream loadStream;
    if (!loadStream.open(FILE_NAME, MetadataStream::ReadOnly))
    {
        cerr << "Can't open file " << FILE_NAME << endl;
        exit(1);
    }

    cout << "Loading schema '" << GPS_SCHEMA_NAME << "'" << endl;
    if (!loadStream.load(GPS_SCHEMA_NAME))
    {
        cerr << "Can't load schema " << GPS_SCHEMA_NAME << endl;
        exit(1);
    }

    // Select all metadata items from loaded schema
    auto dataSet = loadStream.queryBySchema(GPS_SCHEMA_NAME);

    // and print them to console
    for (size_t i = 0; i < dataSet.size(); i++)
    {
        cout << "Getting item " << i << endl;
        auto metadataItem = dataSet[i];

        string coord = metadataItem->getFieldValue(GPS_COORD_FIELD);
        cout << "\tGPS coordinates are: " << coord << endl;

        string time = metadataItem->getFieldValue(GPS_TIME_FIELD);
        cout << "\tAssociated time is: " << time << endl;
    }

    // Close metadata stream
    loadStream.close();

    // Uninitialize VMF library to free allocated resources
    vmf::terminate();

    return 0;
}
예제 #5
0
void XMPDataSource::loadXMPstructs()
{
    std::shared_ptr<SXMPMeta> tmpXMP = make_shared<SXMPMeta>();
    xmpFile.GetXMP(tmpXMP.get());

    std::shared_ptr<XMPMetadataSource> tmpMetaSource;
    std::shared_ptr<XMPSchemaSource> tmpSchemaSource;
    std::shared_ptr<XMPStatSource> tmpStatSource;
    tmpSchemaSource = make_shared<XMPSchemaSource>(tmpXMP);
    tmpMetaSource = make_shared<XMPMetadataSource>(tmpXMP);
    tmpStatSource = make_shared<XMPStatSource>(tmpXMP);
    if(!tmpMetaSource || !tmpSchemaSource || !tmpStatSource)
    {
        VMF_EXCEPTION(DataStorageException, "Failed to create metadata source or schema source");
    }

    //load standard VMF metadata and decompress them if there is a corresponding schema
    //or pass them further
    try
    {
        //load standard VMF metadata and decrypt them if there is a corresponding schema
        //or pass them further
        std::map<vmf_string, std::shared_ptr<MetadataSchema> > eSchemas;
        tmpSchemaSource->load(eSchemas);
        auto itEncryption = eSchemas.find(ENCRYPTED_DATA_SCHEMA_NAME);
        if(itEncryption != eSchemas.end())
        {
            MetadataStream eStream;
            eStream.addSchema(itEncryption->second);
            tmpMetaSource->loadSchema(ENCRYPTED_DATA_SCHEMA_NAME, eStream);
            MetadataSet eSet = eStream.queryBySchema(ENCRYPTED_DATA_SCHEMA_NAME);
            std::shared_ptr<Metadata> eItem = eSet[0];
            vmf_string hint      = eItem->getFieldValue(ENCRYPTION_HINT_PROP_NAME);
            vmf_string encodedB64 = eItem->getFieldValue(ENCRYPTED_DATA_PROP_NAME);
            bool ignoreBad = (openMode & MetadataStream::OpenModeFlags::IgnoreUnknownEncryptor) != 0;
            if(!encryptor)
            {
                if(!ignoreBad)
                {
                    VMF_EXCEPTION(IncorrectParamException,
                                  "No decryption algorithm provided for encrypted data");
                }
            }
            else
            {
                string decodedFromB64;
                XMPUtils::DecodeFromBase64(encodedB64.data(), encodedB64.length(), &decodedFromB64);
                vmf_rawbuffer encrypted(decodedFromB64.c_str(), decodedFromB64.size());
                string theData;
                try
                {
                    encryptor->decrypt(encrypted, theData);
                }
                catch(Exception& ee)
                {
                    //if we've failed with decryption (whatever the reason was)
                    //and we're allowed to ignore that
                    if(!ignoreBad)
                    {
                        string message = "Decryption failed: " + string(ee.what()) + ", hint: " + hint;
                        VMF_EXCEPTION(IncorrectParamException, message);
                    }
                }
                //replace tmp XMP entities
                tmpXMP->ParseFromBuffer(theData.c_str(), theData.size(), 0);
                tmpSchemaSource = make_shared<XMPSchemaSource>(tmpXMP);
                tmpMetaSource = make_shared<XMPMetadataSource>(tmpXMP);
                tmpStatSource = make_shared<XMPStatSource>(tmpXMP);
                if(!tmpMetaSource || !tmpSchemaSource || !tmpStatSource)
                {
                    VMF_EXCEPTION(DataStorageException,
                                  "Failed to create metadata source, schema source or stat source");
                }
            }
        }

        //load standard VMF metadata and decompress them if there is a corresponding schema
        //or pass them further
        std::map<vmf_string, std::shared_ptr<MetadataSchema> > cSchemas;
        tmpSchemaSource->load(cSchemas);
        auto itCompression = cSchemas.find(COMPRESSED_DATA_SCHEMA_NAME);
        if(itCompression != cSchemas.end())
        {
            MetadataStream cStream;
            cStream.addSchema(itCompression->second);
            tmpMetaSource->loadSchema(COMPRESSED_DATA_SCHEMA_NAME, cStream);
            MetadataSet cSet = cStream.queryBySchema(COMPRESSED_DATA_SCHEMA_NAME);
            std::shared_ptr<Metadata> cItem = cSet[0];
            vmf_string algo    = cItem->getFieldValue(COMPRESSION_ALGO_PROP_NAME);
            vmf_string encoded = cItem->getFieldValue(COMPRESSED_DATA_PROP_NAME);
            bool ignoreBad = (openMode & MetadataStream::OpenModeFlags::IgnoreUnknownCompressor) != 0;
            try
            {
                std::shared_ptr<Compressor> decompressor = Compressor::create(algo);
                string decoded;
                XMPUtils::DecodeFromBase64(encoded.data(), encoded.length(), &decoded);
                vmf_rawbuffer compressed(decoded.c_str(), decoded.size());
                string theData;
                decompressor->decompress(compressed, theData);
                //replace tmp XMP entities
                tmpXMP->ParseFromBuffer(theData.c_str(), theData.size(), 0);
                tmpSchemaSource = make_shared<XMPSchemaSource>(tmpXMP);
                tmpMetaSource = make_shared<XMPMetadataSource>(tmpXMP);
                tmpStatSource = make_shared<XMPStatSource>(tmpXMP);
                if(!tmpMetaSource || !tmpSchemaSource || !tmpStatSource)
                {
                    VMF_EXCEPTION(DataStorageException,
                                  "Failed to create metadata source, schema source or stat source");
                }
            }
            catch(IncorrectParamException& ce)
            {
                //if there's no such compressor and we're allowed to ignore that
                if(!ignoreBad)
                {
                    VMF_EXCEPTION(IncorrectParamException, ce.what());
                }
            }
            catch(InternalErrorException& ce)
            {
                //if there was an error during decompression
                if(!ignoreBad)
                {
                    VMF_EXCEPTION(IncorrectParamException, ce.what());
                }
            }
        }
    }
    catch(const XMP_Error& e)
    {
        VMF_EXCEPTION(DataStorageException, e.GetErrMsg());
    }
    catch(const std::exception& e)
    {
        VMF_EXCEPTION(DataStorageException, e.what());
    }

    xmp = tmpXMP;
    schemaSource = tmpSchemaSource;
    metadataSource = tmpMetaSource;
    statSource = tmpStatSource;
}