webengine/device/src/Device.cpp
changeset 0 dd21522fd290
child 10 a359256acfc6
--- /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 <LiwServiceHandler.h>
+
+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<Device>);
+        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<ServiceObject>( 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<Device*>(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
+
+
+