[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    koffice/krita/ui/kisexiv2
From:       Cyrille Berger <cyb () lepi ! org>
Date:       2010-01-28 23:07:50
Message-ID: 1264720070.649934.12724.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 1081656 by berger:

load array of structure


 M  +71 -3     kis_xmp_io.cpp  


--- trunk/koffice/krita/ui/kisexiv2/kis_xmp_io.cpp #1081655:1081656
@@ -162,6 +162,7 @@
     Exiv2::XmpData xmpData_;
     Exiv2::XmpParser::decode(xmpData_, xmpPacket_);
     QMap< const KisMetaData::Schema*, QMap<QString, QMap<QString, \
KisMetaData::Value> > > structures; +    QMap< const KisMetaData::Schema*, \
                QMap<QString, QVector< QMap<QString, KisMetaData::Value> > > > \
                arraysOfStructures;
     for (Exiv2::XmpData::iterator it = xmpData_.begin(); it != xmpData_.end(); ++it) \
{  dbgFile << it->key().c_str();
         Exiv2::XmpKey key(it->key());
@@ -181,20 +182,41 @@
             // Decrypt key
             QString structName = "";
             QString tagName = key.tagName().c_str();
+            int arrayIndex;
             const KisMetaData::TypeInfo* typeInfo = 0;
             bool isStructureEntry = false;
+            bool isStructureInArrayEntry = false;
             if (tagName.contains("/")) {
                 QRegExp regexp("([A-Za-z]\\w+)/([A-Za-z]\\w+):([A-Za-z]\\w+)");
                 if (regexp.indexIn(tagName) != -1) {
                     structName = regexp.capturedTexts()[1];
                     tagName =  regexp.capturedTexts()[3];
                     typeInfo = schema->propertyType(structName);
+                    Q_ASSERT(typeInfo == schema->propertyType(structName));
                     if (typeInfo && typeInfo->propertyType() == \
                KisMetaData::TypeInfo::StructureType) {
                         typeInfo = \
typeInfo->structureSchema()->propertyType(tagName);  }
                     isStructureEntry = true;
                 } else {
-                    dbgFile << "Decoding structure name/entry failed: " << tagName;
+                    QRegExp \
regexp2("([A-Za-z]\\w+)\\[(\\d+)\\]/([A-Za-z]\\w+):([A-Za-z]\\w+)"); +                \
if (regexp2.indexIn(tagName) != -1) { +                        dbgFile << \
ppVar(tagName); +                        structName = regexp2.capturedTexts()[1];
+                        arrayIndex = regexp2.capturedTexts()[2].toInt() - 1;
+                        tagName = regexp2.capturedTexts()[4];
+                        dbgFile << ppVar(structName) << \
ppVar(regexp2.capturedTexts()[3]); +                        \
Q_ASSERT(schema->propertyType(structName)); +                        if \
(schema->propertyType(structName)) { +                            typeInfo = \
schema->propertyType(structName)->embeddedPropertyType(); +                           \
Q_ASSERT(typeInfo); +                            if (typeInfo && \
typeInfo->propertyType() == KisMetaData::TypeInfo::StructureType) { +                 \
typeInfo = typeInfo->structureSchema()->propertyType(tagName); +                      \
} +                        }
+                        isStructureInArrayEntry = true;
+                    } else {
+                        dbgFile << "Decoding structure name/entry failed: " << \
tagName; +                    }
                 }
             } else {
                 typeInfo = schema->propertyType(tagName);
@@ -202,8 +224,10 @@
             KisMetaData::Value v;
 
             bool ignoreValue = false;
-            if (value->typeId() == Exiv2::xmpBag || value->typeId() == Exiv2::xmpSeq \
                ||
-                    value->typeId() == Exiv2::xmpAlt) {
+            // Compute the value
+            if (value->typeId() == Exiv2::xmpBag
+                    || value->typeId() == Exiv2::xmpSeq
+                    || value->typeId() == Exiv2::xmpAlt) {
                 const KisMetaData::TypeInfo* embeddedTypeInfo = 0;
                 if (typeInfo) {
                     embeddedTypeInfo = typeInfo->embeddedPropertyType();
@@ -265,9 +289,16 @@
                     }
                 }
             }
+
+            // set the value
             dbgFile << ppVar(tagName);
             if (isStructureEntry) {
                 structures[schema][structName][tagName] = v;
+            } else if (isStructureInArrayEntry) {
+                if (arraysOfStructures[schema][structName].size() <= arrayIndex) {
+                    arraysOfStructures[schema][structName].resize(arrayIndex + 1);
+                }
+                arraysOfStructures[schema][structName][arrayIndex][tagName] = v;
             } else {
                 if (!ignoreValue) {
                     store->addEntry(KisMetaData::Entry(schema, tagName, v));
@@ -286,6 +317,43 @@
             store->addEntry(KisMetaData::Entry(schema, it2.key(), \
KisMetaData::Value(it2.value())));  }
     }
+    for (QMap< const KisMetaData::Schema*, QMap<QString, QVector< QMap<QString, \
KisMetaData::Value> > > >::iterator it = arraysOfStructures.begin(); it != \
arraysOfStructures.end(); ++it) { +        const KisMetaData::Schema* schema = \
it.key(); +        for (QMap<QString, QVector<QMap<QString, KisMetaData::Value> > \
>::iterator it2 = it.value().begin(); +                it2 != it.value().end(); \
> ++it2) {
+            KisMetaData::Value::ValueType type = KisMetaData::Value::OrderedArray;
+            QString entryName = it2.key();
+            if (schema->propertyType(entryName)) {
+                switch (schema->propertyType(entryName)->propertyType()) {
+                case KisMetaData::TypeInfo::OrderedArrayType:
+                    type = KisMetaData::Value::OrderedArray;
+                    break;
+                case KisMetaData::TypeInfo::UnorderedArrayType:
+                    type = KisMetaData::Value::OrderedArray;
+                    break;
+                case KisMetaData::TypeInfo::AlternativeArrayType:
+                    type = KisMetaData::Value::AlternativeArray;
+                    break;
+                default:
+                    type = KisMetaData::Value::Invalid;
+                    break;
+                }
+            } else if (store->containsEntry(schema, entryName)) {
+                KisMetaData::Value value = store->getEntry(schema, \
entryName).value(); +                if (value.isArray()) {
+                    type = value.type();
+                }
+            }
+            store->removeEntry(schema, entryName);
+            if (type != KisMetaData::Value::Invalid) {
+                QList< KisMetaData::Value > valueList;
+                for (int i = 0; i < it2.value().size(); ++i) {
+                    valueList.append(it2.value()[i]);
+                }
+                store->addEntry(KisMetaData::Entry(schema, entryName, \
KisMetaData::Value(valueList, type))); +            }
+        }
+    }
 
     return true;
 }


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic