diff -r 10e98eab6f85 -r a359256acfc6 webengine/device/src/Device.cpp --- a/webengine/device/src/Device.cpp Fri Jul 03 15:54:40 2009 +0100 +++ b/webengine/device/src/Device.cpp Thu Aug 27 07:44:59 2009 +0300 @@ -29,7 +29,7 @@ using namespace KJS; const ClassInfo Device::info = { "Device", 0, 0, 0 }; -const TInt INIT_SO_ARRAY_SIZE = 10; // initial service object array +const TInt INIT_ARRAY_SIZE = 10; // initial service object array // ============================= LOCAL FUNCTIONS =============================== /* @@ -49,11 +49,11 @@ Device::Device( ExecState* exec ) : JSObject() { - m_privateData = new DevicePrivate(); + m_privateData = new DevicePrivate(this); if (!m_privateData || !m_privateData->m_deviceBinding ) - m_valid = false; + m_valid = EFalse; else - m_valid = true; + m_valid = ETrue; } @@ -75,6 +75,10 @@ // void Device::Close() { + if ( !m_valid ) + return; + + m_valid = EFalse; delete m_privateData; m_privateData = NULL; } @@ -107,6 +111,9 @@ // ---------------------------------------------------------------------------- bool Device::getOwnPropertySlot(ExecState* exec, const Identifier& propertyName, PropertySlot& slot) { + if ( !m_valid ) + return false; + m_privateData->m_exec = exec; m_privateData->m_propName = propertyName; const HashEntry* entry = Lookup::findEntry(&DeviceTable, propertyName); @@ -127,6 +134,9 @@ // ---------------------------------------------------------------------------- JSValue* Device::getValueProperty(ExecState *exec, int token) const { + if ( !m_valid ) + return jsUndefined(); + switch( token ) { case getServiceObject: @@ -139,35 +149,96 @@ } // --------------------------------------------------------------------------- +// DevicePrivateBase constructor +// +// --------------------------------------------------------------------------- +DevicePrivateBase::DevicePrivateBase() + { + m_parent = NULL; + m_isDeleting = EFalse; + TRAP_IGNORE( + m_children = new RPointerArray( INIT_ARRAY_SIZE );) + } + +// --------------------------------------------------------------------------- +// DevicePrivateBase destructor +// +// --------------------------------------------------------------------------- +DevicePrivateBase::~DevicePrivateBase() + { + m_isDeleting = ETrue; + // 1. remove self from the parent + if ( m_parent ) + { + m_parent->RemoveChild(this); + } + + // 2. delete all the children + for ( int i = 0; i < m_children->Count(); i++ ) + { + delete (*m_children)[i]; + } + + // 3. delete array + m_children->Close(); + delete m_children; + } + +// --------------------------------------------------------------------------- +// DevicePrivateBase setParent +// +// --------------------------------------------------------------------------- +void DevicePrivateBase::SetParent( DevicePrivateBase* aValue ) + { + m_parent = aValue; + } + +// --------------------------------------------------------------------------- +// DevicePrivateBase add child into list +// +// --------------------------------------------------------------------------- +void DevicePrivateBase::AddChild( DevicePrivateBase* aValue ) + { + m_children->Append( aValue ); + } + +// --------------------------------------------------------------------------- +// DevicePrivateBase add child into list +// +// --------------------------------------------------------------------------- +void DevicePrivateBase::RemoveChild( DevicePrivateBase* aValue ) + { + if ( m_isDeleting ) + return; + + TInt index = m_children->Find( aValue ); + if ( index != KErrNotFound ) + m_children->Remove( index ); + } + +// --------------------------------------------------------------------------- // DevicePrivate constructor // // --------------------------------------------------------------------------- -DevicePrivate::DevicePrivate() +DevicePrivate::DevicePrivate( Device* jsobj ) { - m_deviceBinding = NULL; + m_deviceBinding = NULL; TRAP_IGNORE( - m_serviceObjArray = new RPointerArray( INIT_SO_ARRAY_SIZE ); m_deviceBinding = CDeviceLiwBinding::NewL(); + m_jsobj = jsobj; m_exec = NULL;) } // --------------------------------------------------------------------------- -// DevicePrivate Close +// DevicePrivate destructor // // --------------------------------------------------------------------------- -void DevicePrivate::Close() +DevicePrivate::~DevicePrivate() { - 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; - } + // invalid the Device + if (m_jsobj) + m_jsobj->m_valid = EFalse; + delete m_deviceBinding; m_deviceBinding = NULL; } @@ -249,7 +320,10 @@ ServiceObject *so = new ServiceObject( exec, svcName, m_deviceBinding ); if ( so != NULL ) { - (static_cast(thisObj))->m_privateData->m_serviceObjArray->Append( so ); + DevicePrivateBase* devData = (static_cast(thisObj))->getDeviceData(); + DevicePrivateBase* soData = so->getServiceData(); + soData->SetParent( devData ); + devData->AddChild( soData ); ret = so; } } @@ -262,6 +336,11 @@ return ret; } +MDeviceBinding* Device::GetDeviceBinding() +{ + return m_privateData->m_deviceBinding; +} + //END OF FILE