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 
00025 using namespace Kross::Api;
00026 
00027 Variant::Variant(const QVariant& value)
00028     : Value<Variant, QVariant>(value)
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 /*
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         case QVariant::Map:
00055             return "Kross::Api::Variant::Dict";
00056         case QVariant::StringList:
00057         case QVariant::List:
00058             return "Kross::Api::Variant::List";
00059         case QVariant::Double:
00060             //return "Kross::Api::Variant::Double";
00061         case QVariant::UInt: 
00062             //return "Kross::Api::Variant::UInt"; // python isn't able to differ between int and uint :-(
00063         case QVariant::LongLong:
00064         case QVariant::ULongLong:
00065         case QVariant::Int:
00066             return "Kross::Api::Variant::Integer";
00067         case QVariant::Bool:
00068             return "Kross::Api::Variant::Bool";
00069         default: //Date, Time, DateTime, ByteArray, BitArray, Rect, Size, Color, Invalid, etc.
00070             return "Kross::Api::Variant";
00071     }
00072 }
00073 */
00074 
00075 const QVariant& Variant::toVariant(Object::Ptr object)
00076 {
00077     return Object::fromObject<Variant>( object.data() )->getValue();
00078 }
00079 
00080 const QString Variant::toString(Object::Ptr object)
00081 {
00082     const QVariant& variant = toVariant(object);
00083     if(! variant.canCast(QVariant::String))
00084         throw Exception::Ptr( new Exception(i18n("Kross::Api::Variant::String expected, but got %1.").arg(variant.typeName()).latin1()) );
00085     return variant.toString();
00086 }
00087 
00088 int Variant::toInt(Object::Ptr object)
00089 {
00090     const QVariant& variant = toVariant(object);
00091     if(! variant.canCast(QVariant::Int))
00092         throw Exception::Ptr( new Exception(i18n("Kross::Api::Variant::Int expected, but got %1.").arg(variant.typeName()).latin1()) );
00093     return variant.toInt();
00094 }
00095 
00096 uint Variant::toUInt(Object::Ptr object)
00097 {
00098     const QVariant& variant = toVariant(object);
00099     if(! variant.canCast(QVariant::UInt))
00100         throw Exception::Ptr( new Exception(i18n("Kross::Api::Variant::UInt expected, but got %1.").arg(variant.typeName()).latin1()) );
00101     return variant.toUInt();
00102 }
00103 
00104 double Variant::toDouble(Object::Ptr object)
00105 {
00106     const QVariant& variant = toVariant(object);
00107     if(! variant.canCast(QVariant::Double))
00108         throw Exception::Ptr( new Exception(i18n("Kross::Api::Variant::Double expected, but got %1.").arg(variant.typeName()).latin1()) );
00109     return variant.toDouble();
00110 }
00111 
00112 Q_LLONG Variant::toLLONG(Object::Ptr object)
00113 {
00114     const QVariant& variant = toVariant(object);
00115     if(! variant.canCast(QVariant::LongLong))
00116         throw Exception::Ptr( new Exception(i18n("Kross::Api::Variant::LLONG expected, but got %1.").arg(variant.typeName()).latin1()) );
00117     return variant.toLongLong();
00118 }
00119 
00120 Q_ULLONG Variant::toULLONG(Object::Ptr object)
00121 {
00122     const QVariant& variant = toVariant(object);
00123     if(! variant.canCast(QVariant::ULongLong))
00124         throw Exception::Ptr( new Exception(i18n("Kross::Api::Variant::ULLONG expected, but got %1.").arg(variant.typeName()).latin1()) );
00125     return variant.toULongLong();
00126 }
00127 
00128 bool Variant::toBool(Object::Ptr object)
00129 {
00130     const QVariant& variant = toVariant(object);
00131     if(! variant.canCast(QVariant::Bool))
00132         throw Exception::Ptr( new Exception(i18n("Kross::Api::Variant::Bool expected, but got %1.").arg(variant.typeName()).latin1()) );
00133     return variant.toBool();
00134 }
00135 
00136 QStringList Variant::toStringList(Object::Ptr object)
00137 {
00138     List* list = dynamic_cast< List* >( object.data() );
00139     if(list) {
00140         QStringList l;
00141         QValueList<Object::Ptr> valuelist = list->getValue();
00142         QValueList<Object::Ptr>::Iterator it(valuelist.begin()), end(valuelist.end());
00143         for(; it != end; ++it)
00144             l.append( toString(*it) );
00145         return l;
00146     }
00147     const QVariant& variant = toVariant(object);
00148     if(! variant.canCast(QVariant::StringList))
00149         throw Exception::Ptr( new Exception(QString("Kross::Api::Variant::StringList expected, but got '%1'.").arg(variant.typeName()).latin1()) );
00150     return variant.toStringList();
00151 }
00152 
00153 QValueList<QVariant> Variant::toList(Object::Ptr object)
00154 {
00155     List* list = dynamic_cast< List* >( object.data() );
00156     if(list) {
00157         QValueList<QVariant> l;
00158         QValueList<Object::Ptr> valuelist = list->getValue();
00159         QValueList<Object::Ptr>::Iterator it(valuelist.begin()), end(valuelist.end());
00160         for(; it != end; ++it)
00161             l.append( toVariant(*it) );
00162         return l;
00163     }
00164     const QVariant& variant = toVariant(object);
00165     if(! variant.canCast(QVariant::List))
00166         throw Exception::Ptr( new Exception(i18n("Kross::Api::Variant::List expected, but got '%1'.").arg(variant.typeName()).latin1()) );
00167     return variant.toList();
00168 }
KDE Home | KDE Accessibility Home | Description of Access Keys