src/hbcore/devicedialogbase/hbsymbianvariantconverter.cpp
changeset 0 16d8024aca5e
child 21 4633027730f5
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/hbcore/devicedialogbase/hbsymbianvariantconverter.cpp	Mon Apr 19 14:02:13 2010 +0300
@@ -0,0 +1,258 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (developer.feedback@nokia.com)
+**
+** This file is part of the HbCore module of the UI Extensions for Mobile.
+**
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this file.
+** Please review the following information to ensure the GNU Lesser General
+** Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at developer.feedback@nokia.com.
+**
+****************************************************************************/
+#include <QVariant>
+#include <QString>
+#include <QStringList>
+#include <QRect>
+
+#include "hbsymbianvariantconverter_p.h"
+#include "hbsymbianvariant.h"
+
+void HbSymbianVariantConverter::toQtVariant(const CHbSymbianVariant* source, 
+                                            QVariant& result )
+{
+    if (!source) {
+        result.clear();
+        return;
+    }
+    switch(source->Type()) {
+        case CHbSymbianVariant::EInt:
+        {
+            result.setValue(*source->Value<TInt>());
+        }
+        break;
+        case CHbSymbianVariant::EBool:
+        {
+            result.setValue((bool)*source->Value<TInt>());
+        }
+        break;
+        case CHbSymbianVariant::EUint:
+        {
+            result.setValue(*source->Value<TUint>());
+        }
+        break;
+        case CHbSymbianVariant::EReal:
+        {
+            result.setValue(*source->Value<TReal>());
+        }
+        break;
+        case CHbSymbianVariant::ERect:
+        {
+            TRect* srcRect = source->Value<TRect>();
+            QRect rect(srcRect->iTl.iX, srcRect->iTl.iY, srcRect->Width(),
+                    srcRect->Height());
+            result.setValue(rect);
+        }
+        break;
+        case CHbSymbianVariant::EPoint:
+        {
+            TPoint* srcPoint = source->Value<TPoint>();
+            QPoint point(srcPoint->iX, srcPoint->iY);
+            result.setValue(point);
+        }
+        break;
+        case CHbSymbianVariant::ESize:
+        {
+            TSize* srcSize = source->Value<TSize>();
+            QSize size(srcSize->iWidth, srcSize->iHeight);
+            result.setValue(size);
+        }
+        break;
+        case CHbSymbianVariant::EChar:
+        {
+            TChar* srcChar = source->Value<TChar>();
+            QChar ch(*srcChar);
+            result.setValue(ch);
+        }
+        break;
+        case CHbSymbianVariant::EDes:
+        {
+            TDesC* srcDes = source->Value<TDesC>();
+            result.setValue(QString::fromUtf16(srcDes->Ptr(), srcDes->Length()));
+        }
+        break;
+        case CHbSymbianVariant::EBinary:
+        {
+            TDesC8* srcBin = source->Value<TDesC8>();
+            QByteArray byteArray((char*)srcBin->Ptr(), srcBin->Length());
+            result.setValue(byteArray);
+        }
+        break;
+        case CHbSymbianVariant::EDesArray:
+        {
+            CDesC16ArrayFlat* srcArray = source->Value<CDesC16ArrayFlat>();
+            QStringList stringList;
+            for(TInt i = 0; i < srcArray->MdcaCount(); i++) {
+                stringList.append(QString::fromUtf16(srcArray->MdcaPoint(i).Ptr(), srcArray->MdcaPoint(i).Length()));
+            }
+            result.setValue(stringList);
+        }
+        break;
+        case CHbSymbianVariant::EVariantMap: 
+        {
+            const CHbSymbianVariantMap* src = source->Value<CHbSymbianVariantMap>();
+            QVariantMap map;
+            toQtVariantMap(*src, map);
+            result.setValue(map);
+        }
+        break;
+        default:
+        {
+            User::Panic(_L("CHbDeviceDialog: Not supported type"), source->Type());
+        }
+        break;
+    }
+}
+
+void HbSymbianVariantConverter::toQtVariantMap(const CHbSymbianVariantMap &aSymbianVariantMap, 
+                                               QVariantMap& aQvMap)
+{
+    MDesCArray& keys = aSymbianVariantMap.Keys();
+    for(TInt i = 0; i < keys.MdcaCount() ; i++) {
+        TPtrC ptr = keys.MdcaPoint(i);
+        QString key = QString::fromUtf16(ptr.Ptr(), ptr.Length());
+        QVariant variant;
+        toQtVariant(aSymbianVariantMap.Get(ptr), variant);
+        aQvMap[key] = variant;
+    }
+}
+
+CHbSymbianVariant* HbSymbianVariantConverter::fromQtVariantL(QVariant& aVariant)
+{
+    CHbSymbianVariant* return_value = 0;
+
+    switch(aVariant.type()) {
+        case QVariant::Bool:
+        {
+            TBool boolean = aVariant.value<bool>();
+            return_value = CHbSymbianVariant::NewL(&boolean, CHbSymbianVariant::EBool);
+        }
+        break;
+        case QVariant::ByteArray:
+        {
+            QByteArray array = aVariant.value<QByteArray>();
+            TPtrC8 bufPtr((uchar*)array.data(), array.size());
+            return_value = CHbSymbianVariant::NewL(&bufPtr, CHbSymbianVariant::EBinary);
+        }
+        break;
+        case QVariant::Char:
+        {
+            TChar sCh(aVariant.value<QChar>().unicode());
+            return_value = CHbSymbianVariant::NewL(&sCh, CHbSymbianVariant::EChar);
+        }
+            break;
+        case QVariant::Double:
+        {
+            double tempDouble = aVariant.value<double>();
+            return_value = CHbSymbianVariant::NewL(&tempDouble, CHbSymbianVariant::EReal);
+        }
+        break;
+        case QVariant::Int:
+        {
+            int tempInt = aVariant.value<int>();
+            return_value = CHbSymbianVariant::NewL(&tempInt, CHbSymbianVariant::EInt);
+        }
+        break;
+        case QVariant::Point:
+        {
+            QPoint tempPoint = aVariant.value<QPoint>();
+            TPoint point(tempPoint.x(), tempPoint.y());
+            return_value = CHbSymbianVariant::NewL(&point, CHbSymbianVariant::EPoint);
+        }
+        break;
+        case QVariant::Rect:
+        {
+            QRect tempRect = aVariant.value<QRect>();
+            TRect rect(tempRect.left(), tempRect.top(), tempRect.right(),
+                    tempRect.bottom());
+            return_value = CHbSymbianVariant::NewL(&rect, CHbSymbianVariant::ERect);
+        }
+        break;
+        case QVariant::Size:
+        {
+            QSize tempSize = aVariant.value<QSize>();
+            TSize size(tempSize.width(), tempSize.height());
+            return_value = CHbSymbianVariant::NewL(&size, CHbSymbianVariant::ESize);
+        }
+        break;
+        case QVariant::String:
+        {
+            QString tempString = aVariant.value<QString>();
+            TPtrC descriptor(static_cast<const TUint16*>(tempString.utf16()),
+                    tempString.length());
+            return_value = CHbSymbianVariant::NewL(&descriptor, CHbSymbianVariant::EDes);
+        }
+        break;
+        case QVariant::StringList:
+        {
+            QStringList stringList = aVariant.value<QStringList>();
+            QStringList::iterator i;
+            CPtrCArray* descriptorArray = 0;
+            for (i = stringList.begin(); i != stringList.end(); ++i) {
+            descriptorArray = new CPtrCArray(stringList.count());
+                TPtrC listItem(static_cast<const TUint16*>((*i).utf16()),
+                        (*i).length());
+                descriptorArray->AppendL(listItem);
+            }
+            MDesCArray* arrayInterface = static_cast<MDesCArray*>(descriptorArray);
+            return_value = CHbSymbianVariant::NewL(arrayInterface, CHbSymbianVariant::EDesArray);
+        }
+        break;
+        case QVariant::UInt:
+        {
+            uint tempUint = aVariant.value<uint>();
+            return_value = CHbSymbianVariant::NewL(&tempUint, CHbSymbianVariant::EUint);
+        }
+        break;
+        case QVariant::Map: 
+        {
+            QVariantMap map = aVariant.value<QVariantMap>();
+            return_value = CHbSymbianVariant::NewL(fromQVariantMapL(map), CHbSymbianVariant::EVariantMap);
+        }
+        break;
+        default:
+        {
+            User::Panic(_L("CHbDeviceDialog: Not supported type"), aVariant.type());
+        }
+        break;
+    }
+    return return_value;
+}
+
+CHbSymbianVariantMap *HbSymbianVariantConverter::fromQVariantMapL(QVariantMap& aQvMap)
+{
+    CHbSymbianVariantMap* map = CHbSymbianVariantMap::NewL();
+    QVariantMap::const_iterator i;
+    for (i = aQvMap.constBegin(); i != aQvMap.constEnd(); ++i){
+      QString keyString = i.key();
+      TPtrC descriptor(static_cast<const TUint16*>(keyString.utf16()),
+              i.key().length());
+      QVariant value = i.value();
+      CHbSymbianVariant* symbianVariant = fromQtVariantL(value);
+      map->Add(descriptor, symbianVariant);
+    }
+    return map;
+}
+