webengine/device/src/ServiceObject.cpp
changeset 10 a359256acfc6
parent 0 dd21522fd290
--- a/webengine/device/src/ServiceObject.cpp	Fri Jul 03 15:54:40 2009 +0100
+++ b/webengine/device/src/ServiceObject.cpp	Thu Aug 27 07:44:59 2009 +0300
@@ -47,17 +47,14 @@
     MDeviceBinding* deviceBinding)
     : JSObject( exec->lexicalInterpreter()->builtinObjectPrototype() )
     {
-        m_privateData = new ServiceObjectPrivate(svcName, deviceBinding);
-        if (m_privateData && m_privateData->m_deviceBinding)
-            {
-            m_valid = true;
-            // protect this object
-            KJS::Collector::protect(this);  
-            }            
-        else
-            {
-             m_valid = false;
-            }  
+    m_valid = EFalse;
+    m_privateData = NULL;
+    if ( deviceBinding )
+        {
+        m_privateData = new ServiceObjectPrivate(this, svcName, deviceBinding);
+        if ( m_privateData )
+            m_valid = ETrue;
+        }
     }
 
 
@@ -69,59 +66,22 @@
 // ----------------------------------------------------------------------------
 ServiceObject::~ServiceObject()
     {
-        // only can be called by garbage collection after the 
-        // ServiceObject::Close() was called
+    Close();
     }
 
 // ----------------------------------------------------------------------------
 // ServiceObject::Close
 //
 // ----------------------------------------------------------------------------
-void ServiceObject::Close( ExecState* exec, bool unmark )
+void ServiceObject::Close()
     {
     // avoid double close    
-    if(!m_valid) 
-        {   
-        if(unmark) 
-            {
-            // unprotect this to allow the garbage collection to release this jsobject
-            KJS::Collector::unprotect(this);
-            }
+    if ( !m_valid ) 
         return;
-        }        
-
-    // set isClosing flag to true
-    m_privateData->isClosing = true;
-
-    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->inherits( &DeviceLiwInterface::info ))
-                    {
-                    (static_cast<DeviceLiwInterface*>(prop))->Close(exec);
-                    }
-                }
-            }
-        }
-
+    m_valid = EFalse; 
     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);
-        }
+    m_privateData = NULL;   
    }
 
 // ----------------------------------------------------------------------------
@@ -164,13 +124,13 @@
         m_privateData->m_propName = propertyName;
         JSValue* val = getDirect( propertyName );
 
-        // if the property is an interface and interface is closed
+        // if the property is an interface which has been closed
         bool need_recreate = false;
         if ( val && val->isObject() &&
              val->toObject(exec)->inherits( &KJS::DeviceLiwInterface::info ) )
             {
             DeviceLiwInterface* interface = static_cast<DeviceLiwInterface*>(val);
-            if ( !interface->isValid() && !m_privateData->isClosing)
+            if ( !interface->isValid() )
                 {
                 need_recreate = true;
                 }
@@ -183,14 +143,16 @@
                 // 1.3 check prototypes
                 JSObject *proto = static_cast<JSObject *>(this->prototype());
 
-                while (!proto->isNull() && proto->isObject()) {
+                while (!proto->isNull() && proto->isObject()) 
+                    {
                     if (proto->getOwnPropertySlot(exec, propertyName, slot))
                         return true;
 
                     proto = static_cast<JSObject *>(proto->prototype());
                     }
                 }
-
+            
+            // Create an interface for me, please!
             // Store the interface in the object so we get the same one each time.
             JSValue* resultVal = m_privateData->m_deviceBinding->CreateInterface(
                 exec, m_privateData->m_svcName, m_privateData->m_propName );
@@ -200,6 +162,11 @@
             else
                 {
                 JSValue* s = resultVal->toObject(exec)->get( exec, m_privateData->m_propName );
+                DeviceLiwInterface* ifObj = static_cast<DeviceLiwInterface*>(s);
+                DevicePrivateBase* ifData = ifObj->getInterfaceData();
+                DevicePrivateBase* soData = this->getServiceData();
+                ifData->SetParent( soData ); 
+                soData->AddChild( ifData );
                 this->putDirect( propertyName, s, DontDelete|ReadOnly );
                 }
 
@@ -210,7 +177,7 @@
                 if(jsobj->inherits( &KJS::DeviceLiwResult::info ))
                     {
                     DeviceLiwResult* result = static_cast<DeviceLiwResult*>(jsobj);
-                    result->quickClose();
+                    result->Close();
                     }
                 }
             }
@@ -317,7 +284,7 @@
             {
             return throwError(exec, GeneralError, "Can not close service object in callback function.");
             }
-        so->Close( exec, false );
+        so->Close();
         }
     return ret;
     }
@@ -326,24 +293,28 @@
 // DeviceLiwMapPrivate constructor
 //
 // ---------------------------------------------------------------------------
-ServiceObjectPrivate::ServiceObjectPrivate(HBufC8* svcName, MDeviceBinding* deviceBinding )
+ServiceObjectPrivate::ServiceObjectPrivate(ServiceObject* jsobj, HBufC8* svcName, MDeviceBinding* deviceBinding )
     {
-     m_svcName = svcName;    
-     m_deviceBinding = deviceBinding;
-     isClosing = false;
+    m_svcName = svcName;    
+    m_deviceBinding = deviceBinding;
+    m_jsobj = jsobj;
     }
     
 // ---------------------------------------------------------------------------
-// DeviceLiwMapPrivate::Close
+// DeviceLiwMapPrivate::destructor
 //
 // ---------------------------------------------------------------------------
-void ServiceObjectPrivate::Close()
+ServiceObjectPrivate::~ServiceObjectPrivate()
     {
+    // invalid the ServiceObject
+    if (m_jsobj)
+        m_jsobj->m_valid = EFalse;
+        
     m_deviceBinding->UnloadServiceProvider(KWildChar(), m_svcName->Des());
     m_deviceBinding = NULL;
         
     delete m_svcName;
-    m_svcName = NULL;    
+    m_svcName = NULL;
     }
 
 //END OF FILE