lib

variant.cpp

00001 /***************************************************************************
00002  * variant.cpp
00003  * This file is part of the KDE project
00004  * copyright (C)2004-2005 by Sebastian Sauer (mail@dipe.org)
00005  *
00006  * This program is free software; you can redistribute it and/or
00007  * modify it under the terms of the GNU Library General Public
00008  * License as published by the Free Software Foundation; either
00009  * version 2 of the License, or (at your option) any later version.
00010  * This program is distributed in the hope that it will be useful,
00011  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00012  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00013  * Library General Public License for more details.
00014  * You should have received a copy of the GNU Library General Public License
00015  * along with this program; see the file COPYING.  If not, write to
00016  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
00017  * Boston, MA 02110-1301, USA.
00018  ***************************************************************************/
00019 
00020 #include "variant.h"
00021 #include "list.h"
00022 
00023 #include <klocale.h>
00024 #include <kdebug.h>
00025 
00026 using namespace Kross::Api;
00027 
00028 Variant::Variant(const QVariant& value, const QString& name)
00029     : Value<Variant, QVariant>(value, name)
00030 {
00031 }
00032 
00033 Variant::~Variant()
00034 {
00035 }
00036 
00037 const QString Variant::getClassName() const
00038 {
00039     return "Kross::Api::Variant";
00040 }
00041 
00042 const QString Variant::toString()
00043 {
00044     return getValue().toString();
00045 }
00046 
00047 const QString Variant::getVariantType(Object::Ptr object)
00048 {
00049     switch( toVariant(object).type() ) {
00050 
00051         case QVariant::CString:
00052         case QVariant::String:
00053             return "Kross::Api::Variant::String";
00054 
00055         case QVariant::Map:
00056             return "Kross::Api::Variant::Dict";
00057 
00058         case QVariant::StringList:
00059         case QVariant::List:
00060             return "Kross::Api::Variant::List";
00061 
00062         case QVariant::Double:
00063             //return "Kross::Api::Variant::Double";
00064         case QVariant::UInt: 
00065             //return "Kross::Api::Variant::UInt"; // python isn't able to differ between int and uint :-(
00066         case QVariant::LongLong:
00067         case QVariant::ULongLong:
00068         case QVariant::Int:
00069             return "Kross::Api::Variant::Integer";
00070 
00071         case QVariant::Bool:
00072             return "Kross::Api::Variant::Bool";
00073 
00074         default: //Date, Time, DateTime, ByteArray, BitArray, Rect, Size, Color, Invalid, etc.
00075             return "Kross::Api::Variant";
00076     }
00077 }
00078 
00079 const QVariant& Variant::toVariant(Object::Ptr object)
00080 {
00081     return Object::fromObject<Variant>( object.data() )->getValue();
00082 }
00083 
00084 const QString Variant::toString(Object::Ptr object)
00085 {
00086     const QVariant& variant = toVariant(object);
00087     if(! variant.canCast(QVariant::String))
00088         throw Exception::Ptr( new Exception(QString(i18n("Kross::Api::Variant::String expected, but got %1.")).arg(variant.typeName()).latin1()) );
00089     return variant.toString();
00090 }
00091 
00092 int Variant::toInt(Object::Ptr object)
00093 {
00094     const QVariant& variant = toVariant(object);
00095     if(! variant.canCast(QVariant::Int))
00096         throw Exception::Ptr( new Exception(QString(i18n("Kross::Api::Variant::Int expected, but got %1.")).arg(variant.typeName()).latin1()) );
00097     return variant.toInt();
00098 }
00099 
00100 uint Variant::toUInt(Object::Ptr object)
00101 {
00102     const QVariant& variant = toVariant(object);
00103     if(! variant.canCast(QVariant::UInt))
00104         throw Exception::Ptr( new Exception(QString(i18n("Kross::Api::Variant::UInt expected, but got %1.")).arg(variant.typeName()).latin1()) );
00105     return variant.toUInt();
00106 }
00107 
00108 double Variant::toDouble(Object::Ptr object)
00109 {
00110     const QVariant& variant = toVariant(object);
00111     if(! variant.canCast(QVariant::Double))
00112         throw Exception::Ptr( new Exception(QString(i18n("Kross::Api::Variant::Double expected, but got %1.")).arg(variant.typeName()).latin1()) );
00113     return variant.toDouble();
00114 }
00115 
00116 Q_LLONG Variant::toLLONG(Object::Ptr object)
00117 {
00118     const QVariant& variant = toVariant(object);
00119     if(! variant.canCast(QVariant::LongLong))
00120         throw Exception::Ptr( new Exception(QString(i18n("Kross::Api::Variant::LLONG expected, but got %1.")).arg(variant.typeName()).latin1()) );
00121     return variant.toLongLong();
00122 }
00123 
00124 Q_ULLONG Variant::toULLONG(Object::Ptr object)
00125 {
00126     const QVariant& variant = toVariant(object);
00127     if(! variant.canCast(QVariant::ULongLong))
00128         throw Exception::Ptr( new Exception(QString(i18n("Kross::Api::Variant::ULLONG expected, but got %1.")).arg(variant.typeName()).latin1()) );
00129     return variant.toULongLong();
00130 }
00131 
00132 bool Variant::toBool(Object::Ptr object)
00133 {
00134     const QVariant& variant = toVariant(object);
00135     if(! variant.canCast(QVariant::Bool))
00136         throw Exception::Ptr( new Exception(QString(i18n("Kross::Api::Variant::Bool expected, but got %1.")).arg(variant.typeName()).latin1()) );
00137     return variant.toBool();
00138 }
00139 
00140 QValueList<QVariant> Variant::toList(Object::Ptr object)
00141 {
00142     if(object->getClassName() == "Kross::Api::List") {
00143         QValueList<QVariant> l;
00144         QValueList<Object::Ptr> list = Object::fromObject<List>( object.data() )->getValue();
00145         for(QValueList<Object::Ptr>::Iterator it = list.begin(); it != list.end(); ++it)
00146             l.append( toVariant(*it) );
00147         return l;
00148     }
00149     const QVariant& variant = toVariant(object);
00150     if(! variant.canCast(QVariant::List))
00151         throw Exception::Ptr( new Exception(QString(i18n("Kross::Api::Variant::List expected, but got '%1'.")).arg(variant.typeName()).latin1()) );
00152     return variant.toList();
00153 }
KDE Home | KDE Accessibility Home | Description of Access Keys