/*
* Copyright (c) 2002 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of "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: DM Screensaver Adapter
*
*/
/*
./Customization -+--> ScreenSaver --+--> AvailableScreenSavers --> <X> * ---+---> Data
| |
|--> ActiveSc |---> ID
|
|---> Name
|
|---> Description
|
|---> CustomProperty
|
|---> Version
|
|---> InstallOptions
*/
#include <badesca.h>
#include <implementationproxy.h> // For TImplementationProxy definition
#include <sisregistrysession.h>
#include <ScreensaverpluginIntDef.h>
#include <mmfcontrollerpluginresolver.h> // For CleanupResetAndDestroyPushL
//#ifdef __SAP_POLICY_MANAGEMENT
#include <PolicyEngineXACML.h>
//#endif
#include "ScreenSaverAdapter.h"
#include "ScreenSaverList.h"
#include "nsmldmuri.h"
#include "FileCoderB64.h"
#include "debug.h"
#include "ScreenSaverClient.h"
#include "e32property.h"
#include <ScreensaverInternalPSKeys.h>
#include <featmgr.h>
_LIT( KScreenSaverAdapterTmpInstallPath, "c:\\system\\temp\\DM_ScrSav.sisx" );
const TInt KPostInstallTimeOut = 10000000; // 10 seconds
_LIT8( KScreenSaverActiveRef, "Customization/ScreenSavers/AvailableScreenSavers/" );
// ------------------------------------------------------------------------------------------------
// CScreenSaverAdapter* CScreenSaverAdapter::NewL( )
// ------------------------------------------------------------------------------------------------
CScreenSaverAdapter* CScreenSaverAdapter::NewL(MSmlDmCallback* aDmCallback )
{
CScreenSaverAdapter* self = NewLC( aDmCallback );
CleanupStack::Pop();
return self;
}
// ------------------------------------------------------------------------------------------------
// CScreenSaverAdapter* CScreenSaverAdapter::NewLC( )
// ------------------------------------------------------------------------------------------------
CScreenSaverAdapter* CScreenSaverAdapter::NewLC(MSmlDmCallback* aDmCallback )
{
CScreenSaverAdapter* self = new (ELeave) CScreenSaverAdapter( aDmCallback );
CleanupStack::PushL( self );
self->ConstructL();
return self;
}
// ------------------------------------------------------------------------------------------------
// CScreenSaverAdapter::CScreenSaverAdapter()
// ------------------------------------------------------------------------------------------------
CScreenSaverAdapter::CScreenSaverAdapter( MSmlDmCallback* aDmCallback ) //: CSmlDmAdapter()
: CTARMDmAdapter( aDmCallback )
, iCallBack( aDmCallback )
, iScreenSavers( 0 )
{
}
// ------------------------------------------------------------------------------------------------
// CScreenSaverAdapter::ConstructL()
// ------------------------------------------------------------------------------------------------
void CScreenSaverAdapter::ConstructL( )
{
TRAPD( errf, FeatureManager::InitializeLibL() );
if( errf != KErrNone )
{
User::Leave(errf);
}
if(FeatureManager::FeatureSupported(KFeatureIdSapScreensaverAdapter))
{
iScreenSavers = CScreenSaverList::NewL();
iScreensaverOff = EFalse;
}
else
{
FeatureManager::UnInitializeLib();
User::Leave( KErrNotSupported );
}
}
// ------------------------------------------------------------------------------------------------
// CScreenSaverAdapter::~CScreenSaverAdapter()
// ------------------------------------------------------------------------------------------------
CScreenSaverAdapter::~CScreenSaverAdapter()
{
TInt error;
FeatureManager::UnInitializeLib();
if (iScreensaverOff)
{
error = RProperty::Define(
KPSUidScreenSaver,
KScreenSaverAllowScreenSaver,
RProperty::EInt,
ECapabilityReadUserData,
ECapabilityWriteUserData);
if(error)
RDEBUG_2("CScreenSaverInfo::KPSUidScreenSaver defined error %d",error);
error=RProperty::Set(KPSUidScreenSaver,KScreenSaverAllowScreenSaver,KEnableScreensaver);
if(error)
RDEBUG_2("CScreenSaverInfo::KPSUidScreenSaver while setting error %d",error);
}
RDEBUG_2("CScreenSaverInfo::KScreenSaverOn set to one error %d",error);
delete iScreenSavers;
iScreenSavers = 0;
}
// ------------------------------------------------------------------------------------------------
// CScreenSaverAdapter::DDFVersionL()
// ------------------------------------------------------------------------------------------------
void CScreenSaverAdapter::DDFVersionL(CBufBase& aDDFVersion)
{
aDDFVersion.InsertL(0,KNSmlSCDDFVersion);
}
// ------------------------------------------------------------------------------------------------
// CScreenSaverAdapter::DDFStructureL()
//
// ------------------------------------------------------------------------------------------------
void CScreenSaverAdapter::DDFStructureL( MSmlDmDDFObject& aDDF )
{
TSmlDmAccessTypes accessTypesGet;
accessTypesGet.SetGet();
TSmlDmAccessTypes accessTypesAddGet;
accessTypesAddGet.SetAdd();
accessTypesAddGet.SetGet();
TSmlDmAccessTypes accessTypesGetReplace;
accessTypesGetReplace.SetGet();
accessTypesGetReplace.SetReplace();
TSmlDmAccessTypes accessTypesReplace;
accessTypesReplace.SetReplace();
TSmlDmAccessTypes accessTypesGetReplaceDelete;
accessTypesGetReplaceDelete.SetGet();
accessTypesGetReplaceDelete.SetReplace();
accessTypesGetReplaceDelete.SetDelete();
//sf- For testing:
accessTypesGetReplaceDelete.SetAdd();
//sf- For testing ends.
/*
Node: ./Customization
This interior node is the common parent to all customization..
Status: Required
Occurs: One
Format: Node
Access Types: Get
Values: N/A
*/
MSmlDmDDFObject& customization = aDDF.AddChildObjectL(KNSmlCustomizationNodeName);
FillNodeInfoL(customization, accessTypesGet, MSmlDmDDFObject::EOne, MSmlDmDDFObject::EPermanent,
MSmlDmDDFObject::ENode, KNSmlSCDescription);
/*
Node: ./Customization/ScreenSavers
ScreenSavers is a common parent node for nodes managing screen savers. .
Status: Required
Occurs: One
Format: Node
Access Types: Add,Get
Values: N/A
*/
MSmlDmDDFObject& screenSavers = customization.AddChildObjectL(KNSmlSCScreenSavers);
FillNodeInfoL(screenSavers, accessTypesGet, MSmlDmDDFObject::EOne, MSmlDmDDFObject::EPermanent,
MSmlDmDDFObject::ENode, KNSmlSCScreenSaversNodeDescription);
/*
Node: ./Customization/ScreenSavers/AvailableScreenSavers
This is parent node for currently existing screen savers..
Status: Required
Occurs: One
Format: Node
Access Types: Add, Get
Values: N/A
*/
MSmlDmDDFObject& availableScreenSavers = screenSavers.AddChildObjectL(KNSmlSCAvailableScreenSaversNodeName);
FillNodeInfoL(availableScreenSavers, accessTypesAddGet, MSmlDmDDFObject::EZeroOrMore, MSmlDmDDFObject::EDynamic,
MSmlDmDDFObject::ENode, KNSmlSCAvailableScreenSaversNodeDescription);
/*
Node: ./Customization/ScreenSavers/AvailableScreenSavers/<X>
This is a placeholder to screen saver ID identifying a screen saver.
Status: Required
Occurs: ZeroOrMore
Format: Node
Access Types: Get, Replace, Delete
Values: N/A
*/
MSmlDmDDFObject& dynNode = availableScreenSavers.AddChildObjectGroupL();
FillNodeInfoL(dynNode, accessTypesGetReplaceDelete, MSmlDmDDFObject::EZeroOrMore, MSmlDmDDFObject::EDynamic,
MSmlDmDDFObject::ENode, KNSmlSCDynamicDescription);
/*
Node: ./Customization/ScreenSavers/ActiveSc
This node is a link to the currently active screen saver.
Status: Required
Occurs: One
Format: Chr (reference to management tree)
Access Types: Get, Replace
Values: N/A
*/
MSmlDmDDFObject& activescNode = screenSavers.AddChildObjectL(KNSmlSCActiveScNodeName);
FillNodeInfoL(activescNode,accessTypesGetReplace,MSmlDmDDFObject::EOne,MSmlDmDDFObject::EPermanent,
MSmlDmDDFObject::EChr,KNSmlSCActiveScNodeDescription);
/*
Node: ./Customization/ScreenSavers/AvailableScreenSavers/<X>/Data
Replace command will install a screen saver that's in the data field of the command.
Status: Optional
Occurs: One
Format: bin
Access Types: Replace
Values: N/A
*/
MSmlDmDDFObject& data = dynNode.AddChildObjectL(KNSmlSCDataNodeName);
FillNodeInfoL(data, accessTypesReplace, MSmlDmDDFObject::EOne, MSmlDmDDFObject::EPermanent,
MSmlDmDDFObject::EBin, KNSmlSCDataNodeDescription);
data.AddDFTypeMimeTypeL( SwiUI::KSisxMimeType() );
/*
Node: ./Customization/ScreenSavers/AvailableScreenSavers/<X>/ID
This leaf node holds the ID of the screen saver
Status: Required
Occurs: One
Format: chr
Access Types: Get, Replace
Values: N/A
*/
MSmlDmDDFObject& idNode = dynNode.AddChildObjectL(KNSmlSCIDNodeName);
FillNodeInfoL(idNode,accessTypesGetReplace,MSmlDmDDFObject::EOne,MSmlDmDDFObject::EDynamic,
MSmlDmDDFObject::EChr,KNSmlSCIDNodeDescription);
/*
Node: ./Customization/ScreenSavers/AvailableScreenSavers/<X>/Name
This leaf node holds the name of the screen saver.
Status: Optional
Occurs: One
Format: chr
Access Types: Get, Replace
Values: N/A
*/
MSmlDmDDFObject& nameNode = dynNode.AddChildObjectL(KNSmlSCNameNodeName);
FillNodeInfoL(nameNode,accessTypesGetReplace,MSmlDmDDFObject::EOne,MSmlDmDDFObject::EDynamic,
MSmlDmDDFObject::EChr,KNSmlSCNameNodeDescription);
/*
Node: ./Customization/ScreenSavers/AvailableScreenSavers/<X>/Description
This leaf node holds the description of the screen saver.
Status: Optional
Occurs: One
Format: chr
Access Types: Get, Replace
Values: N/A
*/
MSmlDmDDFObject& descNode = dynNode.AddChildObjectL(KNSmlSCDescriptionNodeName);
FillNodeInfoL(descNode,accessTypesGetReplace,MSmlDmDDFObject::EOne,MSmlDmDDFObject::EDynamic,
MSmlDmDDFObject::EChr,KNSmlSCDescriptionNodeDescription);
/*
Node: ./Customization/ScreenSavers/AvailableScreenSavers/<X>/CustomProperty
This leaf node holds the custom property value of the screen saver.
Status: Optional
Occurs: One
Format: chr
Access Types: Get, Replace
Values: N/A
*/
MSmlDmDDFObject& customNode = dynNode.AddChildObjectL(KNSmlSCCustomPropertyNodeName);
FillNodeInfoL(customNode,accessTypesGetReplace,MSmlDmDDFObject::EOne,MSmlDmDDFObject::EDynamic,
MSmlDmDDFObject::EChr,KNSmlSCCustomPropertyNodeDescription);
/*
Node: ./Customization/ScreenSavers/AvailableScreenSavers/<X>/Version
This leaf node holds the version of the screen saver.
Status: Optional
Occurs: One
Format: chr
Access Types: Get, Replace
Values: N/A
*/
MSmlDmDDFObject& verNode = dynNode.AddChildObjectL(KNSmlSCVersionNodeName);
FillNodeInfoL(verNode,accessTypesGetReplace,MSmlDmDDFObject::EOne,MSmlDmDDFObject::EDynamic,
MSmlDmDDFObject::EChr,KNSmlSCVersionNodeDescription);
/*
Node: ./Customization/ScreenSavers/AvailableScreenSavers/<X>/InstallOptions
Holds the install options for next install.
Status: Optional
Occurs: One
Format: Chr
Access Types: Replace
Values: N/A
*/
MSmlDmDDFObject& installOptionsNode = dynNode.AddChildObjectL(KNSmlSCInstallOptionsNodeName);
FillNodeInfoL(installOptionsNode, accessTypesReplace, MSmlDmDDFObject::EOne, MSmlDmDDFObject::EPermanent,
MSmlDmDDFObject::EChr, KNSmlSCInstallOptionsNodeDescription);
}
// ------------------------------------------------------------------------------------------------
// CScreenSaverAdapter::UpdateLeafObjectL()
//
// ------------------------------------------------------------------------------------------------
void CScreenSaverAdapter::_UpdateLeafObjectL( const TDesC8& aURI, const TDesC8& /*aLUID*/, const TDesC8& aObject, const TDesC8& /*aType*/, const TInt aStatusRef )
{
RDEBUG("CScreenSaverAdapter::UpdateLeafObjectL(): begin");
TError ret = EOk ;
#ifdef __TARM_SYMBIAN_CONVERGENCY
TPtrC8 uriPtrc = NSmlDmURI::RemoveDotSlash( aURI );
TNodeId nodeId = NodeId( uriPtrc );
TPtrC8 parentURI = NSmlDmURI::ParentURI( uriPtrc );
#else
TNodeId nodeId = NodeId( aURI );
TPtrC8 parentURI = NSmlDmURI::ParentURI( aURI );
#endif
TPtrC8 screenSaverId = NSmlDmURI::LastURISeg( parentURI );
HBufC8* parentLUID = iCallBack->GetLuidAllocL( parentURI );
CleanupStack::PushL( parentLUID );
switch( nodeId )
{
case ENodeActiveSc:
{
TPtrC8 activeName = NSmlDmURI::LastURISeg( aObject );
HBufC8* fullName = HBufC8::NewLC( KScreenSaverActiveRef().Length() + activeName.Length() + 1 );
fullName->Des().Copy( KScreenSaverActiveRef );
fullName->Des().Append( activeName );
HBufC8* luid = iCallBack->GetLuidAllocL( *fullName );
CleanupStack::PushL( luid );
ret = iScreenSavers->SetActiveL( *luid );
if( ret == MSmlDmAdapter::EOk )
{
iScreensaverOff = ETrue;
#ifdef __TARM_SYMBIAN_CONVERGENCY
iCallBack->SetMappingL( uriPtrc, *fullName );
#else
iCallBack->SetMappingL( aURI, *fullName );
#endif
}
CleanupStack::PopAndDestroy( luid );
CleanupStack::PopAndDestroy( fullName );
break;
}
case ENodeData:
{
RFs fs;
User::LeaveIfError( fs.Connect() );
CleanupClosePushL( fs );
TFileCoderB64 decoder;
TPtrC fileName( KScreenSaverAdapterTmpInstallPath );
TBool isEncoded = TFileCoderB64::CheckB64Encode( aObject );
if( isEncoded )
{
decoder.DecodeToL( aObject, fileName );
}
else
{
// aObject is original data, save it to fileName
RFile file;
User::LeaveIfError( file.Replace( fs, fileName, EFileWrite));
CleanupClosePushL( file );
User::LeaveIfError( file.Write( aObject ) );
CleanupStack::PopAndDestroy(); // file
}
// Get current status of installed packages and screen savers
RArray< TUid > oldPackages;
CleanupClosePushL( oldPackages );
RArray< TUid > newPackages;
CleanupClosePushL( newPackages );
CDesCArrayFlat* oldScreenSavers = new (ELeave) CDesCArrayFlat( 8 );
CleanupStack::PushL( oldScreenSavers );
CDesCArrayFlat* newScreenSavers = new (ELeave) CDesCArrayFlat( 8 );
CleanupStack::PushL( newScreenSavers );
InstalledPackagesL( oldPackages );
InstalledScreenSaversL( *oldScreenSavers );
User::ResetInactivityTime();
TInt error = RProperty::Define(
KPSUidScreenSaver,
KScreenSaverAllowScreenSaver,
RProperty::EInt,
ECapabilityReadUserData,
ECapabilityWriteUserData);
error=RProperty::Set(KPSUidScreenSaver,KScreenSaverAllowScreenSaver,KDisableScreensaver);
iScreensaverOff = ETrue;
// Open ECom session and setup notifier
REComSession& ecom = REComSession::OpenL();
CleanupClosePushL( ecom );
TRequestStatus ecomStatus;
// Install screen saver
ret = iScreenSavers->InstallL( fileName );
ecom.NotifyOnChange( ecomStatus );
// Wait until ECom server finds new plugin
if (ret == EOk)
{
TRequestStatus timeoutStatus;
RTimer timeout;
User::LeaveIfError( timeout.CreateLocal() );
CleanupClosePushL( timeout );
timeout.After( timeoutStatus, KPostInstallTimeOut );
User::WaitForRequest( ecomStatus, timeoutStatus );
if( timeoutStatus.Int() == KRequestPending)
{
timeout.Cancel();
User::WaitForRequest( timeoutStatus );
}
CleanupStack::PopAndDestroy( &timeout );
}
// Close ECom session
if (ecomStatus.Int() == KRequestPending)
{
ecom.CancelNotifyOnChange( ecomStatus );
User::WaitForRequest( ecomStatus );
}
CleanupStack::PopAndDestroy( &ecom );
// Find out which package and screen savers where installed
InstalledPackagesL( newPackages );
InstalledScreenSaversL( *newScreenSavers );
TInt count = 0;
TInt i = 0;
count = oldPackages.Count();
for (i = 0 ; i < count ; i++)
{
TInt idx = newPackages.FindInSignedKeyOrder( oldPackages[ i ] );
if (idx >= 0)
{
newPackages.Remove( idx );
}
}
count = oldScreenSavers->Count();
for (i = 0 ; i < count ; i++)
{
TInt idx = 0;
TInt err = newScreenSavers->Find( (*oldScreenSavers)[ i ], idx );
if (err == 0)
{
newScreenSavers->Delete( idx );
}
}
RDEBUG_3("newPackages.Count() (%d) newScreenSavers->Count() (%d)", newPackages.Count(), newScreenSavers->Count());
// Save package uid to DMTree with LUID mapping
// We can handle only situation where only one new package is found.
if (newPackages.Count() == 1 && newScreenSavers->Count() > 0)
{
TUid pkgUid = newPackages[ 0 ];
HBufC8* luid = HBufC8::NewL( KMaxUidName + 1 + (*newScreenSavers)[0].Length() );
CleanupStack::PushL( luid );
TPtr8 luidPtr = luid->Des();
luidPtr.Copy( pkgUid.Name() );
luidPtr.Append( KPkgId_ScrId_Separator );
luidPtr.Append( (*newScreenSavers)[0] );
RDEBUG8_2("CScreenSaverAdapter::UpdateLeafObjectL() Luid for new screensaver (%S)", &luidPtr);
iCallBack->SetMappingL( parentURI, *luid );
CleanupStack::PopAndDestroy( luid );
}
else
{
ret = EError;
}
// Remove temporary installations file
fs.Delete( fileName );
// Cleanup
CleanupStack::PopAndDestroy( newScreenSavers );
CleanupStack::PopAndDestroy( oldScreenSavers );
CleanupStack::PopAndDestroy( &newPackages );
CleanupStack::PopAndDestroy( &oldPackages );
CleanupStack::PopAndDestroy( &fs );
}
break;
case ENodeInstallOptions:
ret = iScreenSavers->SetInstallOptionsL( aObject );
break;
case ENodeName:
if (aObject.Length() > 0)
{
#ifdef __TARM_SYMBIAN_CONVERGENCY
iCallBack->SetMappingL( uriPtrc, aObject );
#else
iCallBack->SetMappingL( aURI, aObject );
#endif
}
else
{
#ifdef __TARM_SYMBIAN_CONVERGENCY
iCallBack->SetMappingL( uriPtrc, _L8(" ") );
#else
iCallBack->SetMappingL( aURI, _L8(" ") );
#endif
}
if (parentLUID->Length() > 1)
{
screenSaverId.Set( *parentLUID );
ret = iScreenSavers->SetNameL( screenSaverId, aObject );
}
else
{
ret = EError;
}
break;
case ENodeDescription:
if (aObject.Length() > 0)
{
#ifdef __TARM_SYMBIAN_CONVERGENCY
iCallBack->SetMappingL( uriPtrc, aObject );
#else
iCallBack->SetMappingL( aURI, aObject );
#endif
}
else
{
#ifdef __TARM_SYMBIAN_CONVERGENCY
iCallBack->SetMappingL( uriPtrc, _L8(" ") );
#else
iCallBack->SetMappingL( aURI, _L8(" ") );
#endif
}
if (parentLUID->Length() > 1)
{
screenSaverId.Set( *parentLUID );
ret = iScreenSavers->SetDescriptionL( screenSaverId, aObject );
}
else
{
ret = EError;
}
break;
case ENodeCustomProperty:
if (aObject.Length() > 0)
{
#ifdef __TARM_SYMBIAN_CONVERGENCY
iCallBack->SetMappingL( uriPtrc, aObject );
#else
iCallBack->SetMappingL( aURI, aObject );
#endif
}
else
{
#ifdef __TARM_SYMBIAN_CONVERGENCY
iCallBack->SetMappingL( uriPtrc, _L8(" ") );
#else
iCallBack->SetMappingL( aURI, _L8(" ") );
#endif
}
if (parentLUID->Length() > 1)
{
screenSaverId.Set( *parentLUID );
ret = iScreenSavers->SetCustomPropertyL( screenSaverId, aObject );
}
else
{
ret = EError;
}
break;
case ENodeVersion:
if (aObject.Length() > 0)
{
#ifdef __TARM_SYMBIAN_CONVERGENCY
iCallBack->SetMappingL( uriPtrc, aObject );
#else
iCallBack->SetMappingL( aURI, aObject );
#endif
}
else
{
#ifdef __TARM_SYMBIAN_CONVERGENCY
iCallBack->SetMappingL( uriPtrc, _L8(" ") );
#else
iCallBack->SetMappingL( aURI, _L8(" ") );
#endif
}
if (parentLUID->Length() > 1)
{
screenSaverId.Set( *parentLUID );
ret = iScreenSavers->SetVersionL( screenSaverId, aObject );
}
else
{
ret = EError;
}
break;
case ENodeUnknown:
ret = ENotFound;
break;
default:
ret = EError;
break;
}
CleanupStack::PopAndDestroy( parentLUID );
iCallBack->SetStatusL( aStatusRef, ret );
RDEBUG("CScreenSaverAdapter::UpdateLeafObjectL(): end");
}
// ------------------------------------------------------------------------------------------------
//
// ------------------------------------------------------------------------------------------------
void CScreenSaverAdapter::_UpdateLeafObjectL( const TDesC8& /*aURI*/, const TDesC8& /*aLUID*/, RWriteStream*& /*aStream*/, const TDesC8& /*aType*/, TInt aStatusRef )
{
RDEBUG( "CScreenSaverAdapter::UpdateLeafObjectL(...RWriteStream...): begin" );
//Not supported
TError ret = EError;
iCallBack->SetStatusL( aStatusRef, ret );
}
// ------------------------------------------------------------------------------------------------
// CScreenSaverAdapter::DeleteObjectL( const TDesC& aURI, const TDesC& aLUID )
// ------------------------------------------------------------------------------------------------
void CScreenSaverAdapter::_DeleteObjectL( const TDesC8& aURI, const TDesC8& aLUID, const TInt aStatusRef )
{
RDEBUG( "CScreenSaverAdapter::DeleteObjectL(): begin" );
TError ret = EOk ;
#ifdef __TARM_SYMBIAN_CONVERGENCY
TPtrC8 uriPtrc = NSmlDmURI::RemoveDotSlash( aURI );
TNodeId nodeId = NodeId( uriPtrc );
TPtrC8 screenSaverId = NSmlDmURI::LastURISeg( uriPtrc );
#else
TNodeId nodeId = NodeId( aURI );
TPtrC8 screenSaverId = NSmlDmURI::LastURISeg( aURI );
#endif
switch( nodeId )
{
case ENodeAvailableScreenSaversX:
{
#ifdef __TARM_SYMBIAN_CONVERGENCY
TPtrC8 parentURI = NSmlDmURI::ParentURI( uriPtrc );
#else
TPtrC8 parentURI = NSmlDmURI::ParentURI( aURI );
#endif
HBufC8* parentLUID = iCallBack->GetLuidAllocL( parentURI );
CleanupStack::PushL( parentLUID );
// Set default return code to ENotFound in case we can't event try to delete package
ret = ENotFound;
if (aLUID != *parentLUID)
{
ret = iScreenSavers->DeleteL( aLUID );
}
CleanupStack::PopAndDestroy( parentLUID );
}
break;
case ENodeUnknown:
ret = ENotFound;
break;
default:
ret = EError;
break;
}
iCallBack->SetStatusL( aStatusRef, ret );
RDEBUG( "CScreenSaverAdapter::DeleteObjectL(): end" );
}
// ------------------------------------------------------------------------------------------------
// CScreenSaverAdapter::GetLeafObjectL()
// ------------------------------------------------------------------------------------------------
void CScreenSaverAdapter::GetLeafObjectL( const TDesC8& aURI, const TDesC8& aLUID, const TDesC8& /*aType*/, CBufBase& aResult, TError& aRet )
{
#ifdef __TARM_SYMBIAN_CONVERGENCY
TPtrC8 uriPtrc = NSmlDmURI::RemoveDotSlash( aURI );
TNodeId nodeId = NodeId( uriPtrc );
TPtrC8 parentURI = NSmlDmURI::ParentURI( uriPtrc );
#else
TNodeId nodeId = NodeId( aURI );
TPtrC8 parentURI = NSmlDmURI::ParentURI( aURI );
#endif
TPtrC8 screenSaverId = NSmlDmURI::LastURISeg( parentURI );
HBufC8* parentLUID = iCallBack->GetLuidAllocL( parentURI );
CleanupStack::PushL( parentLUID );
HBufC8* trimmedLUID = aLUID.AllocL();
CleanupStack::PushL( trimmedLUID );
trimmedLUID->Des().Trim();
switch( nodeId )
{
case ENodeActiveSc:
{
#ifdef __TARM_SYMBIAN_CONVERGENCY
HBufC8* luid = iCallBack->GetLuidAllocL( uriPtrc );
#else
HBufC8* luid = iCallBack->GetLuidAllocL( aURI );
#endif
CleanupStack::PushL( luid );
aResult.InsertL( aResult.Size(), *luid );
CleanupStack::PopAndDestroy( luid );
}
break;
case ENodeID:
{
if (parentLUID->Length() > 1)
{
screenSaverId.Set( *parentLUID );
}
aRet = iScreenSavers->GetIdL( screenSaverId, aResult );
}
break;
case ENodeName:
if ( trimmedLUID->Length() > 0 && *trimmedLUID != *parentLUID)
{
aResult.InsertL( aResult.Size(), aLUID );
}
else
{
if (parentLUID->Length() > 1)
{
screenSaverId.Set( *parentLUID );
}
aRet = iScreenSavers->GetNameL( screenSaverId, aResult );
}
break;
case ENodeDescription:
if ( trimmedLUID->Length() > 0 && *trimmedLUID != *parentLUID)
{
aResult.InsertL( aResult.Size(), aLUID );
}
else
{
if (parentLUID->Length() > 1)
{
screenSaverId.Set( *parentLUID );
}
aRet = iScreenSavers->GetDescriptionL( screenSaverId, aResult );
}
break;
case ENodeCustomProperty:
if ( trimmedLUID->Length() > 0 && *trimmedLUID != *parentLUID)
{
aResult.InsertL( aResult.Size(), aLUID );
}
else
{
if (parentLUID->Length() > 1)
{
screenSaverId.Set( *parentLUID );
}
aRet = iScreenSavers->GetCustomPropertyL( screenSaverId, aResult );
}
break;
case ENodeVersion:
if ( trimmedLUID->Length() > 0 && *trimmedLUID != *parentLUID)
{
aResult.InsertL( aResult.Size(), aLUID );
}
else
{
if (parentLUID->Length() > 1)
{
screenSaverId.Set( *parentLUID );
}
aRet = iScreenSavers->GetVersionL( screenSaverId, aResult );
}
break;
case ENodeUnknown:
aRet = ENotFound;
break;
default:
aRet = EError;
break;
}
CleanupStack::PopAndDestroy( trimmedLUID );
CleanupStack::PopAndDestroy( parentLUID );
}
// ------------------------------------------------------------------------------------------------
// CScreenSaverAdapter::FetchLeafObjectL( const TDesC& aURI, const TDesC& aLUID, const TDesC& aType, CBufBase& aObject )
// ------------------------------------------------------------------------------------------------
void CScreenSaverAdapter::_FetchLeafObjectL( const TDesC8& aURI, const TDesC8& aLUID, const TDesC8& aType, const TInt aResultsRef, const TInt aStatusRef )
{
RDEBUG("CScreenSaverAdapter::FetchLeafObjectL(): begin");
TError ret = EOk ;
CBufBase *result = CBufFlat::NewL( 128 );
CleanupStack::PushL( result );
#ifdef __TARM_SYMBIAN_CONVERGENCY
TPtrC8 uriPtrc = NSmlDmURI::RemoveDotSlash( aURI );
GetLeafObjectL( uriPtrc, aLUID, aType, *result, ret );
#else
GetLeafObjectL( aURI, aLUID, aType, *result, ret );
#endif
if( ret == EOk )
{
iCallBack->SetResultsL( aResultsRef, *result, KNullDesC8 );
}
iCallBack->SetStatusL( aStatusRef, ret );
CleanupStack::PopAndDestroy( result );
RDEBUG("CScreenSaverAdapter::FetchLeafObjectL(): end");
}
// ------------------------------------------------------------------------------------------------
//
// ------------------------------------------------------------------------------------------------
void CScreenSaverAdapter::_FetchLeafObjectSizeL( const TDesC8& aURI, const TDesC8& aLUID, const TDesC8& aType, TInt aResultsRef, TInt aStatusRef )
{
RDEBUG("CScreenSaverAdapter::FetchLeafObjectSizeL(): begin");
TError ret = EOk ;
CBufBase *result = CBufFlat::NewL( 128 );
CleanupStack::PushL( result );
#ifdef __TARM_SYMBIAN_CONVERGENCY
TPtrC8 uriPtrc = NSmlDmURI::RemoveDotSlash( aURI );
GetLeafObjectL( uriPtrc, aLUID, aType, *result, ret );
#else
GetLeafObjectL( aURI, aLUID, aType, *result, ret );
#endif
if (ret == EOk)
{
TBuf8<20> len;
len.AppendNum( result->Size() );
result->Reset();
result->InsertL( 0, len );
iCallBack->SetResultsL( aResultsRef, *result, KNullDesC8() );
}
iCallBack->SetStatusL( aStatusRef, ret );
CleanupStack::PopAndDestroy( result );
RDEBUG("CScreenSaverAdapter::FetchLeafObjectSizeL(): end");
}
// ------------------------------------------------------------------------------------------------
// CScreenSaverAdapter::ChildURIListL( const TDesC& aURI, const TDesC& aParentLUID, const CArrayFix<TNSmlDmMappingInfo>& aPreviousURISegmentList, CArrayFix<TPtrC>& aCurrentURISegmentList )
// ------------------------------------------------------------------------------------------------
void CScreenSaverAdapter::_ChildURIListL( const TDesC8& aURI, const TDesC8& /*aParentLUID*/, const CArrayFix<TSmlDmMappingInfo>& aPreviousURISegmentList, const TInt aResultsRef, const TInt aStatusRef )
{
RDEBUG("CScreenSaverAdapter::ChildURIListL(): begin");
TError ret = EOk;
#ifdef __TARM_SYMBIAN_CONVERGENCY
TPtrC8 uriPtrc = NSmlDmURI::RemoveDotSlash( aURI );
TNodeId nodeId = NodeId( uriPtrc );
#else
TNodeId nodeId = NodeId( aURI );
#endif
CBufBase *result = CBufFlat::NewL( 128 );
CleanupStack::PushL( result );
switch( nodeId )
{
case ENodeCustomization:
result->InsertL( result->Size(), KNSmlSCScreenSavers() );
break;
case ENodeScreenSavers:
result->InsertL( result->Size(), KNSmlSCAvailableScreenSaversNodeName() );
result->InsertL( result->Size(), KSlash() );
result->InsertL( result->Size(), KNSmlSCActiveScNodeName() );
break;
case ENodeAvailableScreenSavers:
ret = iScreenSavers->GetScreenSaverListL( aPreviousURISegmentList, *result );
break;
case ENodeActiveSc:
break;
case ENodeInstallOptions:
break;
case ENodeAvailableScreenSaversX:
result->InsertL( result->Size(), KNSmlSCDataNodeName() );
result->InsertL( result->Size(), KSlash() );
result->InsertL( result->Size(), KNSmlSCIDNodeName() );
result->InsertL( result->Size(), KSlash() );
result->InsertL( result->Size(), KNSmlSCNameNodeName() );
result->InsertL( result->Size(), KSlash() );
result->InsertL( result->Size(), KNSmlSCDescriptionNodeName() );
result->InsertL( result->Size(), KSlash() );
result->InsertL( result->Size(), KNSmlSCCustomPropertyNodeName() );
result->InsertL( result->Size(), KSlash() );
result->InsertL( result->Size(), KNSmlSCVersionNodeName() );
result->InsertL( result->Size(), KSlash() );
result->InsertL( result->Size(), KNSmlSCInstallOptionsNodeName() );
break;
case ENodeData:
break;
case ENodeID:
break;
case ENodeName:
break;
case ENodeDescription:
break;
case ENodeCustomProperty:
break;
case ENodeVersion:
break;
case ENodeUnknown:
ret = ENotFound;
break;
default:
ret = EError;
break;
}
if( ret == EOk )
{
iCallBack->SetResultsL( aResultsRef, *result, KNullDesC8 );
}
iCallBack->SetStatusL( aStatusRef, ret );
CleanupStack::PopAndDestroy( result );
RDEBUG("CScreenSaverAdapter::ChildURIListL(): end");
}
// ------------------------------------------------------------------------------------------------
// CScreenSaverAdapter::AddNodeObjectL( const TDesC& aURI, const TDesC& aParentLUID )
// ------------------------------------------------------------------------------------------------
void CScreenSaverAdapter::_AddNodeObjectL( const TDesC8& aURI, const TDesC8& /*aParentLUID*/, const TInt aStatusRef )
{
RDEBUG("CScreenSaverAdapter::AddNodeObjectL(): begin");
TError ret = EOk ;
#ifdef __TARM_SYMBIAN_CONVERGENCY
TPtrC8 uriPtrc = NSmlDmURI::RemoveDotSlash( aURI );
TPtrC8 parentURI = NSmlDmURI::ParentURI( uriPtrc );
#else
TPtrC8 parentURI = NSmlDmURI::ParentURI( aURI );
#endif
TNodeId parentNodeId = NodeId( parentURI );
HBufC8* parentLUID = iCallBack->GetLuidAllocL( parentURI );
CleanupStack::PushL( parentLUID );
#ifdef __TARM_SYMBIAN_CONVERGENCY
HBufC8* trimmedLUID = iCallBack->GetLuidAllocL( uriPtrc );
#else
HBufC8* trimmedLUID = iCallBack->GetLuidAllocL( aURI );
#endif
CleanupStack::PushL( trimmedLUID );
trimmedLUID->Des().Trim();
switch( parentNodeId )
{
case ENodeAvailableScreenSavers:
// Set LUID mapping to make this new node permanent
if ( trimmedLUID->Length() > 0 && *trimmedLUID != *parentLUID)
{
ret = EAlreadyExists;
}
else
{
#ifdef __TARM_SYMBIAN_CONVERGENCY
iCallBack->SetMappingL( uriPtrc, _L8(" ") );
#else
iCallBack->SetMappingL( aURI, _L8(" ") );
#endif
}
break;
default:
ret = EError;
break;
}
// Cleanup
CleanupStack::Pop( trimmedLUID );
CleanupStack::Pop( parentLUID );
iCallBack->SetStatusL( aStatusRef, ret );
RDEBUG("CScreenSaverAdapter::AddNodeObjectL(): end");
}
// ------------------------------------------------------------------------------------------------
//
// ------------------------------------------------------------------------------------------------
void CScreenSaverAdapter::_ExecuteCommandL( const TDesC8& /*aURI*/, const TDesC8& /*aLUID*/, const TDesC8& /*aArgument*/, const TDesC8& /*aType*/, TInt aStatusRef )
{
RDEBUG("CScreenSaverAdapter::ExecuteCommandL(): begin");
// Not supported for any node
CSmlDmAdapter::TError ret = CSmlDmAdapter::EError;
iCallBack->SetStatusL(aStatusRef, ret);
RDEBUG("CScreenSaverAdapter::ExecuteCommandL(): end");
}
// ------------------------------------------------------------------------------------------------
//
// ------------------------------------------------------------------------------------------------
void CScreenSaverAdapter::_ExecuteCommandL( const TDesC8& /*aURI*/, const TDesC8& /*aLUID*/, RWriteStream*& /*aStream*/, const TDesC8& /*aType*/, TInt aStatusRef )
{
RDEBUG("CScreenSaverAdapter::ExecuteCommandL(...RWriteStream...): begin");
//Not supported
TError ret = EError;
iCallBack->SetStatusL( aStatusRef, ret );
}
// ------------------------------------------------------------------------------------------------
//
// ------------------------------------------------------------------------------------------------
void CScreenSaverAdapter::_CopyCommandL( const TDesC8& /*aTargetURI*/, const TDesC8& /*aTargetLUID*/, const TDesC8& /*aSourceURI*/, const TDesC8& /*aSourceLUID*/, const TDesC8& /*aType*/, TInt aStatusRef )
{
RDEBUG("CScreenSaverAdapter::CopyCommandL(): begin");
//Not supported
TError ret = EError;
iCallBack->SetStatusL( aStatusRef, ret );
}
// ------------------------------------------------------------------------------------------------
//
// ------------------------------------------------------------------------------------------------
void CScreenSaverAdapter::StartAtomicL()
{
RDEBUG("CScreenSaverAdapter::StartAtomicL(): begin");
//Not supported
}
// ------------------------------------------------------------------------------------------------
//
// ------------------------------------------------------------------------------------------------
void CScreenSaverAdapter::CommitAtomicL()
{
RDEBUG("CScreenSaverAdapter::CommitAtomicL(): begin");
//Not supported
}
// ------------------------------------------------------------------------------------------------
//
// ------------------------------------------------------------------------------------------------
void CScreenSaverAdapter::RollbackAtomicL()
{
RDEBUG("CScreenSaverAdapter::RollbackAtomicL(): begin");
//Not supported
}
// ------------------------------------------------------------------------------------------------
//
// ------------------------------------------------------------------------------------------------
TBool CScreenSaverAdapter::StreamingSupport( TInt& /*aItemSize*/ )
{
RDEBUG("CScreenSaverAdapter::StreamingSupport(): begin");
return EFalse;
}
// ------------------------------------------------------------------------------------------------
//
// ------------------------------------------------------------------------------------------------
#ifdef __TARM_SYMBIAN_CONVERGENCY
void CScreenSaverAdapter::StreamCommittedL( RWriteStream& /*aStream*/ )
#else
void CScreenSaverAdapter::StreamCommittedL()
#endif
{
RDEBUG("CScreenSaverAdapter::StreamCommittedL(): begin");
RDEBUG("CScreenSaverAdapter::StreamCommittedL(): end");
}
// ------------------------------------------------------------------------------------------------
//
// ------------------------------------------------------------------------------------------------
void CScreenSaverAdapter::CompleteOutstandingCmdsL()
{
RDEBUG("CScreenSaverAdapter::CompleteOutstandingCmdsL(): begin");
}
// -----------------------------------------------------------------------------
//
// -----------------------------------------------------------------------------
//
//#ifdef __SAP_POLICY_MANAGEMENT
TPtrC8 CScreenSaverAdapter::PolicyRequestResourceL( const TDesC8& /*aURI*/ )
{
if(!FeatureManager::FeatureSupported(KFeatureIdSapPolicyManagement ))
{
User::Leave(KErrNotSupported);
}
return PolicyEngineXACML::KCustomizationManagement();
}
//#endif
// ------------------------------------------------------------------------------------------------
//
// ------------------------------------------------------------------------------------------------
CScreenSaverAdapter::TNodeId CScreenSaverAdapter::NodeId( const TDesC8& aURI )
{
TNodeId id = ENodeUnknown;
#ifdef __TARM_SYMBIAN_CONVERGENCY
TPtrC8 uriPtrc = NSmlDmURI::RemoveDotSlash( aURI );
TInt cnt = NSmlDmURI::NumOfURISegs( uriPtrc );
TPtrC8 app = NSmlDmURI::LastURISeg( uriPtrc );
#else
TInt cnt = NSmlDmURI::NumOfURISegs( aURI );
TPtrC8 app = NSmlDmURI::LastURISeg( aURI );
#endif
/*
./Customization -+--> ScreenSaver --+----> CurrentScreenSavers --> <X> * ---+-----> ID
| |
|----> ActiveSc |-----> Name
| |
|----> InstallScreenSaver |-----> Description
| |
|----> InstallOptions |-----> CustomProperty
|
|-----> Version
*/
if ( cnt == 1 )
{
if (app == KNSmlCustomizationNodeName)
{
id = ENodeCustomization;
}
}
else if ( cnt == 2 )
{
if (app == KNSmlSCScreenSavers)
{
id = ENodeScreenSavers;
}
}
else if ( cnt == 3 )
{
if (app == KNSmlSCAvailableScreenSaversNodeName)
{
id = ENodeAvailableScreenSavers;
}
else if (app == KNSmlSCActiveScNodeName)
{
id = ENodeActiveSc;
}
}
else if ( cnt == 4 )
{
id = ENodeAvailableScreenSaversX;
}
else if ( cnt == 5 )
{
if (app == KNSmlSCDataNodeName)
{
id = ENodeData;
}
else if (app == KNSmlSCIDNodeName)
{
id = ENodeID;
}
else if (app == KNSmlSCNameNodeName)
{
id = ENodeName;
}
else if (app == KNSmlSCDescriptionNodeName)
{
id = ENodeDescription;
}
else if (app == KNSmlSCCustomPropertyNodeName)
{
id = ENodeCustomProperty;
}
else if (app == KNSmlSCVersionNodeName)
{
id = ENodeVersion;
}
else if (app == KNSmlSCInstallOptionsNodeName)
{
id = ENodeInstallOptions;
}
}
return id;
}
// ------------------------------------------------------------------------------------------------
//
// ------------------------------------------------------------------------------------------------
const TImplementationProxy ImplementationTable[] =
{
{ {KNSmlDMScreenSaverAdapterImplUid}, (TProxyNewLPtr)CScreenSaverAdapter::NewL }
};
// ------------------------------------------------------------------------------------------------
//
// ------------------------------------------------------------------------------------------------
EXPORT_C const TImplementationProxy* ImplementationGroupProxy( TInt& aTableCount )
{
aTableCount = sizeof(ImplementationTable) / sizeof(TImplementationProxy);
return ImplementationTable;
}
// -------------------------------------------------------------------------------------
// CScreenSaverAdapter::FillNodeInfoL()
// Fills the node info in ddf structure
// -------------------------------------------------------------------------------------
void CScreenSaverAdapter::FillNodeInfoL( MSmlDmDDFObject& aNode,TSmlDmAccessTypes aAccTypes,
MSmlDmDDFObject::TOccurence aOccurrence, MSmlDmDDFObject::TScope aScope,
MSmlDmDDFObject::TDFFormat aFormat,const TDesC8& aDescription )
{
aNode.SetAccessTypesL(aAccTypes);
aNode.SetOccurenceL(aOccurrence);
aNode.SetScopeL(aScope);
aNode.SetDFFormatL(aFormat);
if(aFormat!=MSmlDmDDFObject::ENode)
{
aNode.AddDFTypeMimeTypeL(KNSmlSCTextPlain);
}
aNode.SetDescriptionL(aDescription);
}
// -------------------------------------------------------------------------------------
// CScreenSaverAdapter::IsImage()
// Checks whether the given mime type is image format (that we support)
// -------------------------------------------------------------------------------------
TBool CScreenSaverAdapter::IsImage(const TDesC8& aMime)
{
if (aMime == _L8("image/jpeg") || aMime == _L8("image/gif"))
{
return ETrue;
}
return EFalse;
}
// -------------------------------------------------------------------------------------
// CScreenSaverAdapter::
// -------------------------------------------------------------------------------------
void CScreenSaverAdapter::InstalledPackagesL( RArray< TUid >& aUids )
{
Swi::RSisRegistrySession reg;
User::LeaveIfError( reg.Connect() );
CleanupClosePushL( reg );
reg.InstalledUidsL( aUids );
aUids.SortSigned( );
CleanupStack::PopAndDestroy( ® );
}
// -------------------------------------------------------------------------------------
// CScreenSaverAdapter::
// -------------------------------------------------------------------------------------
void CScreenSaverAdapter::InstalledScreenSaversL( CDesCArray& aIds )
{
RDEBUG(" -> CScreenSaverAdapter: GetScreenSaverList ... START!");
RScreenSaverClient ssClient;
User::LeaveIfError( ssClient.Connect() );
CleanupClosePushL( ssClient );
ssClient.GetScreenSaverListL(aIds );
CleanupStack::PopAndDestroy( &ssClient );
RDEBUG(" -> CScreenSaverAdapter: GetScreenSaverList ... END!");
}