diff -r 000000000000 -r dd21522fd290 webengine/device/src/DeviceLiwResult.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webengine/device/src/DeviceLiwResult.cpp Mon Mar 30 12:54:55 2009 +0300 @@ -0,0 +1,290 @@ +/* +* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +// INCLUDE FILES +#include +#include +#include +#include +#include "DeviceLiwResult.h" +#include "DeviceLiwIterable.h" +#include "DeviceLiwMap.h" +#include "array_instance.h" + +const TInt KMaxKeySize = 255; + +using namespace KJS; +const ClassInfo DeviceLiwResult::info = { "DeviceLiwResult", 0/*&ArrayInstance::info*/, 0, 0 }; + +// ============================= LOCAL FUNCTIONS =============================== +/* +@begin DeviceLiwResultTable 1 + close DeviceLiwResult::close DontDelete|Function 0 +@end +*/ + +// ============================ MEMBER FUNCTIONS =============================== + +// ---------------------------------------------------------------------------- +// DeviceLiwResult::DeviceLiwResult +// +// ---------------------------------------------------------------------------- +// +DeviceLiwResult::DeviceLiwResult( JSValue* proto) + : JSObject(proto) + { + m_privateData = new DeviceLiwResultPrivate(); + if (!m_privateData) + m_valid = false; + else + { + m_valid = true; + // protect this object + KJS::Collector::protect(this); + } + } + +// ---------------------------------------------------------------------------- +// DeviceLiwResult::~DeviceLiwResult +// +// ---------------------------------------------------------------------------- +// +DeviceLiwResult::~DeviceLiwResult() + { + // only can be called by garbage collection after the + // DeviceLiwResult::Close() was called + } + +// ---------------------------------------------------------------------------- +// DeviceLiwResult::Close +// +// ---------------------------------------------------------------------------- +void DeviceLiwResult::Close( ExecState* exec, bool unmark ) + { + + // avoid double close + if(!m_valid) + { + if(unmark) + { + // unprotect this to allow the garbage collection to release this jsobject + KJS::Collector::unprotect(this); + } + return; + } + + // close thDeviceLiwIterable + if ( exec ) + { + PropertyNameArray propertyNames; + this->getPropertyNames( exec, propertyNames ); + unsigned size = static_cast(propertyNames.size()); + + for (unsigned i = 0; i < size; i++) + { + JSValue * jsvalue = this->get( exec, propertyNames[i] ); + if(jsvalue->isObject()) + { + JSObject * prop = jsvalue->toObject( exec ); + if (prop && prop->inherits( &DeviceLiwIterable::info )) + { + (static_cast(prop))->Close(exec, true); + } + } + } + } + + delete m_privateData; + m_privateData = NULL; + m_valid = false; + + if(unmark) + { + // unprotect this to allow the garbage collection to release this jsobject + KJS::Collector::unprotect(this); + } + } + +// ---------------------------------------------------------------------------- +// DeviceLiwResult::QuickClose +// +// ---------------------------------------------------------------------------- +void DeviceLiwResult::quickClose() + { + if(!m_valid) + return + + delete m_privateData; + m_privateData = NULL; + m_valid = false; + + // unprotect this to allow the garbage collection to release this jsobject + KJS::Collector::unprotect(this); + } + +// ---------------------------------------------------------------------------- +// DeviceLiwResult::toString +// +// +// ---------------------------------------------------------------------------- +UString DeviceLiwResult::toString( ExecState* /*exec*/ ) const + { + return "[object DeviceLiwResult]"; + } + +// ---------------------------------------------------------------------------- +// DeviceLiwResult::getOwnPropertySlot +// +// +// ---------------------------------------------------------------------------- +bool DeviceLiwResult::getOwnPropertySlot(ExecState* exec, const Identifier& propertyName, PropertySlot& slot) + { + // When the DeviceLiwResult is valid, the check order is + // DeviceLiwResult table => own property => prototype property + // When the DeviceLiwResult is invalid (after close), the check order is + // close function in table => prototype property + + // 1. when it is valid + if(m_valid) + { + m_privateData->m_propName = propertyName; + + // 1.1 check DeviceLiwResult table + const HashEntry* entry = Lookup::findEntry(&DeviceLiwResultTable, propertyName); + if (entry) + { + slot.setStaticEntry(this, entry, staticValueGetter); + return true; + } + + // 1.2 check own property + if (JSObject::getOwnPropertySlot(exec, propertyName, slot)) + return true; + + // 1.3 check prototypes + JSObject *proto = static_cast(this->prototype()); + while (!proto->isNull() && proto->isObject()) + { + if (proto->getOwnPropertySlot(exec, propertyName, slot)) + return true; + + proto = static_cast(proto->prototype()); + } + } + // 2. when it is invalid + else + { + // 2.1 check close() function + if (propertyName == "close") + { + const HashEntry* entry = Lookup::findEntry(&DeviceLiwResultTable, propertyName); + if (entry) + { + slot.setStaticEntry(this, entry, staticValueGetter); + return true; + } + } + + // 2.2 check prototypes + JSObject *proto = static_cast(this->prototype()); + while (!proto->isNull() && proto->isObject()) + { + if (proto->getOwnPropertySlot(exec, propertyName, slot)) + return true; + + proto = static_cast(proto->prototype()); + } + } + return false; + } + + +// ---------------------------------------------------------------------------- +// DeviceLiwResult::getValueProperty +// +// ---------------------------------------------------------------------------- +JSValue* DeviceLiwResult::getValueProperty(ExecState *exec, int token) const + { + switch (token) + { + case close: + { + return new DeviceLiwResultFunc(exec, token); + } + default: + if(m_valid) + return getDirect(m_privateData->m_propName); + else + return jsUndefined(); + } + } + +// --------------------------------------------------------------------------- +// DeviceLiwIterablePrivate constructor +// +// --------------------------------------------------------------------------- +DeviceLiwResultPrivate::DeviceLiwResultPrivate() + { + // currently, do nothing + } + +// --------------------------------------------------------------------------- +// DeviceLiwMapPrivate::Close +// +// --------------------------------------------------------------------------- +void DeviceLiwResultPrivate::Close() + { + // currently, do nothing + } + +// ---------------------------------------------------------------------------- +// DeviceLiwResultFunc::DeviceLiwResultFunc +// +// ---------------------------------------------------------------------------- +// +DeviceLiwResultFunc::DeviceLiwResultFunc( ExecState* exec, int token ) + : JSObject( exec->lexicalInterpreter()->builtinObjectPrototype() ), + m_func( token ) + { + } + +// ---------------------------------------------------------------------------- +// DeviceLiwResultFunc::call +// +// ---------------------------------------------------------------------------- +// +JSValue* DeviceLiwResultFunc::callAsFunction(ExecState* exec, JSObject *thisObj, const List& aArgs ) + { + if (!thisObj->inherits(&DeviceLiwResult::info)) + { + return throwError(exec, GeneralError); + } + DeviceLiwResult *result = static_cast(thisObj); + + if ( m_func == DeviceLiwResult::close ) + { + result->Close(exec, false); + } + return jsUndefined(); + } + +//END OF FILE + + + +