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 <kdebug.h>
00024 
00025 using namespace Kross::Api;
00026 
00027 Variant::Variant(const QVariant& value, const QString& name)
00028     : Value<Variant, QVariant>(value, name)
00029 {
00030 }
00031 
00032 Variant::~Variant()
00033 {
00034 }
00035 
00036 const QString Variant::getClassName() const
00037 {
00038     return "Kross::Api::Variant";
00039 }
00040 
00041 const QString Variant::toString()
00042 {
00043     return getValue().toString();
00044 }
00045 
00046 const QString Variant::getVariantType(Object::Ptr object)
00047 {
00048     switch( toVariant(object).type() ) {
00049 
00050         case QVariant::CString:
00051         case QVariant::String:
00052             return "Kross::Api::Variant::String";
00053 
00054         case QVariant::Map:
00055             return "Kross::Api::Variant::Dict";
00056 
00057         case QVariant::StringList:
00058         case QVariant::List:
00059             return "Kross::Api::Variant::List";
00060 
00061         case QVariant::Double:
00062             //return "Kross::Api::Variant::Double";
00063         case QVariant::UInt: 
00064             //return "Kross::Api::Variant::UInt"; // python isn't able to differ between int and uint :-(
00065         case QVariant::LongLong:
00066         case QVariant::ULongLong:
00067         case QVariant::Int:
00068             return "Kross::Api::Variant::Integer";
00069 
00070         case QVariant::Bool:
00071             return "Kross::Api::Variant::Bool";
00072 
00073         default: //Date, Time, DateTime, ByteArray, BitArray, Rect, Size, Color, Invalid, etc.
00074             return "Kross::Api::Variant";
00075     }
00076 }
00077 
00078 const QVariant& Variant::toVariant(Object::Ptr object)
00079 {
00080     return Object::fromObject<Variant>( object.data() )->getValue();
00081 }
00082 
00083 const QString Variant::toString(Object::Ptr object)
00084 {
00085     const QVariant& variant = toVariant(object);
00086     if(! variant.canCast(QVariant::String))
00087         throw Exception::Ptr( new Exception(QString("Kross::Api::Variant::String expected, but got %1.").arg(variant.typeName()).latin1()) );
00088     return variant.toString();
00089 }
00090 
00091 int Variant::toInt(Object::Ptr object)
00092 {
00093     const QVariant& variant = toVariant(object);
00094     if(! variant.canCast(QVariant::Int))
00095         throw Exception::Ptr( new Exception(QString("Kross::Api::Variant::Int expected, but got %1.").arg(variant.typeName()).latin1()) );
00096     return variant.toInt();
00097 }
00098 
00099 uint Variant::toUInt(Object::Ptr object)
00100 {
00101     const QVariant& variant = toVariant(object);
00102     if(! variant.canCast(QVariant::UInt))
00103         throw Exception::Ptr( new Exception(QString("Kross::Api::Variant::UInt expected, but got %1.").arg(variant.typeName()).latin1()) );
00104     return variant.toUInt();
00105 }
00106 
00107 double Variant::toDouble(Object::Ptr object)
00108 {
00109     const QVariant& variant = toVariant(object);
00110     if(! variant.canCast(QVariant::Double))
00111         throw Exception::Ptr( new Exception(QString("Kross::Api::Variant::Double expected, but got %1.").arg(variant.typeName()).latin1()) );
00112     return variant.toDouble();
00113 }
00114 
00115 Q_LLONG Variant::toLLONG(Object::Ptr object)
00116 {
00117     const QVariant& variant = toVariant(object);
00118     if(! variant.canCast(QVariant::LongLong))
00119         throw Exception::Ptr( new Exception(QString("Kross::Api::Variant::LLONG expected, but got %1.").arg(variant.typeName()).latin1()) );
00120     return variant.toLongLong();
00121 }
00122 
00123 Q_ULLONG Variant::toULLONG(Object::Ptr object)
00124 {
00125     const QVariant& variant = toVariant(object);
00126     if(! variant.canCast(QVariant::ULongLong))
00127         throw Exception::Ptr( new Exception(QString("Kross::Api::Variant::ULLONG expected, but got %1.").arg(variant.typeName()).latin1()) );
00128     return variant.toULongLong();
00129 }
00130 
00131 bool Variant::toBool(Object::Ptr object)
00132 {
00133     const QVariant& variant = toVariant(object);
00134     if(! variant.canCast(QVariant::Bool))
00135         throw Exception::Ptr( new Exception(QString("Kross::Api::Variant::Bool expected, but got %1.").arg(variant.typeName()).latin1()) );
00136     return variant.toBool();
00137 }
00138 
00139 QValueList<QVariant> Variant::toList(Object::Ptr object)
00140 {
00141     if(object->getClassName() == "Kross::Api::List") {
00142         QValueList<QVariant> l;
00143         QValueList<Object::Ptr> list = Object::fromObject<List>( object.data() )->getValue();
00144         for(QValueList<Object::Ptr>::Iterator it = list.begin(); it != list.end(); ++it)
00145             l.append( toVariant(*it) );
00146         return l;
00147     }
00148     const QVariant& variant = toVariant(object);
00149     if(! variant.canCast(QVariant::List))
00150         throw Exception::Ptr( new Exception(QString("Kross::Api::Variant::List expected, but got '%1'.").arg(variant.typeName()).latin1()) );
00151     return variant.toList();
00152 }

Generated on Thu Feb 9 17:59:11 2006 for Kross by  doxygen 1.4.6