diff -r c742e1129640 -r aa33c2cb9a50 applicationmanagement/omascomoadapter/inc/omascomoadapter.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/applicationmanagement/omascomoadapter/inc/omascomoadapter.h Tue Jul 06 14:06:19 2010 +0300 @@ -0,0 +1,853 @@ +/* +* Copyright (c) 2009 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: Implementation of applicationmanagement components + * +*/ + + +#ifndef __OMASCOMOADAPTER_H__ +#define __OMASCOMOADAPTER_H__ + +// ------------------------------------------------------------------------------------------------ +// Includes +// ------------------------------------------------------------------------------------------------ +#include +#include +#include "omascomoadapterdb.h" + +#ifdef __TARM_SYMBIAN_CONVERGENCY +#include +#else +#include "nsmldmtreedbclient.h" +#endif + +#include "ApplicationManagementClient.h" + +const TInt KMaxUrlLength = 2048; + +namespace NApplicationManagement + { + + const TUint KAMAdapterImplUid = 0x20021336; + + const TInt KMaxSizeString = 256; + + // the DDF version must be changed if any changes in DDF structure ( built in DDFStructureL() function ) + _LIT8( KAMDDFVersion, "1.0" ); + + _LIT8( KAMTextPlain, "text/plain" ); + +#ifdef __TARM_SYMBIAN_CONVERGENCY + _LIT8( KAMNodeName, "./SCOMO" ); +#else + _LIT8( KAMNodeName, "SCOMO" ); +#endif + _LIT8( KAMNodeDescription, "This node is the root node for all application management functionality" ); + + _LIT8( KAMInventoryNodeName, "Inventory" ); + _LIT8( KAMInventoryNodeDescription, "This node is start node of application inventory" ); + + _LIT8( KAMDeliveredNodeName, "Delivered" ); + _LIT8( KAMDeliveredNodeDescription, "This is node under which applications that are delivered but not installed are found." ); + + _LIT8( KAMDeployedNodeName, "Deployed" ); + _LIT8( KAMDeployedNodeDescription, "This is a node under which deployed applications are found" ); + + _LIT8( KAMDeliveredDynaNodeDescription, "This dynamic node is placeholder applications that are in Delivered state" ); + + _LIT8( KAMPkgIDNodeName, "PkgID" ); + _LIT8( KAMPkgIDNodeDescription, "This leaf node holds an package identifier for an application" ); + + + _LIT8( KAMIDNodeName, "ID" ); + _LIT8( KAMIDNodeDescription, "This leaf node holds an identifier for an deployment component" ); + + _LIT8( KAMPkgIDRefNodeName, "PkgIDRef" ); + _LIT8( KAMPkgIDRefNodeDescription, "This leaf node holds an identifier for an deployment component" ); + + _LIT8( KAMNameNodeName, "Name" ); + _LIT8( KAMNameNodeDescription, "This leaf node holds name of an application" ); + + _LIT8( KAMVersionNodeName, "Version" ); + _LIT8( KAMVersionNodeDescription, "This leaf node holds the version of an application" ); + + _LIT8( KAMStateValueNodeName, "State" ); + _LIT8( KAMStateValueNodeDescription, "This leaf node holds the state value of an application (active/inactive)" ); + + _LIT8( KAMDataNodeName, "Data" ); + _LIT8( KAMDataNodeDescription, "This leaf node holds the data of an application" ); + + _LIT8( KAMDescriptorNodeName, "Descriptor" ); + _LIT8( KAMDescriptorNodeDescription, "This leaf node holds the possible metadata of an application" ); + + _LIT8( KAMOperationsNodeName, "Operations" ); + _LIT8( KAMOperationsNodeDescription, "This is a node under which operations are found" ); + + _LIT8( KAMInstallOptsNodeName, "InstallOpts" ); + _LIT8( KAMInstallOptsNodeDescription, "This is a node that holds the installation options of an application" ); + + _LIT8( KAMDeployedDynaNodeDescription, "This dynamic node is placeholder applications that are in Inactive state" ); + + _LIT8( KAMDownloadOperationNodeName, "Download" ); + _LIT8( KAMDownloadOperationNodeDescription, "Starts the download" ); + + _LIT8( KAMConRefNodeName, "ConRef" ); + _LIT8( KAMConRefNodeDescription, "Holds reference to IAP" ); + + _LIT8( KAMLocalOperationsNodeDescription, "This is the root node for local operations" ); + + _LIT8( KAMActivateNodeName, "Activate" ); + _LIT8( KAMActivateNodeDescription, "Exec command causes device to activate an inactive application" ); + + _LIT8( KAMDeActivateNodeName, "Deactivate" ); + _LIT8( KAMDeActivateNodeDescription, "Exec command causes device to stop and deactivate an active application" ); + + _LIT8( KAMInstallNodeName, "Install" ); + _LIT8( KAMInstallNodeDescription, "Exec command causes device to install a delivered application" ); + + _LIT8( KAMInstallInactiveNodeName, "InstallInactive" ); + _LIT8( KAMInstallInactivateNodeDescription, "Exec command causes device to install a delivered application and activate it" ); + + _LIT8( KAMUpdateNodeName, "Update" ); + _LIT8( KAMUpdateNodeDescription, "Exec command causes device to update an application" ); + + _LIT8( KAMUpdateAndActivateNodeName, "UpdateAndActivate" ); + _LIT8( KAMUpdateAndActivateNodeDescription, "Exec command causes device to update an application and activate it" ); + + _LIT8( KAMRemoveNodeName, "Remove" ); + _LIT8( KAMRemoveNodeDescription, "Exec command causes device to remove an application" ); + + _LIT8( KAMDownloadNodeName, "Download" ); + _LIT8( KAMDownloadNodeDescription, "This node is a root node for application download functionality" ); + + _LIT8( KAMDownloadAndInstallNodeName, "DownloadInstall" ); + _LIT8( KAMDownloadAndInstallOperationNodeDescription, "Starts the download and installs component when complete" ); + + _LIT8( KAMDownloadAndInstallAndInActivateNodeName, "DownloadInstallInactive" ); + _LIT8( KAMDownloadAndInstallAndInActivateNodeDescription, "Starts the download and installs and activates component when complete" ); + + _LIT8( KAMDownloadAndUpdateNodeName, "DownloadAndUpdate" ); + _LIT8( KAMDownloadAndUpdateNodeDescription, "Starts the download and installs component when complete" ); + + _LIT8( KAMDownloadAndUpdateAndActivateNodeName, "DownloadAndUpdateAndActivate" ); + _LIT8( KAMDownloadAndUpdateAndActivateNodeDescription, "Starts the download and updates and activates component when complete" ); + + _LIT8( KAMDownloadDynaNodeDescription, "This node is a placeholder for identifier of an application that is to be downloaded" ); + + _LIT8( KAMURINodeName, "PkgURL" ); + _LIT8( KAMURINodeDescription, "This leaf node holds the URL from which the application should be downloaded" ); + + _LIT8( KAMStatusNodeName, "Status" ); + _LIT8( KAMStatusNodeDescription, "This leaf node holds the status of the download" ); + + _LIT8( KAMDescriptionNodeName, "Description" ); + _LIT8( KAMDescriptionNodeDescription, "This leaf node holds the description of the download" ); + + _LIT8( KAMPkgTypeNodeName, "PkgType" ); + _LIT8( KAMPkgTypeNodeDescription, "This leaf node holds the PkgType of the download or delivered" ); + +#ifdef __AM_LASTERROR_NODE + _LIT8( KAMExtNodeName, "Ext" ); + _LIT8( KAMExtNodeDescription, "Non std extentions are found under this leaf" ); + _LIT8( KAMLastErrorNodeName, "LastError" ); + _LIT8( KAMLastErrorDescription, "This leaf node may hold the error" ); +#endif + + _LIT8( KAMDynamicNodeName, "" ); + _LIT( KAMSeparator16, "/" ); + + _LIT8( KAMSeparator8, "/" ); + + _LIT8( KAMRootChilds, "Inventory/Download" ); + _LIT8( KAMInventoryChilds, "Delivered/Deployed" ); + //_LIT8( KAMLocalOperationsChilds, "Activate/DeActivate/Install/Update/Remove" ); + + _LIT8( KAMDownloadDynaChilds, "PkgID/Name/PkgURL/Description/Status/PkgType/Operations" ); +_LIT8( KAMInventoryDynaChilds, "ID/PkgIDRef/Name/Description/Version/State/Operations" ); +_LIT8( KAMDownloadOperationChilds, "Download/DownloadInstall/DownloadInstallInactivate" ); +_LIT8( KAMDeployedOperationChilds, "Activate/Deactivate/Remove" ); +_LIT8( KAMDeliveredOperationChilds, "Install/InstallInactive/Remove" ); +_LIT8( KAMInventoryDeliveredDynaChilds, "PkgID/Data/Name/Description/Status/State/PkgType/Operations" ); + + _LIT8( KNSmlDMSCOMOMetaType,"org.openmobilealliance.dm.softwarecomponent.OperationComplete" ); + _LIT8( KNSmlDMSCOMOMetaFormat, "text/plain" ); + + _LIT8(KDataStart, ""); + _LIT8(KResultCodeStart, ""); + _LIT8(KResultCodeEnd, ""); + _LIT8(KIdentifierStart, ""); + _LIT8(KIdentifierEnd, ""); + + + _LIT8(KMark, "warning"); + + struct TAMCommandBufferElement + { + TInt iStatusRef; + TBuf8<256> iURI; + TAMCommandBufferElement(TInt aRef, const TDesC8 &aURI) : + iStatusRef(aRef), iURI(aURI) + { + } + }; + + typedef RArray TAMCommandBuffer; + + // ------------------------------------------------------------------------------------------------ + // CSCOMOAdapter + // ------------------------------------------------------------------------------------------------ + class CSCOMOAdapter : public CSmlDmAdapter + { +public: + static CSCOMOAdapter* NewL(MSmlDmCallback* aDmCallback); + static CSCOMOAdapter* NewLC(MSmlDmCallback* aDmCallback); + + virtual ~CSCOMOAdapter(); + + /** + The function returns current version of the DDF. + By asking current DDF versions from adapters DM Module can control + possible changes in the data structure and send the changed DDF + description to a management server. + This function is always called after DDFStructureL. + @param aVersion DDF version of the adapter. (filled by the adapter) + @publishedPartner + @prototype + */ + virtual void DDFVersionL(CBufBase& aVersion); + + /** + The function for filling the DDF structure of the adapter + This function is only called once, immediately after the adapter is created. + @param aDDFObject Reference to root object. A DM adapter starts filling + the data structure by calling AddChildObjectL to the root object and + so describes the DDF of the adapter. + @publishedPartner + @prototype + */ + virtual void DDFStructureL(MSmlDmDDFObject& aDDF); + + /** + The function creates new leaf objects, or replaces data in existing leaf + objects. The information about the success of the command should be + returned by calling SetStatusL function of MSmlDmCallback callback + interface. This makes it possible to buffer the commands. However, all + the status codes for buffered commands must be returned at the latest when + the adapter's CompleteOutstandingCmdsL() is called. + @param aURI URI of the object + @param aLUID LUID of the object (if the adapter has earlier returned a + LUID to the DM Module). For new objects, this is the LUID + inherited through the parent node. + @param aObject Data of the object. + @param aType MIME type of the object + @param aStatusRef Reference to correct command, i.e. this reference + must be used when calling the SetStatusL of this command + @publishedPartner + @prototype + */ + virtual void UpdateLeafObjectL(const TDesC8& aURI, + const TDesC8& aLUID, const TDesC8& aObject, + const TDesC8& aType, TInt aStatusRef); + + /** + The function creates new leaf objects, or replaces data in existing leaf + objects, in the case where data is large enough to be streamed. The + information about the success of the command should be returned by calling + SetStatusL function of MSmlDmCallback callback interface. This makes it + possible to buffer the commands. However, all the status codes for buffered + commands must be returned at the latest when the CompleteOutstandingCmdsL() + of adapter is called. + @param aURI URI of the object + @param aLUID LUID of the object (if the adapter has earlier returned a + LUID to the DM Module). For new objects, this is the LUID + inherited through the parent node. + @param aStream Data of the object. Adapter should create write stream + and return, when data is written to stream by DM agent, + StreamCommittedL() is called by DM engine + @param aType MIME type of the object + @param aStatusRef Reference to correct command, i.e. this reference + must be used when calling the SetStatusL of this + command. + @publishedPartner + @prototype + */ + virtual void UpdateLeafObjectL(const TDesC8& aURI, + const TDesC8& aLUID, RWriteStream*& aStream, + const TDesC8& aType, TInt aStatusRef); + + /** + The function deletes an object and its child objects. The SetStatusL + should be used as described in UpdateLeafObjectL() + @param aURI URI of the object + @param aLUID LUID of the object (if the adapter have earlier returned + LUID to the DM Module). + @param aStatusRef Reference to correct command, i.e. this reference must + be used when calling the SetStatusL of this command. + @publishedPartner + @prototype + */ + virtual void DeleteObjectL(const TDesC8& aURI, const TDesC8& aLUID, + TInt aStatusRef); + + /** + The function fetches data of a leaf object. The SetStatusL should be used + as described in UpdateLeafObjectL(). The data is returned by using the + SetResultsL function of MSmlCallback callback interface, and may be streamed. + @param aURI URI of the object + @param aLUID LUID of the object (if the adapter have earlier + returned LUID to the DM Module). + @param aType MIME type of the object + @param aResultsRef Reference to correct results, i.e. this reference + must be used when returning the result by calling + the SetResultsL. + @param aStatusRef Reference to correct command, i.e. this reference + must be used when calling the SetStatusL of this + command. + @publishedPartner + @prototype + */ + virtual void FetchLeafObjectL(const TDesC8& aURI, + const TDesC8& aLUID, const TDesC8& aType, TInt aResultsRef, + TInt aStatusRef); + + /** + The function fetches the size of the data of a leaf object. The size is + in bytes, and must reflect the number of bytes that will be transferred + when the framework calls FetchLeafObjectL. The SetStatusL should be used + as described in FetchLeafObjectL(). The size value is returned by using + the SetResultsL function of MSmlCallback callback interface, and must be + a decimal integer expressed as a string, eg. "1234". + Results from this call MUST NOT be streamed. + @param aURI URI of the object + @param aLUID LUID of the object (if the adapter have earlier + returned LUID to the DM Module). + @param aType MIME type of the object + @param aResultsRef Reference to correct results, i.e. this reference + must be used when returning the result by calling + the SetResultsL. + @param aStatusRef Reference to correct command, i.e. this reference + must be used when calling the SetStatusL of this + command. + @publishedPartner + @prototype + */ + virtual void FetchLeafObjectSizeL(const TDesC8& aURI, + const TDesC8& aLUID, const TDesC8& aType, TInt aResultsRef, + TInt aStatusRef); + /** + The function fetches URI list. An adapter returns the list of URI segments + under the given URI be separated by slash ("/"). The URI segment names for + new objects must be given by the adapter. + The list is returned by calling the SetResultsL function of MSmlCallback + callback interface. Results from this call MUST NOT be streamed. + @param aParentURI URI of the parent object + @param aParentLUID LUID of the parent object (if the + adapter have earlier returned LUID to + the DM Module). + @param aPreviousURISegmentList URI list with mapping LUID information, + which is known by DM engine. An adapter + can use this information when verifying + if old objects still exists. An adapter + also knows what objects are new to DM + engine and can provide LUID mapping for + them. aPreviousURISegmentList parameter + (see above) helps to recognise new + objects. + @param aResultsRef Reference to correct results, i.e. this + reference must be used when returning + the result by calling the SetResultsL. + @param aStatusRef Reference to correct command, i.e. this + reference must be used when calling the + SetStatusL of this command. + @publishedPartner + @prototype + */ + virtual void ChildURIListL(const TDesC8& aURI, const TDesC8& aLUID, + const CArrayFix& aPreviousURISegmentList, + TInt aResultsRef, TInt aStatusRef); + + /** + The function adds node object. In some cases an implementation of the + function may be empty function, if the node object does not need concrete + database update. Still this function may be helpful to an adapter, i.e. in + passing mapping LUID of the node to DM Module. The SetStatusL should be + used as described in UpdateLeafObjectL() + @param aURI URI of the object + @param aParentLUID LUID of the parent object (if the adapter have + earlier returned LUID to the DM Module). + @param aStatusRef Reference to correct command, i.e. this reference + must be used when calling the SetStatusL of this + command. + @publishedPartner + @prototype + */ + virtual void AddNodeObjectL(const TDesC8& aURI, + const TDesC8& aParentLUID, TInt aStatusRef); + + /** + The function implements execute command. The information about the success + of the command should be returned by calling SetStatusL function of + MSmlDmCallback callback interface. This makes it possible to buffer the + commands. + However, all the status codes for buffered commands must be returned at + the latest when the CompleteOutstandingCmdsL() of adapter is called. + @param aURI URI of the command + @param aLUID LUID of the object (if the adapter have earlier + returned LUID to the DM Module). + @param aArgument Argument for the command + @param aType MIME type of the object + @param aStatusRef Reference to correct command, i.e. this reference + must be used when calling the SetStatusL of this + command. + @publishedPartner + @prototype + */ + virtual void + ExecuteCommandL(const TDesC8& aURI, const TDesC8& aLUID, + const TDesC8& aArgument, const TDesC8& aType, + TInt aStatusRef); + + /** + The function implements execute command. The information about the + success of the command should be returned by calling SetStatusL function + of MSmlDmCallback callback interface. This makes it possible to buffer the + commands. + However, all the status codes for buffered commands must be returned at + the latest when the CompleteOutstandingCmdsL() of adapter is called. + @param aURI URI of the command + @param aLUID LUID of the object (if the adapter have earlier + returned LUID to the DM Module). + @param aStream Argument for the command. Adapter should create + write stream and return, when data is written to + stream by DM agent, StreamCommittedL() is called by + DM engine + @param aType MIME type of the object + @param aStatusRef Reference to correct command, i.e. this reference + must be used when calling the SetStatusL of this + command. + @publishedPartner + @prototype + */ + virtual void ExecuteCommandL(const TDesC8& aURI, const TDesC8& aLUID, + RWriteStream*& aStream, const TDesC8& aType, TInt aStatusRef); + + /** + The function implements copy command. The information about the success of + the command should be returned by calling SetStatusL function of + MSmlDmCallback callback interface. This makes it possible to buffer the + commands. + However, all the status codes for buffered commands must be returned at + the latest when the CompleteOutstandingCmdsL() of adapter is called. + @param aTargetURI Target URI for the command + @param aSourceLUID LUID of the target object (if one exists, and if the adapter + has earlier returned a LUID to the DM Module). + @param aSourceURI Source URI for the command + @param aSourceLUID LUID of the source object (if the adapter has + earlier returned a LUID to the DM Module). + @param aType MIME type of the objects + @param aStatusRef Reference to correct command, i.e. this reference + must be used when calling the SetStatusL of this + command. + @publishedPartner + @prototype + */ + virtual void CopyCommandL(const TDesC8& aTargetURI, + const TDesC8& aTargetLUID, const TDesC8& aSourceURI, + const TDesC8& aSourceLUID, const TDesC8& aType, + TInt aStatusRef); + + /** + The function indicates start of Atomic command. + @publishedPartner + @prototype + */ + virtual void StartAtomicL(); + + /** + The function indicates successful end of Atomic command. The adapter + should commit all changes issued between StartAtomicL() and + CommitAtomicL() + @publishedPartner + @prototype + */ + virtual void CommitAtomicL(); + + /** + The function indicates unsuccessful end of Atomic command. The adapter + should rollback all changes issued between StartAtomicL() and + RollbackAtomicL(). If rollback fails for a command, adapter should use + SetStatusL() to indicate it. + @publishedPartner + @prototype + */ + virtual void RollbackAtomicL(); + + /** + Returns ETrue if adapter supports streaming otherwise EFalse. + @param aItemSize size limit for stream usage + @return TBool ETrue for streaming support + @publishedPartner + @prototype + */ + virtual TBool StreamingSupport(TInt& aItemSize); + + /** + Called when stream returned from UpdateLeafObjectL or ExecuteCommandL has + been written to and committed. Not called when fetching item. + @publishedPartner + @prototype + */ +#ifdef __TARM_SYMBIAN_CONVERGENCY + virtual void StreamCommittedL( RWriteStream& aStream ); +#else + virtual void StreamCommittedL(); +#endif + /** + The function tells the adapter that all the commands of the message that + can be passed to the adapter have now been passed. This indciates that + the adapter must supply status codes and results to any buffered commands. + This must be done at latest by the time this function returns. + This function is used at the end of SyncML messages, and during processing + of Atomic. In the case of Atomic processing, the function will be + followed by a call to CommitAtomicL or RollbackAtomicL. + @publishedPartner + @prototype + */ + virtual void CompleteOutstandingCmdsL(); + +private: + CSCOMOAdapter(TAny* aDmCallback); + void ConstructL(); + TInt DesToIntL(const TDesC8& aLuid); + HBufC8* IntToDes8LC(const TInt aLuid); + + TBool CheckStateL(const TDeploymentComponent &aComp, + const TDesC8& aURI); + TBool CheckStateL(const TDesC8& aURI, const TDesC8& aLUID); + /** + * UpdateFlagFromMapping Maps a node name to internal attribute flag that + * is used by server to identify to data + * @param aMapping The SyncML node name + * @return TDeplCompAttrType the attribute type + */ + TDeplCompAttrType UpdateFlagFromMapping(const TDesC8& aMapping); + + /** + * IdListL Looks up the given state user ids of deployment components, + * and places them to currentList in the format specified by SyncML spec + * @param aState The deployment component state in which we are interested + * @param aCurrentList The buffer where the results are placed + * @param aAppend Does the list possibly contain some items already + * @return TError EOk if successful + */ + TError IdListL(TDeploymentComponentState aState, + CBufBase &aCurrentList, TBool aAppend = EFalse); + + /** + * DeliverOrDownloadL Depending on aURI, creates new delivery or download component + * + * @param aUserId The name of dynamic node. + * @param aURI The full URI + * @param aCnt Count of URI segments + * @param aParentMapping The parent data + * @param aStatus A reference to the error which will be set the status of the operation + * @return TError EOk if successful + */ + void DeliverOrDownloadL(const TDesC8 &aUserId, const TDesC8 &aURI, + TInt aCnt, const TDesC8 &aParentMapping, + MSmlDmAdapter::TError &aStatus); + + /** + * Fills the node info in ddf structure + */ + void + FillNodeInfoL(MSmlDmDDFObject& aNode, + TSmlDmAccessTypes aAccTypes, + MSmlDmDDFObject::TOccurence aOccurrence, + MSmlDmDDFObject::TScope aScope, + MSmlDmDDFObject::TDFFormat aFormat, + const TDesC8& aDescription); + + /** + * Fills the node info in ddf structure, without default mime type + */ + void + FillNodeInfoNoDefaultMimeL(MSmlDmDDFObject& aNode, + TSmlDmAccessTypes aAccTypes, + MSmlDmDDFObject::TOccurence aOccurrence, + MSmlDmDDFObject::TScope aScope, + MSmlDmDDFObject::TDFFormat aFormat, + const TDesC8& aDescription); + + TBool IsImage(const TDesC8& aMime); + /** + Calls Callback().SetResultsL() + */ + void SetResultsL(TInt aResultsRef, CBufBase& aObject, + const TDesC8& aType); + /** + Calls Callback().SetStatusL() + */ + void SetStatusL(TInt aStatusRef, MSmlDmAdapter::TError aErrorCode); + // TInt FindBuffered( const TDesC8 &aURI ) ; + RApplicationManagement &SessionL(); + TDeploymentComponentState StateL(const TDesC8& aURI); + + void CheckStateChangesL(); + void CheckStateChangesInternalL(); + + TPtrC8 URISegsUpTo(const TDesC8& aURI, TInt aUpTo, + TBool aInclKeno=EFalse); + + /** + * Helper method to move acl. Copies acl of node aFrom to acl of aTo, + * and removes acl from aFrom. + * + * @param aFrom The source uri + * @param aTo The target uri + */ + void MoveAclL(const TDesC8 &aFrom, const TDesC8 &aTo); + + /** + * Helper method to move nodes in SCOMO tree + * + * 1. Sets mapping of aOriginal to null. + * 2. If aNewURI is null, constructs new uri depending on aTargetstate. + * 3. Sets mapping of aNewURI to aLUID + * 4. Moves acls of aOriginal to aNewURI (using MoveAclL) + * + * @param aOriginal The uri of original node to be moved + * @param aTargetstate The target state the node is moving to + * @param aLUID The luid of the original node + * @param aNewUri The new uri of the node (will be constructed and left to stack if null) + */ + void SetMappingLC(const TDesC8 &aOriginal, + const TDeploymentComponentState aTargetstate, + const TDesC8 &aLUID, HBufC8 *&aNewUri); + + /** + * Helper method to move nodes in SCOMO tree + * + * 1. Sets mapping of aOriginal to null. + * 2. Sets mapping of a uri constructed using aTargetState to aLUID + * 2. Moves acls of aOriginal to a uri constructed using aTargetState (using MoveAclL) + * + * @param aTargetstate The target state the node is moving to + * @param aLUID The luid of the original node + */ + void SetMappingL(const TDesC8 &aOriginalURI, + const TDeploymentComponentState aTargetState, + const TDesC8 &aLUID); + + /** + * Helper method to set DM LUID mappings directly database. + * + * @param aURI The uri of node whose mapping is to be set + * @param aLUID The new mapping value + * @return Possible database error - KErrNone if successful + */ + TInt DirectSetMappingL(const TDesC8 &aURI, const TDesC8 &aLUID); + + TInt DirectRemoveMappingL(const TDesC8 &aURI); + + /** + * Helper method to get DM LUID mappings directly from database. + * + * @param aURI The uri of node whose mapping is to be found + * @return The luid mapping - Empty string if not found. + */ + HBufC8 *DirectGetLuidAllocLC(const TDesC8 &aURI); + + /** + * Helper method to perform install + * + * @param aLuidi The mapping value of component as integer + * @param aURI The uri of node that is to be installed + * @param aLUID The mapping value of component as text + * @param aTargetstate The target state the node is moving to (EDCSActive or EDCSInactive) + * @param aRet The SyncML Error code - value will be updated according to success + */ + void InstallL(const TUint aLuidi, const TDesC8& aURI, + const TDesC8& aLUID, + const TDeploymentComponentState aTargetState, TError &aRet); + + /** + * Helper method to perform update + * + * @param aLuidi The mapping value of component as integer + * @param aURI The uri of node that is to be installed + * @param aLUID The mapping value of component as text + * @param aTargetstate The target state the node is moving to (EDCSActive or EDCSInactive) + * @param aRet The SyncML Error code - value will be updated according to success + */ + void UpdateL(const TUint aLuidi, const TDesC8& aURI, + const TDesC8& aSourceLUID, + const TDeploymentComponentState aTargetState, TError &aRet); + /** + maps symbian error code to DM error code as follows: + Kerrnone-> EOk + Kerrnotfound ->Enotfound + all oether -> EError + */ + void DefaultMapError(const TInt aErr, TError &aRet, + const TDesC8& aDes = KNullDesC8); + + /** + * Deactivates given component if given state is inactive + */ + void DeactivateIfInactive(const TUint aLuidi, + const TDeploymentComponentState aTargetState); + + /** + * Finds luid from app mgmt server to given userid + */ + TUint32 GetLuidForUserIdL(const TDesC8 &aUserId, + const TDeploymentComponentState aState); + + TUint32 GetLuidL(const TDesC8 &aDMLuid, const TDesC8 &aUserId, + const TDeploymentComponentState aState); + + /** + * places result in current + * @param aParent The deployment component identifying uri + * @param aMapping The user id part of the deployment component uri + * @param aLuid Internal id of the deployment compoennt + * @param aCurrentList The list that will get the data + * @param aStatus The syncml status + */ + void GetComponentDataL(const TDesC8& aParent, const TDesC8& aMapping, + const TUint32 aLuid, CBufBase &aCurrentList, + CBufBase ¤tMime, TError &aStatus); + /** + * returns luid of leaf node, or 0 + */ + TInt GetLeafLuidL(const TDesC8 &aURI, const TDesC8 & aParentMapping); + /** + * returns length of result + */ + TInt GetSizeL(const TDeplCompAttrType aDataType, const TInt aLuid, + TError &aRet); + + /** + * places installoptions of given aLuid to aBuf + */ + void InstallOptionsDataL(const TUint32 aLuid, + const TDeplCompAttrType& aDataType, CBufBase &aBuf, + CBufBase *aRaw = NULL); + + /** + * Gets the luid using GetLuidL, and updates aStatus to ENotFound if not found... + */ + TUint32 GetLuid2L(const TDesC8 &aDMLuid, const TDesC8 &aUserId, + const TDeploymentComponentState aState, TError &aStatus); + + /** + * Finds out correct download target based on download operation + */ + TDownloadTarget DownloadTargetL(const TDesC8& aOperation); + + TPtrC8 LastURISeg(const TDesC8& aURI); + TInt DesToInt(const TDesC8& aLuid); + +#ifdef __AM_LASTERROR_NODE + void SetLastErrorL(const TDesC8& aLastError, const TInt aErr); + const TDesC8& LastError(); + void SetErrorL(const TDesC8& aDes, const TInt aErr); +#endif + + /** + The function creates new leaf objects, or replaces data in existing leaf + objects. The information about the success of the command should be + returned by calling SetStatusL function of MSmlDmCallback callback + interface. This makes it possible to buffer the commands. However, all + the status codes for buffered commands must be returned at the latest when + the adapter's CompleteOutstandingCmdsL() is called. + @param aURI URI of the object + @param aLUID LUID of the object (if the adapter has earlier returned a + LUID to the DM Module). For new objects, this is the LUID + inherited through the parent node. + @param aObject Data of the object. + @param aType MIME type of the object + @param aStatusRef Reference to correct command, i.e. this reference + must be used when calling the SetStatusL of this command + @publishedPartner + @prototype + */ + void _UpdateLeafObjectL(const TDesC8& aURI, const TDesC8& aLUID, + const TDesC8& aObject, const TDesC8& aType, TInt aStatusRef, + MSmlDmAdapter::TError& aStatus); + /** + * The function creates new leaf objects, or replaces data in existing leaf + */ + void CloseStreaming(); + + void GetServerInfoL(TSmlProfileId& aProfId, HBufC8*& aServerId) const; + + void SendPendingGenericAlertL(); + + void ASyncReportL(TUint32 aLuid, const TDesC8& aArgument, + const TDownloadTarget aTarget, const TDesC8& aURI); + + void SyncReportL(TUint32 aLuid, const TDesC8& aArgument, + const TDownloadTarget aTarget, const TDesC8& aURI, TError &aRet); + /** + Checks if predefined node for Download object is in tree if not add to the tree + */ + void CheckAndAddPredefinedNodeL(); + /** + Gets predefined node for Download object from cenrep + */ + void GetPredefinedNodeL(TDes8& aNode); + TInt GetAdapterValue(); + void SetAdapterValue(TInt aAdapterValue); + TBool RecognizeMimeType(const TDesC8& aMimeType); + +private: + +#ifdef __TARM_SYMBIAN_CONVERGENCY + RDmTree iDbSession; +#else + RNSmlDMCallbackSession iDbSession; // to change acl location +#endif + + RApplicationManagement iManagement; + TBool iSessionOpened; + TAMCommandBuffer iBuffer; + TBool iInAtomic; + TBool iUpdated; // have we checked changed state DCs? + // Streaming API support + TBool iStreamOpen; + RFileWriteStream iStream; + TInt iStatusRef; + RFs iStreamRFs; + RFile iStreamFile; + TBool iIsStreamedContent; + HBufC8* iStreamedURI; + HBufC8* iStreamedLuid; + HBufC8* iStreamedType; + TBool iCertRequired; + TBool iTrustAdded; + CSCOMOAdapterDb* iAMdb; + TUint iInternalId; +#ifdef __AM_LASTERROR_NODE + HBufC8 *iLastError; +#endif + + HBufC8 *iUriDel; + }; + + } // namespace +#endif // __AMDMADAPTER_H__ +// End of File