28 #include <kjs/PropertyNameArray.h>
29 #include <kjs/array_instance.h>
31 #include <QtCore/QBitRef>
32 #include <QtCore/QByteRef>
33 #include <QtCore/QDebug>
34 #include <QtCore/QObject>
35 #include <QtGui/QWidget>
43 using namespace KJSEmbed;
55 return m_value.data();
65 return m_value.typeName();
80 const void *p = m_value.constData();
83 return QGenericArgument( type, p );
99 QVariant::Type type = QVariant::nameToType( args[0]->toString(exec).ascii() );
100 KJS::JSValue *returnValue = KJS::jsBoolean(val.convert(type));
104 return KJS::jsNull();
115 QString stringVal = val.toString();
116 if( !stringVal.isEmpty() )
120 return KJS::jsNull();
125 {
"cast", 1, KJS::DontDelete|KJS::ReadOnly|KJS::DontEnum, &
callCast },
126 {
"toString", 0, KJS::DontDelete|KJS::ReadOnly|KJS::DontEnum, &
callToString },
134 KJS::JSObject *obj = val->toObject( exec );
135 if (
toQString(obj->className()) ==
"Array" )
137 if( !obj->hasProperty(exec, KJS::Identifier(
"length")) )
139 KJS::JSValue *jslen = obj->get(exec, KJS::Identifier(
"length"));
140 const int len = jslen->toNumber(exec);
144 if( !obj->hasProperty(exec, KJS::Identifier( buff.data() ) ) )
155 QMap<QString, QVariant> returnMap;
156 KJS::JSObject *obj = value->toObject(exec);
157 KJS::PropertyNameArray lst;
158 obj->getPropertyNames(exec, lst);
159 KJS::PropertyNameArrayIterator
idx = lst.begin();
160 for( ; idx != lst.end(); idx++ )
162 KJS::Identifier
id = *
idx;
163 KJS::JSValue *
val = obj->get(exec,
id);
171 QList<QVariant> returnList;
189 KJS::ArrayInstance* arrayImp = extractBindingImp<KJS::ArrayInstance>(exec,
value);
192 const unsigned numItems = arrayImp->getLength();
193 for (
unsigned i = 0; i < numItems; ++i )
201 QStringList returnList;
219 KJS::ArrayInstance* arrayImp = extractBindingImp<KJS::ArrayInstance>(exec,
value);
222 const unsigned numItems = arrayImp->getLength();
223 for (
unsigned i = 0; i < numItems; ++i )
224 returnList.append(
convertToVariant(exec, arrayImp->getItem(i)).toString() );
232 QDateTime returnDateTime;
233 KJS::JSObject *obj = value->toObject( exec );
234 if (
toQString(obj->className()) ==
"Date" )
236 int seconds = int( obj->get( exec, KJS::Identifier(
"getSeconds" ) )->toObject( exec )->call( exec, obj, args )->toInteger( exec ) );
237 int minutes = int( obj->get( exec, KJS::Identifier(
"getMinutes" ) )->toObject( exec )->call( exec, obj, args )->toInteger( exec ) );
238 int hours = int( obj->get( exec, KJS::Identifier(
"getHours" ) )->toObject( exec )->call( exec, obj, args )->toInteger( exec ) );
239 int month = int( obj->get( exec, KJS::Identifier(
"getMonth" ) )->toObject( exec )->call( exec, obj, args )->toInteger( exec ) );
240 int day = int( obj->get( exec, KJS::Identifier(
"getDate" ) )->toObject( exec )->call( exec, obj, args )->toInteger( exec ) );
241 int year = int( obj->get( exec, KJS::Identifier(
"getFullYear" ) )->toObject( exec )->call( exec, obj, args )->toInteger( exec ) );
242 returnDateTime.setDate( QDate( year, month + 1, day ) );
243 returnDateTime.setTime( QTime( hours, minutes, seconds ) );
250 return returnDateTime;
255 #ifdef KJSEMBED_VARIANT_DEBUG
256 qDebug()<<
"KJSEmbed::convertToVariant";
259 QVariant returnValue;
260 switch( value->type() )
262 case KJS::UndefinedType:
265 case KJS::StringType:
266 returnValue =
toQString(value->toString(exec));
268 case KJS::NumberType:
269 returnValue = value->toNumber(exec);
271 case KJS::BooleanType:
272 returnValue = value->toBoolean(exec);
274 case KJS::ObjectType:
276 KJS::JSObject *obj = value->toObject(exec);
278 if (
toQString(obj->className()) ==
"Array" ) {
284 else if (
toQString(obj->className()) ==
"Date" )
300 #ifdef KJSEMBED_VARIANT_DEBUG
301 qDebug()<<
"KJSEmbed::convertToValue typeid="<<value.type()<<
"typename="<<value.typeName()<<
"toString="<<value.toString();
304 KJS::JSValue *returnValue;
305 switch( value.type() )
307 case QVariant::Invalid:
308 returnValue = KJS::jsNull();
311 returnValue = KJS::jsNumber( value.value<
int>() );
314 returnValue = KJS::jsNumber( value.value<
unsigned int>() );
316 case QVariant::LongLong:
317 returnValue = KJS::jsNumber( value.value<qlonglong>() );
319 case QVariant::ULongLong:
320 returnValue = KJS::jsNumber( value.value<qulonglong>() );
322 case QVariant::Double:
323 returnValue = KJS::jsNumber( value.value<
double>() );
326 returnValue = KJS::jsBoolean( value.value<
bool>() );
328 case QVariant::ByteArray:
329 returnValue =
KJS::jsString( QString(value.value<QByteArray>()) );
331 case QVariant::String:
334 case QVariant::StringList:
337 QStringList lst = value.value<QStringList>();
338 QStringList::Iterator
idx = lst.begin();
339 for ( ; idx != lst.end(); ++
idx )
341 returnValue = exec->lexicalInterpreter()->builtinArray()->construct( exec, items );
345 case QVariant::DateTime:
348 QDateTime dt = QDateTime::currentDateTime();
349 if ( value.type() == QVariant::Date )
350 dt.setDate( value.toDate() );
351 else if ( value.type() == QVariant::Time )
352 dt.setTime( value.toTime() );
354 dt = value.toDateTime();
357 items.append( KJS::jsNumber( dt.date().year() ) );
358 items.append( KJS::jsNumber( dt.date().month() - 1 ) );
359 items.append( KJS::jsNumber( dt.date().day() ) );
360 items.append( KJS::jsNumber( dt.time().hour() ) );
361 items.append( KJS::jsNumber( dt.time().minute() ) );
362 items.append( KJS::jsNumber( dt.time().second() ) );
363 items.append( KJS::jsNumber( dt.time().msec() ) );
364 returnValue = exec->lexicalInterpreter()->builtinDate()->construct( exec, items );
370 QList<QVariant> lst = value.toList();
371 foreach(
const QVariant &item, lst)
373 returnValue = exec->lexicalInterpreter()->builtinArray()->construct( exec, items );
378 QMap<QString,QVariant>
map = value.toMap();
379 QMap<QString,QVariant>::Iterator
idx = map.begin();
380 KJS::JSObject *obj = exec->lexicalInterpreter()->builtinObject()->construct( exec,
KJS::List() );
381 for ( ; idx != map.end(); ++
idx )
388 if( qVariantCanConvert< QWidget* >(value) ) {
392 else if( qVariantCanConvert< QObject* >(value) ) {
398 if( returnValue->isNull() )
409 #ifdef KJSEMBED_VARIANT_DEBUG
410 qDebug()<<
"KJSEmbed::extractVariant";
416 if( value->type() == KJS::StringType)
417 return QVariant(
toQString(value->toString(exec)));
418 if( value->type() == KJS::NumberType)
419 return QVariant(value->toNumber(exec));
420 if( value->type() == KJS::BooleanType)
421 return QVariant(value->toBoolean(exec));
423 KJS::JSObject *obj = value->toObject( exec );
425 if(
QObjectBinding *objImp = KJSEmbed::extractBindingImp<QObjectBinding>(exec, value)) {
431 if(
toQString(obj->className()) ==
"Array" )