--- /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 <config.h>
+#include <lookup.h>
+#include <liwvariant.h>
+#include <PropertyNameArray.h>
+#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<unsigned>(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<DeviceLiwIterable*>(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<DeviceLiwResult>);
+ return true;
+ }
+
+ // 1.2 check own property
+ if (JSObject::getOwnPropertySlot(exec, propertyName, slot))
+ return true;
+
+ // 1.3 check prototypes
+ JSObject *proto = static_cast<JSObject *>(this->prototype());
+ while (!proto->isNull() && proto->isObject())
+ {
+ if (proto->getOwnPropertySlot(exec, propertyName, slot))
+ return true;
+
+ proto = static_cast<JSObject *>(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<DeviceLiwResult>);
+ return true;
+ }
+ }
+
+ // 2.2 check prototypes
+ JSObject *proto = static_cast<JSObject *>(this->prototype());
+ while (!proto->isNull() && proto->isObject())
+ {
+ if (proto->getOwnPropertySlot(exec, propertyName, slot))
+ return true;
+
+ proto = static_cast<JSObject *>(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<DeviceLiwResult *>(thisObj);
+
+ if ( m_func == DeviceLiwResult::close )
+ {
+ result->Close(exec, false);
+ }
+ return jsUndefined();
+ }
+
+//END OF FILE
+
+
+
+