diff -r 000000000000 -r dd21522fd290 webengine/widgetregistry/Client/src/WidgetRegistryClient.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webengine/widgetregistry/Client/src/WidgetRegistryClient.cpp Mon Mar 30 12:54:55 2009 +0300 @@ -0,0 +1,718 @@ +/* +* Copyright (c) 2003, 2004, 2005 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 +#include +#include +#include "WidgetRegistryClient.h" + + +// ============================================================================ +// Starts the widget registry server +// +// @since 3.1 +// ============================================================================ +// +TInt StartServer() + { + const TUidType KServerUidType( + KNullUid, KNullUid, KWidgetRegistryServerUid ); + + RProcess server; + TInt ret = server.Create( + KWidgetRegistryImage, KNullDesC, KServerUidType ); + + // Did we manage to create the thread/process? + if (ret == KErrNone) + { + // Wait to see if the thread/process died during construction + TRequestStatus serverDiedRequestStatus; + server.Rendezvous( serverDiedRequestStatus ); + + // do we have to abort? + if ( serverDiedRequestStatus != KRequestPending ) + { + // abort the startup here + server.Kill(0); + } + else + { + // start server + server.Resume(); + } + + User::WaitForRequest( serverDiedRequestStatus ); + + // Determine the reason for the server exit. + const TInt exitReason = ( server.ExitType() == EExitPanic ) ? + KErrGeneral : serverDiedRequestStatus.Int(); + ret = exitReason; + + // Finished with process handle + server.Close(); + } + + return ret; + } + +// ============================================================================ +// RWidgetRegistryClientSession::RWidgetRegistryClientSession() +// C++ constructor +// +// @since 3.1 +// ============================================================================ +// +EXPORT_C RWidgetRegistryClientSession::RWidgetRegistryClientSession() + { + } + +// ============================================================================ +// RWidgetRegistryClientSession::Connect() +// Connect to widgetregistry server +// +// @since 3.1 +// ============================================================================ +// +EXPORT_C TInt RWidgetRegistryClientSession::Connect() + { + TInt startupAttempts = KWidgetRegistryServerStartupAttempts; + + for ( ;; ) + { + TInt ret = CreateSession( KWidgetRegistryName, Version(), + KWidgetRegistryServerAsynchronousSlotCount ); + + if ( ret != KErrNotFound && ret != KErrServerTerminated ) + { + return ret; + } + + if ( startupAttempts-- == 0 ) + { + return ret; + } + + ret = StartServer(); + if ( ret != KErrNone && ret != KErrAlreadyExists ) + { + return ret; + } + } + } + +// ============================================================================ +// RWidgetRegistryClientSession::Version() +// Returns the version +// +// @since 3.1 +// ============================================================================ +// +EXPORT_C TVersion RWidgetRegistryClientSession::Version() const + { + const TVersion version( + KWidgetRegistryClientVersionMajor, + KWidgetRegistryClientVersionMinor, + KWidgetRegistryClientVersionBuild ); + + return version; + } + + +// ============================================================================ +// RWidgetRegistryClientSession::Disconnect() +// Disconnect from widgetregistry server +// +// @since 3.1 +// ============================================================================ +// +EXPORT_C TInt RWidgetRegistryClientSession::Disconnect() + { + SendReceive( EOpCodeWidgetRegistryDisconnect, TIpcArgs() ); + RSessionBase::Close(); + return KErrNone; + } + +// ============================================================================ +// RWidgetRegistryClientSession::IsWidget() +// Returns true if the Uid falls within the range specified for widgets. +// +// @since 3.1 +// ============================================================================ +// +EXPORT_C TBool RWidgetRegistryClientSession::IsWidget( const TUid& aUid ) + { + TBool retVal = EFalse; + iMesgArgs = TIpcArgs( aUid.iUid ); + retVal = SendReceive( EOpCodeIsWidget, iMesgArgs ); + + return retVal; + } + +// ============================================================================ +// RWidgetRegistryClientSession::WidgetExists() +// Returns true if the widget is installed +// +// @since 3.1 +// ============================================================================ +// +EXPORT_C TBool RWidgetRegistryClientSession::WidgetExistsL( + const TDesC& aBundleId ) + { + TBool retVal = EFalse; + TInt len = aBundleId.Length(); + iMesgArgs = TIpcArgs( &aBundleId, len ); + + retVal = SendReceive( EOpCodeWidgetExists, iMesgArgs ); + return retVal; + } + + +// ============================================================================ +// RWidgetRegistryClientSession::IsWidgetRunning() +// Returns true if the widget is running. +// +// @since 3.1 +// ============================================================================ +// +EXPORT_C TBool RWidgetRegistryClientSession::IsWidgetRunning( const TUid& aUid ) + { + TBool retVal = EFalse; + iMesgArgs = TIpcArgs( aUid.iUid ); + retVal = SendReceive( EOpCodeIsWidgetRunning, iMesgArgs ); + + return retVal; + } + +// ============================================================================ +// RWidgetRegistryClientSession::WidgetSapiAccessState() +// Returns whether sapi access is prompted, promptless or denied. +// +// @since 5.0 +// ============================================================================ +// +EXPORT_C TInt RWidgetRegistryClientSession::WidgetSapiAccessState( const TUid& aUid ) + { + TInt retVal = -1; + iMesgArgs = TIpcArgs( aUid.iUid ); + retVal = SendReceive( EOpWidgetSapiAccessState, iMesgArgs ); + + return retVal; + } + +// ============================================================================ +// RWidgetRegistryClientSession::IsWidgetInMiniView() +// Returns true if the widget is in MiniView. +// +// @since +// ============================================================================ +// +EXPORT_C TBool RWidgetRegistryClientSession::IsWidgetInMiniView( const TUid& aUid ) + { + TBool retVal = EFalse; + iMesgArgs = TIpcArgs( aUid.iUid ); + retVal = SendReceive( EOpCodeIsWidgetInMiniView, iMesgArgs ); + + return retVal; + } + +// ============================================================================ +// RWidgetRegistryClientSession::IsWidgetInFullView() +// Returns true if the widget is in FullView. +// +// @since +// ============================================================================ +// +EXPORT_C TBool RWidgetRegistryClientSession::IsWidgetInFullView( const TUid& aUid ) + { + TBool retVal = EFalse; + iMesgArgs = TIpcArgs( aUid.iUid ); + retVal = SendReceive( EOpCodeIsWidgetInFullView, iMesgArgs ); + + return retVal; + } + +// ============================================================================ +// RWidgetRegistryClientSession::IsBlanketPermGranted() +// Returns true if the widget is granted blanket permission. +// +// @since +// ============================================================================ +EXPORT_C TBool RWidgetRegistryClientSession::IsBlanketPermGranted( const TUid& aUid ) + { + TBool retVal = EFalse; + iMesgArgs = TIpcArgs( aUid.iUid ); + retVal = SendReceive( EOpCodeIsWidgetPromptNeeded, iMesgArgs ); + + return retVal; + } + +// ============================================================================ +// RWidgetRegistryClientSession::WidgetCount() +// Returns count of widgets installed. +// +// @since 3.1 +// ============================================================================ +// +EXPORT_C TInt RWidgetRegistryClientSession::WidgetCount( TInt& aCount ) + { + TInt ret = 0; + iMesgArgs = TIpcArgs(); + ret = SendReceive( EOpCodeWidgetCount, iMesgArgs ); + aCount = ret; + + return ret; + } + +// ============================================================================ +// RWidgetRegistryClientSession::GetWidgetPath() +// Returns path of the widget with a particular UId +// +// @since 3.1 +// ============================================================================ +// +EXPORT_C void RWidgetRegistryClientSession::GetWidgetPath( + const TUid& aUid, + TDes& aWidgetPath ) + { + iMesgArgs = TIpcArgs( &aWidgetPath, aWidgetPath.Length(), aUid.iUid ); + TInt len = SendReceive( EOpCodeGetWidgetPath, iMesgArgs ); + + if ( len >= 0 ) + { + aWidgetPath.SetLength( len ); + } + } + +// ============================================================================ +// RWidgetRegistryClientSession::GetWidgetUid() +// Returns uid of the widget with a particular bundle identifier +// +// @since 3.1 +// ============================================================================ +// +EXPORT_C TInt RWidgetRegistryClientSession::GetWidgetUidL( + const TDesC& aBundleId ) + { + TInt uid = 0; + iMesgArgs = TIpcArgs( &aBundleId, aBundleId.Length() ); + + uid = SendReceive( EOpCodeGetWidgetUid, iMesgArgs ); + return uid; + } + +// ============================================================================ +// RWidgetRegistryClientSession::GetWidgetUidForUrl() +// Returns UId of the widget with a patricular html path +// +// @since 3.1 +// ============================================================================ +// +EXPORT_C TInt RWidgetRegistryClientSession::GetWidgetUidForUrl( + const TDesC& aUrl ) + { + TInt uid = 0; + iMesgArgs = TIpcArgs( &aUrl, aUrl.Length() ); + + uid = SendReceive( EOpCodeGetWidgetUidForUrl, iMesgArgs ); + return uid; + } + +// ============================================================================ +// RWidgetRegistryClientSession::GetAvailableUidL() +// Return the next available UId +// +// @since 3.1 +// ============================================================================ +// +EXPORT_C TUid RWidgetRegistryClientSession::GetAvailableUidL( TUint aDriveLetter ) + { + TInt uid = 0; + iMesgArgs = TIpcArgs( aDriveLetter ); + + uid = SendReceive( EOpCodeGetAvailableUid, iMesgArgs ); + if ( KNullUid.iUid == uid ) + { + User::Leave( KErrNotFound ); + } + return TUid::Uid( uid ); + } + +// ============================================================================ +// RWidgetRegistryClientSession::GetWidgetBundleId() +// Returns bundle Id of the widget with a particular UId +// +// @since 3.1 +// ============================================================================ +// +EXPORT_C void RWidgetRegistryClientSession::GetWidgetBundleId( + const TUid& aUid, + TDes& aWidgetBundleId ) + { + iMesgArgs = TIpcArgs( + &aWidgetBundleId, aWidgetBundleId.Length(), aUid.iUid ); + TInt len = SendReceive( EOpCodeGetWidgetBundleId, iMesgArgs ); + + if ( len >= 0 ) + { + aWidgetBundleId.SetLength( len ); + } + } + +// ============================================================================ +// RWidgetRegistryClientSession::GetWidgetBundleName() +// Returns bundle display name of the widget with a particular UId +// +// @since 3.1 +// ============================================================================ +// +EXPORT_C void RWidgetRegistryClientSession::GetWidgetBundleName( + const TUid& aUid, + TDes& aWidgetBundleName ) + { + iMesgArgs = TIpcArgs( + &aWidgetBundleName, aWidgetBundleName.Length(), aUid.iUid ); + TInt len = SendReceive( EOpCodeGetWidgetBundleName, iMesgArgs ); + + if ( len >= 0 ) + { + aWidgetBundleName.SetLength( len ); + } + } + +// ============================================================================ +// RWidgetRegistryClientSession::GetWidgetPropertyValue() +// Returns info.plist key value string for the widget with a particular UId +// +// @since 3.1 +// ============================================================================ +// +EXPORT_C +CWidgetPropertyValue* RWidgetRegistryClientSession::GetWidgetPropertyValueL( + const TUid& aUid, + TWidgetPropertyId aPropertyId) + { + const TInt maxSize = 2*KWidgetPropertyValSerializeMaxLength; // need 16 bit chars + CBufFlat* buf = CBufFlat::NewL( maxSize ); + CleanupStack::PushL( buf ); + buf->ExpandL( 0, maxSize ); + TPtr8 p( buf->Ptr(0) ); + User::LeaveIfError( + + SendReceive( EOpCodeGetWidgetPropertyValue, + TIpcArgs( aUid.iUid, aPropertyId, &p ) ) + ); + + // deserialize + RDesReadStream stream( p ); + CleanupClosePushL( stream ); + + CWidgetPropertyValue* value = CWidgetPropertyValue::NewL(); + CleanupStack::PushL( value ); + + value->DeserializeL( stream ); + + CleanupStack::Pop(); // value + CleanupStack::PopAndDestroy( 2, buf ); // stream, buf + return value; + } + +// ============================================================================ +// RWidgetRegistryClientSession::InstalledWidgets() +// Returns widget info for all the installed widgets. +// +// @since 3.1 +// ============================================================================ +// +EXPORT_C TInt RWidgetRegistryClientSession::InstalledWidgetsL( + RWidgetInfoArray& aWidgetInfoArr ) + { + TInt status = KErrNone; + // gets total size of all elements in the widgetinfo array in terms of + // buffer length; negative value means one of the system-wide error + TInt ret = SendReceive( EOpCodeInstalledWidgetsPhase1, TIpcArgs() ); + if ( ret > 0 ) + { + CBufFlat* responseBuff = NULL; + TPtr8 responsePtr( NULL, 0 ); + responseBuff = CBufFlat::NewL( ret ); + CleanupStack::PushL( responseBuff ); + responseBuff->ExpandL( 0, ret ); + responsePtr.Set( ( TUint8* ) responseBuff->Ptr( 0 ).Ptr(), ret, ret ); + + iMesgArgs = TIpcArgs( &responsePtr ); + TInt count = SendReceive( EOpCodeInstalledWidgetsPhase2, iMesgArgs ); + + if ( count > 0 ) + { + RBufReadStream stream; + // Unpack the response. + stream.Open( *responseBuff, 0 ); + CleanupClosePushL( stream ); + // Read the widget info. + DeserializeWidgetInfoL( stream, aWidgetInfoArr, count ); + CleanupStack::PopAndDestroy( &stream ); + } + + CleanupStack::PopAndDestroy( responseBuff ); + } + + return status; + } + +// ============================================================================ +// RWidgetRegistryClientSession::RunningWidgets() +// Returns widget info for all the running widgets. +// +// @since 3.1 +// ============================================================================ +// +EXPORT_C TInt RWidgetRegistryClientSession::RunningWidgetsL( + RWidgetInfoArray& widgetInfoArr ) + { + TInt status = KErrNone; + // gets total size of all elements in the widgetinfo array in terms of + // buffer length; negative value means one of the system-wide error + TInt ret = SendReceive( EOpCodeRunningWidgetsPhase1, TIpcArgs() ); + + if ( ret > 0 ) + { + CBufFlat* responseBuff = NULL; + TPtr8 responsePtr( NULL, 0 ); + responseBuff = CBufFlat::NewL( ret ); + CleanupStack::PushL( responseBuff ); + responseBuff->ExpandL( 0, ret ); + responsePtr.Set( ( TUint8* ) responseBuff->Ptr( 0 ).Ptr(), ret, ret ); + + iMesgArgs = TIpcArgs( &responsePtr ); + TInt count = SendReceive( EOpCodeRunningWidgetsPhase2, iMesgArgs ); + + if ( count > 0 ) + { + RBufReadStream stream; + // Unpack the response. + stream.Open( *responseBuff, 0 ); + CleanupClosePushL( stream ); + // Read the widget info. + DeserializeWidgetInfoL( stream, widgetInfoArr, count ); + CleanupStack::PopAndDestroy( &stream ); + } + + CleanupStack::PopAndDestroy( responseBuff ); + } + + return status; + } + +// ============================================================================ +// RWidgetRegistryClientSession::RegisterWidget() +// Registers the widget +// +// @since 3.1 +// ============================================================================ +// +EXPORT_C void RWidgetRegistryClientSession::RegisterWidgetL( + const RPointerArray& aPropertyValues ) + { + CBufFlat* buf = MarshalPropertyValuesL( aPropertyValues ); + + CleanupStack::PushL( buf ); + TPtr8 p( buf->Ptr(0) ); + User::LeaveIfError( + + SendReceive( EOpCodeRegisterWidget, TIpcArgs( &p ) ) + + ); + CleanupStack::PopAndDestroy( buf ); + } + +// ============================================================================ +// RWidgetRegistryClientSession::DeRegisterWidget() +// Deregister the widget +// +// @since 3.1 +// ============================================================================ +// +EXPORT_C void RWidgetRegistryClientSession::DeRegisterWidgetL( + const TUid& aUid ) + { + iMesgArgs = TIpcArgs( aUid.iUid ); + + TInt error = SendReceive( EOpCodeDeRegisterWidget, iMesgArgs ); + User::LeaveIfError( error ); + } + +// ============================================================================ +// RWidgetRegistryClientSession::SetActive() +// Set/Reset active status of the widget +// +// @since 3.1 +// ============================================================================ +// +EXPORT_C void RWidgetRegistryClientSession::SetActive( + const TUid& aUid, TInt aStatus ) + { + iMesgArgs = TIpcArgs( aUid.iUid, aStatus ); + + TInt error = SendReceive( EOpCodeSetActive, iMesgArgs ); + User::LeaveIfError( error ); + } +// ============================================================================ +// RWidgetRegistryClientSession::SetMiniViewL() +// Sets when widget is launched in miniview +// +// @since 5.0 +// ============================================================================ +// +EXPORT_C void RWidgetRegistryClientSession::SetMiniViewL( + const TUid& aUid, TInt aStatus ) + { + iMesgArgs = TIpcArgs( aUid.iUid, aStatus ); + TInt error = SendReceive( EOpCodeSetWidgetInMiniView, iMesgArgs ); + User::LeaveIfError( error ); + } + +// ============================================================================ +// RWidgetRegistryClientSession::SetFullViewL() +// Sets when widget is launched in fullview +// +// @since 5.0 +// ============================================================================ +// +EXPORT_C void RWidgetRegistryClientSession::SetFullViewL( + const TUid& aUid, TInt aStatus ) + { + iMesgArgs = TIpcArgs( aUid.iUid, aStatus ); + TInt error = SendReceive( EOpCodeSetWidgetInFullView, iMesgArgs ); + User::LeaveIfError( error ); + } + +// ============================================================================ +// RWidgetRegistryClientSession::SetBlanketPermissionL() +// Set/Reset blanket permission for widget +// +// @since 5.0 +// ============================================================================ +// +EXPORT_C void RWidgetRegistryClientSession::SetBlanketPermissionL( + const TUid& aUid, TInt aStatus ) + { + iMesgArgs = TIpcArgs( aUid.iUid, aStatus ); + TInt error = SendReceive( EOpCodeSetWidgetPromptNeeded, iMesgArgs ); + User::LeaveIfError( error ); + } + +// ============================================================================ +// RWidgetRegistryClientSession::MarshalPropertyValuesL() +// Creates and returns heap descriptor which holds contents of property values +// +// @since 3.1 +// ============================================================================ +// +CBufFlat* RWidgetRegistryClientSession::MarshalPropertyValuesL( + const RPointerArray& aPropertyValues ) const + { + CBufFlat* buf = CBufFlat::NewL( 512 ); + CleanupStack::PushL( buf ); + + RBufWriteStream stream( *buf ); + CleanupClosePushL( stream ); + + TInt i = 0; + for ( ; i < EWidgetPropertyIdCount; ++i ) + { + aPropertyValues[i]->SerializeL( stream ); + } + + CleanupStack::PopAndDestroy( &stream ); + CleanupStack::Pop( buf ); + + return buf; + } + +// ============================================================================ +// RWidgetRegistryClientSession::DeserializeWidgetInfoL() +// Initializes widgetinfo array with the contents of aStream +// +// @since 3.1 +// ============================================================================ +// +void RWidgetRegistryClientSession::DeserializeWidgetInfoL( + RReadStream& aStream, + RWidgetInfoArray& aWidgetInfoArr, + TInt aCount ) + { + + for ( TInt i = 0; i < aCount; i++ ) + { + CWidgetInfo* tempInfo = new ( ELeave ) CWidgetInfo(); + CleanupStack::PushL( tempInfo ); + tempInfo->iUid.iUid = aStream.ReadInt32L(); + tempInfo->iFileSize = aStream.ReadInt32L(); + + TInt len = 0; + TBuf tempNameBuf; + TBuf tempDriveBuf; + + len = aStream.ReadInt32L(); + aStream.ReadL( tempNameBuf, len ); + *(tempInfo->iBundleName) = tempNameBuf; + + len = aStream.ReadInt32L(); + aStream.ReadL( tempDriveBuf, len ); + *(tempInfo->iDriveName) = tempDriveBuf; + + aWidgetInfoArr.AppendL( tempInfo ); + CleanupStack::Pop( tempInfo ); + } + } + +// ============================================================================ +// RWidgetRegistryClientSession::GetLprojName() +// Get the language project name which is the directory to hold localized +// resources +// +// @since 3.1 +// ============================================================================ +// +EXPORT_C void RWidgetRegistryClientSession::GetLprojName( TDes& aLprojName ) + { + iMesgArgs = TIpcArgs( &aLprojName, aLprojName.Length() ); + TInt len = SendReceive( EOpCodeGetLprojName, iMesgArgs ); + + if ( len >= 0 ) + { + aLprojName.SetLength( len ); + } + } + +// ============================================================================ +// RWidgetRegistryClientSession::SecurityPolicyId() +// Returns security policyId. +// +// @since 5.0 +// ============================================================================ +// +EXPORT_C TInt RWidgetRegistryClientSession::SecurityPolicyId() + { + TInt ret = 0; + iMesgArgs = TIpcArgs(); + ret = SendReceive( EOpCodeSecurityPolicyId, iMesgArgs ); + return ret; + } + +// End of File