diff -r 000000000000 -r dd21522fd290 webengine/device/src/Device.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webengine/device/src/Device.cpp Mon Mar 30 12:54:55 2009 +0300 @@ -0,0 +1,268 @@ +/* +* 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 "Device.h" +#include "ServiceObject.h" +#include "ServiceEventHandler.h" +#include "DeviceBridge.h" +#include "DeviceBinding.h" +#include "DeviceLiwBinding.h" +#include + +using namespace KJS; + +const ClassInfo Device::info = { "Device", 0, 0, 0 }; +const TInt INIT_SO_ARRAY_SIZE = 10; // initial service object array + +// ============================= LOCAL FUNCTIONS =============================== +/* +@begin DeviceTable 1 + getServiceObject Device::getServiceObject DontDelete|Function 2 + listProviders Device::listProviders DontDelete|Function 2 +@end +*/ + +// ============================ MEMBER FUNCTIONS =============================== + +// ---------------------------------------------------------------------------- +// Device::Device +// +// ---------------------------------------------------------------------------- +// +Device::Device( ExecState* exec ) + : JSObject() + { + m_privateData = new DevicePrivate(); + if (!m_privateData || !m_privateData->m_deviceBinding ) + m_valid = false; + else + m_valid = true; + } + + +// ---------------------------------------------------------------------------- +// Device::SetUid +// +// ---------------------------------------------------------------------------- +// +void Device::SetUid( const TUint& aValue) + { + if(m_privateData) + m_privateData->SetUid( aValue); + } + +// ---------------------------------------------------------------------------- +// Device::Close +// +// ---------------------------------------------------------------------------- +// +void Device::Close() + { + delete m_privateData; + m_privateData = NULL; + } + + +// ---------------------------------------------------------------------------- +// Device::~Device +// +// ---------------------------------------------------------------------------- +// +Device::~Device() + { + Close(); + } + +// ---------------------------------------------------------------------------- +// Device::toString +// +// ---------------------------------------------------------------------------- +// +UString Device::toString( ExecState* /*exec*/ ) const + { + return "[object Device]"; + } + +// ---------------------------------------------------------------------------- +// Device::getOwnPropertySlot +// +// +// ---------------------------------------------------------------------------- +bool Device::getOwnPropertySlot(ExecState* exec, const Identifier& propertyName, PropertySlot& slot) +{ + m_privateData->m_exec = exec; + m_privateData->m_propName = propertyName; + const HashEntry* entry = Lookup::findEntry(&DeviceTable, propertyName); + if (entry) + { + slot.setStaticEntry(this, entry, staticValueGetter); + return true; + } + + return JSObject::getOwnPropertySlot(exec, propertyName, slot); +} + + +// ---------------------------------------------------------------------------- +// JSVersion::getValueProperty +// +// +// ---------------------------------------------------------------------------- +JSValue* Device::getValueProperty(ExecState *exec, int token) const + { + switch( token ) + { + case getServiceObject: + case listProviders: + return new DeviceFunc( exec, m_privateData->m_deviceBinding, token ); + + default: + return throwError(exec, GeneralError); + } + } + +// --------------------------------------------------------------------------- +// DevicePrivate constructor +// +// --------------------------------------------------------------------------- +DevicePrivate::DevicePrivate() + { + m_deviceBinding = NULL; + TRAP_IGNORE( + m_serviceObjArray = new RPointerArray( INIT_SO_ARRAY_SIZE ); + m_deviceBinding = CDeviceLiwBinding::NewL(); + m_exec = NULL;) + } + +// --------------------------------------------------------------------------- +// DevicePrivate Close +// +// --------------------------------------------------------------------------- +void DevicePrivate::Close() + { + if ( m_serviceObjArray ) + { + // close all the service objects created for this device + for (int i = 0; i < m_serviceObjArray->Count(); i++) + { + (*m_serviceObjArray)[i]->Close( m_exec, true ); + } + m_serviceObjArray->Close(); + delete m_serviceObjArray; + m_serviceObjArray = NULL; + } + delete m_deviceBinding; + m_deviceBinding = NULL; + } + +// --------------------------------------------------------------------------- +// DevicePrivate SetUid +// +// --------------------------------------------------------------------------- +void DevicePrivate::SetUid( const TUint& aValue) + { + if(m_deviceBinding) + m_deviceBinding->SetUid( aValue); + } + +// ---------------------------------------------------------------------------- +// DeviceFunc::DeviceFunc +// +// +// ---------------------------------------------------------------------------- +// +DeviceFunc::DeviceFunc( ExecState* exec, MDeviceBinding* deviceBinding, + int token ) + : JSObject( exec->lexicalInterpreter()->builtinObjectPrototype() ), + m_deviceBinding( deviceBinding ), + m_func( token ) + { + } + +// ---------------------------------------------------------------------------- +// DeviceFunc::callAsFunction +// +// ---------------------------------------------------------------------------- +// +JSValue* DeviceFunc::callAsFunction(ExecState *exec, JSObject *thisObj, const List &args) + { + TInt err = KErrNone; + JSValue* ret = jsUndefined(); + + if ( !m_deviceBinding ) + { + return ret; + } + + if ( m_func == Device::getServiceObject ) + { + err = m_deviceBinding->LoadServiceProvider( exec, args ); + if ( err != KErrNone ) + { + char * err_msg = "general error "; + // process TLiwLoadStatus errors + switch ( err ) + { + case KLiwUnknown: // -5 + err_msg = "unknown error"; + break; + case KLiwMetaDataInvalidFormat: //-4 + err_msg = "meta data invalid format"; + break; + case KLiwInvalidVersionSpecification: //-3 + err_msg = "invalid version specification"; + break; + case KLiwVersionOutOfRange: //-2 + err_msg = "version out of range"; + break; + case KLiwSecurityAccessCheckFailed: //-1 + err_msg = "security access check failed"; + break; + } + throwError(exec, GeneralError, err_msg); + } + else + { + int argcount = args.size(); + if ( argcount == 0 || args[0]->type() != StringType || args[0]->toString( exec ).size() == 0 ) + return ret; + // Get service name + HBufC8* svcName = KJS::GetAsciiBufferL( args[0]->toString( exec ) ); + + ServiceObject *so = new ServiceObject( exec, svcName, m_deviceBinding ); + if ( so != NULL ) + { + (static_cast(thisObj))->m_privateData->m_serviceObjArray->Append( so ); + ret = so; + } + } + } + else if ( m_func == Device::listProviders ) + { + ret = m_deviceBinding->ListProviders( exec, args ); + } + + return ret; + } + +//END OF FILE + + +