# HG changeset patch # User Dremov Kirill (Nokia-D-MSW/Tampere) # Date 1277305382 -10800 # Node ID c742e112964037bd5dc9bae71b777dbfc12569bc # Parent d3981f4fe6a4a4498505bed04d7bf6d5b7194a18 Revision: 201023 Kit: 2010125 diff -r d3981f4fe6a4 -r c742e1129640 clientprovisioning/cpqtsp/cpqtsp.pro --- a/clientprovisioning/cpqtsp/cpqtsp.pro Fri Jun 11 13:29:40 2010 +0300 +++ b/clientprovisioning/cpqtsp/cpqtsp.pro Wed Jun 23 18:03:02 2010 +0300 @@ -31,6 +31,7 @@ } CONFIG += hb service +INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE include(Cpqtsp.pri) LIBS+=-lxqservice -lxqserviceutil -lflogger MMP_RULES += "LIBRARY msgs.lib centralrepository.lib provisioningengine.lib featmgr.lib apengine.lib favouritesengine.lib smcm.lib gsmu.lib" diff -r d3981f4fe6a4 -r c742e1129640 clientprovisioning/cpqtsp/rom/cpqtsp.iby --- a/clientprovisioning/cpqtsp/rom/cpqtsp.iby Fri Jun 11 13:29:40 2010 +0300 +++ b/clientprovisioning/cpqtsp/rom/cpqtsp.iby Wed Jun 23 18:03:02 2010 +0300 @@ -24,7 +24,4 @@ file = ABI_DIR/BUILD_DIR/Cpqtsp.exe PROGRAMS_DIR/Cpqtsp.exe data = DATAZ_/private/10003a3f/import/apps/Cpqtsp_reg.rsc private/10003a3f/import/apps/Cpqtsp_reg.rsc -data=/epoc32/data/z/resource/plugins/devicedialogs/devicemanagementnotifiersplugin.qtplugin resource/plugins/devicedialogs/devicemanagementnotifiersplugin.qtplugin -file=ABI_DIR/BUILD_DIR/devicemanagementnotifiersplugin.dll SHARED_LIB_DIR/devicemanagementnotifiersplugin.dll - #endif \ No newline at end of file diff -r d3981f4fe6a4 -r c742e1129640 devicemgmtdialogsplugin/devicemanagementnotifierdevman.qrc --- a/devicemgmtdialogsplugin/devicemanagementnotifierdevman.qrc Fri Jun 11 13:29:40 2010 +0300 +++ b/devicemgmtdialogsplugin/devicemanagementnotifierdevman.qrc Wed Jun 23 18:03:02 2010 +0300 @@ -3,7 +3,7 @@ resources/dialog.docml resources/dialoginformative.docml resources/dialogserverpushconfirm.docml - resources/PIN.docml + resources/pin.docml resources/iconnotifier.svg diff -r d3981f4fe6a4 -r c742e1129640 devicemgmtdialogsplugin/devicemgmtdialogsplugin.pro --- a/devicemgmtdialogsplugin/devicemgmtdialogsplugin.pro Fri Jun 11 13:29:40 2010 +0300 +++ b/devicemgmtdialogsplugin/devicemgmtdialogsplugin.pro Wed Jun 23 18:03:02 2010 +0300 @@ -13,7 +13,7 @@ # Contributors: # # Description: -# Pro file of devicemanagementnotifiersplugin +# Pro file of devicemgmtdialogsplugin # # @@ -23,6 +23,7 @@ plugin INCLUDEPATH += . DEPENDPATH += . +INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE DESTDIR = $${HB_BUILD_DIR}/plugins/devicedialogs @@ -54,6 +55,10 @@ pluginstub.path = /resource/plugins/devicedialogs DEPLOYMENT += pluginstub MMP_RULES += "LIBRARY syncmlclientapi.lib centralrepository.lib flogger.lib" + + BLD_INF_RULES.prj_exports += \ + "$${LITERAL_HASH}include " \ + "rom/devicemgmtdialogsplugin.iby CORE_APP_LAYER_IBY_EXPORT_PATH(devicemgmtdialogsplugin.iby)" } !local { target.path = $${HB_PLUGINS_DIR}/devicedialogs diff -r d3981f4fe6a4 -r c742e1129640 devicemgmtdialogsplugin/rom/devicemgmtdialogsplugin.iby --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/devicemgmtdialogsplugin/rom/devicemgmtdialogsplugin.iby Wed Jun 23 18:03:02 2010 +0300 @@ -0,0 +1,23 @@ +/* +* 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: +* +*/ +#ifndef __DEVICEMGMTDIALOGSPLUGIN_IBY__ +#define __DEVICEMGMTDIALOGSPLUGIN_IBY__ + +data=/epoc32/data/z/resource/plugins/devicedialogs/devicemanagementnotifiersplugin.qtplugin resource/plugins/devicedialogs/devicemanagementnotifiersplugin.qtplugin +file=ABI_DIR/BUILD_DIR/devicemanagementnotifiersplugin.dll SHARED_LIB_DIR/devicemanagementnotifiersplugin.dll + +#endif \ No newline at end of file diff -r d3981f4fe6a4 -r c742e1129640 devicemgmtdialogsplugin/src/omacppinquerydialog.cpp --- a/devicemgmtdialogsplugin/src/omacppinquerydialog.cpp Fri Jun 11 13:29:40 2010 +0300 +++ b/devicemgmtdialogsplugin/src/omacppinquerydialog.cpp Wed Jun 23 18:03:02 2010 +0300 @@ -57,7 +57,8 @@ loader.load(":/xml/resources/pin.docml", &ok); if (!ok) { - return; + qFatal("omacppinquerydialog createcppinquery() Unable to read pin.docml"); + } HbDialog *dialog = qobject_cast (loader.findWidget("dialog")); diff -r d3981f4fe6a4 -r c742e1129640 deviceupdatesui/deviceupdatesplugin/deviceupdatesplugin.pro --- a/deviceupdatesui/deviceupdatesplugin/deviceupdatesplugin.pro Fri Jun 11 13:29:40 2010 +0300 +++ b/deviceupdatesui/deviceupdatesplugin/deviceupdatesplugin.pro Wed Jun 23 18:03:02 2010 +0300 @@ -30,7 +30,7 @@ LIBS += -lcpframework \ -lcentralrepository \ -lws32 \ - -lapparc + -lapgrfx # Input HEADERS += deviceupdatesplugin.h \ diff -r d3981f4fe6a4 -r c742e1129640 omadmadapters/bld/bld.inf --- a/omadmadapters/bld/bld.inf Fri Jun 11 13:29:40 2010 +0300 +++ b/omadmadapters/bld/bld.inf Wed Jun 23 18:03:02 2010 +0300 @@ -25,12 +25,12 @@ #include "../syncmldm/bld/bld.inf" #include "../syncmldm12/bld/bld.inf" //#include "../browseradapter/bld/bld.inf" -//#include "../streamingadapter/bld/bld.inf" +#include "../streamingadapter/bld/bld.inf" #include "../globalwlansettings/group/bld.inf" //#include "../nsmldminternet/group/bld.inf" #include "../nsmldmalwaysonadapter/group/bld.inf" -//#include "../nsmldmbmadapter/group/bld.inf" +#include "../nsmldmbmadapter/group/bld.inf" #include "../connmoadapter/group/bld.inf" #ifdef __SYNCML_DM_DS @@ -38,7 +38,7 @@ #endif #ifdef __SYNCML_DM_EMAIL -//#include "../email/bld/bld.inf" +#include "../email/bld/bld.inf" #endif #ifdef __SYNCML_DM_MMS diff -r d3981f4fe6a4 -r c742e1129640 omadmadapters/email/bld/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omadmadapters/email/bld/bld.inf Wed Jun 23 18:03:02 2010 +0300 @@ -0,0 +1,25 @@ +/* +* Copyright (c) 2004 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: build info file for email settings adapter +* +*/ + + + + +PRJ_MMPFILES +./nsmldmemailadapter.mmp + + +// End of File \ No newline at end of file diff -r d3981f4fe6a4 -r c742e1129640 omadmadapters/email/bld/nsmldmemailadapter.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omadmadapters/email/bld/nsmldmemailadapter.mmp Wed Jun 23 18:03:02 2010 +0300 @@ -0,0 +1,51 @@ +/* +* Copyright (c) 2004 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: Project file for SyncML DM Email adapter +* +*/ + + + + +#include "defaultcaps.hrh" +#include + +CAPABILITY CAP_ECOM_PLUGIN +TARGET nsmldmemailadapter.dll +TARGETTYPE PLUGIN +UID 0x10009D8D 0x101F6E34 +VENDORID VID_DEFAULT + +APP_LAYER_SYSTEMINCLUDE +SYSTEMINCLUDE /epoc32/include/ecom + +SOURCEPATH ../src +USERINCLUDE ../inc ../../inc +SOURCE nsmldmemailadapter.cpp + +START RESOURCE nsmldmemailadapter.rss +TARGET nsmldmemailadapter.rsc +LANGUAGE_IDS +END + + + +LIBRARY euser.lib ecom.lib msgs.lib charconv.lib imcm.lib nsmldebug.lib commdb.lib +LIBRARY efsrv.lib sysutil.lib nsmldmiapmatcher.lib +LIBRARY etel.lib // RTelServer +LIBRARY etelmm.lib // RMobilePhone + + +SMPSAFE +// End of File diff -r d3981f4fe6a4 -r c742e1129640 omadmadapters/email/inc/nsmldmemailadapter.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omadmadapters/email/inc/nsmldmemailadapter.h Wed Jun 23 18:03:02 2010 +0300 @@ -0,0 +1,744 @@ +/* +* Copyright (c) 2004 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 Email Settings Adapter + * +*/ + + + + + +#ifndef __NSMLDMEMAILADAPTER_H__ +#define __NSMLDMEMAILADAPTER_H__ + +// ----------------------------------------------------------------------------- +// Includes +// ----------------------------------------------------------------------------- +#include +#include +#include + +// ----------------------------------------------------------------------------- +// Class forwards +// ----------------------------------------------------------------------------- +class CImSmtpSettings; +class CImPop3Settings; +class CImImap4Settings; +class CImIAPPreferences; +class CMsvSession; +class CEmailAccounts; + + +// ----------------------------------------------------------------------------- +// Definitions +// ----------------------------------------------------------------------------- + +// the DDF version must be changed if any changes in DDF structure +// ( built in DDFStructureL() function ) +// +_LIT8( KNSmlDMEmailDDFVersion, "1.1" ); + +_LIT8( KNSmlDMEmailTextPlain, "text/plain" ); +_LIT8( KNSmlDMEmailNodeName, "Email" ); +_LIT8( KNSmlDMEmailDescription, "The interior object holds all email objects" ); +_LIT8( KNSmlDMDynamicNodeDescription, "Placeholder for one or more Email objects" ); +_LIT8( KNSmlDMNameDescription, "Displayable Account Name for the Email Settings" ); +_LIT8( KNSmlDMUIDDescription, "User ID for email account" ); +_LIT8( KNSmlDMPWDescription, "Password for email account " ); +_LIT8( KNSmlDMUAddrDescription, "User's email address" ); +_LIT8( KNSmlDMUNameDescription, "Displayable name for the user" ); +_LIT8( KNSmlDMMrcvDescription, "Host name of the receiving (IMAP/POP3) server" ); +_LIT8( KNSmlDMMsndDescription, "Host name of the SMTP server" ); +_LIT8( KNSmlDMMproDescription, "Remote mailbox protocol" ); +_LIT8( KNSmlDMUseSecConDescription, "Secure connection is used or not" ); +_LIT8( KNSmlDMUseSauthDescription, "SMTP authentication is used or not" ); +_LIT8( KNSmlDMSauthUIDDescription, "SMTP authenticatio user Id" ); +_LIT8( KNSmlDMSauthPWDescription, "SMTP authentication password" ); +_LIT8( KNSmlDMPtxtSAuthDescription, "Plain text SMTP authentication is allowed or not" ); +_LIT8( KNSmlDMDelFetDescription, "Defines whether to delete fetched mail from remote server" ); +_LIT8( KNSmlDMUseAPOPDescription, "Defines whether the APOP is used or not" ); +_LIT8( KNSmlDMRcvPortDescription, "Port for IMAP4 or POP3" ); +_LIT8( KNSmlDMSndPortDescription, "Port for SMTP" ); +_LIT8( KNSmlDMToNapIDDescription, "Link to connectivity information" ); + +_LIT8( KNSmlDMSToNapIDDescription, "Link to connectivity information for sending SMTP" ); +_LIT8( KNSmlDMSUseSecConDescription, "Defines whether SSL/TLS security is used in SMTP" ); +_LIT8( KNSmlDMUseStartTLSDescription, "Defines whether StartTLS is used in IMAP/POP" ); +_LIT8( KNSmlDMSUseStartTLSDescription, "Defines whether StartTLS is in SMTP" ); +_LIT8( KNSmlDMMrcvPortDescription, "Defines the port number of the IMAP/POP server" ); +_LIT8( KNSmlDMMsndPortDescription, "Defines the port number of the SMTP server" ); +_LIT8( KNSmlDMFolderPathDescription, "Defines the mailbox folder path" ); + +_LIT8( KNSmlDMEmailDynamicNode, "" ); +_LIT8( KNSmlDMEmailName, "Name" ); +_LIT8( KNSmlDMEmailUID, "UID" ); +_LIT8( KNSmlDMEmailPW, "PW" ); +_LIT8( KNSmlDMEmailUAddr, "UAddr" ); +_LIT8( KNSmlDMEmailUName, "UName" ); +_LIT8( KNSmlDMEmailMrcv, "Mrcv" ); +_LIT8( KNSmlDMEmailMsnd, "Msnd" ); +_LIT8( KNSmlDMEmailMpro, "Mpro" ); +_LIT8( KNSmlDMEmailUseAPOP, "UseAPOP" ); +_LIT8( KNSmlDMEmailUseSecCon, "UseSecCon" ); +_LIT8( KNSmlDMEmailUseSauth, "UseSauth" ); +_LIT8( KNSmlDMEmailSauthUID, "SauthUID" ); +_LIT8( KNSmlDMEmailSauthPW, "SauthPW" ); +_LIT8( KNSmlDMEmailPtxtSAuth, "PtxtSAuth" ); +//_LIT8( KNSmlDMEmailRcvPort, "RcvPort" ); +//_LIT8( KNSmlDMEmailSndPort, "SndPort" ); +_LIT8( KNSmlDMEmailToNapID, "ToNapID" ); +_LIT8( KNSmlDMEmailIAPUri, "AP" ); + +_LIT8( KNSmlDMEmailSToNapID, "SToNapID" ); +_LIT8( KNSmlDMEmailSUseSecCon, "SUseSecCon" ); +_LIT8( KNSmlDMEmailUseStartTLS, "UseStartTLS" ); +_LIT8( KNSmlDMEmailSUseStartTLS, "SUseStartTLS" ); +_LIT8( KNSmlDMEmailMrcvPort, "MrcvPort" ); +_LIT8( KNSmlDMEmailMsndPort, "MsndPort" ); +_LIT8( KNSmlDMEmailFolderPath, "FolderPath" ); + +_LIT8( KNSmlDMEmailMproPOP, "POP" ); +_LIT8( KNSmlDMEmailMproIMAP, "IMAP" ); +_LIT8( KNSmlDMEmailTrue, "True" ); +_LIT8( KNSmlDMEmailFalse, "False" ); + +_LIT8( KNSmlDMEmailListOfLeafs, "Name/UID/PW/UAddr/UName/Mrcv/Msnd/Mpro/UseSecCon/UseSauth/SauthUID/SauthPW/PtxtSAuth/ToNapID/SToNapID/SUseSecCon/UseStartTLS/SUseStartTLS/MrcvPort/MsndPort/UseAPOP/FolderPath" ); +_LIT8( KNSmlDMEmailSeparator8, "/" ); +_LIT8( KNSmlEmailUriDotSlash, "./"); + +const TInt KNSmlDmFatMinimumFileSize = 512; +const TInt KNSmlSmtpMessageTypeValue = 0x10001028; +const TInt KNSmlDefaultMaxLimit = 1024*10; //maximum message size (default) +const TInt KNSmlDmEmailGranularity = 4; +const TUint32 KNSmlDmEmailAlwaysAskIap = 0; + +const TInt KNSmlDMEmailNormalSmtpPort = 25; +const TInt KNSmlDMEmailSslSmtpPort = 465; +const TInt KNSmlDMEmailNormalImap4Port = 143; +const TInt KNSmlDMEmailNormalPop3Port = 110; +const TInt KNSmlDMEmailSslWrappedImap4Port = 993; +const TInt KNSmlDMEmailSslWrappedPop3Port = 995; +const TInt KNSmlDMEmailDefaultHeaderCount = 30; + +const TInt KNSmlDmEmailImapLuidLow = 50000; +const TInt KNSmlDmEmailImapLuidHigh = 100000; +const TInt KNSmlDmEmailPopLuidHigh = 150000; +const TUint32 KNSmlDMEmailMaxPortNbr = 0xffff; + +/** +* The main class of the SyncML DM Email adapter. +* +* @since +*/ +class CNSmlDmEmailAdapter : public CSmlDmAdapter, public MMsvSessionObserver + { +public: + /** + * The one phase constructor + * + */ + static CNSmlDmEmailAdapter* NewL(MSmlDmCallback* aDmCallback ); + + /** + * The destructor + * + */ + virtual ~CNSmlDmEmailAdapter(); + + // Adapter interface from CSmlDmAdapter + /** + * 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 + */ + + void DDFVersionL( CBufBase& aDDFVersion ); + /** + * 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 + */ + 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 + */ + void UpdateLeafObjectL( const TDesC8& aURI, const TDesC8& aLUID, + const TDesC8& aObject, 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 + */ + void DeleteObjectL( const TDesC8& aURI, const TDesC8& aLUID, + const 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 + */ + void FetchLeafObjectL( const TDesC8& aURI, const TDesC8& aLUID, + const TDesC8& aType, const TInt aResultsRef, + const 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 + */ + void ChildURIListL( const TDesC8& aURI, + const TDesC8& aLUID, + const CArrayFix& aPreviousURISegmentList, + const TInt aResultsRef, const 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 + */ + void AddNodeObjectL( const TDesC8& aURI, const TDesC8& aParentLUID, + const 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 + */ + void UpdateLeafObjectL( const TDesC8& aURI, const TDesC8& aLUID, + RWriteStream*& aStream, const TDesC8& aType, + const 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 + */ + void FetchLeafObjectSizeL( const TDesC8& aURI, const TDesC8& aLUID, + const TDesC8& aType, const TInt aResultsRef, + const 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 + */ + void ExecuteCommandL( const TDesC8& aURI, const TDesC8& aLUID, + const TDesC8& aArgument, const TDesC8& aType, + const 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 + */ + void ExecuteCommandL( const TDesC8& aURI, const TDesC8& aLUID, + RWriteStream*& aStream, const TDesC8& aType, + const 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 + */ + 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 + */ + void StartAtomicL(); + /** + * The function indicates successful end of Atomic command. The adapter + * should commit all changes issued between StartAtomicL() and + * CommitAtomicL() + * @publishedPartner + * @prototype + */ + 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 + */ + 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 + */ + 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 + */ + void StreamCommittedL(); + /** + * 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 + */ + void CompleteOutstandingCmdsL(); + +protected: + /** + * Inherited from MMsvSessionObserver + * Indicates an event has occurred. + * @param aEvent Indicates the event type. + * @param aArg1 Event type-specific argument value + * @param aArg2 Event type-specific argument value + * @param aArg3 Event type-specific argument value + */ + void HandleSessionEventL( TMsvSessionEvent aEvent, TAny* aArg1, TAny* aArg2, + TAny* aArg3 ); + +private: + +struct TNSmlEmailCommandElement + { + HBufC8* iLastUriSeg; + HBufC8* iData; + TInt iStatusRef; + TBool iLeaf; + CSmlDmAdapter::TError iStatus; + }; + +enum TNSmlEmailAccountType + { + EImap, + EPop, + EUnknown + }; + +enum TNSmlEmailSecuritySetting + { + EUseSecCon = 1, + EUseStartTls, + ESuseSecCon, + ESuseStartTls, + }; + +struct TNSmlEmailSettingsElement + { + CArrayFixFlat *iNodeBuf; + /* iMappingName = Email/xxxx */ + HBufC8* iMappingName; + HBufC* iName; + CImSmtpSettings* iSmtpSettings; + CImPop3Settings* iPop3Settings; + CImImap4Settings* iImap4Settings; + CImIAPPreferences* iIapPref; + CImIAPPreferences* iSmtpIapPref; + + TBool iExecuted; + TInt iLuid; + TBool iJustFetch; + CNSmlDmEmailAdapter::TNSmlEmailAccountType iAccType; + TInt iAccId; + TMsvId iServiceId; + }; + + /** + * C++ default constructor. + */ + void ConstructL(); + CNSmlDmEmailAdapter(); + CNSmlDmEmailAdapter( MSmlDmCallback* aDmCallback ); + + /** + * Initializes the buffer for leaf nodes. + * @param aURI URI of the object + * @param aObject The data to be updated + * @param aStatusRef The status reference + * @param aIndex The index to command buffer + * @return status of the operation + */ + TInt FirstAddLeafL(const TDesC8& aURI, + const TDesC8& aObject, + TInt aStatusRef, + TInt aIndex); + + /** + * Updates the value of leaf object + * @param aLastUriSeg URI of the object + * @param aObject The data to be updated + * @param aIndex The index to node buffer + * @param aCommand The index to command buffer + * @return status of the operation + */ + TInt DoAddLeafObjectL(const TDesC8& aLastUriSeg, + const TDesC8& aObject, + TInt aIndex, + TInt aCommand); + + /** + * Set the default values to email account + * @param aIndex The index to node buffer + * @return none + */ + void SetDefaultSettingsL(TInt aIndex); + + /** + * Converts 16bit descriptor to integer + * @param aLuid The descriptor to be converted + * @return Integer value of the descriptor + */ + TInt DesToInt(const TDesC& aLuid) const; + + /** + * Converts 8bit descriptor to integer + * @param aLuid The descriptor to be converted + * @return Integer value of the descriptor + */ + TInt DesToInt(const TDesC8& aLuid) const; + + /** + * Converts integer to 16bit descriptor + * @param aLuid The integer to be converted + * @return The Integer as a descriptor + */ + HBufC* IntToDesLC(const TInt aLuid) const; + + /** + * Converts integer to 8bit descriptor + * @param aLuid The integer to be converted + * @return The Integer as a descriptor + */ + HBufC8* IntToDes8LC(const TInt aLuid) const; + + /** + * Converts 16bit descriptor to 8bit descriptor + * @param aSource The descriptor to be converted + * @return The 8bit descriptor + */ + HBufC8* ConvertTo8LC( const TDesC& aSource ) const; + + /** + * Transfers the email settings from memory to phones permanent data store + * @param aIndex The index to command buffer + * @return Luid of the email account + */ + TInt ValidateAndStoreSettingsL(TInt aIndex); + + /** + * Restores the settings to the adapter from phones permanent data store + * @param aIndex The index to command buffer + * @return Status of the operation + */ + TInt DoRestoreSettingsL(TInt aIndex); + + /** + * Opens the CMsvSession if it is not open already + * @param none + * @return Status of the operation + */ + TInt OpenSessionL(); + + /** + * Parses the last URI segment from URI + * @param aURI The whole URI + * @return The last URI segment + */ + TPtrC8 LastURISeg(const TDesC8& aURI) const; + + /** + * Removes the last URI segment from URI + * @param aURI The whole URI + * @return The aURI without the last URI segment + */ + TPtrC8 RemoveLastURISeg(const TDesC8& aURI) const; + + /** + * Calculates the number of URI segments + * @param aURI The whole URI + * @return The number of URI segments + */ + TInt NumOfURISegs(const TDesC8& aURI) const; + + /** + * Fills the DDF node with desired properties + * @param aNode Reference to node or leaf which info to be filled. + * @param aAccTypes Access rights for a leaf / node. + * @param aOccurrence Occurance of the node / leaf. + * @param aScope Scope (dynamic / permanent) of the leaf / node. + * @param aFormat Data format of the leaf / node. + * @param aDescription Description of the node / leaf. + * @param aDefaultValue Default value for a leaf or node. + * @return none + */ + void FillNodeInfoL( MSmlDmDDFObject& aNode, + const TSmlDmAccessTypes& aAccTypes, + MSmlDmDDFObject::TOccurence aOccurrence, + MSmlDmDDFObject::TScope aScope, + MSmlDmDDFObject::TDFFormat aFormat, + const TDesC8& aDescription) const; + + /** + * Parses the dot and slash in start of URI away + * @param aURI The whole URI + * @return The URI without dot and slash in start + */ + TPtrC8 RemoveDotSlash(const TDesC8& aURI) const; + + /** + * Fetches the value of leaf node + * @param aURI The whole URI + * @param aLUID The LUID + * @param aObject The storage for the result + * @return Status of the operation + */ + CSmlDmAdapter::TError FetchObjectL(const TDesC8& aURI, + const TDesC8& aLUID, + CBufBase& aObject); + + /** + * Calculates correct account id from the LUID + * @param aAccType Account Type + * @param aAccId Account ID + * @param aLuid The LUID + * @return none + */ + void GetIdByLuid( TNSmlEmailAccountType& aAccType, + TInt& aAccId, const TInt aLuid ) const; + + /** + * Calculates LUID from the account id + * @param aAccType Account Type + * @param aAccId Account ID + * @param aLuid The LUID + * @return none + */ + void SetLuidById( const TNSmlEmailAccountType& aAccType, + const TInt& aAccId, TInt& aLuid ) const; + + /** + * Checks if the account with given id exists + * @param aAccs Pointer to CEmailAccount object + * @param aAccType Account Type + * @param aId Account ID + * @param aIndex The LUIDIndex to the command buffer + * @return True if the account exists + */ + TBool AccountExistsL( CEmailAccounts* aAccs, + const TNSmlEmailAccountType aAccType, + const TInt aId, + TInt aIndex ); + + /** + * Sets the parameters related to STARTTLS and SSL/TLS + * @param aObject The value(True/False) to be set + * @param aThisElem The element of which value is to be set. + * @param aSetting The setting which value is to be set + * @return none + */ + void SetDefaultSecurityL(const TDesC8& aObject, + const TNSmlEmailSettingsElement* aThisElem, + const TNSmlEmailSecuritySetting aSetting + ) const; + + /** + * Fetches the parameters related to STARTTLS and SSL/TLS + * @param aObject The storage for the value + * @param aElem The element of which value is fetched. + * @param aSetting The setting which value is fetched. + * @return Status of the operation + */ + CSmlDmAdapter::TError FetchSecurityValueL(CBufBase& aObject, + const TNSmlEmailSettingsElement* aElem, + const TNSmlEmailSecuritySetting aSetting ) const; + + /** + * Creates the mapping for the email account preset + * @param aURI The whole URI + * @return the luid of the email account specified im aURI, else -1 + */ + TInt ConstructTreeL(const TDesC8& aURI); + + /** + * The function extracts Email/x node from aURI + * @param aURI Email aURI. + * @return Email/x node. + */ + TPtrC8 GetDynamicEmailNodeUri( const TDesC8& aURI ); + +private: + // Pointer to CMsvSession + CMsvSession* iMsvSession; + // The buffer for received commands + CArrayFixFlat* iBuffer; + }; + +#endif // __NSMLDMEMAILADAPTER_H__ + +// End of File diff -r d3981f4fe6a4 -r c742e1129640 omadmadapters/email/sis/emailadapter.pkg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omadmadapters/email/sis/emailadapter.pkg Wed Jun 23 18:03:02 2010 +0300 @@ -0,0 +1,35 @@ +; +; 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 dm adapters +; This is part of omadmextensions. +; +&EN + +; standard SIS file header +#{"nsmlemailadapter"},(0x101F6E34),2,0,0,TYPE=SA + +;Localised Vendor name +%{"Nokia-EN"} + +;Unique Vendor name +:"Nokia" + +;Supports Series 60 v 3.0 +;[0x101F6E34], 0, 0, 0, {"Series60ProductID"} + +;Files to install +;Exes to be installed +"\EPOC32\RELEASE\ARMV5\UREL\nsmldmemailadapter.dll" -"!:\sys\bin\nsmldmemailadapter.dll" +; Application resource files to be installed +"\EPOC32\data\z\resource\plugins\nsmldmemailadapter.Rsc" -"!:\resource\plugins\nsmldmemailadapter.Rsc" diff -r d3981f4fe6a4 -r c742e1129640 omadmadapters/email/sis/gensis.bat --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omadmadapters/email/sis/gensis.bat Wed Jun 23 18:03:02 2010 +0300 @@ -0,0 +1,19 @@ +rem +rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +rem All rights reserved. +rem This component and the accompanying materials are made available +rem under the terms of "Eclipse Public License v1.0" +rem which accompanies this distribution, and is available +rem at the URL "http://www.eclipse.org/legal/epl-v10.html". +rem +rem Initial Contributors: +rem Nokia Corporation - initial contribution. +rem +rem Contributors: +rem +rem Description: Implementation of dm adapters +rem This is part of omadmextensions. +rem + +makesis emailadapter.pkg +signsis emailadapter.SIS emailadapter.SISX \S60\mw\contentmanagement\swinstalleruis\Appinstui\internal\RD_rootCA\rd.cer \s60\mw\contentmanagement\swinstalleruis\appinstui\internal\RD_rootca\rd-key.pem \ No newline at end of file diff -r d3981f4fe6a4 -r c742e1129640 omadmadapters/email/src/nsmldmemailadapter.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omadmadapters/email/src/nsmldmemailadapter.cpp Wed Jun 23 18:03:02 2010 +0300 @@ -0,0 +1,3364 @@ +/* +* Copyright (c) 2004 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 Email Settings Adapter + * +*/ + + + + +#include // For TImplementationProxy definition +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "nsmldmimpluids.h" +#include "nsmldmemailadapter.h" +#include "nsmldebug.h" +#include "nsmlconstants.h" +#include "nsmldmconst.h" +#include "nsmldmiapmatcher.h" + +#ifndef __WINS__ +// This lowers the unnecessary compiler warning (armv5) to remark. +// "Warning: #174-D: expression has no effect..." is caused by +// DBG_ARGS8 macro in no-debug builds. +#pragma diag_remark 174 +#endif + +// ----------------------------------------------------------------------------- +// CNSmlDmEmailAdapter* CNSmlDmEmailAdapter::NewL( ) +// ----------------------------------------------------------------------------- +CNSmlDmEmailAdapter* CNSmlDmEmailAdapter::NewL(MSmlDmCallback* aDmCallback ) + { + _DBG_FILE("CNSmlDmEmailAdapter::NewL(): begin"); + CNSmlDmEmailAdapter* self = new (ELeave) CNSmlDmEmailAdapter(aDmCallback); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(); + _DBG_FILE("CNSmlDmEmailAdapter::NewL(): end"); + return self; + } + +// ----------------------------------------------------------------------------- +// CNSmlDmEmailAdapter::CNSmlDmEmailAdapter() +// ----------------------------------------------------------------------------- + +CNSmlDmEmailAdapter::CNSmlDmEmailAdapter( MSmlDmCallback* aDmCallback ) + : CSmlDmAdapter(aDmCallback) + { + _DBG_FILE("CNSmlDmEmailAdapter::CNSmlDmEmailAdapter(): begin"); + iMsvSession = NULL; + _DBG_FILE("CNSmlDmEmailAdapter::CNSmlDmEmailAdapter(): end"); + } + +// ----------------------------------------------------------------------------- +// CNSmlDmEmailAdapter::ConstructL() +// ----------------------------------------------------------------------------- +void CNSmlDmEmailAdapter::ConstructL() + { + iBuffer = new (ELeave) CArrayFixFlat + (KNSmlDmEmailGranularity); + } + +// ----------------------------------------------------------------------------- +// CNSmlDmEmailAdapter::~CNSmlDmEmailAdapter() +// ----------------------------------------------------------------------------- +CNSmlDmEmailAdapter::~CNSmlDmEmailAdapter() + { + _DBG_FILE("CNSmlDmEmailAdapter::~CNSmlDmEmailAdapter(): begin"); + delete iMsvSession; + if(iBuffer) + { + for(TInt i=0;iCount();i++) + { + delete iBuffer->At(i).iMappingName; + delete iBuffer->At(i).iName; + delete iBuffer->At(i).iSmtpSettings; + delete iBuffer->At(i).iPop3Settings; + delete iBuffer->At(i).iImap4Settings; + delete iBuffer->At(i).iIapPref; + delete iBuffer->At(i).iSmtpIapPref; + + if(iBuffer->At(i).iNodeBuf) + { + for(TInt j=0;jAt(i).iNodeBuf->Count();j++) + { + delete iBuffer->At(i).iNodeBuf->At(j).iLastUriSeg; + delete iBuffer->At(i).iNodeBuf->At(j).iData; + } + iBuffer->At(i).iNodeBuf->Reset(); + delete iBuffer->At(i).iNodeBuf; + } + } + iBuffer->Reset(); + delete iBuffer; + } + + _DBG_FILE("CNSmlDmEmailAdapter::~CNSmlDmEmailAdapter(): end"); + } + +// ----------------------------------------------------------------------------- +// CNSmlDmEmailAdapter::DDFVersionL() +// ----------------------------------------------------------------------------- +void CNSmlDmEmailAdapter::DDFVersionL(CBufBase& aDDFVersion) + { + _DBG_FILE("CNSmlDmEmailAdapter::DDFVersionL(TDes& aDDFVersion): begin"); + aDDFVersion.InsertL(0,KNSmlDMEmailDDFVersion); + _DBG_FILE("CNSmlDmEmailAdapter::DDFVersionL(TDes& aDDFVersion): end"); + } + + +// ----------------------------------------------------------------------------- +// CNSmlDmEmailAdapter::DDFStructureL() +// +// ----------------------------------------------------------------------------- +void CNSmlDmEmailAdapter::DDFStructureL(MSmlDmDDFObject& aDDF) + { + _DBG_FILE("CNSmlDmEmailAdapter::DDFStructureL(): begin"); + + TSmlDmAccessTypes accessTypesNode; + + accessTypesNode.SetGet(); + + // Email + MSmlDmDDFObject& email = aDDF.AddChildObjectL(KNSmlDMEmailNodeName); + FillNodeInfoL(email,accessTypesNode,MSmlDmDDFObject::EOne, + MSmlDmDDFObject::EPermanent, + MSmlDmDDFObject::ENode,KNSmlDMEmailDescription); + + accessTypesNode.SetAdd(); + accessTypesNode.SetDelete(); + accessTypesNode.SetReplace(); + MSmlDmDDFObject& rtNode = email.AddChildObjectGroupL(); + + + FillNodeInfoL(rtNode,accessTypesNode,MSmlDmDDFObject::EZeroOrMore, + MSmlDmDDFObject::EDynamic,MSmlDmDDFObject::ENode, + KNSmlDMDynamicNodeDescription); + + TSmlDmAccessTypes accessTypes; + accessTypes.SetGet(); + accessTypes.SetAdd(); + accessTypes.SetReplace(); + //displayable account name + MSmlDmDDFObject& name = rtNode.AddChildObjectL(KNSmlDMEmailName); + FillNodeInfoL(name,accessTypes,MSmlDmDDFObject::EZeroOrOne, + MSmlDmDDFObject::EDynamic,MSmlDmDDFObject::EChr, + KNSmlDMNameDescription); + + //user id for email account + MSmlDmDDFObject& uid = rtNode.AddChildObjectL(KNSmlDMEmailUID); + FillNodeInfoL(uid,accessTypes,MSmlDmDDFObject::EOne, + MSmlDmDDFObject::EDynamic,MSmlDmDDFObject::EChr, + KNSmlDMUIDDescription); + + //password for email account + TSmlDmAccessTypes accessTypesPw; + accessTypesPw.SetAdd(); + accessTypesPw.SetReplace(); + MSmlDmDDFObject& pw = rtNode.AddChildObjectL(KNSmlDMEmailPW); + FillNodeInfoL(pw,accessTypesPw,MSmlDmDDFObject::EZeroOrOne, + MSmlDmDDFObject::EDynamic,MSmlDmDDFObject::EChr, + KNSmlDMPWDescription); + + //user's email address + MSmlDmDDFObject& uaddr = rtNode.AddChildObjectL(KNSmlDMEmailUAddr); + FillNodeInfoL(uaddr,accessTypes,MSmlDmDDFObject::EOne, + MSmlDmDDFObject::EDynamic,MSmlDmDDFObject::EChr, + KNSmlDMUAddrDescription); + + //Displayable name for the user + MSmlDmDDFObject& uname = rtNode.AddChildObjectL(KNSmlDMEmailUName); + FillNodeInfoL(uname,accessTypes,MSmlDmDDFObject::EZeroOrOne, + MSmlDmDDFObject::EDynamic,MSmlDmDDFObject::EChr, + KNSmlDMUNameDescription); + + //Host name for the receiving server + MSmlDmDDFObject& mrcv = rtNode.AddChildObjectL(KNSmlDMEmailMrcv); + FillNodeInfoL(mrcv,accessTypes,MSmlDmDDFObject::EOne, + MSmlDmDDFObject::EDynamic,MSmlDmDDFObject::EChr, + KNSmlDMMrcvDescription); + + //Host name for the sending server + MSmlDmDDFObject& msnd = rtNode.AddChildObjectL(KNSmlDMEmailMsnd); + FillNodeInfoL(msnd,accessTypes,MSmlDmDDFObject::EOne, + MSmlDmDDFObject::EDynamic,MSmlDmDDFObject::EChr, + KNSmlDMMsndDescription); + + //Remote mailbox protocol + MSmlDmDDFObject& mpro = rtNode.AddChildObjectL(KNSmlDMEmailMpro); + FillNodeInfoL(mpro,accessTypes,MSmlDmDDFObject::EOne, + MSmlDmDDFObject::EDynamic,MSmlDmDDFObject::EChr, + KNSmlDMMproDescription); + + //Use secure connection + MSmlDmDDFObject& useSecCon = rtNode.AddChildObjectL(KNSmlDMEmailUseSecCon); + FillNodeInfoL(useSecCon,accessTypes,MSmlDmDDFObject::EZeroOrOne, + MSmlDmDDFObject::EDynamic,MSmlDmDDFObject::EBool, + KNSmlDMUseSecConDescription); + + //Use APop + MSmlDmDDFObject& useAPOP = rtNode.AddChildObjectL(KNSmlDMEmailUseAPOP); + FillNodeInfoL(useAPOP, accessTypes, MSmlDmDDFObject::EZeroOrOne, + MSmlDmDDFObject::EDynamic, MSmlDmDDFObject::EBool, + KNSmlDMUseAPOPDescription ); + + //Use smtp authentication + MSmlDmDDFObject& useSauth = rtNode.AddChildObjectL(KNSmlDMEmailUseSauth); + FillNodeInfoL(useSauth,accessTypes,MSmlDmDDFObject::EZeroOrOne, + MSmlDmDDFObject::EDynamic,MSmlDmDDFObject::EBool, + KNSmlDMUseSauthDescription); + + //smtp authentication user id + MSmlDmDDFObject& sauthUid = rtNode.AddChildObjectL(KNSmlDMEmailSauthUID); + FillNodeInfoL(sauthUid,accessTypes,MSmlDmDDFObject::EZeroOrOne, + MSmlDmDDFObject::EDynamic,MSmlDmDDFObject::EChr, + KNSmlDMSauthUIDDescription); + + //Use smtp authentication + MSmlDmDDFObject& sauthPw = rtNode.AddChildObjectL(KNSmlDMEmailSauthPW); + FillNodeInfoL(sauthPw,accessTypesPw,MSmlDmDDFObject::EZeroOrOne, + MSmlDmDDFObject::EDynamic,MSmlDmDDFObject::EChr, + KNSmlDMSauthPWDescription); + + //Use smtp authentication + MSmlDmDDFObject& ptxtSAuth = rtNode.AddChildObjectL(KNSmlDMEmailPtxtSAuth); + FillNodeInfoL(ptxtSAuth,accessTypes,MSmlDmDDFObject::EZeroOrOne, + MSmlDmDDFObject::EDynamic,MSmlDmDDFObject::EBool, + KNSmlDMPtxtSAuthDescription); + + //Link to IAP + MSmlDmDDFObject& toNapId = rtNode.AddChildObjectL(KNSmlDMEmailToNapID); + FillNodeInfoL(toNapId,accessTypes,MSmlDmDDFObject::EZeroOrOne, + MSmlDmDDFObject::EDynamic,MSmlDmDDFObject::EChr, + KNSmlDMToNapIDDescription); + + //Link to IAP for SMTP + MSmlDmDDFObject& sToNapId = rtNode.AddChildObjectL(KNSmlDMEmailSToNapID); + FillNodeInfoL(sToNapId,accessTypes,MSmlDmDDFObject::EZeroOrOne, + MSmlDmDDFObject::EDynamic,MSmlDmDDFObject::EChr, + KNSmlDMSToNapIDDescription); + + //SSL/TLS used in SMTP + MSmlDmDDFObject& sUseSecCon = rtNode. + AddChildObjectL(KNSmlDMEmailSUseSecCon); + FillNodeInfoL(sUseSecCon,accessTypes,MSmlDmDDFObject::EZeroOrOne, + MSmlDmDDFObject::EDynamic,MSmlDmDDFObject::EBool, + KNSmlDMSUseSecConDescription); + + //StartTLS used in IMAP/POP + MSmlDmDDFObject& useStartTls = rtNode. + AddChildObjectL(KNSmlDMEmailUseStartTLS); + FillNodeInfoL(useStartTls,accessTypes,MSmlDmDDFObject::EZeroOrOne, + MSmlDmDDFObject::EDynamic,MSmlDmDDFObject::EBool, + KNSmlDMUseStartTLSDescription); + + //StartTLS used in SMTP + MSmlDmDDFObject& sUseStartTls = rtNode. + AddChildObjectL(KNSmlDMEmailSUseStartTLS); + FillNodeInfoL(sUseStartTls,accessTypes,MSmlDmDDFObject::EZeroOrOne, + MSmlDmDDFObject::EDynamic,MSmlDmDDFObject::EBool, + KNSmlDMSUseStartTLSDescription); + + //port of IMAP/POP server + MSmlDmDDFObject& mrcvPort = rtNode.AddChildObjectL(KNSmlDMEmailMrcvPort); + FillNodeInfoL(mrcvPort,accessTypes,MSmlDmDDFObject::EZeroOrOne, + MSmlDmDDFObject::EDynamic,MSmlDmDDFObject::EInt, + KNSmlDMMrcvPortDescription); + + //port of SMTP server + MSmlDmDDFObject& msndPort = rtNode.AddChildObjectL(KNSmlDMEmailMsndPort); + FillNodeInfoL(msndPort,accessTypes,MSmlDmDDFObject::EZeroOrOne, + MSmlDmDDFObject::EDynamic,MSmlDmDDFObject::EInt, + KNSmlDMMsndPortDescription); + + //IMAP folder path + MSmlDmDDFObject& folderPath = rtNode. + AddChildObjectL(KNSmlDMEmailFolderPath); + FillNodeInfoL(folderPath,accessTypes,MSmlDmDDFObject::EZeroOrOne, + MSmlDmDDFObject::EDynamic,MSmlDmDDFObject::EChr, + KNSmlDMFolderPathDescription); + + _DBG_FILE("CNSmlDmEmailAdapter::DDFStructureL(): end"); + } + +// ----------------------------------------------------------------------------- +// CNSmlDmEmailAdapter::UpdateLeafObjectL() +// ----------------------------------------------------------------------------- +void CNSmlDmEmailAdapter::UpdateLeafObjectL( const TDesC8& aURI, + const TDesC8& aLUID, + const TDesC8& aObject, + const TDesC8& /*aType*/, + const TInt aStatusRef ) + { + _DBG_FILE("CNSmlDmEmailAdapter::UpdateLeafObjectL(): begin"); + + TInt index = -1; + TBool firstAdd = EFalse; + + for(TInt i = 0; iCount(); i++) + { + TPtrC8 parentUri = RemoveLastURISeg(aURI); + //Check Node from buffer if match + if(iBuffer->At(i).iMappingName->Compare(parentUri) == 0 ) + { + firstAdd = ETrue; + index = i; + break; + } + } + + TInt luid = DesToInt(aLUID); + + if(aLUID.Length()==0 && index<0) + { + luid = ConstructTreeL(aURI); + if(luid == -1) + { + Callback().SetStatusL(aStatusRef, CSmlDmAdapter::ENotFound); + _DBG_FILE("CNSmlDmEmailAdapter::UpdateLeafObjectL(): end"); + return; + } + } + + if( OpenSessionL() != KErrNone ) + { + Callback().SetStatusL(aStatusRef, CSmlDmAdapter::EError); + _DBG_FILE("CNSmlDmEmailAdapter::UpdateLeafObjectL(): end"); + return; + } + + if(!firstAdd) + { + + if(LastURISeg(aURI).Compare(KNSmlDMEmailMpro)==0) + { + Callback().SetStatusL(aStatusRef, CSmlDmAdapter::EError); + _DBG_FILE("CNSmlDmEmailAdapter::UpdateLeafObjectL(): end"); + return; + } + index = -1; + for(TInt i=0;iCount();i++) + { + if(iBuffer->At(i).iLuid == luid) + { + index = i; + break; + } + } + + if(index<0) + { + TNSmlEmailSettingsElement newNode; + newNode.iImap4Settings = NULL; + newNode.iPop3Settings = NULL; + newNode.iSmtpSettings = NULL; + newNode.iIapPref = NULL; + newNode.iSmtpIapPref = NULL; + newNode.iLuid = luid; + newNode.iMappingName = aURI.AllocLC(); + newNode.iName = HBufC::NewLC(0); + newNode.iNodeBuf = new (ELeave) CArrayFixFlat + (KNSmlDmEmailGranularity); + newNode.iExecuted = ETrue; + GetIdByLuid(newNode.iAccType, newNode.iAccId, luid); + iBuffer->AppendL(newNode); + index = iBuffer->Count() - 1; + TInt err = DoRestoreSettingsL(index); + if(err!=KErrNone) + { + CleanupStack::PopAndDestroy(2); //newNode.iMappingName,newNode.iName + newNode.iMappingName = NULL; + newNode.iName = NULL; + iBuffer->At(index).iNodeBuf->Reset(); + delete iBuffer->At(index).iNodeBuf; + iBuffer->Delete(index); + } + if(err==KErrNotFound) + { + Callback().SetStatusL(aStatusRef, CSmlDmAdapter::ENotFound); + _DBG_FILE("CNSmlDmEmailAdapter::UpdateLeafObjectL(): end"); + return; + } + else if(err!=KErrNone) + { + Callback().SetStatusL(aStatusRef, CSmlDmAdapter::EError); + _DBG_FILE("CNSmlDmEmailAdapter::UpdateLeafObjectL(): end"); + return; + } + CleanupStack::Pop(2); //newNode.iMappingName,newNode.iName + } + TNSmlEmailCommandElement newCommand; + newCommand.iLastUriSeg = LastURISeg(aURI).AllocLC(); + newCommand.iData = NULL; + newCommand.iStatusRef = aStatusRef; + newCommand.iLeaf = ETrue; + newCommand.iStatus = CSmlDmAdapter::EOk; + iBuffer->At(index).iNodeBuf->AppendL(newCommand); + CleanupStack::Pop(); //newCommand.iLastUriSeg + iBuffer->At(index).iJustFetch=EFalse; + DoAddLeafObjectL(newCommand.iLastUriSeg->Des(),aObject,index, + iBuffer->At(index).iNodeBuf->Count()-1); + } + else + { + FirstAddLeafL(aURI,aObject,aStatusRef,index); + } + + _DBG_FILE("CNSmlDmEmailAdapter::UpdateLeafObjectL(): end"); + } + +// ----------------------------------------------------------------------------- +// CNSmlDmEmailAdapter::DeleteObjectL( const TDesC8& aURI, +// const TDesC8& aLUID, +// const TInt aStatusRef ) +// ----------------------------------------------------------------------------- +void CNSmlDmEmailAdapter::DeleteObjectL( const TDesC8& aURI, + const TDesC8& aLUID, + const TInt aStatusRef ) + { + _DBG_FILE("CNSmlDmEmailAdapter::DeleteLeafObjectL( ): begin"); + if(NumOfURISegs(aURI)==2) + { + if(aLUID.Length()==0) + { + Callback().SetStatusL(aStatusRef, CSmlDmAdapter::ENotFound); + _DBG_FILE("CNSmlDmEmailAdapter::DeleteLeafObjectL( ): ENotFound end"); + return; + } + + TInt luid = DesToInt(aLUID); + TInt err = OpenSessionL(); + if(err!=KErrNone) + { + Callback().SetStatusL(aStatusRef, CSmlDmAdapter::EError); + _DBG_FILE("CNSmlDmEmailAdapter::DeleteLeafObjectL( ): EError end"); + return; + } + CEmailAccounts* emailAccs = CEmailAccounts::NewLC(); + TNSmlEmailAccountType accType; + TInt id; + GetIdByLuid(accType, id, luid ); + if( AccountExistsL( emailAccs, accType, id, -1 ) ) + { + switch ( accType ) + { + case EImap: + { + RArray imap4Accs; + CleanupClosePushL( imap4Accs ); + emailAccs->GetImapAccountsL( imap4Accs ); + + for (TInt i(0); i < imap4Accs.Count(); i++) + { + if ( imap4Accs[i].iImapAccountId == id ) + { + // Delete also related Smtp account + TSmtpAccount relatedSmtp; + emailAccs->GetSmtpAccountL( imap4Accs[i].iSmtpService, relatedSmtp ); + emailAccs->DeleteImapAccountL( imap4Accs[i] ); + emailAccs->DeleteSmtpAccountL( relatedSmtp ); + //The only email a/c in phone gettiong deleted , so delete the default sntp a/c + if( imap4Accs.Count() == 1 ) + { + TInt deferr = KErrNone; + TRAP(deferr, emailAccs->DeleteDefaultSmtpAccountL()); + DBG_ARGS(_S16("CNSmlDmEmailAdapter::DeleteLeafObjectL( ): Delete default smtp account Error code %d"),deferr); + } + break; + } + } + + CleanupStack::PopAndDestroy(&imap4Accs); //imap4Accs + + // If the default account was just deleted, + // new one needs to be set. + // + TSmtpAccount defaultSmtp; + TInt retVal = emailAccs->DefaultSmtpAccountL( defaultSmtp ); + if ( retVal != KErrNone ) + { + RArray imapAccs; + CleanupClosePushL( imapAccs ); + emailAccs->GetImapAccountsL( imapAccs ); + if ( imapAccs.Count() > 0 ) + { + TSmtpAccount relatedSmtp; + emailAccs->GetSmtpAccountL( imapAccs[0].iSmtpService, relatedSmtp ); + emailAccs->SetDefaultSmtpAccountL( relatedSmtp ); + } + CleanupStack::PopAndDestroy( &imapAccs ); + RArray popAccounts; + CleanupClosePushL( popAccounts ); + emailAccs->GetPopAccountsL( popAccounts ); + if ( popAccounts.Count() > 0 ) + { + TSmtpAccount relatedSmtp; + emailAccs->GetSmtpAccountL( popAccounts[0].iSmtpService, relatedSmtp ); + emailAccs->SetDefaultSmtpAccountL( relatedSmtp ); + } + CleanupStack::PopAndDestroy( &popAccounts ); + } + break; + } + + case EPop: + { + RArray popAccs; + CleanupClosePushL( popAccs ); + emailAccs->GetPopAccountsL( popAccs ); + + for (TInt i(0); i < popAccs.Count(); i++) + { + if ( popAccs[i].iPopAccountId == id ) + { + // Delete also related Smtp account + TSmtpAccount relatedSmtp; + emailAccs->GetSmtpAccountL( popAccs[i].iSmtpService, relatedSmtp ); + emailAccs->DeletePopAccountL( popAccs[i] ); + emailAccs->DeleteSmtpAccountL( relatedSmtp ); + if( popAccs.Count() == 1 ) + { + TInt deferr = KErrNone; + TRAP(deferr, emailAccs->DeleteDefaultSmtpAccountL()); + DBG_ARGS(_S16("CNSmlDmEmailAdapter::DeleteLeafObjectL( ): Delete default smtp account Error code %d "),deferr); + } + break; + } + } + + CleanupStack::PopAndDestroy(); //popAccs + + // If the default account was just deleted, + // new one needs to be set. + // + TSmtpAccount defSmtp; + TInt retVal = emailAccs->DefaultSmtpAccountL( defSmtp ); + if ( retVal != KErrNone ) + { + RArray popAccounts; + CleanupClosePushL( popAccounts ); + emailAccs->GetPopAccountsL( popAccounts ); + if ( popAccounts.Count() > 0 ) + { + TSmtpAccount relatedSmtp; + emailAccs->GetSmtpAccountL( popAccounts[0].iSmtpService, relatedSmtp ); + emailAccs->SetDefaultSmtpAccountL( relatedSmtp ); + } + CleanupStack::PopAndDestroy( &popAccounts ); + RArray imapAccs; + CleanupClosePushL( imapAccs ); + emailAccs->GetImapAccountsL( imapAccs ); + if ( imapAccs.Count() > 0 ) + { + TSmtpAccount relatedSmtp; + emailAccs->GetSmtpAccountL( imapAccs[0].iSmtpService, relatedSmtp ); + emailAccs->SetDefaultSmtpAccountL( relatedSmtp ); + } + CleanupStack::PopAndDestroy( &imapAccs ); + } + break; + } + + default: + Callback().SetStatusL(aStatusRef, CSmlDmAdapter::ENotFound); + break; + } + + Callback().SetStatusL(aStatusRef, CSmlDmAdapter::EOk); + } + else + { + Callback().SetStatusL(aStatusRef, CSmlDmAdapter::ENotFound); + } + CleanupStack::PopAndDestroy(); //emailAccs + } + else + { + Callback().SetStatusL(aStatusRef, CSmlDmAdapter::EError); + } + + _DBG_FILE("CNSmlDmEmailAdapter::DeleteLeafObjectL( ): end"); + } + +// ----------------------------------------------------------------------------- +// CNSmlDmEmailAdapter::FetchLeafObjectL( const TDesC8& aURI, +// const TDesC8& aLUID, +// const TDesC8& aType, +// const TInt aResultsRef, +// const TInt aStatusRef ) +// +// ----------------------------------------------------------------------------- +void CNSmlDmEmailAdapter::FetchLeafObjectL( const TDesC8& aURI, + const TDesC8& aLUID, + const TDesC8& aType, + const TInt aResultsRef, + const TInt aStatusRef ) + { + _DBG_FILE("CNSmlDmEmailAdapter::FetchLeafObjectL(): begin"); + + TInt luid = DesToInt(aLUID); + + if(aLUID.Length()==0) + { + luid = ConstructTreeL(aURI); + if(luid == -1) + { + Callback().SetStatusL(aStatusRef, CSmlDmAdapter::ENotFound); + _DBG_FILE("CNSmlDmEmailAdapter::FetchLeafObjectL(): ENotFound end"); + return; + } + } + if( OpenSessionL() != KErrNone ) + { + Callback().SetStatusL(aStatusRef, CSmlDmAdapter::EError); + _DBG_FILE("CNSmlDmEmailAdapter::FetchLeafObjectL(): EError end"); + return; + } + + TInt index = -1; + for(TInt i=0;iCount();i++) + { + if(iBuffer->At(i).iLuid == luid) + { + index = i; + break; + } + } + + if(index<0) + { + TNSmlEmailSettingsElement newNode; + newNode.iImap4Settings = NULL; + newNode.iPop3Settings = NULL; + newNode.iSmtpSettings = NULL; + newNode.iIapPref = NULL; + newNode.iSmtpIapPref = NULL; + newNode.iLuid = luid; + newNode.iMappingName = aURI.AllocLC(); + newNode.iName = HBufC::NewLC(0); + newNode.iNodeBuf = new (ELeave) + CArrayFixFlat (KNSmlDmEmailGranularity); + newNode.iExecuted = ETrue; + newNode.iJustFetch = ETrue; + GetIdByLuid(newNode.iAccType, newNode.iAccId, luid); + iBuffer->AppendL(newNode); + index = iBuffer->Count() - 1; + if( DoRestoreSettingsL(index) != KErrNone ) + { + Callback().SetStatusL(aStatusRef, CSmlDmAdapter::EError); + CleanupStack::Pop(2); //newNode.iMappingName,newNode.iName + _DBG_FILE("CNSmlDmEmailAdapter::FetchLeafObjectL(): EError end"); + return; + } + CleanupStack::Pop(2); //newNode.iMappingName,newNode.iName + } + + TPtrC8 lastUriSeg = LastURISeg(aURI); + CBufBase* object = CBufFlat::NewL(32); + CleanupStack::PushL(object); + CSmlDmAdapter::TError status = CSmlDmAdapter::EOk; + + if(lastUriSeg.Compare(KNSmlDMEmailName)==0) + { + HBufC8 *data = HBufC8::NewLC(iBuffer->At(index).iName->Length()); + TPtr8 dataPtr = data->Des(); + CnvUtfConverter::ConvertFromUnicodeToUtf8( + dataPtr,iBuffer->At(index).iName->Des() ); + object->InsertL(0,dataPtr); + CleanupStack::PopAndDestroy(); //data + } + + else if(lastUriSeg.Compare(KNSmlDMEmailUID)==0) + { + HBufC *data = NULL; + if(iBuffer->At(index).iPop3Settings!= NULL) + { + data = HBufC::NewLC(iBuffer->At(index).iPop3Settings->LoginName().Length()); + data->Des().Copy(iBuffer->At(index).iPop3Settings->LoginName()); + } + else if(iBuffer->At(index).iImap4Settings!= NULL) + { + data = HBufC::NewLC(iBuffer->At(index).iImap4Settings->LoginName().Length()); + data->Des().Copy(iBuffer->At(index).iImap4Settings->LoginName()); + } + if(data) + { + HBufC8 *data8 = CnvUtfConverter::ConvertFromUnicodeToUtf8L(*data); + CleanupStack::PushL(data8); + object->InsertL(0,*data8); + CleanupStack::PopAndDestroy(2);//data, data8 + } + } + + else if(lastUriSeg.Compare(KNSmlDMEmailPW)==0) + { + HBufC *data = NULL; + if(iBuffer->At(index).iPop3Settings!= NULL) + { + data = HBufC::NewLC(iBuffer->At(index).iPop3Settings->Password().Length()); + data->Des().Copy(iBuffer->At(index).iPop3Settings->Password()); + } + else if(iBuffer->At(index).iImap4Settings!= NULL) + { + data = HBufC::NewLC(iBuffer->At(index).iImap4Settings->Password().Length()); + data->Des().Copy(iBuffer->At(index).iImap4Settings->Password()); + } + if(data) + { + HBufC8 *data8 = CnvUtfConverter::ConvertFromUnicodeToUtf8L(*data); + CleanupStack::PushL(data8); + object->InsertL(0,*data8); + CleanupStack::PopAndDestroy(2);//data, data8 + } + } + + else if(lastUriSeg.Compare(KNSmlDMEmailUAddr)==0) + { + HBufC *data = NULL; + data = iBuffer->At(index).iSmtpSettings->EmailAddress().AllocLC(); + HBufC8 *data8 = HBufC8::NewLC(data->Size()); + TPtr8 dataPtr8 = data8->Des(); + CnvUtfConverter::ConvertFromUnicodeToUtf8( dataPtr8, data->Des() ); + + object->InsertL(0,dataPtr8); + CleanupStack::PopAndDestroy(2); //data, data8 + } + + else if(lastUriSeg.Compare(KNSmlDMEmailUName)==0) + { + + HBufC *data = NULL; + data = iBuffer->At(index).iSmtpSettings->EmailAlias().AllocLC(); + HBufC8 *data8 = HBufC8::NewLC(data->Size()); + TPtr8 dataPtr8 = data8->Des(); + CnvUtfConverter::ConvertFromUnicodeToUtf8( dataPtr8, data->Des() ); + + object->InsertL(0,dataPtr8); + CleanupStack::PopAndDestroy(2); //data, data8 + } + + else if(lastUriSeg.Compare( KNSmlDMEmailMrcv)==0) + { + HBufC *data = NULL; + if(iBuffer->At(index).iPop3Settings!= NULL) + { + data = iBuffer->At(index).iPop3Settings->ServerAddress().AllocLC(); + } + else if(iBuffer->At(index).iImap4Settings!= NULL) + { + data = iBuffer->At(index).iImap4Settings->ServerAddress().AllocLC(); + } + else + { + status = CSmlDmAdapter::ENotFound; + } + if(data) + { + HBufC8 *data8 = HBufC8::NewLC(data->Size()); + TPtr8 dataPtr8 = data8->Des(); + CnvUtfConverter::ConvertFromUnicodeToUtf8( dataPtr8, data->Des() ); + + object->InsertL(0,dataPtr8); + CleanupStack::PopAndDestroy(2); //data, data8 + } + } + + else if(lastUriSeg.Compare(KNSmlDMEmailMsnd)==0) + { + HBufC *data = NULL; + data = iBuffer->At(index).iSmtpSettings->ServerAddress().AllocLC(); + HBufC8 *data8 = HBufC8::NewLC(data->Size()); + TPtr8 dataPtr8 = data8->Des(); + CnvUtfConverter::ConvertFromUnicodeToUtf8( dataPtr8, data->Des() ); + + object->InsertL(0,dataPtr8); + CleanupStack::PopAndDestroy(2); //data, data8 + } + + else if(lastUriSeg.Compare(KNSmlDMEmailMpro)==0) + { + if(iBuffer->At(index).iPop3Settings!= NULL) + { + object->InsertL(0,KNSmlDMEmailMproPOP); + } + else if(iBuffer->At(index).iImap4Settings!= NULL) + { + object->InsertL(0,KNSmlDMEmailMproIMAP); + } + } + + else if(lastUriSeg.Compare(KNSmlDMEmailUseSecCon)==0) + { + FetchSecurityValueL(*object, &iBuffer->At(index), EUseSecCon ); + } + + else if(lastUriSeg.Compare(KNSmlDMEmailUseSauth)==0) + { + if(iBuffer->At(index).iSmtpSettings->SMTPAuth()) + { + object->InsertL(0,KNSmlDMEmailTrue); + } + else + { + object->InsertL(0,KNSmlDMEmailFalse); + } + } + + else if(lastUriSeg.Compare(KNSmlDMEmailSauthUID)==0) + { + HBufC *data = HBufC::NewLC(iBuffer->At(index).iSmtpSettings->LoginName().Length()); + data->Des().Copy(iBuffer->At(index).iSmtpSettings->LoginName()); + HBufC8 *data8 = CnvUtfConverter::ConvertFromUnicodeToUtf8L(*data); + CleanupStack::PushL(data8); + object->InsertL(0,*data8); + CleanupStack::PopAndDestroy(2);//data, data8 + } + + else if(lastUriSeg.Compare(KNSmlDMEmailSauthPW)==0) + { + HBufC *data = HBufC::NewLC(iBuffer->At(index).iSmtpSettings->Password().Length()); + data->Des().Copy(iBuffer->At(index).iSmtpSettings->Password()); + HBufC8 *data8 = CnvUtfConverter::ConvertFromUnicodeToUtf8L(*data); + CleanupStack::PushL(data8); + object->InsertL(0,*data8); + CleanupStack::PopAndDestroy(2);//data, data8 + } + + else if(lastUriSeg.Compare(KNSmlDMEmailPtxtSAuth)==0) + { + if(iBuffer->At(index).iSmtpSettings->InboxLoginDetails()) + { + object->InsertL(0,KNSmlDMEmailTrue); + } + else + { + object->InsertL(0,KNSmlDMEmailFalse); + } + } + + else if (lastUriSeg.Compare(KNSmlDMEmailSUseSecCon)==0) + { + FetchSecurityValueL(*object, &iBuffer->At(index), ESuseSecCon ); + } + + else if (lastUriSeg.Compare(KNSmlDMEmailUseStartTLS)==0) + { + FetchSecurityValueL(*object, &iBuffer->At(index), EUseStartTls ); + } + + else if (lastUriSeg.Compare(KNSmlDMEmailSUseStartTLS)==0) + { + FetchSecurityValueL(*object, &iBuffer->At(index), ESuseStartTls ); + } + + else if(lastUriSeg.Compare(KNSmlDMEmailMrcvPort)==0) + { + TUint port; + if(iBuffer->At(index).iPop3Settings!= NULL) + { + port = iBuffer->At(index).iPop3Settings->Port(); + } + else + { + port = iBuffer->At(index).iImap4Settings->Port(); + } + HBufC8 *data = IntToDes8LC(port); + object->InsertL(0,data->Des()); + CleanupStack::PopAndDestroy(); //data + } + + else if(lastUriSeg.Compare(KNSmlDMEmailMsndPort)==0) + { + TUint port = iBuffer->At(index).iSmtpSettings->Port(); + HBufC8 *data = IntToDes8LC(port); + object->InsertL(0,data->Des()); + CleanupStack::PopAndDestroy(); //data + } + + else if(lastUriSeg.Compare(KNSmlDMEmailUseAPOP)==0) + { + if(iBuffer->At(index).iPop3Settings!= NULL) + { + if(iBuffer->At(index).iPop3Settings->Apop()) + { + object->InsertL(0,KNSmlDMEmailTrue); + } + else + { + object->InsertL(0,KNSmlDMEmailFalse); + } + } + else + { + status = CSmlDmAdapter::ENotFound; + } + } + + else if (lastUriSeg.Compare(KNSmlDMEmailFolderPath)==0) + { + if(iBuffer->At(index).iImap4Settings) + { + object->InsertL(0, iBuffer->At(index).iImap4Settings->FolderPath() ); + } + else + { + status = CSmlDmAdapter::ENotFound; + } + } + + else if(lastUriSeg.Compare(KNSmlDMEmailToNapID)==0) + { + + CNSmlDMIAPMatcher* iapmatch = CNSmlDMIAPMatcher::NewL( &Callback() ); + CleanupStack::PushL(iapmatch); + HBufC8* uri8 = NULL; + TInt iapCount = iBuffer->At(index).iIapPref->NumberOfIAPs(); + if ( iapCount ) + { + TImIAPChoice localIAP = iBuffer->At(index).iIapPref->IAPPreference(0); + uri8 = iapmatch->URIFromIAPIdL( localIAP.iIAP ); + } + + if( uri8 ) + { + CleanupStack::PushL(uri8); + object->InsertL(0,uri8->Des()); + status = CSmlDmAdapter::EOk; + CleanupStack::PopAndDestroy(); // uri8 + } + + CleanupStack::PopAndDestroy(); // iapMatch + } + else if(lastUriSeg.Compare(KNSmlDMEmailSToNapID)==0) + { + + // SToNapID exists only for SMTP + if (iBuffer->At(index).iSmtpSettings!= NULL) + { + CNSmlDMIAPMatcher* iapmatch = CNSmlDMIAPMatcher::NewL( &Callback() ); + CleanupStack::PushL(iapmatch); + HBufC8* uri8 = NULL; + TInt iapCount = iBuffer->At(index).iIapPref->NumberOfIAPs(); + if ( iapCount ) + { + TImIAPChoice localIAP = iBuffer->At(index).iSmtpIapPref->IAPPreference(0); + uri8 = iapmatch->URIFromIAPIdL( localIAP.iIAP ); + } + + if( uri8 ) + { + CleanupStack::PushL(uri8); + object->InsertL(0,uri8->Des()); + status = CSmlDmAdapter::EOk; + CleanupStack::PopAndDestroy(); // uri8 + } + + CleanupStack::PopAndDestroy(); // iapMatch + } + else + { + status = CSmlDmAdapter::ENotFound; + } + } + + if(status == CSmlDmAdapter::EOk) + { + Callback().SetResultsL(aResultsRef,*object,aType); + } + Callback().SetStatusL(aStatusRef, status); + CleanupStack::PopAndDestroy(object); //object + + _DBG_FILE("CNSmlDmEmailAdapter::FetchLeafObjectL(): end"); + } + +// ----------------------------------------------------------------------------- +// CNSmlDmEmailAdapter::ChildURIListL( const TDesC8& aURI, +// const TDesC8& aParentLUID, +// const CArrayFix& +// aPreviousURISegmentList, +// const TInt aResultsRef, +// const TInt aStatusRef ) +// ----------------------------------------------------------------------------- +void CNSmlDmEmailAdapter::ChildURIListL( const TDesC8& aURI, + const TDesC8& aParentLUID, + const CArrayFix& + aPreviousURISegmentList, + const TInt aResultsRef, + const TInt aStatusRef ) + { + _DBG_FILE("CNSmlDmEmailAdapter::ChildURIListL(): begin"); + + CSmlDmAdapter::TError ret = CSmlDmAdapter::EError; + + if( OpenSessionL() != KErrNone ) + { + Callback().SetStatusL(aStatusRef, ret); + _DBG_FILE("CNSmlDmEmailAdapter::ChildURIListL(): end"); + return; + } + CBufBase *currentList = CBufFlat::NewL(128); + CleanupStack::PushL(currentList); + + CEmailAccounts* emailAccs = CEmailAccounts::NewLC(); + + if(aURI.Compare(KNSmlDMEmailNodeName)==0) + { + RArray imap4Accounts; + CleanupClosePushL( imap4Accounts ); + emailAccs->GetImapAccountsL(imap4Accounts); + + // First, IMAP accounts + // + TInt luid; + TPtrC8 name; + // cycle through every found account + for(TInt count = 0; count < imap4Accounts.Count(); count++) + { + SetLuidById( EImap, imap4Accounts[count].iImapAccountId, luid ); + + TBool found = EFalse; + // cycle through every known account + for(TInt i = 0; iDes(); + uriPtr.Format(aURI); + uriPtr.Append(KNSmlDMEmailSeparator8); + uriPtr.Append(KNSmlDMEmailMproIMAP); + TUint16 crc; + Mem::Crc ( crc, &imap4Accounts[count],sizeof(TImapAccount) ); + HBufC8 *crcBuf = IntToDes8LC(crc); + uriPtr.Append(*crcBuf); + HBufC8 *luidBuf = IntToDes8LC(luid); + Callback().SetMappingL(uriPtr,luidBuf->Des()); + currentList->InsertL( currentList->Size(),LastURISeg(uriPtr)); + CleanupStack::PopAndDestroy(3); //uri,luidBuf, crcBuf + } + else + { + currentList->InsertL( currentList->Size(),name ); + } + // in all cases: add it to results. + if(count < imap4Accounts.Count()-1 ) + { + currentList->InsertL(currentList->Size(),KNSmlDMEmailSeparator8); + } + } + CleanupStack::PopAndDestroy(); //imap4Accounts + + // Then, POP accounts + // + RArray pop3Accounts; + CleanupClosePushL( pop3Accounts ); + emailAccs->GetPopAccountsL( pop3Accounts ); + if (pop3Accounts.Count()&¤tList->Size()>0) + { + // there is at least one account; insert separator + currentList->InsertL(currentList->Size(),KNSmlDMEmailSeparator8); + } + // cycle through every found account + for(TInt count = 0; count < pop3Accounts.Count(); count++) + { + SetLuidById( EPop, pop3Accounts[count].iPopAccountId, luid ); + + TBool found = EFalse; + // cycle through every known account + for(TInt i = 0; iDes(); + uriPtr.Format(aURI); + uriPtr.Append(KNSmlDMEmailSeparator8); + uriPtr.Append(KNSmlDMEmailMproPOP); + TUint16 crc; + Mem::Crc ( crc, &pop3Accounts[count],sizeof(TPopAccount) ); + HBufC8 *crcBuf = IntToDes8LC(crc); + uriPtr.Append(*crcBuf); + HBufC8 *luidBuf = IntToDes8LC(luid); + Callback().SetMappingL(uriPtr,luidBuf->Des()); + currentList->InsertL( currentList->Size(),LastURISeg(uriPtr)); + CleanupStack::PopAndDestroy(3); //uri,luidBuf,crcBuf + } + else + { + currentList->InsertL( currentList->Size(),name ); + } + // in all cases: add it to results. + if(count < pop3Accounts.Count()-1) + { + currentList->InsertL(currentList->Size(),KNSmlDMEmailSeparator8); + } + } + CleanupStack::PopAndDestroy(); //pop3Accounts + ret = CSmlDmAdapter::EOk; + } + else + { + if(aParentLUID.Length() > 0) + { + TInt err = KErrNotFound; + TInt luid = DesToInt(aParentLUID); + TNSmlEmailAccountType accType; + TInt id; + GetIdByLuid( accType, id, luid ); + switch ( accType ) + { + case EImap: + { + RArray imap4Accounts; + CleanupClosePushL( imap4Accounts ); + emailAccs->GetImapAccountsL( imap4Accounts ); + for ( TInt i=0; i pop3Accounts; + CleanupClosePushL( pop3Accounts ); + emailAccs->GetPopAccountsL(pop3Accounts); + for ( TInt i=0; iInsertL(0,KNSmlDMEmailListOfLeafs); + } + } + else + { + ret = CSmlDmAdapter::ENotFound; + } + } + // Common part + Callback().SetStatusL(aStatusRef, ret); + if( ret == CSmlDmAdapter::EOk ) + { + Callback().SetResultsL(aResultsRef,*currentList,KNullDesC8); + } + + CleanupStack::PopAndDestroy(emailAccs); //emailAccs + CleanupStack::PopAndDestroy(currentList); //currentList + _DBG_FILE("CNSmlDmEmailAdapter::ChildURIListL(): end"); + } + +// ----------------------------------------------------------------------------- +// CNSmlDmEmailAdapter::AddNodeObjectL( const TDesC8& aURI, +// const TDesC8& aParentLUID, const TInt aStatusRef ) +// ----------------------------------------------------------------------------- +void CNSmlDmEmailAdapter::AddNodeObjectL( const TDesC8& aURI, + const TDesC8& aParentLUID, + const TInt aStatusRef ) + { + _DBG_FILE("CNSmlDmEmailAdapter::AddNodeObjectL(): begin"); + + if(aParentLUID.Length()>0) + { + TInt luid = DesToInt(aParentLUID); + TInt accId; + TNSmlEmailAccountType accType; + GetIdByLuid( accType, accId, luid ); + TInt err = OpenSessionL(); + if(err!=KErrNone) + { + Callback().SetStatusL(aStatusRef, CSmlDmAdapter::EError); + _DBG_FILE("CNSmlDmEmailAdapter::AddNodeObjectL(): EError end"); + return; + } + CEmailAccounts* emailAccs = CEmailAccounts::NewLC(); + TBool accEx = AccountExistsL( emailAccs, accType, accId, -1 ); + CleanupStack::PopAndDestroy( emailAccs ); + if( accEx ) + { + Callback().SetStatusL(aStatusRef, CSmlDmAdapter::EAlreadyExists); + _DBG_FILE("CNSmlDmEmailAdapter::AddNodeObjectL(): EAlreadyExists end"); + return; + } + else + { + TInt ret = Callback().RemoveMappingL( KNSmlDMEmailAdapterImplUid, + GetDynamicEmailNodeUri(aURI), ETrue ); + if(ret != KErrNone) + { + Callback().SetStatusL(aStatusRef, CSmlDmAdapter::EError); + _DBG_FILE("CNSmlDmEmailAdapter::AddNodeObjectL(): EError end"); + return; + } + } + Callback().SetMappingL(aURI,KNullDesC8); + } + + if( aURI.Find(KNSmlDMEmailNodeName)>=0 && NumOfURISegs(aURI)==2 ) + { + if( OpenSessionL() != KErrNone ) + { + Callback().SetStatusL(aStatusRef, CSmlDmAdapter::EError); + _DBG_FILE("CNSmlDmEmailAdapter::AddNodeObjectL(): EError end"); + return; + } + + RFs fs; + User::LeaveIfError( fs.Connect() ); + CleanupClosePushL(fs); + //2files and 2 folders are needed for settings + if (SysUtil::FFSSpaceBelowCriticalLevelL(&fs, + KNSmlDmFatMinimumFileSize*4)) + { + CleanupStack::PopAndDestroy(); //fs + Callback().SetStatusL(aStatusRef, CSmlDmAdapter::EDiskFull); + _DBG_FILE("CNSmlDmEmailAdapter::AddNodeObjectL(): EDiskFull end"); + return; + // do not write + } + CleanupStack::PopAndDestroy(); //fs + + + TNSmlEmailSettingsElement newNode; + newNode.iMappingName = aURI.AllocLC(); + newNode.iName = HBufC::NewLC(0); + newNode.iNodeBuf = new (ELeave) + CArrayFixFlat (KNSmlDmEmailGranularity); + newNode.iExecuted = EFalse; + newNode.iImap4Settings = NULL; + newNode.iPop3Settings = NULL; + newNode.iSmtpSettings = NULL; + newNode.iIapPref = NULL; + newNode.iSmtpIapPref = NULL; + newNode.iLuid = 0; + newNode.iJustFetch=EFalse; + iBuffer->AppendL(newNode); + CleanupStack::Pop(2); //newNode.iMappingName,newNode.iName + TNSmlEmailCommandElement newCommand; + newCommand.iLastUriSeg = LastURISeg(aURI).AllocLC(); //aURI.AllocLC(); + newCommand.iData = NULL; + newCommand.iStatusRef = aStatusRef; + newCommand.iLeaf = EFalse; + newCommand.iStatus = CSmlDmAdapter::EOk; + TInt index = iBuffer->Count() - 1; + iBuffer->At(index).iNodeBuf->AppendL(newCommand); + CleanupStack::Pop(); //newCommand.iLastUriSeg + + + } + _DBG_FILE("CNSmlDmEmailAdapter::AddNodeObjectL(): end"); + } +// ----------------------------------------------------------------------------- +// CNSmlDmEmailAdapter::UpdateLeafObjectL( const TDesC8& aURI, +// const TDesC8& aLUID, RWriteStream*& aStream, const TDesC8& aType, +// const TInt aStatusRef ) +// This should update a stream object, but in case of Email settings streaming +// is not supported. +// ----------------------------------------------------------------------------- +void CNSmlDmEmailAdapter::UpdateLeafObjectL( const TDesC8& /*aURI*/, + const TDesC8& /*aLUID*/, + RWriteStream*& /*aStream*/, + const TDesC8& /*aType*/, + const TInt aStatusRef ) + { + _DBG_FILE("CNSmlDmEmailAdapter::UpdateLeafObjectL(stream): begin"); + Callback().SetStatusL(aStatusRef, CSmlDmAdapter::EError); + _DBG_FILE("CNSmlDmEmailAdapter::UpdateLeafObjectL(stream): end"); + } +// ----------------------------------------------------------------------------- +// void CNSmlDmEmailAdapter::FetchLeafObjectSizeL( const TDesC8& aURI, +// const TDesC8& aLUID, const TDesC8& aType, const TInt aResultsRef, +// const TInt aStatusRef ) +// Fetches data object and returns its size. +// ----------------------------------------------------------------------------- +void CNSmlDmEmailAdapter::FetchLeafObjectSizeL( const TDesC8& aURI, + const TDesC8& aLUID, + const TDesC8& aType, + const TInt aResultsRef, + const TInt aStatusRef ) + { + _DBG_FILE("CNSmlDmEmailAdapter::FetchLeafObjectSizeL(): begin"); + + CBufBase *result = CBufFlat::NewL(32); + CleanupStack::PushL(result); + CSmlDmAdapter::TError status = FetchObjectL(aURI, aLUID, *result); + if( status == CSmlDmAdapter::EOk ) + { + TInt objSizeInBytes = result->Size(); + TBuf8<4> stringObjSizeInBytes; + stringObjSizeInBytes.Num( objSizeInBytes ); + result->Reset(); + result->InsertL( 0, stringObjSizeInBytes ); + Callback().SetResultsL(aResultsRef, *result, aType); + } + Callback().SetStatusL(aStatusRef, status); + CleanupStack::PopAndDestroy(); //result + _DBG_FILE("CNSmlDmEmailAdapter::FetchLeafObjectSizeL(): end"); + } +// ----------------------------------------------------------------------------- +// CNSmlDmEmailAdapter::ExecuteCommandL() +// ----------------------------------------------------------------------------- +void CNSmlDmEmailAdapter::ExecuteCommandL( const TDesC8& /*aURI*/, + const TDesC8& /*aLUID*/, + const TDesC8& /*aArgument*/, + const TDesC8& /*aType*/, + const TInt aStatusRef ) + { + //Not supported + _DBG_FILE("CNSmlDmEmailAdapter::ExecuteCommandL(): begin"); + Callback().SetStatusL(aStatusRef, CSmlDmAdapter::EError); + _DBG_FILE("CNSmlDmEmailAdapter::ExecuteCommandL(): end"); + } + +// ----------------------------------------------------------------------------- +// CNSmlDmEmailAdapter::ExecuteCommandL() +// ----------------------------------------------------------------------------- +void CNSmlDmEmailAdapter::ExecuteCommandL( const TDesC8& /*aURI*/, + const TDesC8& /*aLUID*/, + RWriteStream*& /*aStream*/, + const TDesC8& /*aType*/, + const TInt aStatusRef ) + { + //Not supported + _DBG_FILE("CNSmlDmEmailAdapter::ExecuteCommandL(): begin"); + Callback().SetStatusL(aStatusRef, CSmlDmAdapter::EError); + _DBG_FILE("CNSmlDmEmailAdapter::ExecuteCommandL(): end"); + } + +// ----------------------------------------------------------------------------- +// CNSmlDmEmailAdapter::CopyCommandL() +// ----------------------------------------------------------------------------- +void CNSmlDmEmailAdapter::CopyCommandL( const TDesC8& /*aTargetURI*/, + const TDesC8& /*aTargetLUID*/, + const TDesC8& /*aSourceURI*/, + const TDesC8& /*aSourceLUID*/, + const TDesC8& /*aType*/, + TInt aStatusRef ) + { + //Not supported + _DBG_FILE("CNSmlDmEmailAdapter::CopyCommandL(): begin"); + Callback().SetStatusL(aStatusRef, CSmlDmAdapter::EError); + _DBG_FILE("CNSmlDmEmailAdapter::CopyCommandL(): end"); + } + +// ----------------------------------------------------------------------------- +// CNSmlDmEmailAdapter::StartAtomicL() +// ----------------------------------------------------------------------------- +void CNSmlDmEmailAdapter::StartAtomicL() + { + //Not supported + _DBG_FILE("CNSmlDmEmailAdapter::StartAtomicL(): begin"); + _DBG_FILE("CNSmlDmEmailAdapter::StartAtomicL(): end"); + } + +// ----------------------------------------------------------------------------- +// CNSmlDmEmailAdapter::CommitAtomicL() +// ----------------------------------------------------------------------------- +void CNSmlDmEmailAdapter::CommitAtomicL() + { + //Not supported + _DBG_FILE("CNSmlDmEmailAdapter::CommitAtomicL(): begin"); + _DBG_FILE("CNSmlDmEmailAdapter::CommitAtomicL(): end"); + } + +// ----------------------------------------------------------------------------- +// CNSmlDmEmailAdapter::RollbackAtomicL() +// ----------------------------------------------------------------------------- +void CNSmlDmEmailAdapter::RollbackAtomicL() + { + //Not supported + _DBG_FILE("CNSmlDmEmailAdapter::RollbackAtomicL(): begin"); + _DBG_FILE("CNSmlDmEmailAdapter::RollbackAtomicL(): end"); + } + +// ----------------------------------------------------------------------------- +// CNSmlDmEmailAdapter::StreamingSupport() +// ----------------------------------------------------------------------------- +TBool CNSmlDmEmailAdapter::StreamingSupport( TInt& /*aItemSize*/ ) + { + _DBG_FILE("CNSmlDmEmailAdapter::StreamingSupport(): begin"); + _DBG_FILE("CNSmlDmEmailAdapter::StreamingSupport(): end"); + return EFalse; + } + +// ----------------------------------------------------------------------------- +// CNSmlDmEmailAdapter::StreamCommittedL() +// ----------------------------------------------------------------------------- +void CNSmlDmEmailAdapter::StreamCommittedL() + { + //Not supported + _DBG_FILE("CNSmlDmEmailAdapter::StreamCommittedL(): begin"); + _DBG_FILE("CNSmlDmEmailAdapter::StreamCommittedL(): end"); + } +// ----------------------------------------------------------------------------- +// CNSmlDmEmailAdapter::CompleteOutstandingCmdsL() +// Indication of message ending. The buffered commands must be executed +// before return of this function. +// ----------------------------------------------------------------------------- +void CNSmlDmEmailAdapter::CompleteOutstandingCmdsL() + { + _DBG_FILE("CNSmlDmEmailAdapter::CompleteOutstandingCmdsL(): begin"); + + for(TInt i=0;iCount();i++) + { + + //Set buffered port values + for(TInt cmd=0;cmdAt(i).iNodeBuf->Count();cmd++) + { + + TNSmlEmailSettingsElement& bufElem = iBuffer->At(i); + TNSmlEmailCommandElement& elem = bufElem.iNodeBuf->At(cmd); + + if(elem.iLastUriSeg->Compare(KNSmlDMEmailMrcvPort)==0) + { + TUint port = DesToInt(*elem.iData); + + if(port>0 && port <= KNSmlDMEmailMaxPortNbr) + { + if(bufElem.iPop3Settings!= NULL) + { + bufElem.iPop3Settings->SetPort(port); + } + else if(bufElem.iImap4Settings!= NULL) + { + bufElem.iImap4Settings->SetPort(port); + } + } + else + { + elem.iStatus = CSmlDmAdapter::EInvalidObject; + } + } + else if(elem.iLastUriSeg->Compare(KNSmlDMEmailMsndPort)==0) + { + TUint port = DesToInt(*elem.iData); + + if(port>0 && port <= KNSmlDMEmailMaxPortNbr) + { + bufElem.iSmtpSettings->SetPort(port); + } + else + { + elem.iStatus = CSmlDmAdapter::EInvalidObject; + } + } + if((iBuffer->At(i).iSmtpSettings->LoginName()==KNullDesC8) && elem.iLastUriSeg->Compare(KNSmlDMEmailUID)==0) + { + elem.iStatus = CSmlDmAdapter::EError; + } + } + + + CSmlDmAdapter::TError stat = CSmlDmAdapter::EOk; + TInt luid=-1; + + if(iBuffer->At(i).iExecuted) + { + TRAPD( leaveCode,luid = ValidateAndStoreSettingsL(i) ); + if(leaveCode!=KErrNone) + { + stat = CSmlDmAdapter::EError; + } + } + else + { + stat = CSmlDmAdapter::EError; + } + + for(TInt cmd=0;cmdAt(i).iNodeBuf->Count();cmd++) + { + + if(iBuffer->At(i).iNodeBuf->At(cmd).iStatus==CSmlDmAdapter::EOk) + { + Callback().SetStatusL(iBuffer->At(i).iNodeBuf->At(cmd).iStatusRef, + stat); + if(!iBuffer->At(i).iNodeBuf->At(cmd).iLeaf) + { + if(stat==CSmlDmAdapter::EOk) + { + HBufC8* luidDes = IntToDes8LC(luid); + Callback().SetMappingL( iBuffer->At(i).iMappingName->Des(), + luidDes->Des() ); + CleanupStack::PopAndDestroy(); //luidDes + } + } + } + else + { + Callback().SetStatusL(iBuffer->At(i).iNodeBuf->At(cmd).iStatusRef, + iBuffer->At(i).iNodeBuf->At(cmd).iStatus); + } + + delete iBuffer->At(i).iNodeBuf->At(cmd).iLastUriSeg; + iBuffer->At(i).iNodeBuf->At(cmd).iLastUriSeg= NULL; + delete iBuffer->At(i).iNodeBuf->At(cmd).iData; + iBuffer->At(i).iNodeBuf->At(cmd).iData= NULL; + + } + iBuffer->At(i).iNodeBuf->Reset(); + delete iBuffer->At(i).iNodeBuf; + iBuffer->At(i).iNodeBuf = NULL; + delete iBuffer->At(i).iMappingName; + iBuffer->At(i).iMappingName= NULL; + delete iBuffer->At(i).iName; + iBuffer->At(i).iName= NULL; + delete iBuffer->At(i).iSmtpSettings; + iBuffer->At(i).iSmtpSettings= NULL; + delete iBuffer->At(i).iPop3Settings; + iBuffer->At(i).iPop3Settings= NULL; + delete iBuffer->At(i).iImap4Settings; + iBuffer->At(i).iImap4Settings= NULL; + delete iBuffer->At(i).iIapPref; + iBuffer->At(i).iIapPref= NULL; + delete iBuffer->At(i).iSmtpIapPref; + iBuffer->At(i).iSmtpIapPref= NULL; + + } // end for + iBuffer->Reset(); + + _DBG_FILE("CNSmlDmEmailAdapter::CompleteOutstandingCmdsL(): end"); + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- + +#ifndef IMPLEMENTATION_PROXY_ENTRY +#define IMPLEMENTATION_PROXY_ENTRY(aUid, aFuncPtr) {{aUid},(aFuncPtr)} +#endif + +const TImplementationProxy ImplementationTable[] = + { + IMPLEMENTATION_PROXY_ENTRY(KNSmlDMEmailAdapterImplUid, + CNSmlDmEmailAdapter::NewL) + }; + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +EXPORT_C const TImplementationProxy* ImplementationGroupProxy( TInt& aTableCount ) + { + _DBG_FILE("ImplementationGroupProxy() for CNSmlDmEmailAdapter: begin"); + aTableCount = sizeof(ImplementationTable) / sizeof(TImplementationProxy); + _DBG_FILE("ImplementationGroupProxy() for CNSmlDmEmailAdapter: end"); + return ImplementationTable; + } + + + +// ----------------------------------------------------------------------------- +// TPtrC8 CNSmlDmEmailAdapter::LastURISeg(const TDesC8& aURI) +// Returns only the last uri segemnt +// ----------------------------------------------------------------------------- +TPtrC8 CNSmlDmEmailAdapter::LastURISeg(const TDesC8& aURI) const + { + _DBG_FILE("CNSmlDmEmailAdapter::LastURISeg() : begin"); + TInt i; + for(i=aURI.Length()-1;i>=0;i--) + { + if(aURI[i]=='/') + { + break; + } + } + _DBG_FILE("CNSmlDmEmailAdapter::LastURISeg() : end"); + if(i==0) + { + return aURI; + } + else + { + return aURI.Mid(i+1); + } + } + +// ----------------------------------------------------------------------------- +// TPtrC8 CNSmlDmEmailAdapter::RemoveLastURISeg(const TDesC8& aURI) +// returns parent uri, i.e. removes last uri segment +// ----------------------------------------------------------------------------- +TPtrC8 CNSmlDmEmailAdapter::RemoveLastURISeg(const TDesC8& aURI) const + { + TInt i; + for(i=aURI.Length()-1;i>=0;i--) + { + if(aURI[i]=='/') + { + break; + } + } + return aURI.Left(i); + } + + + +// ----------------------------------------------------------------------------- +// TInt CNSmlDmEmailAdapter::NumOfURISegs(const TDesC8& aURI) +// Returns the num of uri segs +// ----------------------------------------------------------------------------- +TInt CNSmlDmEmailAdapter::NumOfURISegs(const TDesC8& aURI) const + { + TInt numOfURISegs = 1; + for(TInt i=0;iAt(aIndex).iNodeBuf->AppendL(newCommand); + CleanupStack::Pop(2); //newCommand.iLastUriSeg, newCommand.iData + if(!iBuffer->At(aIndex).iExecuted) + { + if(lastSeg.Compare(KNSmlDMEmailMpro)==0) + { + TBool ok = EFalse; + HBufC8* object = aObject.AllocLC(); + TPtr8 objectPtr = object->Des(); + objectPtr.UpperCase(); + + if(objectPtr.Find(KNSmlDMEmailMproPOP) >= 0) + { + iBuffer->At(aIndex).iPop3Settings = new(ELeave) CImPop3Settings; + ok=ETrue; + } + + else if(objectPtr.Find(KNSmlDMEmailMproIMAP) >= 0) + { + iBuffer->At(aIndex).iImap4Settings = new(ELeave) CImImap4Settings; + ok=ETrue; + } + if(ok) + { + iBuffer->At(aIndex).iSmtpSettings = new(ELeave) CImSmtpSettings; + iBuffer->At(aIndex).iIapPref = CImIAPPreferences::NewLC(); + iBuffer->At(aIndex).iSmtpIapPref = CImIAPPreferences::NewLC(); + CleanupStack::Pop(); //iBuffer->At(index).iIapPref + CleanupStack::Pop(); //iBuffer->At(index).iSmtpIapPref + SetDefaultSettingsL(aIndex); + + for(TInt i = 0; iAt(aIndex).iNodeBuf->Count();i++) + { + if(iBuffer->At(aIndex).iNodeBuf->At(i).iLeaf) + { + DoAddLeafObjectL(iBuffer->At(aIndex).iNodeBuf->At(i).iLastUriSeg->Des(), + iBuffer->At(aIndex).iNodeBuf->At(i).iData->Des(), + aIndex, i); + } + } + + iBuffer->At(aIndex).iExecuted = ETrue; + } + CleanupStack::PopAndDestroy(); //object + } + } + else + { + DoAddLeafObjectL(lastSeg,aObject,aIndex, + iBuffer->At(aIndex).iNodeBuf->Count()-1); + } + + _DBG_FILE("CNSmlDmEmailAdapter::FirstAddLeafL() :: end"); + return KErrNone; + } + + +// ----------------------------------------------------------------------------- +// CNSmlDmEmailAdapter::DoAddLeafObjectL +// ----------------------------------------------------------------------------- +TInt CNSmlDmEmailAdapter::DoAddLeafObjectL(const TDesC8& aLastUriSeg, + const TDesC8& aObject, + TInt aIndex, + TInt aCommand) + { + _DBG_FILE("CNSmlDmEmailAdapter::DoAddLeafObjectL() :: begin"); + if(aLastUriSeg.Compare(KNSmlDMEmailName)==0) + { + if ( aObject.Size() < KEmailAccountNameSize ) + { + delete iBuffer->At(aIndex).iName; + iBuffer->At(aIndex).iName = NULL; + iBuffer->At(aIndex).iName = HBufC::NewL(aObject.Size()); + TPtr namePtr = iBuffer->At(aIndex).iName->Des(); + CnvUtfConverter::ConvertToUnicodeFromUtf8( namePtr, aObject ); + } + else + { + iBuffer->At(aIndex).iNodeBuf->At(aCommand).iStatus = + CSmlDmAdapter::ETooLargeObject; + } + } + + else if(aLastUriSeg.Compare(KNSmlDMEmailUID)==0) + { + if(iBuffer->At(aIndex).iPop3Settings!= NULL) + { + iBuffer->At(aIndex).iPop3Settings->SetLoginNameL(aObject); + } + else if(iBuffer->At(aIndex).iImap4Settings!= NULL) + { + iBuffer->At(aIndex).iImap4Settings->SetLoginNameL(aObject); + } + if(iBuffer->At(aIndex).iSmtpSettings->LoginName()==KNullDesC8) + { + iBuffer->At(aIndex).iSmtpSettings->SetLoginNameL(aObject); + } + } + + else if(aLastUriSeg.Compare(KNSmlDMEmailPW)==0) + { + if(iBuffer->At(aIndex).iPop3Settings!= NULL) + { + iBuffer->At(aIndex).iPop3Settings->SetPasswordL(aObject); + } + else if(iBuffer->At(aIndex).iImap4Settings!= NULL) + { + iBuffer->At(aIndex).iImap4Settings->SetPasswordL(aObject); + } + if(iBuffer->At(aIndex).iSmtpSettings->Password()==KNullDesC8) + { + iBuffer->At(aIndex).iSmtpSettings->SetPasswordL(aObject); + } + } + + else if(aLastUriSeg.Compare(KNSmlDMEmailUAddr)==0) + { + HBufC *object = HBufC::NewLC(aObject.Size()); + TPtr objectPtr = object->Des(); + CnvUtfConverter::ConvertToUnicodeFromUtf8( objectPtr, aObject ); + if(iBuffer->At(aIndex).iSmtpSettings!= NULL) + { + iBuffer->At(aIndex).iSmtpSettings->SetEmailAddressL(objectPtr); + iBuffer->At(aIndex).iSmtpSettings->SetReplyToAddressL(objectPtr); + iBuffer->At(aIndex).iSmtpSettings->SetReceiptAddressL(objectPtr); + } + + CleanupStack::PopAndDestroy(); //object + } + + else if(aLastUriSeg.Compare(KNSmlDMEmailUName)==0) + { + HBufC *object = HBufC::NewLC(aObject.Size()); + TPtr objectPtr = object->Des(); + CnvUtfConverter::ConvertToUnicodeFromUtf8( objectPtr, aObject ); + if(iBuffer->At(aIndex).iSmtpSettings!= NULL) + { + iBuffer->At(aIndex).iSmtpSettings->SetEmailAliasL(objectPtr); + } + CleanupStack::PopAndDestroy(); //object + } + + else if(aLastUriSeg.Compare( KNSmlDMEmailMrcv)==0) + { + HBufC *object = HBufC::NewLC(aObject.Size()); + TPtr objectPtr = object->Des(); + CnvUtfConverter::ConvertToUnicodeFromUtf8( objectPtr, aObject ); + if(iBuffer->At(aIndex).iPop3Settings!= NULL) + { + iBuffer->At(aIndex).iPop3Settings->SetServerAddressL(objectPtr); + } + else if(iBuffer->At(aIndex).iImap4Settings!= NULL) + { + iBuffer->At(aIndex).iImap4Settings->SetServerAddressL(objectPtr); + } + CleanupStack::PopAndDestroy(); //object + } + + else if(aLastUriSeg.Compare(KNSmlDMEmailMsnd)==0) + { + HBufC *object = HBufC::NewLC(aObject.Size()); + TPtr objectPtr = object->Des(); + CnvUtfConverter::ConvertToUnicodeFromUtf8( objectPtr, aObject ); + if(iBuffer->At(aIndex).iSmtpSettings!= NULL) + { + iBuffer->At(aIndex).iSmtpSettings->SetServerAddressL(objectPtr); + } + CleanupStack::PopAndDestroy(); //object + } + + else if(aLastUriSeg.Compare(KNSmlDMEmailMpro)==0) + { + iBuffer->At(aIndex).iNodeBuf->At(aCommand).iStatus = CSmlDmAdapter::EOk; + } + + else if(aLastUriSeg.Compare(KNSmlDMEmailUseSecCon)==0) + { + SetDefaultSecurityL(aObject, &iBuffer->At(aIndex), EUseSecCon ); + } + + else if(aLastUriSeg.Compare(KNSmlDMEmailUseSauth)==0) + { + HBufC8 *data = aObject.AllocLC(); + TPtr8 dataPtr = data->Des(); + dataPtr.Capitalize(); + TBool object=EFalse; + if(dataPtr.Find(KNSmlDMEmailTrue)>=0) + { + object = ETrue; + } + if(iBuffer->At(aIndex).iSmtpSettings!= NULL) + { + iBuffer->At(aIndex).iSmtpSettings->SetSMTPAuth(object); + } + CleanupStack::PopAndDestroy(); //data + } + + else if(aLastUriSeg.Compare(KNSmlDMEmailSauthUID)==0) + { + if( iBuffer->At(aIndex).iSmtpSettings ) + { + iBuffer->At(aIndex).iSmtpSettings->SetLoginNameL(aObject); + } + } + + else if(aLastUriSeg.Compare(KNSmlDMEmailSauthPW)==0) + { + if( iBuffer->At(aIndex).iSmtpSettings ) + { + iBuffer->At(aIndex).iSmtpSettings->SetPasswordL( aObject ); + } + } + + else if(aLastUriSeg.Compare(KNSmlDMEmailPtxtSAuth)==0) + { + HBufC8 *data = aObject.AllocLC(); + TPtr8 dataPtr = data->Des(); + dataPtr.Capitalize(); + TBool object=EFalse; + if(dataPtr.Find(KNSmlDMEmailTrue)>=0) + { + object = ETrue; + } + if(iBuffer->At(aIndex).iSmtpSettings!= NULL) + { + iBuffer->At(aIndex).iSmtpSettings->SetInboxLoginDetails(object); + } + CleanupStack::PopAndDestroy(); //data + } + + else if(aLastUriSeg.Compare(KNSmlDMEmailSUseSecCon)==0) + { + SetDefaultSecurityL(aObject, &iBuffer->At(aIndex), ESuseSecCon ); + } + + else if(aLastUriSeg.Compare(KNSmlDMEmailUseStartTLS)==0) + { + SetDefaultSecurityL(aObject, &iBuffer->At(aIndex), EUseStartTls ); + } + + else if(aLastUriSeg.Compare(KNSmlDMEmailSUseStartTLS)==0) + { + SetDefaultSecurityL(aObject, &iBuffer->At(aIndex), ESuseStartTls ); + } + + else if(aLastUriSeg.Compare(KNSmlDMEmailMrcvPort)==0) + { + TNSmlEmailSettingsElement& bufElem = iBuffer->At(aIndex); + TNSmlEmailCommandElement& elem = bufElem.iNodeBuf->At(aCommand); + elem.iData = aObject.AllocL(); + } + + else if(aLastUriSeg.Compare(KNSmlDMEmailMsndPort)==0) + { + TNSmlEmailSettingsElement& bufElem = iBuffer->At(aIndex); + TNSmlEmailCommandElement& elem = bufElem.iNodeBuf->At(aCommand); + elem.iData = aObject.AllocL(); + } + + else if(aLastUriSeg.Compare(KNSmlDMEmailUseAPOP)==0) + { + TBool object=EFalse; + if(aObject.Find(_L8("True"))>=0 || aObject.Find(_L8("true"))>=0) + { + object = ETrue; + } + if(iBuffer->At(aIndex).iPop3Settings!= NULL) + { + iBuffer->At(aIndex).iPop3Settings->SetApop(object); + } + } + + else if(aLastUriSeg.Compare(KNSmlDMEmailFolderPath)==0) + { + if(iBuffer->At(aIndex).iImap4Settings!= NULL) + { + iBuffer->At(aIndex).iImap4Settings->SetFolderPathL(aObject); + } + } + + else if(aLastUriSeg.Compare(KNSmlDMEmailToNapID)==0) + { + CNSmlDMIAPMatcher* iapmatch = CNSmlDMIAPMatcher::NewL( &Callback() ); + CleanupStack::PushL(iapmatch); + + TInt iap = iapmatch->IAPIdFromURIL( aObject ); + + if ( iap != KErrNotFound ) + { + TImIAPChoice localIAP; + localIAP.iIAP = iap; + DBG_ARGS(_S("IAP = %d"), localIAP.iIAP); + localIAP.iDialogPref = ECommDbDialogPrefDoNotPrompt; + + if ( iBuffer->At(aIndex).iSmtpIapPref->NumberOfIAPs() ) + { + iBuffer->At(aIndex).iIapPref->RemoveIAPL(0); + } + iBuffer->At(aIndex).iIapPref->AddIAPL(localIAP,0); + if (iBuffer->At(aIndex).iSmtpSettings!= NULL) + { + if ( iBuffer->At(aIndex).iSmtpIapPref->NumberOfIAPs() ) + { + iBuffer->At(aIndex).iSmtpIapPref->RemoveIAPL(0); + } + iBuffer->At(aIndex).iSmtpIapPref->AddIAPL(localIAP,0); + } + } + else + { + iBuffer->At(aIndex).iNodeBuf->At(aCommand).iStatus = CSmlDmAdapter::ENotFound; + } + + CleanupStack::PopAndDestroy(); // iapmatch + } + + else if(aLastUriSeg.Compare(KNSmlDMEmailSToNapID)==0) + { + CNSmlDMIAPMatcher* iapmatch = CNSmlDMIAPMatcher::NewL( &Callback() ); + CleanupStack::PushL(iapmatch); + + TInt iap = iapmatch->IAPIdFromURIL( aObject ); + + if ( iap != KErrNotFound ) + { + TImIAPChoice localIAP; + localIAP.iIAP = iap; + DBG_ARGS(_S("SMTP IAP = %d"), localIAP.iIAP); + localIAP.iDialogPref = ECommDbDialogPrefDoNotPrompt; + if ( iBuffer->At(aIndex).iSmtpSettings!= NULL ) + { + if ( iBuffer->At(aIndex).iSmtpIapPref->NumberOfIAPs() ) + { + iBuffer->At(aIndex).iSmtpIapPref->RemoveIAPL(0); + } + iBuffer->At(aIndex).iSmtpIapPref->AddIAPL(localIAP,0); + } + else + { + iBuffer->At(aIndex).iNodeBuf->At(aCommand).iStatus = + CSmlDmAdapter::ENotFound; + } + } + else + { + iBuffer->At(aIndex).iNodeBuf->At(aCommand).iStatus = + CSmlDmAdapter::ENotFound; + } + + CleanupStack::PopAndDestroy(); // iapmatch + } + _DBG_FILE("CNSmlDmEmailAdapter::DoAddLeafObjectL() :: end"); + return KErrNone; + } + + +// ----------------------------------------------------------------------------- +// void CNSmlDmEmailAdapter::SetDefaultSettingsL(TInt aIndex) +// Set defaults for used protocol +// ----------------------------------------------------------------------------- +void CNSmlDmEmailAdapter::SetDefaultSettingsL(TInt aIndex) + { + _DBG_FILE("CNSmlDmEmailAdapter::SetDefaultSettingsL() :: begin"); + TNSmlEmailSettingsElement& thisElem = iBuffer->At(aIndex); + CEmailAccounts* emailAccs = CEmailAccounts::NewLC(); + if( thisElem.iPop3Settings ) + { + + emailAccs->PopulateDefaultPopSettingsL(*thisElem.iPop3Settings, + *thisElem.iIapPref + ); + emailAccs->PopulateDefaultSmtpSettingsL(*thisElem.iSmtpSettings, + *thisElem.iSmtpIapPref + ); + + thisElem.iPop3Settings->SetDeleteEmailsWhenDisconnecting( EFalse ); + thisElem.iPop3Settings->SetInboxSynchronisationLimit( KNSmlDMEmailDefaultHeaderCount ); + thisElem.iPop3Settings->SetSecureSockets( EFalse ); + thisElem.iPop3Settings->SetAutoSendOnConnect( ETrue ); + thisElem.iPop3Settings->SetDisconnectedUserMode( ETrue ); + thisElem.iPop3Settings->SetAcknowledgeReceipts( EFalse ); + } + else if( thisElem.iImap4Settings ) + { + + emailAccs->PopulateDefaultImapSettingsL(*thisElem.iImap4Settings, + *thisElem.iIapPref + ); + + emailAccs->PopulateDefaultSmtpSettingsL(*thisElem.iSmtpSettings, + *thisElem.iSmtpIapPref + ); + + thisElem.iImap4Settings->SetDeleteEmailsWhenDisconnecting( EFalse ); + thisElem.iImap4Settings->SetInboxSynchronisationLimit( KNSmlDMEmailDefaultHeaderCount ); + thisElem.iImap4Settings->SetMailboxSynchronisationLimit( KNSmlDMEmailDefaultHeaderCount ); + thisElem.iImap4Settings->SetSecureSockets( EFalse ); + thisElem.iImap4Settings->SetAutoSendOnConnect( ETrue ); + thisElem.iImap4Settings->SetDisconnectedUserMode( ETrue ); + thisElem.iImap4Settings->SetImapIdle( ETrue ); + thisElem.iImap4Settings->SetUpdatingSeenFlags( ETrue ); + } + thisElem.iSmtpSettings->SetLoginNameL(KNullDesC8); + thisElem.iSmtpSettings->SetPasswordL(KNullDesC8); + // Set IAP id to 0 and ask from user if ToNapID/SToNapID not sent + TImIAPChoice tmpIap; + tmpIap.iIAP = KNSmlDmEmailAlwaysAskIap; + tmpIap.iDialogPref = ECommDbDialogPrefPrompt; + thisElem.iIapPref->AddIAPL( tmpIap, 0 ); + thisElem.iSmtpIapPref->AddIAPL( tmpIap, 0 ); + CleanupStack::PopAndDestroy(); //emailAccs + _DBG_FILE("CNSmlDmEmailAdapter::SetDefaultSettingsL() :: end"); + } + +// ----------------------------------------------------------------------------- +// HBufC* CNSmlDmEmailAdapter::IntToDesLC(const TInt aLuid) const +// Converts integer to 16bit descriptor +// ----------------------------------------------------------------------------- +HBufC* CNSmlDmEmailAdapter::IntToDesLC(const TInt aLuid) const + { + HBufC* buf = HBufC::NewLC(10); //10 = max length of 32bit integer + TPtr ptrBuf = buf->Des(); + ptrBuf.Num(aLuid); + return buf; + } + +// ----------------------------------------------------------------------------- +// HBufC8* CNSmlDmEmailAdapter::IntToDes8LC(const TInt aLuid) const +// Converts integer to 8bit descriptor +// ----------------------------------------------------------------------------- +HBufC8* CNSmlDmEmailAdapter::IntToDes8LC(const TInt aLuid) const + { + HBufC8* buf = HBufC8::NewLC(10); //10 = max length of 32bit integer + TPtr8 ptrBuf = buf->Des(); + ptrBuf.Num(aLuid); + return buf; + } + +// ----------------------------------------------------------------------------- +// CNSmlDmEmailAdapter::ConvertTo8LC() +// Converts string value to 8-bit +// +// ----------------------------------------------------------------------------- +HBufC8* CNSmlDmEmailAdapter::ConvertTo8LC( const TDesC& aSource ) const + { + HBufC8* buf = HBufC8::NewLC( aSource.Length()*2); + TPtr8 bufPtr = buf->Des(); + CnvUtfConverter::ConvertFromUnicodeToUtf8( bufPtr, aSource ); + + return buf; + } + +// ----------------------------------------------------------------------------- +// TInt CNSmlDmEmailAdapter::ValidateAndStoreSettingsL(TInt aIndex +// Transfers the email settings from memory to phones permanent data store +// ----------------------------------------------------------------------------- +TInt CNSmlDmEmailAdapter::ValidateAndStoreSettingsL(TInt aIndex) + { + _DBG_FILE("CNSmlDmEmailAdapter::ValidateAndStoreSettingsL() : begin"); + TInt luid = 0; + + TNSmlEmailSettingsElement& thisElem = iBuffer->At(aIndex); + + if( iBuffer->At( aIndex ).iJustFetch ) + { + _DBG_FILE("CNSmlDmEmailAdapter::ValidateAndStoreSettingsL() : end"); + return luid; + } + CEmailAccounts* emailAccs = CEmailAccounts::NewLC(); + if( iBuffer->At( aIndex ).iLuid != 0 ) + { + switch ( thisElem.iAccType ) + { + case EPop: + { + TPopAccount accId; + emailAccs->GetPopAccountL( thisElem.iServiceId, accId ); + //Copy name field + accId.iPopAccountName.Copy(thisElem.iName->Des()); + emailAccs->SavePopSettingsL( accId, *thisElem.iPop3Settings ); + emailAccs->SavePopIapSettingsL( accId, *thisElem.iIapPref ); + TSmtpAccount smtpAcc; + emailAccs->GetSmtpAccountL( accId.iSmtpService, smtpAcc ); + //Copy name field + smtpAcc.iSmtpAccountName.Copy(thisElem.iName->Des()); + emailAccs->SaveSmtpSettingsL( smtpAcc, *thisElem.iSmtpSettings ); + emailAccs->SaveSmtpIapSettingsL( smtpAcc, *thisElem.iSmtpIapPref ); + break; + } + case EImap: + { + TImapAccount accId2; + emailAccs->GetImapAccountL( thisElem.iServiceId, accId2 ); + //Copy name field + accId2.iImapAccountName.Copy(thisElem.iName->Des()); + emailAccs->SaveImapSettingsL( accId2, *thisElem.iImap4Settings ); + emailAccs->SaveImapIapSettingsL( accId2, *thisElem.iIapPref ); + TSmtpAccount smtpAccForImap; + emailAccs->GetSmtpAccountL( accId2.iSmtpService, smtpAccForImap ); + //Copy name field + smtpAccForImap.iSmtpAccountName.Copy(thisElem.iName->Des()); + emailAccs->SaveSmtpSettingsL( smtpAccForImap, *thisElem.iSmtpSettings ); + emailAccs->SaveSmtpIapSettingsL( smtpAccForImap, *thisElem.iSmtpIapPref ); + break; + } + default: + + break; + } + } + else // if(iBuffer->At(aIndex).iLuid != 0) + { + RTelServer telServer; + User::LeaveIfError( telServer.Connect() ); + CleanupClosePushL(telServer); + + TInt numPhones = 0; + User::LeaveIfError( telServer.EnumeratePhones( numPhones ) ); + if ( numPhones < 1 ) + { + User::Leave( KErrNotFound ); + } + + RTelServer::TPhoneInfo info; + User::LeaveIfError( telServer.GetPhoneInfo( 0, info ) ); + RMobilePhone mobilePhone; + User::LeaveIfError( mobilePhone.Open( telServer, info.iName ) ); + CleanupClosePushL( mobilePhone ); + TRequestStatus status; + RMobilePhone::TMobilePhoneIdentityV1 mobilePhoneIdentity; + mobilePhone.GetPhoneId( status, mobilePhoneIdentity ); + User::WaitForRequest( status ); + User::LeaveIfError( status.Int() ); + TBuf<50> imei; + imei.Copy( mobilePhoneIdentity.iSerialNumber ); + + CleanupStack::PopAndDestroy(&mobilePhone); + CleanupStack::PopAndDestroy(&telServer); + if ( thisElem.iPop3Settings ) + { + TPopAccount accId; + accId = emailAccs->CreatePopAccountL( *thisElem.iName, + *thisElem.iPop3Settings, + *thisElem.iIapPref, + EFalse ); + + TSmtpAccount smtpAcc = emailAccs->CreateSmtpAccountL( accId, + *thisElem.iSmtpSettings, + *thisElem.iSmtpIapPref, + EFalse ); + TMsvEntry smtpEntry; + TMsvEntry popEntry; + CMsvEntry* entry = iMsvSession->GetEntryL(smtpAcc.iSmtpService); + CleanupStack::PushL(entry); + smtpEntry = entry->Entry(); + smtpEntry.iMtmData2 = smtpAcc.iSmtpAccountId; + smtpEntry.iDescription.Set( imei ); + entry->ChangeL(smtpEntry); + CleanupStack::PopAndDestroy(entry); + + entry = iMsvSession->GetEntryL(smtpAcc.iRelatedService); + CleanupStack::PushL(entry); + popEntry = entry->Entry(); + popEntry.iMtmData2 = accId.iPopAccountId; + popEntry.iDescription.Set( imei ); + entry->ChangeL(popEntry); + CleanupStack::PopAndDestroy(entry); + + if ( accId.iSmtpService != smtpAcc.iSmtpService || smtpAcc.iRelatedService != accId.iPopService ) + { + DBG_ARGS8(_S8("ERROR!!! PopAccount creation: iSmtpService=%d, smtpAcc.iSmtpService=%d, iRelatedService=%d, iPopService=%d"), + accId.iSmtpService, smtpAcc.iSmtpService, smtpAcc.iRelatedService, accId.iPopService ); + } + + thisElem.iAccType = EPop; + thisElem.iAccId = accId.iPopAccountId; + SetLuidById( thisElem.iAccType, thisElem.iAccId, thisElem.iLuid ); + + RArray popAccs; + CleanupClosePushL( popAccs ); + emailAccs->GetPopAccountsL( popAccs ); + + RArray imapAccs; + CleanupClosePushL( imapAccs ); + emailAccs->GetImapAccountsL( imapAccs ); + + if ( popAccs.Count() == 1 && !imapAccs.Count()) + { + emailAccs->SetDefaultSmtpAccountL( smtpAcc ); + } + + CleanupStack::PopAndDestroy( &imapAccs ); + CleanupStack::PopAndDestroy( &popAccs ); + // Check and set the default account + TSmtpAccount defSmtp; + TInt retVal = emailAccs->DefaultSmtpAccountL( defSmtp ); + if ( retVal != KErrNone ) + { + RArray popAccounts; + CleanupClosePushL( popAccounts ); + emailAccs->GetPopAccountsL( popAccounts ); + if ( popAccounts.Count() > 0 ) + { + TSmtpAccount relatedSmtp; + emailAccs->GetSmtpAccountL( popAccounts[0].iSmtpService, relatedSmtp ); + emailAccs->SetDefaultSmtpAccountL( relatedSmtp ); + } + CleanupStack::PopAndDestroy( &popAccounts ); + } + } + else if ( thisElem.iImap4Settings ) + { + TImapAccount accId2; + accId2 = emailAccs->CreateImapAccountL(*thisElem.iName, + *thisElem.iImap4Settings, + *thisElem.iIapPref, + EFalse); + + TSmtpAccount smtpAcc = emailAccs->CreateSmtpAccountL( accId2, + *thisElem.iSmtpSettings, + *thisElem.iSmtpIapPref, + EFalse ); + + TMsvEntry smtpEntry; + TMsvEntry imapEntry; + CMsvEntry* entry = iMsvSession->GetEntryL(smtpAcc.iSmtpService); + CleanupStack::PushL(entry); + smtpEntry = entry->Entry(); + smtpEntry.iMtmData2 = smtpAcc.iSmtpAccountId; + smtpEntry.iDescription.Set( imei ); + entry->ChangeL(smtpEntry); + CleanupStack::PopAndDestroy(entry); + + entry = iMsvSession->GetEntryL(smtpAcc.iRelatedService); + CleanupStack::PushL(entry); + imapEntry = entry->Entry(); + imapEntry.iMtmData2 = accId2.iImapAccountId; + imapEntry.iDescription.Set( imei ); + entry->ChangeL(imapEntry); + CleanupStack::PopAndDestroy(entry); + + if ( accId2.iSmtpService != smtpAcc.iSmtpService || smtpAcc.iRelatedService != accId2.iImapService ) + { + DBG_ARGS8(_S8("ERROR!!! ImapAccount creation: iSmtpService=%d, smtpAcc.iSmtpService=%d, iRelatedService=%d, iImapService=%d"), + accId2.iSmtpService, smtpAcc.iSmtpService, smtpAcc.iRelatedService, accId2.iImapService ); + } + + + thisElem.iAccType = EImap; + thisElem.iAccId = accId2.iImapAccountId; + SetLuidById( thisElem.iAccType, thisElem.iAccId, thisElem.iLuid ); + + // Check and set the default account + RArray popAccs; + CleanupClosePushL( popAccs ); + emailAccs->GetPopAccountsL( popAccs ); + + RArray imapAccs; + CleanupClosePushL( imapAccs ); + emailAccs->GetImapAccountsL( imapAccs ); + + if ( imapAccs.Count() == 1 && !popAccs.Count()) + { + emailAccs->SetDefaultSmtpAccountL( smtpAcc ); + } + + CleanupStack::PopAndDestroy( &imapAccs ); + CleanupStack::PopAndDestroy( &popAccs ); + TSmtpAccount defaultSmtp; + TInt retVal = emailAccs->DefaultSmtpAccountL( defaultSmtp ); + if ( retVal != KErrNone ) + { + RArray imapAccs; + CleanupClosePushL( imapAccs ); + emailAccs->GetImapAccountsL( imapAccs ); + if ( imapAccs.Count() > 0 ) + { + TSmtpAccount relatedSmtp; + emailAccs->GetSmtpAccountL( imapAccs[0].iSmtpService, relatedSmtp ); + emailAccs->SetDefaultSmtpAccountL( relatedSmtp ); + } + CleanupStack::PopAndDestroy( &imapAccs ); + } + } + + } + luid = thisElem.iLuid; + CleanupStack::PopAndDestroy(); //emailAccs + _DBG_FILE("CNSmlDmEmailAdapter::ValidateAndStoreSettingsL() : end"); + return luid; + } +// ----------------------------------------------------------------------------- +// void CNSmlDmEmailAdapter::GetIdByLuid( TNSmlEmailAccountType& aAccType, +// TInt& aAccId, +// const TInt aLuid ) const +// Calculates the account type and id on basis of luid +// ----------------------------------------------------------------------------- +void CNSmlDmEmailAdapter::GetIdByLuid( TNSmlEmailAccountType& aAccType, + TInt& aAccId, + const TInt aLuid ) const + { + if ( ( aLuid > KNSmlDmEmailImapLuidLow ) && + ( aLuid < KNSmlDmEmailImapLuidHigh ) ) + { + aAccType = EImap; + aAccId = aLuid - KNSmlDmEmailImapLuidLow; + } + else if (( aLuid > KNSmlDmEmailImapLuidHigh ) && + ( aLuid < KNSmlDmEmailPopLuidHigh )) + { + aAccType = EPop; + aAccId = aLuid - KNSmlDmEmailImapLuidHigh; + } + else + { + aAccType = EUnknown; + } + + } + + +// ----------------------------------------------------------------------------- +// void CNSmlDmEmailAdapter::SetLuidById( const TNSmlEmailAccountType& aAccType, +// const TInt& aAccId, TInt& aLuid ) const +// Sets the luid on basis of account type and id +// ----------------------------------------------------------------------------- +void CNSmlDmEmailAdapter::SetLuidById( const TNSmlEmailAccountType& aAccType, + const TInt& aAccId, TInt& aLuid ) const + { + switch (aAccType) + { + case EImap : + aLuid = KNSmlDmEmailImapLuidLow + aAccId; + break; + + case EPop : + aLuid = KNSmlDmEmailImapLuidHigh + aAccId; + break; + + default : + aLuid = -1; + break; + } + } + +// ----------------------------------------------------------------------------- +// TBool CNSmlDmEmailAdapter::AccountExistsL( const CEmailAccounts* aAccs, +// const TNSmlEmailAccountType aAccType, +// const TInt aId, +// TInt aIndex ) +// Checks if the accout matching the given parameters is found. +// returns True if found. +// ----------------------------------------------------------------------------- +TBool CNSmlDmEmailAdapter::AccountExistsL( CEmailAccounts* aAccs, + const TNSmlEmailAccountType aAccType, + const TInt aId, + TInt aIndex ) + { + RArray imap4Accs; + CleanupClosePushL( imap4Accs ); + RArray pop3Accs; + CleanupClosePushL( pop3Accs ); + switch ( aAccType ) + { + case EImap: + aAccs->GetImapAccountsL(imap4Accs); + for(TInt i=0;i= 0 ) + { + iBuffer->At(aIndex).iServiceId = imap4Accs[i].iImapService; + delete iBuffer->At(aIndex).iName; + iBuffer->At(aIndex).iName = NULL; + iBuffer->At(aIndex).iName = HBufC::NewL(imap4Accs[i].iImapAccountName.Size()); + *iBuffer->At(aIndex).iName = imap4Accs[i].iImapAccountName; + } + CleanupStack::PopAndDestroy(2); //imap4Accs, pop3Accs + return ETrue; + } + } + break; + + case EPop: + aAccs->GetPopAccountsL(pop3Accs); + for(TInt i=0;i= 0 ) + { + iBuffer->At(aIndex).iServiceId = pop3Accs[i].iPopService; + delete iBuffer->At(aIndex).iName; + iBuffer->At(aIndex).iName = NULL; + iBuffer->At(aIndex).iName = HBufC::NewL(pop3Accs[i].iPopAccountName.Size()); + *iBuffer->At(aIndex).iName = pop3Accs[i].iPopAccountName; + } + CleanupStack::PopAndDestroy(2); //imap4Accs, pop3Accs + return ETrue; + } + } + break; + default: + // Returns EFalse in this case. + break; + } + CleanupStack::PopAndDestroy(2); //imap4Accs, pop3Accs + return EFalse; + } + +// ----------------------------------------------------------------------------- +// TInt CNSmlDmEmailAdapter::DoRestoreSettingsL(TInt aIndex) +// Restores the settings to the adapter from settings store +// ----------------------------------------------------------------------------- +TInt CNSmlDmEmailAdapter::DoRestoreSettingsL(TInt aIndex) + { + _DBG_FILE("CNSmlDmEmailAdapter::DoRestoreSettingsL() : begin"); + TNSmlEmailSettingsElement& thisElem = iBuffer->At(aIndex); + + CEmailAccounts* emailAccs = CEmailAccounts::NewLC(); + TInt err = KErrNone; + + // These are destroyed latest at destructor + thisElem.iSmtpSettings = new (ELeave) CImSmtpSettings; + thisElem.iIapPref = CImIAPPreferences::NewLC(); + thisElem.iSmtpIapPref = CImIAPPreferences::NewLC(); + + switch( thisElem.iAccType ) + { + case EImap: + if (AccountExistsL(emailAccs, thisElem.iAccType, thisElem.iAccId, aIndex )) + { + TImapAccount imapAccId; + + thisElem.iImap4Settings = new(ELeave) CImImap4Settings; + + //Get IMAP account by iAccId id + emailAccs->GetImapAccountL(thisElem.iServiceId, imapAccId); + //Get IMAP settings by account id + emailAccs->LoadImapSettingsL( imapAccId, *thisElem.iImap4Settings ); + //Get IMAP settings IAP prefs + emailAccs->LoadImapIapSettingsL( imapAccId, *thisElem.iIapPref ); + + TSmtpAccount smtpAccount; + //Get smtp account by related IMAP id + emailAccs->GetSmtpAccountL( imapAccId.iSmtpService, smtpAccount ); + //Get smtp settings by IMAP id + emailAccs->LoadSmtpSettingsL( smtpAccount, *thisElem.iSmtpSettings ); + //Get Smtp settings IAP prefs + emailAccs->LoadSmtpIapSettingsL( smtpAccount, *thisElem.iSmtpIapPref ); + } + else + { + err = KErrNotFound; + } + break; + + case EPop: + if (AccountExistsL(emailAccs, thisElem.iAccType, thisElem.iAccId, aIndex )) + { + TPopAccount popAccId; + + thisElem.iPop3Settings = new(ELeave) CImPop3Settings; + + //Get POP3 account by iAccId id + emailAccs->GetPopAccountL( thisElem.iServiceId, popAccId ); + //Get POP3 settings by account id + emailAccs->LoadPopSettingsL( popAccId, *thisElem.iPop3Settings ); + //Get POP3 setting IAP prefs + emailAccs->LoadPopIapSettingsL( popAccId, *thisElem.iIapPref ); + + TSmtpAccount smtpAccount; + //Get smtp account by related POP id + emailAccs->GetSmtpAccountL( popAccId.iSmtpService, smtpAccount ); + //Get smtp settings + emailAccs->LoadSmtpSettingsL( smtpAccount, *thisElem.iSmtpSettings ); + //Get Smtp setting IAP prefs + emailAccs->LoadSmtpIapSettingsL( smtpAccount, *thisElem.iSmtpIapPref ); + } + else + { + err = KErrNotFound; + } + break; + + default: + err = KErrNotFound; + break; + } + + if ( err ) + { + _DBG_FILE("CNSmlDmEmailAdapter::DoRestoreSettingsL() : \ + KErrNotFound end"); + CleanupStack::PopAndDestroy(2); // iIapPref, iSmtpIapPref + CleanupStack::PopAndDestroy(emailAccs); //emailAccs + return KErrNotFound; + } + + CleanupStack::Pop(2); // iIapPref, iSmtpIapPref + CleanupStack::PopAndDestroy(emailAccs); //emailAccs + _DBG_FILE("CNSmlDmEmailAdapter::DoRestoreSettingsL() : end"); + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CNSmlDmEmailAdapter::OpenSessionL() +// Opens the CMsvSession if it is not open already +// ----------------------------------------------------------------------------- +TInt CNSmlDmEmailAdapter::OpenSessionL() + { + _DBG_FILE("CNSmlDmEmailAdapter::OpenSessionL() : begin"); + if(!iMsvSession) + { + TRAPD(err, iMsvSession = CMsvSession::OpenSyncL(*this)); + _DBG_FILE("CNSmlDmEmailAdapter::OpenSessionL() : end"); + return err; + } + + _DBG_FILE("CNSmlDmEmailAdapter::OpenSessionL() : end"); + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CNSmlDmEmailAdapter::FillNodeInfoL() +// Fills the node info in ddf structure +// ----------------------------------------------------------------------------- +void CNSmlDmEmailAdapter::FillNodeInfoL( MSmlDmDDFObject& aNode, + const TSmlDmAccessTypes& aAccTypes, + MSmlDmDDFObject::TOccurence aOccurrence, + MSmlDmDDFObject::TScope aScope, + MSmlDmDDFObject::TDFFormat aFormat, + const TDesC8& aDescription) const + { + aNode.SetAccessTypesL(aAccTypes); + aNode.SetOccurenceL(aOccurrence); + aNode.SetScopeL(aScope); + aNode.SetDFFormatL(aFormat); + if(aFormat!=MSmlDmDDFObject::ENode) + { + aNode.AddDFTypeMimeTypeL(KNSmlDMEmailTextPlain); + } + aNode.SetDescriptionL(aDescription); + + } + +// ----------------------------------------------------------------------------- +// TPtrC8 CNSmlDmEmailAdapter::RemoveDotSlash(const TDesC8& aURI) +// return uri without dot and slash in start +// ----------------------------------------------------------------------------- +TPtrC8 CNSmlDmEmailAdapter::RemoveDotSlash(const TDesC8& aURI) const + { + if(aURI.Find(KNSmlEmailUriDotSlash)==0) + { + return aURI.Right(aURI.Length()-KNSmlEmailUriDotSlash().Length()); + } + else + { + return aURI; + } + } +// ----------------------------------------------------------------------------- +// CSmlDmAdapter::TError CNSmlDmEmailAdapter::FetchObjectL(const TDesC8& aURI, +// const TDesC8& aLUID, CBufBase& aObject) +// Fetches object acording to URI & LUID. Retur codes acording to +// CSmlDmAdapter::TError. +// ----------------------------------------------------------------------------- +CSmlDmAdapter::TError CNSmlDmEmailAdapter::FetchObjectL(const TDesC8& aURI, + const TDesC8& aLUID, + CBufBase& aObject) + { + _DBG_FILE("CNSmlDmEmailAdapter::FetchObjectL() : begin"); + CSmlDmAdapter::TError status = EOk; + if(aLUID.Length()==0) + { + _DBG_FILE("CNSmlDmEmailAdapter::FetchObjectL() : ENotFound end"); + return CSmlDmAdapter::ENotFound; + } + if( OpenSessionL() != KErrNone ) + { + _DBG_FILE("CNSmlDmEmailAdapter::FetchObjectL() : EError end"); + return CSmlDmAdapter::EError; + } + TInt luid = DesToInt(aLUID); + TInt index = -1; + for(TInt i=0;iCount();i++) + { + if(iBuffer->At(i).iLuid == luid) + { + index = i; + break; + } + } + + if(index<0) + { + TNSmlEmailSettingsElement newNode; + newNode.iImap4Settings = NULL; + newNode.iPop3Settings = NULL; + newNode.iSmtpSettings = NULL; + newNode.iIapPref = NULL; + newNode.iLuid = luid; + newNode.iMappingName = aURI.AllocLC(); + newNode.iName = HBufC::NewLC(0); + newNode.iNodeBuf = new (ELeave) + CArrayFixFlat (KNSmlDmEmailGranularity); + newNode.iExecuted = ETrue; + newNode.iJustFetch = ETrue; + GetIdByLuid(newNode.iAccType, newNode.iAccId, luid); + iBuffer->AppendL(newNode); + index = iBuffer->Count() - 1; + if(DoRestoreSettingsL(index)!=KErrNone) + { + CleanupStack::Pop(2); //newNode.iMappingName,newNode.iName + _DBG_FILE("CNSmlDmEmailAdapter::FetchObjectL() : EError end"); + return CSmlDmAdapter::EError; + } + CleanupStack::Pop(2); //newNode.iMappingName,newNode.iName + } + + TPtrC8 lastUriSeg = LastURISeg(aURI); + + if(lastUriSeg.Compare(KNSmlDMEmailName)==0) + { + HBufC8 *data = HBufC8::NewLC(iBuffer->At(index).iName->Length()); + TPtr8 dataPtr = data->Des(); + CnvUtfConverter::ConvertFromUnicodeToUtf8( dataPtr, iBuffer->At(index).iName->Des() ); + aObject.InsertL(0,dataPtr); + CleanupStack::PopAndDestroy(); //data + } + else if(lastUriSeg.Compare(KNSmlDMEmailUID)==0) + { + HBufC *data = NULL; + if(iBuffer->At(index).iPop3Settings!= NULL) + { + data = HBufC::NewLC(iBuffer->At(index).iPop3Settings->LoginName().Length()); + data->Des().Copy(iBuffer->At(index).iPop3Settings->LoginName()); + } + else if(iBuffer->At(index).iImap4Settings!= NULL) + { + data = HBufC::NewLC(iBuffer->At(index).iImap4Settings->LoginName().Length()); + data->Des().Copy(iBuffer->At(index).iImap4Settings->LoginName()); + } + if(data) + { + HBufC8 *data8 = CnvUtfConverter::ConvertFromUnicodeToUtf8L(*data); + CleanupStack::PushL(data8); + aObject.InsertL(0,*data8); + CleanupStack::PopAndDestroy(2);//data, data8 + } + } + else if(lastUriSeg.Compare(KNSmlDMEmailPW)==0) + { + HBufC *data = NULL; + if(iBuffer->At(index).iPop3Settings!= NULL) + { + data = HBufC::NewLC(iBuffer->At(index).iPop3Settings->Password().Length()); + data->Des().Copy(iBuffer->At(index).iPop3Settings->Password()); + } + else if(iBuffer->At(index).iImap4Settings!= NULL) + { + data = HBufC::NewLC(iBuffer->At(index).iImap4Settings->Password().Length()); + data->Des().Copy(iBuffer->At(index).iImap4Settings->Password()); + } + if(data) + { + HBufC8 *data8 = CnvUtfConverter::ConvertFromUnicodeToUtf8L(*data); + CleanupStack::PushL(data8); + aObject.InsertL(0,*data8); + CleanupStack::PopAndDestroy(2);//data, data8 + } + } + else if(lastUriSeg.Compare(KNSmlDMEmailUAddr)==0) + { + HBufC *data = NULL; + data = iBuffer->At(index).iSmtpSettings->EmailAddress().AllocLC(); + HBufC8 *data8 = HBufC8::NewLC(data->Size()); + TPtr8 dataPtr8 = data8->Des(); + CnvUtfConverter::ConvertFromUnicodeToUtf8( dataPtr8, data->Des() ); + + aObject.InsertL(0,dataPtr8); + CleanupStack::PopAndDestroy(2); //data, data8 + } + else if(lastUriSeg.Compare(KNSmlDMEmailUName)==0) + { + + HBufC *data = NULL; + data = iBuffer->At(index).iSmtpSettings->EmailAlias().AllocLC(); + HBufC8 *data8 = HBufC8::NewLC(data->Size()); + TPtr8 dataPtr8 = data8->Des(); + CnvUtfConverter::ConvertFromUnicodeToUtf8( dataPtr8, data->Des() ); + + aObject.InsertL(0,dataPtr8); + CleanupStack::PopAndDestroy(2); //data, data8 + } + + else if(lastUriSeg.Compare( KNSmlDMEmailMrcv)==0) + { + HBufC *data = NULL; + if(iBuffer->At(index).iPop3Settings!= NULL) + { + data = iBuffer->At(index).iPop3Settings->ServerAddress().AllocLC(); + } + else if(iBuffer->At(index).iImap4Settings!= NULL) + { + data = iBuffer->At(index).iImap4Settings->ServerAddress().AllocLC(); + } + else + { + status = CSmlDmAdapter::ENotFound; + return status; + } + HBufC8 *data8 = HBufC8::NewLC(data->Size()); + TPtr8 dataPtr8 = data8->Des(); + CnvUtfConverter::ConvertFromUnicodeToUtf8( dataPtr8, data->Des() ); + + aObject.InsertL(0,dataPtr8); + CleanupStack::PopAndDestroy(2); //data, data8 + } + else if(lastUriSeg.Compare(KNSmlDMEmailMsnd)==0) + { + HBufC *data = NULL; + data = iBuffer->At(index).iSmtpSettings->ServerAddress().AllocLC(); + HBufC8 *data8 = HBufC8::NewLC(data->Size()); + TPtr8 dataPtr8 = data8->Des(); + CnvUtfConverter::ConvertFromUnicodeToUtf8( dataPtr8, data->Des() ); + + aObject.InsertL(0,dataPtr8); + CleanupStack::PopAndDestroy(2); //data, data8 + } + else if(lastUriSeg.Compare(KNSmlDMEmailMpro)==0) + { + if(iBuffer->At(index).iPop3Settings!= NULL) + { + aObject.InsertL(0,KNSmlDMEmailMproPOP); + } + else if(iBuffer->At(index).iImap4Settings!= NULL) + { + aObject.InsertL(0,KNSmlDMEmailMproIMAP); + } + } + else if(lastUriSeg.Compare(KNSmlDMEmailUseSecCon)==0) + { + FetchSecurityValueL(aObject, &iBuffer->At(index), EUseSecCon ); + } + + else if(lastUriSeg.Compare(KNSmlDMEmailUseSauth)==0) + { + if(iBuffer->At(index).iSmtpSettings->SMTPAuth()) + { + aObject.InsertL(0,KNSmlDMEmailTrue); + } + else + { + aObject.InsertL(0,KNSmlDMEmailFalse); + } + } + else if(lastUriSeg.Compare(KNSmlDMEmailSauthUID)==0) + { + HBufC *data = HBufC::NewLC(iBuffer->At(index).iSmtpSettings->LoginName().Length()); + data->Des().Copy(iBuffer->At(index).iSmtpSettings->LoginName()); + HBufC8 *data8 = CnvUtfConverter::ConvertFromUnicodeToUtf8L(*data); + CleanupStack::PushL(data8); + aObject.InsertL(0,*data8); + CleanupStack::PopAndDestroy(2);//data, data8 + } + else if(lastUriSeg.Compare(KNSmlDMEmailSauthPW)==0) + { + HBufC *data = HBufC::NewLC(iBuffer->At(index).iSmtpSettings->Password().Length()); + data->Des().Copy(iBuffer->At(index).iSmtpSettings->Password()); + HBufC8 *data8 = CnvUtfConverter::ConvertFromUnicodeToUtf8L(*data); + CleanupStack::PushL(data8); + aObject.InsertL(0,*data8); + CleanupStack::PopAndDestroy(2);//data, data8 + } + else if(lastUriSeg.Compare(KNSmlDMEmailPtxtSAuth)==0) + { + if(iBuffer->At(index).iSmtpSettings->InboxLoginDetails()) + { + aObject.InsertL(0,KNSmlDMEmailTrue); + } + else + { + aObject.InsertL(0,KNSmlDMEmailFalse); + } + } + + else if (lastUriSeg.Compare(KNSmlDMEmailSUseSecCon)==0) + { + FetchSecurityValueL(aObject, &iBuffer->At(index), ESuseSecCon ); + } + + else if (lastUriSeg.Compare(KNSmlDMEmailUseStartTLS)==0) + { + FetchSecurityValueL(aObject, &iBuffer->At(index), EUseStartTls ); + } + + else if (lastUriSeg.Compare(KNSmlDMEmailSUseStartTLS)==0) + { + FetchSecurityValueL(aObject, &iBuffer->At(index), ESuseStartTls ); + } + + else if(lastUriSeg.Compare(KNSmlDMEmailMrcvPort)==0) + { + TUint port; + if(iBuffer->At(index).iPop3Settings!= NULL) + { + port = iBuffer->At(index).iPop3Settings->Port(); + } + else + { + port = iBuffer->At(index).iImap4Settings->Port(); + } + HBufC8 *data = IntToDes8LC(port); + aObject.InsertL(0,data->Des()); + CleanupStack::PopAndDestroy(); //data + } + + else if(lastUriSeg.Compare(KNSmlDMEmailMsndPort)==0) + { + TUint port = iBuffer->At(index).iSmtpSettings->Port(); + HBufC8 *data = IntToDes8LC(port); + aObject.InsertL(0,data->Des()); + CleanupStack::PopAndDestroy(); //data + } + + else if(lastUriSeg.Compare(KNSmlDMEmailUseAPOP)==0) + { + if(iBuffer->At(index).iPop3Settings!= NULL) + { + if(iBuffer->At(index).iPop3Settings->Apop()) + { + aObject.InsertL(0,KNSmlDMEmailTrue); + } + else + { + aObject.InsertL(0,KNSmlDMEmailFalse); + } + } + else if(iBuffer->At(index).iImap4Settings!= NULL) + { + status = CSmlDmAdapter::ENotFound; + } + } + + else if (lastUriSeg.Compare(KNSmlDMEmailFolderPath)==0) + { + if( iBuffer->At(index).iImap4Settings ) + { + aObject.InsertL(0, iBuffer->At(index).iImap4Settings->FolderPath() ); + } + else + { + status = CSmlDmAdapter::ENotFound; + } + } + + else if(lastUriSeg.Compare(KNSmlDMEmailToNapID)==0) + { + CNSmlDMIAPMatcher* iapmatch=CNSmlDMIAPMatcher::NewL( &Callback() ); + CleanupStack::PushL(iapmatch); + HBufC8* uri8 = NULL; + TInt iapCount = iBuffer->At(index).iIapPref->NumberOfIAPs(); + if ( iapCount ) + { + TImIAPChoice localIAP = iBuffer->At(index).iIapPref->IAPPreference(0); + uri8 = iapmatch->URIFromIAPIdL( localIAP.iIAP ); + } + + if( uri8 ) + { + CleanupStack::PushL(uri8); + aObject.InsertL(0,uri8->Des()); + status = CSmlDmAdapter::EOk; + CleanupStack::PopAndDestroy(); // uri8 + } + + CleanupStack::PopAndDestroy(); // iapMatch + } + else if(lastUriSeg.Compare(KNSmlDMEmailSToNapID)==0) + { + // SToNapID exists only for SMTP + if (iBuffer->At(index).iSmtpSettings!= NULL) + { + CNSmlDMIAPMatcher* iapmatch=CNSmlDMIAPMatcher::NewL( &Callback() ); + CleanupStack::PushL(iapmatch); + HBufC8* uri8 = NULL; + TInt iapCount = iBuffer->At(index).iIapPref->NumberOfIAPs(); + if ( iapCount ) + { + TImIAPChoice localIAP = iBuffer->At(index).iSmtpIapPref->IAPPreference(0); + uri8 = iapmatch->URIFromIAPIdL( localIAP.iIAP ); + } + + if( uri8 ) + { + CleanupStack::PushL(uri8); + aObject.InsertL(0,uri8->Des()); + status = CSmlDmAdapter::EOk; + CleanupStack::PopAndDestroy(); // uri8 + } + + CleanupStack::PopAndDestroy(); // iapMatch + } + else + { + status = CSmlDmAdapter::ENotFound; + } + } + _DBG_FILE("CNSmlDmEmailAdapter::FetchObjectL() : end"); + return status; + } + +// ----------------------------------------------------------------------------- +// void CNSmlDmEmailAdapter::SetDefaultSecurityL(const TDesC8& aObject, +// const TNSmlEmailSettingsElement* thisElem, +// const TNSmlEmailSecuritySetting aSetting ) +// Sets (on/off) the security modes: SSL/TLS, StartTLS +// ----------------------------------------------------------------------------- +void CNSmlDmEmailAdapter::SetDefaultSecurityL(const TDesC8& aObject, + const TNSmlEmailSettingsElement* aThisElem, + const TNSmlEmailSecuritySetting aSetting + ) const + { + _DBG_FILE("CNSmlDmEmailAdapter::SetDefaultSecurityL(): begin"); + HBufC8 *data = aObject.AllocLC(); + TPtr8 dataPtr = data->Des(); + dataPtr.Capitalize(); + TBool object=EFalse; + if(dataPtr.Find(KNSmlDMEmailTrue)>=0) + { + object = ETrue; + } + switch ( aSetting ) + { + case EUseSecCon : + if ( object ) + { + if ( aThisElem->iImap4Settings ) + { + aThisElem->iImap4Settings->SetSecureSockets(EFalse); + aThisElem->iImap4Settings->SetSSLWrapper(ETrue); + aThisElem->iImap4Settings->SetPort( KNSmlDMEmailSslWrappedImap4Port ); + } + else if ( aThisElem->iPop3Settings ) + { + aThisElem->iPop3Settings->SetSecureSockets(EFalse); + aThisElem->iPop3Settings->SetSSLWrapper(ETrue); + aThisElem->iPop3Settings->SetPort( KNSmlDMEmailSslWrappedPop3Port ); + } + } + else + { + if ( aThisElem->iImap4Settings ) + { + aThisElem->iImap4Settings->SetPort( KNSmlDMEmailNormalImap4Port ); + aThisElem->iImap4Settings->SetSSLWrapper(EFalse); + } + else if ( aThisElem->iPop3Settings ) + { + aThisElem->iPop3Settings->SetPort( KNSmlDMEmailNormalPop3Port ); + aThisElem->iPop3Settings->SetSSLWrapper(EFalse); + } + } + break; + case EUseStartTls : + if ( object ) + { + if ( aThisElem->iImap4Settings ) + { + aThisElem->iImap4Settings->SetSecureSockets(ETrue); + aThisElem->iImap4Settings->SetSSLWrapper(EFalse); + aThisElem->iImap4Settings->SetPort( KNSmlDMEmailNormalImap4Port ); + } + else if ( aThisElem->iPop3Settings ) + { + aThisElem->iPop3Settings->SetSecureSockets(ETrue); + aThisElem->iPop3Settings->SetSSLWrapper(EFalse); + aThisElem->iPop3Settings->SetPort( KNSmlDMEmailNormalPop3Port ); + } + } + else + { + if ( aThisElem->iImap4Settings ) + { + aThisElem->iImap4Settings->SetSecureSockets(EFalse); + } + else if ( aThisElem->iPop3Settings ) + { + aThisElem->iPop3Settings->SetSecureSockets(EFalse); + } + } + break; + case ESuseSecCon : + if ( object ) + { + // The port is same in all cases + aThisElem->iSmtpSettings->SetSecureSockets(EFalse); + aThisElem->iSmtpSettings->SetSSLWrapper(ETrue); + aThisElem->iSmtpSettings->SetPort( KNSmlDMEmailSslSmtpPort ); + } + else + { + aThisElem->iSmtpSettings->SetPort( KNSmlDMEmailNormalSmtpPort ); + aThisElem->iSmtpSettings->SetSSLWrapper( EFalse ); + } + break; + case ESuseStartTls : + if ( object ) + { + // The port is same in all cases + aThisElem->iSmtpSettings->SetSecureSockets(ETrue); + aThisElem->iSmtpSettings->SetSSLWrapper(EFalse); + aThisElem->iSmtpSettings->SetPort( KNSmlDMEmailNormalSmtpPort ); + } + else + { + aThisElem->iSmtpSettings->SetSecureSockets( EFalse ); + } + + break; + default : + break; + } + CleanupStack::PopAndDestroy(); // object + _DBG_FILE("CNSmlDmEmailAdapter::SetDefaultSecurityL(): end"); + } + +// ----------------------------------------------------------------------------- +// CSmlDmAdapter::TError CNSmlDmEmailAdapter::FetchSecurityValueL( +// CBufBase& aObject, +// const TNSmlEmailSettingsElement* aElem, +// const TNSmlEmailSecuritySetting aSetting ) +// Gets the status(on/off) of security modes SSL/TLS or StartTLS +// ----------------------------------------------------------------------------- + +CSmlDmAdapter::TError CNSmlDmEmailAdapter::FetchSecurityValueL( + CBufBase& aObject, + const TNSmlEmailSettingsElement* aElem, + const TNSmlEmailSecuritySetting aSetting ) const + { + _DBG_FILE("CNSmlDmEmailAdapter::FetchSecurityValueL(): start"); + TBool result=EFalse; + CSmlDmAdapter::TError status = CSmlDmAdapter::EOk; + switch ( aSetting ) + { + + case EUseStartTls : + if ( aElem->iImap4Settings) + { + result = aElem->iImap4Settings->SecureSockets(); + } + else if(aElem->iPop3Settings) + { + result = aElem->iPop3Settings->SecureSockets(); + } + else + { + status = CSmlDmAdapter::EError; + } + break; + case EUseSecCon : + if ( aElem->iImap4Settings) + { + result = aElem->iImap4Settings->SSLWrapper(); + } + else if(aElem->iPop3Settings) + { + result = aElem->iPop3Settings->SSLWrapper(); + } + else + { + status = CSmlDmAdapter::EError; + } + break; + case ESuseStartTls : + if(aElem->iSmtpSettings) + { + result = aElem->iSmtpSettings->SecureSockets(); + } + else + { + status = CSmlDmAdapter::EError; + } + break; + case ESuseSecCon : + if(aElem->iSmtpSettings) + { + result = aElem->iSmtpSettings->SSLWrapper(); + } + else + { + status = CSmlDmAdapter::EError; + } + break; + default: + status = CSmlDmAdapter::EError; + break; + } + + if ( result ) + { + aObject.InsertL(0,KNSmlDMEmailTrue); + } + else + { + aObject.InsertL(0,KNSmlDMEmailFalse); + } + _DBG_FILE("CNSmlDmEmailAdapter::FetchSecurityValueL(): end"); + return status; + } + +//-------------------------------------------------------------------- +//TInt CNSmlDmEmailAdapter::ConstructTreeL(const TDesC8& aURI) +// +//------------------------------------------------------------------- + +TInt CNSmlDmEmailAdapter::ConstructTreeL(const TDesC8& aURI) +{ + TInt ret = KErrNotFound; + CEmailAccounts* emailAccs = CEmailAccounts::NewLC(); + + if(aURI.Find(KNSmlDMEmailNodeName)!= KErrNotFound) + { + RArray imap4Accounts; + CleanupClosePushL( imap4Accounts ); + emailAccs->GetImapAccountsL(imap4Accounts); + + // First, IMAP accounts + // + TInt luid; + TPtrC8 name; + // cycle through every found account + for(TInt count = 0; count < imap4Accounts.Count(); count++) + { + + SetLuidById( EImap, imap4Accounts[count].iImapAccountId, luid ); + HBufC8 *uri = HBufC8::NewLC(KNSmlDMEmailNodeName().Length() + + KNSmlDMEmailMproIMAP().Length() + 6); + + TPtr8 uriPtr = uri->Des(); + uriPtr.Append(KNSmlDMEmailNodeName); + uriPtr.Append(KNSmlDMEmailSeparator8); + uriPtr.Append(KNSmlDMEmailMproIMAP); + uriPtr.AppendNumFixedWidth(count,EDecimal,3); + HBufC8 *luidBuf = IntToDes8LC(luid); + HBufC8* mapInfo = Callback().GetLuidAllocL(uriPtr); + if (mapInfo->Length() == 0) + { + Callback().SetMappingL(uriPtr, luidBuf->Des()); + if( aURI.Find(uriPtr) >= 0 ) + { + ret = luid; + } + } + else + { + delete mapInfo; + } + + CleanupStack::PopAndDestroy(2); //uri,luidBuf + } + CleanupStack::PopAndDestroy(); //imap4Accounts + + // Then, POP accounts + // + RArray pop3Accounts; + CleanupClosePushL( pop3Accounts ); + emailAccs->GetPopAccountsL( pop3Accounts ); + // cycle through every found account + for(TInt count = 0; count < pop3Accounts.Count(); count++) + { + SetLuidById( EPop, pop3Accounts[count].iPopAccountId, luid ); + + HBufC8 *uri = HBufC8::NewLC(KNSmlDMEmailNodeName().Length() + + KNSmlDMEmailMproPOP().Length() + 5); + TPtr8 uriPtr = uri->Des(); + uriPtr.Append(KNSmlDMEmailNodeName); + uriPtr.Append(KNSmlDMEmailSeparator8); + uriPtr.Append(KNSmlDMEmailMproPOP); + uriPtr.AppendNumFixedWidth(count,EDecimal,3); + HBufC8 *luidBuf = IntToDes8LC(luid); + HBufC8* mapInfo = Callback().GetLuidAllocL(uriPtr); + if (mapInfo->Length() == 0) + { + Callback().SetMappingL(uriPtr,luidBuf->Des()); + if( aURI.Find(uriPtr) >= 0 ) + { + ret = luid; + } + } + else + { + delete mapInfo; + } + + CleanupStack::PopAndDestroy(2); //uri,luidBuf + } + CleanupStack::PopAndDestroy(); //pop3Accounts + } + CleanupStack::PopAndDestroy(); //emailAccs + return ret; +} + +//------------------------------------------------------------------------------ +// TPtrC8 CNSmlDmEmailAdapter::GetDynamicEmailNodeUri( const TDesC8& aURI ) +// returns Email/xxx URI +//------------------------------------------------------------------------------ +TPtrC8 CNSmlDmEmailAdapter::GetDynamicEmailNodeUri( const TDesC8& aURI ) + { + DBG_ARGS8(_S8("CNSmlDmEmailAdapter::GetDynamicEmailNodeUri() - <%S> "), &aURI); + TInt i= 0; + TBuf8<50> EmailAccRoot(KNSmlDMEmailNodeName); + for ( i = aURI.Find( KNSmlDMEmailNodeName ) + EmailAccRoot.Length() + 1; + i < aURI.Length(); i++ ) + { + if( aURI[i] == '/' ) + { + break; + } + } + _DBG_FILE("CNSmlDmEmailAdapter::GetDynamicEmailNodeUri(): end"); + return aURI.Left( i ); + } + + +// End of File diff -r d3981f4fe6a4 -r c742e1129640 omadmadapters/email/src/nsmldmemailadapter.rss --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omadmadapters/email/src/nsmldmemailadapter.rss Wed Jun 23 18:03:02 2010 +0300 @@ -0,0 +1,49 @@ +CHARACTER_SET UTF8/* +* Copyright (c) 2005 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: Resource data for SyncML DM Email adapter +* +*/ + + + + + + +#include +#include "nsmldmconstants.h" + +RESOURCE REGISTRY_INFO theRegistryInfo + { + dll_uid = 0x101F6E34; //The DLL's 3rd UID. + interfaces = + { + INTERFACE_INFO + { + interface_uid = KNSmlDMInterfaceUid; // DM interface UID + implementations = + { + IMPLEMENTATION_INFO + { + implementation_uid = 0x101F6E35; // DM Email implementation UID + version_no = 1; + display_name = ""; + default_data = ""; + opaque_data = ""; + } + }; + } + }; + } + +// End of File diff -r d3981f4fe6a4 -r c742e1129640 omadmadapters/email/tsrc/bwins/emailtestu.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omadmadapters/email/tsrc/bwins/emailtestu.def Wed Jun 23 18:03:02 2010 +0300 @@ -0,0 +1,3 @@ +EXPORTS + ?LibEntryL@@YAPAVCScriptBase@@AAVCTestModuleIf@@@Z @ 1 NONAME ; class CScriptBase * LibEntryL(class CTestModuleIf &) + diff -r d3981f4fe6a4 -r c742e1129640 omadmadapters/email/tsrc/conf/emailtest.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omadmadapters/email/tsrc/conf/emailtest.cfg Wed Jun 23 18:03:02 2010 +0300 @@ -0,0 +1,96 @@ +[Test] +title DDF +create emailtest foobar jee +foobar DDFStructure +delete foobar +[Endtest] + +[Test] +title StartAtomic +create emailtest foobar +foobar StartAtomic +delete foobar +[Endtest] + +[Test] +title CommitAtomic +create emailtest foobar +foobar CommitAtomic +delete foobar +[Endtest] + +[Test] +title RollbackAtomic +create emailtest foobar +foobar RollbackAtomic +delete foobar +[Endtest] + +[Test] +title AddEmail +create emailtest foobar +foobar AddNode Email/IMAP33245 +foobar UpdateLeaf Email/IMAP33245/Name email99 +foobar UpdateLeaf Email/IMAP33245/UName Test +foobar UpdateLeaf Email/IMAP33245/Mpro IMAP +foobar UpdateLeaf Email/IMAP33245/Mrcv mai..yaho.com +foobar UpdateLeaf Email/IMAP33245/Msnd smtp.yahoo.com +foobar CompleteCommands +delete foobar +[Endtest] + +[Test] +title UpdateLeafEmailName +create emailtest foobar +foobar UpdateLeaf Email/IMAP33245/Name newname99 +delete foobar +[Endtest] + +[Test] +title FetchNodeEmail +create emailtest foobar +foobar FetchNode Email/IMAP33245 +delete foobar +[Endtest] + +[Test] +title FetchLeafEmailName +create emailtest foobar +foobar FetchLeaf Email/IMAP33245/Name +delete foobar +[Endtest] + +[Test] +title FetchLeafEmailUName +create emailtest foobar +foobar FetchLeaf Email/IMAP33245/UName +delete foobar +[Endtest] + +[Test] +title FetchLeafEmailMpro +create emailtest foobar +foobar FetchLeaf Email/IMAP33245/Mpro +delete foobar +[Endtest] + +[Test] +title FetchLeafEmailMrcv +create emailtest foobar +foobar FetchLeaf Email/IMAP33245/Mrcv +delete foobar +[Endtest] + +[Test] +title FetchLeafEmailMsnd +create emailtest foobar +foobar FetchLeaf Email/IMAP33245/Msnd +delete foobar +[Endtest] + +[Test] +title DeleteEmail +create emailtest foobar +foobar DeleteNode Email/IMAP33245 +delete foobar +[Endtest] diff -r d3981f4fe6a4 -r c742e1129640 omadmadapters/email/tsrc/eabi/emailtestu.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omadmadapters/email/tsrc/eabi/emailtestu.def Wed Jun 23 18:03:02 2010 +0300 @@ -0,0 +1,9 @@ +EXPORTS + _Z9LibEntryLR13CTestModuleIf @ 1 NONAME + _ZTI10CemailTest @ 2 NONAME ; ## + _ZTI16CTestDmDDFObject @ 3 NONAME ; ## + _ZTI8Cdmatest @ 4 NONAME ; ## + _ZTV10CemailTest @ 5 NONAME ; ## + _ZTV16CTestDmDDFObject @ 6 NONAME ; ## + _ZTV8Cdmatest @ 7 NONAME ; ## + diff -r d3981f4fe6a4 -r c742e1129640 omadmadapters/email/tsrc/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omadmadapters/email/tsrc/group/bld.inf Wed Jun 23 18:03:02 2010 +0300 @@ -0,0 +1,55 @@ +/* +* Copyright (c) 2008 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 DM adapter test component +* This is part of omadmextensions/adapter test application. +* +*/ + + + + + + +PRJ_PLATFORMS +// specify the platforms your component needs to be built for here +// defaults to WINS MARM so you can ignore this if you just build these +DEFAULT + +PRJ_TESTEXPORTS +// NOTE: If using ARS requirements all export operations should be done under this. +// 'abld test export' + +PRJ_EXPORTS +// Specify the source file followed by its destination here +// copy will be used to copy the source file to its destination +// If there's no destination then the source file will be copied +// to the same name in /epoc32/include +// Example: + + +PRJ_TESTMMPFILES +// NOTE: If using ARS requirements .mmp file operation should be done under this. +// 'abld test build' +emailtest.mmp + +PRJ_MMPFILES +// Specify the .mmp files required for building the important component +// releasables. +// +// Specify "tidy" if the component you need to build doesn't need to be +// released. Specify "ignore" if the MMP file exists but should be +// ignored. +// Example: + +// End of File diff -r d3981f4fe6a4 -r c742e1129640 omadmadapters/email/tsrc/group/emailtest.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omadmadapters/email/tsrc/group/emailtest.mmp Wed Jun 23 18:03:02 2010 +0300 @@ -0,0 +1,64 @@ +/* +* Copyright (c) 2008 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 DM adapter test component +* This is part of omadmextensions/adapter test application. +* +*/ + + + + +#include + +TARGET emailtest.dll +TARGETTYPE dll +UID 0x1000008D 0x101FB3E3 + +CAPABILITY ALL -TCB +/* Remove comments and replace 0x00000000 with correct vendor id */ +// VENDORID 0x00000000 + +//TARGETPATH ?target_path +DEFFILE emailtest.def + +SOURCEPATH ../src +SOURCE dmatest.cpp +SOURCE TestDmDDFObject.cpp +SOURCE emailtest.cpp +SOURCE emailtestBlocks.cpp + + +USERINCLUDE ../inc +USERINCLUDE ../../inc + +SYSTEMINCLUDE /epoc32/include/ecom +APP_LAYER_SYSTEMINCLUDE + + + +LIBRARY apgrfx.lib apmime.lib +LIBRARY euser.lib ecom.lib +LIBRARY stiftestinterface.lib +LIBRARY stiftestengine.lib +LIBRARY efsrv.lib +LIBRARY estor.lib +LIBRARY SWInstCli.lib + +LANG SC + + + +SMPSAFE +// End of File + diff -r d3981f4fe6a4 -r c742e1129640 omadmadapters/email/tsrc/group/emailtest.pkg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omadmadapters/email/tsrc/group/emailtest.pkg Wed Jun 23 18:03:02 2010 +0300 @@ -0,0 +1,38 @@ +; +; Copyright (c) 2008 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 DM adapter test component +; This is part of omadmextensions/adapter test application. +; + +;*Languages +&EN +; +;*Standard SIS file header. This section specifies the package name, +;application UID, and version/build numbers. Add the package TYPE here if needed. +#{"emailtest"},(0x101FB3E8),1,0,1; +; + +;*Unique (Non-Localised) Vendor name +;This is used in combination with signing to prevent the unauthroized +;upgrade ofa a package by someone other than the rightful vendor. +:"Nokia" + +;*Localized Vendor Name +;This specifies the localised vendor name(s) correspodning to language(s). +%{"Nokia Test EN"} + +;*Files To Copy... +"\epoc32\release\armv5\urel\emailtest.dll" -"C:\sys\bin\emailtest.dll" +"..\conf\emailtest.cfg"-"C:\TestFramework\emailtest.cfg" +"..\init\emailtest.ini"-"C:\TestFramework\emailtest.ini" diff -r d3981f4fe6a4 -r c742e1129640 omadmadapters/email/tsrc/inc/TestDmDDFObject.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omadmadapters/email/tsrc/inc/TestDmDDFObject.h Wed Jun 23 18:03:02 2010 +0300 @@ -0,0 +1,203 @@ +/* +* Copyright (c) 2008 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 DM adapter test component +* This is part of omadmextensions/adapter test application. +* +*/ + + + + + + +#ifndef __TESTDMDDFOBJECT_H +#define __TESTDMDDFOBJECT_H + +// INCLUDES +//#include +#include + +// CONSTANTS +//const ?type ?constant_var = ?constant; + +// MACROS +//#define ?macro ?macro_def + +// DATA TYPES +//enum ?declaration +//typedef ?declaration +//extern ?data_type; + +// FUNCTION PROTOTYPES +//?type ?function_name(?arg_list); + +// FORWARD DECLARATIONS +class CStifLogger; + +// CLASS DECLARATION + +/** +* ?one_line_short_description. +* ?other_description_lines +* +* @lib ?library +* @since Series ?XX ?SeriesXX_version +*/ +class CTestDmDDFObject : public CBase, public MSmlDmDDFObject + { + public: // Constructors and destructor + + /** + * Two-phased constructor. + */ + static CTestDmDDFObject* NewL( CStifLogger *aLog ); + static CTestDmDDFObject* NewLC( CStifLogger *aLog ); + + /** + * Destructor. + */ + virtual ~CTestDmDDFObject(); + + public: // New functions + + /** + * ?member_description. + * @since Series ?XX ?SeriesXX_version + * @param ?arg1 ?description + * @return ?description + */ + //?type ?member_function( ?type ?arg1 ); + + virtual void SetNameL( const TDesC8& aName ); + + void DumpL( const TDesC8& aParentName, TBool aFullDump = ETrue ); + void ExternalizeL(RWriteStream& aStream) const; + + + + public: // Functions from base classes + +//sf- ********************************* + + void SetAccessTypesL( TSmlDmAccessTypes aAccessTypes ); + void SetDefaultValueL( const TDesC8& aDefaultValue ); + void SetDescriptionL( const TDesC8& aDescription ); + void SetDFFormatL( TDFFormat aFormat ); + void SetOccurenceL( TOccurence aOccurence ); + void SetScopeL( TScope aScope ); + void SetDFTitleL( const TDesC8& aTitle ); + void AddDFTypeMimeTypeL( const TDesC8& aMimeType ); + void SetAsObjectGroup(); + MSmlDmDDFObject& AddChildObjectL(const TDesC8& aNodeName); + MSmlDmDDFObject& AddChildObjectGroupL(); + +//sf- ############################# + + const TDesC8& Name(); + TSmlDmAccessTypes AccessTypes(); + const TDesC8& DefaultValue(); + const TDesC8& Description(); + TDFFormat DFFormat(); + TOccurence Occurence(); + TScope Scope(); + const TDesC8& DFTitle(); + const TDesC8& DFTypeMimeType(); + TBool ObjectGroup(); + + TInt ChildObjectCount(); + CTestDmDDFObject& ChildObject( TInt aIndex ); + + CTestDmDDFObject* FindChildObject( const TDesC8& aName ); + TInt SubObjectsCount(); + + + protected: // New functions + + /** + * ?member_description. + * @since Series ?XX ?SeriesXX_version + * @param ?arg1 ?description + * @return ?description + */ + //?type ?member_function( ?type ?arg1 ); + + protected: // Functions from base classes + + /** + * From ?base_class ?member_description + */ + //?type ?member_function(); + + private: + + /** + * C++ default constructor. + */ + CTestDmDDFObject( CStifLogger *aLog ); + + /** + * By default Symbian 2nd phase constructor is private. + */ + void ConstructL(); + + // Prohibit copy constructor if not deriving from CBase. + // CTestDmDDFObject( const CTestDmDDFObject& ); + // Prohibit assigment operator if not deriving from CBase. + // CTestDmDDFObject& operator=( const CTestDmDDFObject& ); + + public: // Data + // ?one_line_short_description_of_data + //?data_declaration; + + protected: // Data + // ?one_line_short_description_of_data + //?data_declaration; + + private: // Data + // ?one_line_short_description_of_data + //?data_declaration; + HBufC8* iName; + + TSmlDmAccessTypes iAccessTypes; + HBufC8* iDefaultValue; + HBufC8* iDescription; + TDFFormat iFormat; + TOccurence iOccurence; + TScope iScope; + HBufC8* iTitle; + HBufC8* iMimeType; + TBool iObjectGroup; + + RPointerArray iChildren; + + + // Reserved pointer for future extension + //TAny* iReserved; + + public: // Friend classes + //?friend_class_declaration; + protected: // Friend classes + //?friend_class_declaration; + private: // Friend classes + //?friend_class_declaration; + /** + * Logger. + */ + CStifLogger* iLog; + + }; + +#endif // __TESTDMDDFOBJECT_H + +// End of File diff -r d3981f4fe6a4 -r c742e1129640 omadmadapters/email/tsrc/inc/dmatest.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omadmadapters/email/tsrc/inc/dmatest.h Wed Jun 23 18:03:02 2010 +0300 @@ -0,0 +1,277 @@ +/* +* Copyright (c) 2008 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 DM adapter test component +* This is part of omadmextensions/adapter test application. +* +*/ + + + + + + +#ifndef __DMA_TEST_H__ +#define __DMA_TEST_H__ + +// INCLUDES +#include +#include +#include +#include +#include +#include "nsmldmemailadapter.h" + +class Cdmatest; + + +struct TMapping + { + TBuf8<256> iURI; + TBuf8<64> iLuid; + TMapping( const TDesC8 &aURI, const TDesC8 &aLuid ) : iURI( aURI ), iLuid( aLuid ) + { + + } + }; + +typedef RArray RMappingArray; + +typedef void (Cdmatest::* ResultsFunction)( TInt , CBufBase& , const TDesC8& ) ; + + +// CLASS DECLARATION + +/** +* ?one_line_short_description. +* ?other_description_lines +* +* @lib ?library +* @since Series ?XX ?SeriesXX_version +*/ +class Cdmatest : public CScriptBase, public MSmlDmCallback + { + + public: // Constructors and destructor + + /** + * Destructor. + */ + virtual ~Cdmatest(); + + public: // Functions from base classes + + /** + * From CScriptBase Runs a script line. + * @since ?Series60_version + * @param aItem Script line containing method name and parameters + * @return Symbian OS error code + */ + virtual TInt RunMethodL( CStifItemParser& aItem ) = 0; + + + public: + /** + The function is used to return the data in case of FetchLeafObjectL(), + FetchLeafObjectSizeL() and ChildURIListL() functions. It should not be + called where the DM command has failed, i.e. the error code returned in + SetStatusL is something other than EOk. + @param aResultsRef Reference to correct command + @param aObject The data which should be returned + @param aType MIME type of the object + @publishedPartner + @prototype + */ + void SetResultsL( TInt aResultsRef, CBufBase& aObject, + const TDesC8& aType ); + + /** + The function is used to return the data in case of FetchLeafObjectL() and + ChildURIListL() functions, where the size of the data being returned is + large enough for the Adapter to stream it. This function should not be + called when command was failed, i.e. the error code returned in SetStatusL + is something other than EOk. + @param aResultsRef Reference to correct command + @param aStream Large data which should be returned, DM engine + closes stream when it has read all the data + @param aType MIME type of the object + @publishedPartner + @prototype + */ + void SetResultsL( TInt /*aResultsRef*/, RReadStream*& /*aStream*/, + const TDesC8& /*aType*/ ) + { + + } + + /** + The function returns information about the Add,Update,Delete and Fetch + commands success to DM engine. The reference to correct command must be + used when calling the SetStatusL function, the reference is got from the + argument of the command functions. The SetStatusL function must be called + separately for every single command. + @param aStatusRef Reference to correct command + @param aErrorCode Information about the command success + @publishedPartner + @prototype + */ + void SetStatusL( TInt aStatusRef, + MSmlDmAdapter::TError aErrorCode ) ; + + /** + The function passes map information to DM Module. This function is called + for a new management object, both for node objects and for leaf objects. + In addition if ChildURIListL() function has returned new objects a mapping + information of the new objects must be passed. A mapping is treated as + inheritable. If the mapping is not set with this function, the mapping + LUID of the parent object is passed in following commands to the object. + @param aURI URI of the object. + @param aLUID LUID of the object. LUID must contain the all information, + which is needed for retrieve the invidual object from the + database. Typically it is ID for the database table. In + more complicated structures it can be combination of IDs, + which represent path to the object. + @publishedPartner + @prototype + */ + void SetMappingL( const TDesC8& aURI, const TDesC8& aLUID ); + + /** + The function is used to make a fetch to other adapters. The most common + use is to make a fetch to the AP adapter, because when managing the access + points, the data comes as URI. For example, there are ToNAPId field in + some adapters, and data to it can be something like AP/IAPidx, and then + the link to AP adapter is needed. + Using FetchLinkL causes the DM Framework to make a Get request to the + appropriate DM adapter. The receiving adapter MUST complete the Get + request synchronously. + @param aURI URI of the object. + @param aData Reference to data, i.e. data is returned here + @param aStatus The status of fetch command is returned here + @publishedPartner + @prototype + */ + void FetchLinkL( const TDesC8& /*aURI*/, CBufBase& /*aData*/, + MSmlDmAdapter::TError& /*aStatus*/ ) + { + + } + + /** + The function returns the LUID which is mapped to aURI. If LUID is not + found, the function allocates a null length string, i.e. the function + allocates memory in every case. + @param aURI URI of the object. + @publishedPartner + @prototype + */ + HBufC8* GetLuidAllocL( const TDesC8& aURI ) ; + +#ifdef __TARM_SYMBIAN_CONVERGENCY + + void GetMappingInfoListL( const TDesC8& aURI, + CArrayFix& aSegmentList ); + +#else +// nothing +#endif + + protected: // New functions + + + void FetchNodeResultsL( TInt aResultsRef, CBufBase& aObject, + const TDesC8& aType ); + void SaveDataL( TInt aResultsRef, CBufBase& aObject, + const TDesC8& aType ) ; + + TPtrC8 LastURISeg( const TDesC8& aURI ); + TPtrC8 RemoveLastURISeg( const TDesC8& aURI ); + TPtrC RemoveLastURISeg( const TDesC& aURI ); + void SetURIL( const TDesC& aURI ); + void SetURIL( const TDesC8& aURI ); + void SetURIL( HBufC8* aURI ); + HBufC8 *LoadFileLC( const TDesC &aFileName, TDataType &aType ); + HBufC8 *LoadFileLC( const TDesC8 &aFileName, TDataType &aType ); + HBufC8 *GetNextStringLC ( CStifItemParser& aItem, const TDesC &aName ); + HBufC8* GetLuidAllocLC( const TDesC8& aURI ) ; + TPtrC8 RemoveLastSeg(const TDesC8& aURI); + + TInt FetchNodeL( CStifItemParser& aItem ) ; + TInt FetchLeafL( CStifItemParser& aItem ) ; + TInt AddNodeL( CStifItemParser& aItem ); + TInt DeleteObjectL( CStifItemParser& aItem ); + TInt UpdateLeafL( CStifItemParser& aItem ) ; + TInt UpdateLeafDataL( CStifItemParser& aItem ) ; + TInt UpdateLeafDataURLL( CStifItemParser& aItem ) ; + + TInt ExecuteLeafL ( CStifItemParser& aItem ) ; + TInt ExecuteLeafDataL ( CStifItemParser& aItem ) ; + TInt StartAtomicL( CStifItemParser& aItem ) ; + TInt CommitAtomicL( CStifItemParser& aItem ) ; + TInt RollbackAtomicL( CStifItemParser& aItem ) ; + TInt CompleteCommandsL( CStifItemParser& aItem ); + TInt DDFStructureL( CStifItemParser& aItem ) ; +// TInt DeliverL( CStifItemParser& aItem ) ; +// TInt DetailsL( CStifItemParser& aItem ) ; +// TInt InstallL( CStifItemParser& aItem ) ; +// TInt BareInstallL( CStifItemParser& aItem ) ; + + protected: + + /** + * C++ default constructor. + */ + Cdmatest( CTestModuleIf& aTestModuleIf, TUid aUid ); + + /** + * By default Symbian 2nd phase constructor is private. + */ + void ConstructL(); + + // Prohibit copy constructor if not deriving from CBase. + // Cdmatest( const Cdmatest& ); + // Prohibit assigment operator if not deriving from CBase. + // Cdmatest& operator=( const Cdmatest& ); + + /** + * Frees all resources allocated from test methods. + * @since ?Series60_version + */ + virtual void Delete(); + void LoadMappingsL(); + void SaveMappingsL(); + public: // Data + // ?one_line_short_description_of_data + //?data_declaration; + + protected: // Data + // ?one_line_short_description_of_data + //?data_declaration; + MSmlDmAdapter::TError iStatus ; + ResultsFunction iResultsFunction; + //CSmlDmAdapter *iAdapter ; + CNSmlDmEmailAdapter *iAdapter ; + HBufC8 *iURI; + CArrayFix *iEmptyMappingInfoArray; + TFileName iSaveFileName; + RMappingArray iMappingTable; + TUid iUid; + TInt iCounter; + //class CNSmlDmMgmtTree* iMgmtTree; + class CNSmlDmMgmtTree* iMgmtTree; + CNSmlDmEmailAdapter *Adapter() ; + }; + +#endif // __DMA_TEST_H__ + +// End of File diff -r d3981f4fe6a4 -r c742e1129640 omadmadapters/email/tsrc/inc/emailtest.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omadmadapters/email/tsrc/inc/emailtest.h Wed Jun 23 18:03:02 2010 +0300 @@ -0,0 +1,133 @@ +/* +* Copyright (c) 2008 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 DM adapter test component +* This is part of omadmextensions/adapter test application. +* +*/ + + + + + + +#ifndef TCTEST_H +#define TCTEST_H + +// INCLUDES +#include +#include +#include +#include +#include "dmatest.h" + +const TUint KNSmlemailAdapterImplUid = 0x101F6E35; + + +const TUid KAdapterUid = + { + KNSmlemailAdapterImplUid + }; +// Logging path +_LIT( KamtestLogPath, "\\logs\\testframework\\tctest\\" ); +// Log file +_LIT( KamtestLogFile, "tctest.txt" ); + + +// FORWARD DECLARATIONS +class CemailTest; + + +// CLASS DECLARATION + +/** +* CemailTest test class for STIF Test Framework TestScripter. +* ?other_description_lines +* +* @lib ?library +* @since ?Series60_version +*/ +class CemailTest : public Cdmatest + { + public: // Constructors and destructor + + /** + * Two-phased constructor. + */ + static CemailTest* NewL( CTestModuleIf& aTestModuleIf ); + + /** + * Destructor. + */ + virtual ~CemailTest(); + + public: // Functions from base classes + + /** + * From CScriptBase Runs a script line. + * @since ?Series60_version + * @param aItem Script line containing method name and parameters + * @return Symbian OS error code + */ + virtual TInt RunMethodL( CStifItemParser& aItem ); + + + private: + + /** + * C++ default constructor. + */ + CemailTest( CTestModuleIf& aTestModuleIf ); + + /** + * By default Symbian 2nd phase constructor is private. + */ + void ConstructL(); + + // Prohibit copy constructor if not deriving from CBase. + // ?classname( const ?classname& ); + // Prohibit assigment operator if not deriving from CBase. + // ?classname& operator=( const ?classname& ); + + /** + * Frees all resources allocated from test methods. + * @since ?Series60_version + */ + virtual void Delete(); + + /** + * Test methods are listed below. + */ + + /** + * Example test method. + * @since ?Series60_version + * @param aItem Script line containing parameters. + * @return Symbian OS error code. + */ +/* virtual TInt ExampleL( CStifItemParser& aItem ) ; + virtual TInt DeliverL( CStifItemParser& aItem ) ; + virtual TInt DetailsL( CStifItemParser& aItem ) ; + virtual TInt InstallL( CStifItemParser& aItem ) ; + virtual TInt BareInstallL( CStifItemParser& aItem ) ;*/ + + + private: // Data + HBufC8 *GetNextStringLC ( CStifItemParser& aItem, const TDesC &aName ); + + + }; + +#endif // TCTEST_H + +// End of File diff -r d3981f4fe6a4 -r c742e1129640 omadmadapters/email/tsrc/init/emailtest.ini --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omadmadapters/email/tsrc/init/emailtest.ini Wed Jun 23 18:03:02 2010 +0300 @@ -0,0 +1,204 @@ +# +# This is STIF initialization file +# Comment lines start with '#'-character. +# See STIF TestFramework users guide.doc for instructions + +# -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +# Set following test engine settings: +# - Set Test Reporting mode. TestReportMode's possible values are: +# + 'Summary': Summary of the tested test cases. +# + 'Environment': Hardware and software info. +# + 'TestCases': Test case report. +# + 'FullReport': Set of all above ones. +# + Example 'TestReportMode= Summary TestCases' +# +# - CreateTestReport setting controls report creation mode +# + YES, Test report will created. +# + NO, No Test report. +# +# - File path indicates the base path of the test report. +# - File name indicates the name of the test report. +# +# - File format indicates the type of the test report. +# + TXT, Test report file will be txt type, for example 'TestReport.txt'. +# + HTML, Test report will be html type, for example 'TestReport.html'. +# +# - File output indicates output source of the test report. +# + FILE, Test report logging to file. +# + RDEBUG, Test report logging to using rdebug. +# +# - File Creation Mode indicates test report overwriting if file exist. +# + OVERWRITE, Overwrites if the Test report file exist. +# + APPEND, Continue logging after the old Test report information if +# report exist. +# - Sets a device reset module's dll name(Reboot). +# + If Nokia specific reset module is not available or it is not correct one +# StifHWResetStub module may use as a template for user specific reset +# module. +# - Sets STIF test measurement disable options. e.g. pluging1 and pluging2 disablation +# DisableMeasurement= stifmeasurementplugin01 stifmeasurementplugin02 +# + +[Engine_Defaults] + +TestReportMode= FullReport # Possible values are: 'Empty', 'Summary', 'Environment', + 'TestCases' or 'FullReport' + +CreateTestReport= YES # Possible values: YES or NO + +TestReportFilePath= C:\LOGS\TestFramework\ +TestReportFileName= TestReport + +TestReportFormat= TXT # Possible values: TXT or HTML +TestReportOutput= FILE # Possible values: FILE or RDEBUG +TestReportFileCreationMode= OVERWRITE # Possible values: OVERWRITE or APPEND + +DeviceResetDllName= StifResetForNokia.dll # e.g. 'StifHWResetStub.dll' for user specific reseting + +DisableMeasurement= stifmeasurementdisablenone # Possible values are: + # 'stifmeasurementdisablenone', 'stifmeasurementdisableall' + # 'stifmeasurementplugin01', 'stifmeasurementplugin02', + # 'stifmeasurementplugin03', 'stifmeasurementplugin04', + # 'stifmeasurementplugin05' or 'stifbappeaprofiler' + +Timeout= 0 # Default timeout value for each test case. In milliseconds +#UITestingSupport= YES # Possible values: YES or NO +#SeparateProcesses= YES # Possible values: YES or NO (default: NO) +[End_Defaults] +# -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- + + + +# -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +# Module configurations start +# Modules are added between module tags +# tags. Module name is specified after ModuleName= tag, like +# ModuleName= XXXXXXXXX +# Modules might have initialisation file, specified as +# IniFile= c:\testframework\YYYYYY +# Modules might have several configuration files, like +# TestCaseFile= c:\testframework\NormalCases.txt +# TestCaseFile= c:\testframework\SmokeCases.txt +# TestCaseFile= c:\testframework\ManualCases.txt + +# (TestCaseFile is synonym for old term ConfigFile) + +# Following case specifies demo module settings. Demo module +# does not read any settings from file, so tags +# IniFile and TestCaseFile are not used. +# In the simplest case it is enough to specify only the +# name of the test module when adding new test module + +#[New_Module] +#ModuleName= demomodule +#[End_Module] + + +[New_Module] +ModuleName= testscripter +#DM +TestCaseFile= c:\testframework\emailtest.cfg +[End_Module] + + +# Load testmoduleXXX, optionally with initialization file and/or test case files +#[New_Module] +#ModuleName= testmodulexxx + +#TestModuleXXX used initialization file +#IniFile= c:\testframework\init.txt + +#TestModuleXXX used configuration file(s) +#TestCaseFile= c:\testframework\testcases1.cfg +#TestCaseFile= c:\testframework\testcases2.cfg +#TestCaseFile= c:\testframework\manualtestcases.cfg + +#[End_Module] +# -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- + + + +# -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +# Set STIF logging overwrite parameters for Logger. +# Hardware and emulator environment logging path and styles can +# be configured from here to overwrite the Logger's implemented values. +# +# Settings description: +# - Indicates option for creation log directory/directories. If log directory/directories +# is/are not created by user they will make by software. +# + YES, Create log directory/directories if not allready exist. +# + NO, Log directory/directories not created. Only created one is used. +# +# - Overwrite emulator path setting. +# + Example: If 'EmulatorBasePath= C:\LOGS\TestFramework\' and in code is defined +# Logger's path 'D:\\LOGS\\Module\\' with those definition the path +# will be 'C:\LOGS\TestFramework\LOGS\Module\' +# +# - Overwrite emulator's logging format. +# + TXT, Log file(s) will be txt type(s), for example 'Module.txt'. +# + HTML, Log file(s) will be html type(s), for example 'Module.html'. +# +# - Overwrited emulator logging output source. +# + FILE, Logging to file(s). +# + RDEBUG, Logging to using rdebug(s). +# +# - Overwrite hardware path setting (Same description as above in emulator path). +# - Overwrite hardware's logging format(Same description as above in emulator format). +# - Overwrite hardware's logging output source(Same description as above in emulator output). +# +# - File Creation Mode indicates file overwriting if file exist. +# + OVERWRITE, Overwrites if file(s) exist. +# + APPEND, Continue logging after the old logging information if file(s) exist. +# +# - Will thread id include to the log filename. +# + YES, Thread id to log file(s) name, Example filename 'Module_b9.txt'. +# + NO, No thread id to log file(s), Example filename 'Module.txt'. +# +# - Will time stamps include the to log file. +# + YES, Time stamp added to each line in log file(s). Time stamp is +# for example'12.Nov.2003 115958 LOGGING INFO' +# + NO, No time stamp(s). +# +# - Will line breaks include to the log file. +# + YES, Each logging event includes line break and next log event is in own line. +# + NO, No line break(s). +# +# - Will event ranking include to the log file. +# + YES, Event ranking number added to each line in log file(s). Ranking number +# depends on environment's tics, for example(includes time stamp also) +# '012 12.Nov.2003 115958 LOGGING INFO' +# + NO, No event ranking. +# +# - Will write log file in unicode format. +# + YES, Log file will be written in unicode format +# + NO, Log will be written as normal, not unicode, file. +# + +[Logger_Defaults] + +#NOTE: If you want to set Logger using next setting(s) remove comment(s)'#' +#NOTE: TestEngine and TestServer logging settings cannot change here + +#CreateLogDirectories= YES # Possible values: YES or NO + +#EmulatorBasePath= C:\LOGS\TestFramework\ +#EmulatorFormat= HTML # Possible values: TXT or HTML +#EmulatorOutput= FILE # Possible values: FILE or RDEBUG + +#HardwareBasePath= D:\LOGS\TestFramework\ +#HardwareFormat= HTML # Possible values: TXT or HTML +#HardwareOutput= FILE # Possible values: FILE or RDEBUG + +#FileCreationMode= OVERWRITE # Possible values: OVERWRITE or APPEND + +#ThreadIdToLogFile= YES # Possible values: YES or NO +#WithTimeStamp= YES # Possible values: YES or NO +#WithLineBreak= YES # Possible values: YES or NO +#WithEventRanking= YES # Possible values: YES or NO + +#FileUnicode= YES # Possible values: YES or NO +#AddTestCaseTitle= YES # Possible values: YES or NO +[End_Logger_Defaults] +# -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- + +# End of file diff -r d3981f4fe6a4 -r c742e1129640 omadmadapters/email/tsrc/src/TestDmDDFObject.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omadmadapters/email/tsrc/src/TestDmDDFObject.cpp Wed Jun 23 18:03:02 2010 +0300 @@ -0,0 +1,516 @@ +/* +* Copyright (c) 2008 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 DM adapter test component +* This is part of omadmextensions/adapter test application. +* +*/ + + + + + + +// INCLUDE FILES + +#include "TestDmDDFObject.h" +#include "StifLogger.h" + +// EXTERNAL DATA STRUCTURES +//extern ?external_data; + +// EXTERNAL FUNCTION PROTOTYPES +//extern ?external_function( ?arg_type,?arg_type ); + +// CONSTANTS +//const ?type ?constant_var = ?constant; + +// MACROS +//#define ?macro ?macro_def + +// LOCAL CONSTANTS AND MACROS +//const ?type ?constant_var = ?constant; +//#define ?macro_name ?macro_def + +// MODULE DATA STRUCTURES +//enum ?declaration +//typedef ?declaration + +// LOCAL FUNCTION PROTOTYPES +//?type ?function_name( ?arg_type, ?arg_type ); + +// FORWARD DECLARATIONS +//class ?FORWARD_CLASSNAME; + +// ============================= LOCAL FUNCTIONS =============================== + + + + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CTestDmDDFObject::CTestDmDDFObject +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CTestDmDDFObject::CTestDmDDFObject( CStifLogger *aLog ) + : iName( 0 ) + , iAccessTypes() + , iDefaultValue( 0 ) + , iDescription( 0 ) + , iFormat( (TDFFormat)0 ) + , iOccurence( (TOccurence)0 ) + , iScope( (TScope)0 ) + , iTitle ( 0 ) + , iMimeType( 0 ) + , iObjectGroup( EFalse ) + , iLog( aLog ) +// RPointerArray iChildren; + { + } + +// ----------------------------------------------------------------------------- +// CTestDmDDFObject::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CTestDmDDFObject::ConstructL() + { + } + +// ----------------------------------------------------------------------------- +// CTestDmDDFObject::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CTestDmDDFObject* CTestDmDDFObject::NewL( CStifLogger *aLog ) + { + CTestDmDDFObject* self = CTestDmDDFObject::NewLC( aLog ); + CleanupStack::Pop( self ); + + return self; + } + +CTestDmDDFObject* CTestDmDDFObject::NewLC( CStifLogger *aLog ) + { + CTestDmDDFObject* self = new( ELeave ) CTestDmDDFObject( aLog ); + + CleanupStack::PushL( self ); + self->ConstructL(); + + return self; + } + + +// Destructor +CTestDmDDFObject::~CTestDmDDFObject() + { + delete iName; + delete iDefaultValue; + delete iDescription; + delete iTitle; + delete iMimeType; + iChildren.ResetAndDestroy(); + } + + +// ----------------------------------------------------------------------------- +// CTestDmDDFObject::?member_function +// ?implementation_description +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +/*?type CTestDmDDFObject::?member_function( + ?arg_type arg, + ?arg_type arg ) + { + + ?code + + } +*/ + +void CTestDmDDFObject::SetAccessTypesL( TSmlDmAccessTypes aAccessTypes ) + { + iLog->Log( _L8( "SetAccessTypesL, aAccessTypes=%d" ), aAccessTypes.GetACL() ); + iAccessTypes = aAccessTypes; + } + +void CTestDmDDFObject::SetDefaultValueL( const TDesC8& aDefaultValue ) + { + iLog->Log( _L8( "SetDefaultValueL, aDefaultValue='%S'" ), &aDefaultValue ); + delete iDefaultValue; + iDefaultValue = 0; + iDefaultValue = aDefaultValue.AllocL(); + } + +void CTestDmDDFObject::SetDescriptionL( const TDesC8& aDescription ) + { + iLog->Log( _L8( "SetDescriptionL, aDescription='%S'" ), &aDescription ); + delete iDescription; + iDescription = 0; + iDescription = aDescription.AllocL(); + } + +void CTestDmDDFObject::SetDFFormatL( TDFFormat aFormat ) + { + iLog->Log( _L8( "SetDFFormatL, aFormat=%d" ), aFormat ); + iFormat = aFormat; + } + +void CTestDmDDFObject::SetOccurenceL( TOccurence aOccurence ) + { + iLog->Log( _L8( "SetOccurenceL, aOccurence=%d" ), aOccurence ); + iOccurence = aOccurence; + } + +void CTestDmDDFObject::SetScopeL( TScope aScope ) + { + iLog->Log( _L8( "SetScopeL, aScope=%d" ), aScope ); + iScope = aScope; + } + +void CTestDmDDFObject::SetDFTitleL( const TDesC8& aTitle ) + { + iLog->Log( _L8( "SetDFTitleL, aTitle='%S'" ), &aTitle ); + delete iTitle; + iTitle = 0; + iTitle = aTitle.AllocL(); + } + +void CTestDmDDFObject::AddDFTypeMimeTypeL( const TDesC8& aMimeType ) + { + iLog->Log( _L8( "AddDFTypeMimeTypeL, aMimeType='%S'" ), &aMimeType ); + delete iMimeType; + iMimeType = 0; + iMimeType = aMimeType.AllocL(); + } + +void CTestDmDDFObject::SetAsObjectGroup() + { + iLog->Log( _L8( "SetAsObjectGroup, true" ) ); + iObjectGroup = ETrue; + } + +MSmlDmDDFObject& CTestDmDDFObject::AddChildObjectL(const TDesC8& aNodeName) + { + iLog->Log( _L8( "AddChildObjectL, aNodeName='%S'" ), &aNodeName ); + CTestDmDDFObject* child = CTestDmDDFObject::NewLC( iLog ); //, aNodeName ); + child->SetNameL( aNodeName ); + iChildren.AppendL( child ); + CleanupStack::Pop( child ); // Don't destroy + return *child; + } + +MSmlDmDDFObject& CTestDmDDFObject::AddChildObjectGroupL() + { + iLog->Log( _L8( "AddChildObjectGroupL, ''" ) ); + CTestDmDDFObject* child = CTestDmDDFObject::NewLC( iLog ); //, KNullDesC ); + child->SetAsObjectGroup(); + iChildren.AppendL( child ); + CleanupStack::Pop( child ); // Don't destroy + return *child; + } + +// Own functions + +void CTestDmDDFObject::SetNameL( const TDesC8& aName ) + { + delete iName; + iName = 0; + iName = aName.AllocL(); + } + +void CTestDmDDFObject::DumpL( const TDesC8& aParentName, TBool aFullDump ) + { + TPtrC8 name( _L8("") ); + if (iName && iName->Length() > 0) + { + name.Set( *iName ); + } + + HBufC8* fullName = HBufC8::NewLC( aParentName.Length() + name.Length() + 1 ); + *fullName = aParentName; + if (aParentName.Length() > 0 && aParentName[ aParentName.Length() - 1 ] != '/') + { + fullName->Des().Append( _L8("/")); + } + fullName->Des().Append( name ); + + /* Translate some members to text for dumping */ + TBuf8<20> strAccessTypes; + TUint8 accessTypes = iAccessTypes.GetACL(); + if ((accessTypes & iAccessTypes.EAccessType_Add) != 0) + { + strAccessTypes.Append( _L8("A") ); + } + if ((accessTypes & iAccessTypes.EAccessType_Copy) != 0) + { + strAccessTypes.Append( _L8("C") ); + } + if ((accessTypes & iAccessTypes.EAccessType_Delete) != 0) + { + strAccessTypes.Append( _L8("D") ); + } + if ((accessTypes & iAccessTypes.EAccessType_Exec) != 0) + { + strAccessTypes.Append( _L8("E") ); + } + if ((accessTypes & iAccessTypes.EAccessType_Get) != 0) + { + strAccessTypes.Append( _L8("G") ); + } + if ((accessTypes & iAccessTypes.EAccessType_Replace) != 0) + { + strAccessTypes.Append( _L8("R") ); + } + + TBuf8<20> strFormat; + switch( iFormat ) + { + case EB64: + strFormat = _L8("Base64"); + break; + case EBool: + strFormat = _L8("Bool"); + break; + case EChr: + strFormat = _L8("Chr"); + break; + case EInt: + strFormat = _L8("Int"); + break; + case ENode: + strFormat = _L8("Node"); + break; + case ENull: + strFormat = _L8("Null"); + break; + case EXml: + strFormat = _L8("Xml"); + break; + case EBin: + strFormat = _L8("Bin"); + break; + default: + break; + } + + + TBuf8<20> strOccurence; + switch( iOccurence ) + { + case EOne: + /** The node appears exactly once */ + strOccurence = _L8("M:1"); + break; + case EZeroOrOne: + /** The node is optional and may appear zero or once */ + strOccurence = _L8("O:0-1"); + break; + case EZeroOrMore: + /** The node is optional and may appear zero or more times */ + strOccurence = _L8("O:0-*"); + break; + case EOneOrMore: + /** The node is mandatory and may appear once or more times */ + strOccurence = _L8("M:1-*"); + break; + case EZeroOrN: + /** The node is optional and may appear between once and 'N' times */ + strOccurence = _L8("O:1-N"); + break; + case EOneOrN: + /** The node is mandatory and may appear between once and 'N' times */ + strOccurence = _L8("M:1-N"); + break; + default: + break; + } + + + TBuf8<20> strScope; + switch( iScope) + { + case EPermanent: + /** The node appears exactly once */ + strScope = _L8("Permanent"); + break; + case EDynamic: + /** The node is optional and may appear zero or once */ + strScope = _L8("O:Dynamic"); + break; + default: + break; + } + + + /* Dump main data */ + if (aFullDump) + { + iLog->Log( _L8( "DDFObject: '%S'" ), fullName ); + } + else + { + iLog->Log( _L8( "DDFObject: '%S' (%S), %S, %S, %S" ), + fullName, &strAccessTypes, &strFormat, &strOccurence, &strScope ); + } + + /* Dump members */ + if (aFullDump) + { + TPtrC8 empty( _L8( "" ) ); + #define CHK_NULL(a) ((a)==0?(TDesC8*)(&empty):(TDesC8*)(a)) + + iLog->Log( _L8( " iName=='%S'" ), iName ); + iLog->Log( _L8( " iAccessTypes=%d (%S)" ), iAccessTypes.GetACL(), &strAccessTypes ); + iLog->Log( _L8( " iDefaultValue='%S'" ), CHK_NULL(iDefaultValue)); + iLog->Log( _L8( " iDescription='%S'" ), CHK_NULL(iDescription )); + iLog->Log( _L8( " iFormat=%d (%S)" ), iFormat, &strFormat ); + iLog->Log( _L8( " iOccurence=%d (%S)" ), iOccurence, &strOccurence ); + iLog->Log( _L8( " iScope=%d (%S)" ), iScope, &strScope ); + iLog->Log( _L8( " iTitle='%S'" ), CHK_NULL(iTitle )); + iLog->Log( _L8( " iMimeType='%S'" ), CHK_NULL(iMimeType )); + iLog->Log( _L8( "----------------------------------" ) ); + } + + /* Dump children */ + for (TInt i = 0 ; i < iChildren.Count() ; i++) + { + iChildren[i]->DumpL( *fullName, aFullDump ); + } + + CleanupStack::PopAndDestroy( fullName ); + } + +/* +void CTestDmDDFObject::ExternalizeL(RWriteStream& aStream) const + { + X; + aStream << *iName << eol; + } +*/ + +const TDesC8& CTestDmDDFObject::Name() + { + return (iName != 0) ? *iName : KNullDesC8(); + } + +TSmlDmAccessTypes CTestDmDDFObject::AccessTypes() + { + return iAccessTypes; + } + +const TDesC8& CTestDmDDFObject::DefaultValue() + { + return (iDefaultValue != 0) ? *iDefaultValue : KNullDesC8(); + } + +const TDesC8& CTestDmDDFObject::Description() + { + return (iDescription != 0) ? *iDescription : KNullDesC8(); + } + +CTestDmDDFObject::TDFFormat CTestDmDDFObject::DFFormat() + { + return iFormat; + } + +CTestDmDDFObject::TOccurence CTestDmDDFObject::Occurence() + { + return iOccurence; + } + +CTestDmDDFObject::TScope CTestDmDDFObject::Scope() + { + return iScope; + } + +const TDesC8& CTestDmDDFObject::DFTitle() + { + return (iTitle != 0) ? *iTitle : KNullDesC8(); + } + +const TDesC8& CTestDmDDFObject::DFTypeMimeType() + { + return (iMimeType != 0) ? *iMimeType : KNullDesC8(); + } + +TBool CTestDmDDFObject::ObjectGroup() + { + return iObjectGroup; + } + +TInt CTestDmDDFObject::ChildObjectCount() + { + return iChildren.Count(); + } + +CTestDmDDFObject& CTestDmDDFObject::ChildObject( TInt aIndex ) + { + return *iChildren[aIndex]; + } + +CTestDmDDFObject* CTestDmDDFObject::FindChildObject( const TDesC8& aName ) + { + CTestDmDDFObject* foundObject = 0; + + for (TInt i = 0 ; i < iChildren.Count() ; i++) + { + if ( aName.CompareC( iChildren[i]->Name() ) == 0 ) + { + foundObject = iChildren[i]; + break; + } + } + + return foundObject; + } + +TInt CTestDmDDFObject::SubObjectsCount() + { + TInt count = 0; + + TInt i; + for (i = 0 ; i < iChildren.Count() ; i++) + { + count += iChildren[i]->SubObjectsCount(); + } + count += i; + + return count; + } + +/* +// ========================== OTHER EXPORTED FUNCTIONS ========================= + +// ----------------------------------------------------------------------------- +// ?function_name implements... +// ?implementation_description. +// Returns: ?value_1: ?description +// ?value_n: ?description +// ?description +// ----------------------------------------------------------------------------- +// +?type ?function_name( + ?arg_type arg, // ?description + ?arg_type arg ) // ?description + { + + ?code + + } +*/ +// End of File diff -r d3981f4fe6a4 -r c742e1129640 omadmadapters/email/tsrc/src/dmatest.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omadmadapters/email/tsrc/src/dmatest.cpp Wed Jun 23 18:03:02 2010 +0300 @@ -0,0 +1,953 @@ +/* +* Copyright (c) 2008 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 DM adapter test component +* This is part of omadmextensions/adapter test application. +* +*/ + + + + + + +// INCLUDE FILES +#include "dmatest.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "TestDmDDFObject.h" + +_LIT8( KEmptyType, "" ); +_LIT8( KDefaultType, "text/plain" ); +_LIT( KMappingTableFile, "\\dmtestmappings.txt" ); +//_LIT8( KNSmlDMSeparator8, "/" ); +const TUint8 KNSmlDMUriSeparator = 0x2f; //forward slash + +#define LEAVE_IF_ERROR(x,msg) \ + { TInt __xres = (x); if ( __xres < 0 ) { if ( iLog ) iLog->Log( (msg), __xres ); User::Leave( __xres ); } } + + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// Cdmatest::Cdmatest +// C++ default constructor can NOT contain any code, that +// leave. +// ----------------------------------------------------------------------------- +// +Cdmatest::Cdmatest(CTestModuleIf& aTestModuleIf, TUid aUid ): + CScriptBase( aTestModuleIf ), iMappingTable(2), iUid( aUid ) + { + + } + +// ----------------------------------------------------------------------------- +// Cdmatest::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void Cdmatest::ConstructL() + { + Adapter(); + iEmptyMappingInfoArray = new ( ELeave ) CArrayFixFlat(1); + + TRAPD( err, LoadMappingsL() ); + if (err != KErrEof && err != KErrNone && err != KErrNotFound) + { + User::Leave( err ); + } + } + +CNSmlDmEmailAdapter *Cdmatest::Adapter() + { + if ( iAdapter == NULL ) + { + if ( iLog ) + { + iLog->Log( _L( "Loading Adapter" ) ); + } + + TRAPD( err, iAdapter = (CNSmlDmEmailAdapter*) CSmlDmAdapter::NewL( iUid,*this ) ); + if ( err == KErrNone ) + { + if (iLog ) + { + iLog->Log( _L( "Loaded" ) ); + } + } + else + { + if (iLog) + { + iLog->Log( _L( "Failed to load adapter: %d" ), err ); + } + } + } + return iAdapter; + } + + +void Cdmatest::LoadMappingsL() + { + TDataType type; + HBufC8 *data = LoadFileLC( KMappingTableFile, type ); + RDesReadStream buf( *data ); + CleanupClosePushL( buf ); + + TInt len( data->Length() ); + while (buf.Source()->TellL( MStreamBuf::ERead ).Offset() < len) + { + TUint32 val = buf.ReadUint32L(); + TBuf8<256> uri; + TBuf8<64> luid; + buf.ReadL(uri, val); + val = buf.ReadUint32L(); + buf.ReadL(luid, val); + TMapping m( uri, luid ) ; + TInt err( iMappingTable.Append( m ) ); + if ( err == KErrNone ) + { + iLog->Log( _L8( "Loaded mapping: '%S' : '%S'"), &m.iURI, &m.iLuid ); + } + else + { + iLog->Log( _L8( "FAILED TO Load mapping: '%d' "), err ); + } + } + CleanupStack::PopAndDestroy( &buf); // buf + CleanupStack::PopAndDestroy( data ); // data + } + + + +void Cdmatest::SaveMappingsL() + { + TInt c( iMappingTable.Count() ); + if ( c > 0 ) + { + RFs fs; + User::LeaveIfError( fs.Connect() ); + CleanupClosePushL( fs ); + RFileWriteStream buf; + User::LeaveIfError( buf.Replace( fs, KMappingTableFile, EFileWrite ) ); + CleanupClosePushL( buf ); + + TInt i( 0 ) ; + do + { + buf.WriteUint32L( iMappingTable[i].iURI.Length() ); + buf.WriteL( iMappingTable[i].iURI ); + buf.WriteUint32L( iMappingTable[i].iLuid.Length() ); + buf.WriteL( iMappingTable[i].iLuid ); + } + while ( ++i < c ) ; + buf.CommitL(); + buf.Close(); + + CleanupStack::PopAndDestroy(); // buf + CleanupStack::PopAndDestroy(); // fs + } + } + + +// Destructor +Cdmatest::~Cdmatest() + { + // Delete resources allocated from test methods + TRAPD(err, SaveMappingsL() ); + if ( err != KErrNone ) + { + iLog->Log( _L8( "Failed to save mappings!: %d"), err ); + } + Delete(); + + // Delete logger + delete iLog; + delete iEmptyMappingInfoArray; + delete iAdapter; + delete iURI; + iMappingTable.Reset(); + REComSession::FinalClose(); + } + + +// ----------------------------------------------------------------------------- +// Camatest::Delete +// Delete here all resources allocated and opened from test methods. +// Called from destructor. +// ----------------------------------------------------------------------------- +// +void Cdmatest::Delete() + { + + } + +// ----------------------------------------------------------------------------- +// Cdmatest::?member_function +// ?implementation_description +// (other items were commented in a header). +// ----------------------------------------------------------------------------- + + + +HBufC8 *Cdmatest::GetNextStringLC ( CStifItemParser& aItem, const TDesC &aName ) + { + TPtrC nodename( KNullDesC ); + + TInt i( aItem.GetNextString ( nodename ) ); + if ( i != KErrNone ) + { + iLog->Log( _L( "ERROR Reading '%S' argument: 0x%X" ), &aName, i ); + } + else + { + iLog->Log( _L("%S: %S"), &aName, &nodename); + } + + HBufC8 *buf = HBufC8::NewLC( nodename.Length() ) ; + buf->Des().Copy( nodename ); + return buf; + } + +TInt Cdmatest::FetchNodeL( CStifItemParser& aItem ) + { + + TInt ret( KErrNone ); + // Print to UI + TestModuleIf().Printf( 0, _L("Cdmatest"), _L("FetchNodeL") ); + + iResultsFunction = FetchNodeResultsL; + + TPtrC8 nodename( GetNextStringLC( aItem, _L(" nodename" ) )->Des() ) ; + + SetURIL(nodename) ;// + HBufC8 *luid = GetLuidAllocLC( *iURI ); + + Adapter()->ChildURIListL( *iURI, *luid, *iEmptyMappingInfoArray, 4, 5) ; + + if ( iStatus == MSmlDmAdapter::EOk ) + { + } + else + { + iLog->Log( _L("FetchNodeL: ChildUriList Error ! %d" ), iStatus ); + ret = KErrGeneral ; + } + CleanupStack::PopAndDestroy( luid ) ; + CleanupStack::PopAndDestroy() ; // nodename + iLog->Log( _L("FetchNodeL: Test Complete with status %d" ), ret ); + + return ret; + } + +TInt Cdmatest::StartAtomicL( CStifItemParser& /*aItem*/ ) + { + TRAPD( err, Adapter()->StartAtomicL() ) ; + iLog->Log( _L("StartAtomicL: Atomic started resulting error %d" ), err ); + return err; + } + +TInt Cdmatest::RollbackAtomicL( CStifItemParser& /*aItem*/ ) + { + TRAPD( err, Adapter()->RollbackAtomicL() ) ; + iLog->Log( _L("RollbackAtomicL: Atomic rolled back resulting error %d" ), err ); + return err; + } + +TInt Cdmatest::CommitAtomicL( CStifItemParser& /*aItem*/ ) + { + TRAPD( err, Adapter()->CommitAtomicL() ) ; + iLog->Log( _L("RollbackAtomicL: Atomic commited resulting error %d" ), err ); + return err; + } + + +TInt Cdmatest::DDFStructureL( CStifItemParser& /*aItem*/ ) + { + CTestDmDDFObject* ddfRoot = CTestDmDDFObject::NewLC( iLog ); //, aNodeName ); + + TRAPD( err, iAdapter->DDFStructureL( *ddfRoot ) ) ; + CleanupStack::PopAndDestroy( ddfRoot ); + iLog->Log( _L("DDFStructureL: method called resulting error %d" ), err ); + return err; + } + + +TInt Cdmatest::AddNodeL( CStifItemParser& aItem ) + { + + TInt ret( KErrNone ); + // Print to UI + TestModuleIf().Printf( 0, _L("Cdmatest"), _L("AddNodeL") ); + + + TPtrC8 nodename( GetNextStringLC ( aItem, _L("nodename" ) )->Des() ) ; + SetURIL( nodename ); + + Adapter()->AddNodeObjectL( *iURI, KEmptyType, 8 ) ; + + if ( iStatus == MSmlDmAdapter::EOk ) + { + iLog->Log( _L("AddNodeL: AddNodeObjectL Successful! %d" ), iStatus ); + } + else + { + iLog->Log( _L("AddNodeL: AddNodeObjectL Error ! %d" ), iStatus ); + ret = KErrGeneral ; + } + + CleanupStack::PopAndDestroy() ; // nodename + iLog->Log( _L("AddNodeL Test Complete with status %d" ), ret ); + + return ret; + } + +TInt Cdmatest::UpdateLeafL( CStifItemParser& aItem ) + { + + TInt ret( KErrNone ); + // Print to UI + TestModuleIf().Printf( 0, _L("Cdmatest"), _L("UpdateLeafL") ); + + TPtrC8 nodename( GetNextStringLC ( aItem, _L("Node name") )->Des() ) ; + TPtrC8 data (GetNextStringLC( aItem, _L("datafile"))->Des() ); + + HBufC8 *mime = GetNextStringLC( aItem, _L("mime") ) ; + SetURIL( nodename ); + + TPtrC8 parentURI(RemoveLastSeg(nodename)); + HBufC8 *luid = GetLuidAllocLC( parentURI ); + + TDataType type; + + TPtrC8 mimePtr( *mime == KNullDesC8 ? type.Des8() : mime->Des() ); + + /** + virtual void UpdateLeafObjectL( const TDesC8& aURI, const TDesC8& aLUID, + const TDesC8& aObject, const TDesC8& aType, + TInt aStatusRef ) = 0; + */ + + Adapter()->UpdateLeafObjectL( *iURI , *luid, data, mimePtr, 3); + + if ( iStatus == MSmlDmAdapter::EOk ) + { + iLog->Log( _L("UpdateLeafL: UpdateLeafObjectL Successful! %d" ), iStatus ); + } + else + { + iLog->Log( _L("UpdateLeafL UpdateLeafObjectL Error ! %d" ), iStatus ); + ret = KErrGeneral ; + } + + CleanupStack::PopAndDestroy(); // loadfile + CleanupStack::PopAndDestroy(); // luid + CleanupStack::PopAndDestroy(); // mime + CleanupStack::PopAndDestroy(); // nodename + + iLog->Log( _L("UpdateLeafL Test Complete with status %d" ), ret ); + + return ret; + } + + +TInt Cdmatest::UpdateLeafDataURLL( CStifItemParser& aItem ) + { + + TInt ret( KErrNone ); + // Print to UI + TestModuleIf().Printf( 0, _L("Cdmatest"), _L("UpdateLeafDataL") ); + + TPtrC8 nodename( GetNextStringLC ( aItem, _L("Node name") )->Des() ) ; + TPtrC8 http (GetNextStringLC( aItem, _L("http"))->Des() ); + TPtrC8 url (GetNextStringLC( aItem, _L("rest of url"))->Des() ); + HBufC8 *mime = GetNextStringLC( aItem, _L("mime") ) ; + SetURIL( nodename ); + + _LIT8( KTag, "://" ); + + HBufC8 *fullurl = HBufC8::NewLC( http.Length() + KTag().Length() + url.Length() ); + TPtr8 pfullurl( fullurl->Des() ); + pfullurl.Copy( http ) ; + pfullurl.Append( KTag ); + pfullurl.Append( url ); + TPtrC8 mimePtr( *mime == KNullDesC8 ? KDefaultType() : mime->Des() ); + + HBufC8 *luid = GetLuidAllocLC( *iURI ); + /** + virtual void UpdateLeafObjectL( const TDesC8& aURI, const TDesC8& aLUID, + const TDesC8& aObject, const TDesC8& aType, + TInt aStatusRef ) = 0; + */ + Adapter()->UpdateLeafObjectL( *iURI , *luid, pfullurl, mimePtr, 3); + if ( iStatus == MSmlDmAdapter::EOk ) + { + iLog->Log( _L("UpdateLeafDataL: UpdateLeafObjectL Successful! %d" ), iStatus ); + } + else + { + iLog->Log( _L("UpdateLeafDataL UpdateLeafObjectL Error ! %d" ), iStatus ); + ret = KErrGeneral ; + } + CleanupStack::PopAndDestroy( luid ); // + CleanupStack::PopAndDestroy( mime ); // mime + CleanupStack::PopAndDestroy(); // url + CleanupStack::PopAndDestroy(); // http + CleanupStack::PopAndDestroy(); // nodename + iLog->Log( _L("UpdateLeafDataL Test Complete with status %d" ), ret ); + + return ret; + } + +TInt Cdmatest::UpdateLeafDataL( CStifItemParser& aItem ) + { + + TInt ret( KErrNone ); + // Print to UI + TestModuleIf().Printf( 0, _L("Camtest"), _L("UpdateLeafDataL") ); + + TPtrC8 nodename( GetNextStringLC ( aItem, _L("Node name") )->Des() ) ; + TPtrC8 data (GetNextStringLC( aItem, _L("data"))->Des() ); + HBufC8 *mime = GetNextStringLC( aItem, _L("mime") ) ; + + SetURIL( nodename ); + + + TPtrC8 mimePtr( *mime == KNullDesC8 ? KDefaultType() : mime->Des() ); + + TPtrC8 parentURI(RemoveLastSeg(nodename)); + HBufC8 *luid = GetLuidAllocLC( parentURI ); + +// +// virtual void UpdateLeafObjectL( const TDesC8& aURI, const TDesC8& aLUID, +// const TDesC8& aObject, const TDesC8& aType, +// TInt aStatusRef ) = 0; +// + Adapter()->UpdateLeafObjectL( *iURI , *luid, data, mimePtr, 3); + if ( iStatus == MSmlDmAdapter::EOk ) + { + iLog->Log( _L("UpdateLeafDataL: UpdateLeafObjectL Successful! %d" ), iStatus ); + } + else + { + iLog->Log( _L("UpdateLeafDataL UpdateLeafObjectL Error ! %d" ), iStatus ); + ret = KErrGeneral ; + } + + CleanupStack::PopAndDestroy(); // mime + CleanupStack::PopAndDestroy(); // luid + CleanupStack::PopAndDestroy(); // data + CleanupStack::PopAndDestroy(); // nodename + iLog->Log( _L("UpdateLeafDataL Test Complete with status %d" ), ret ); + + return ret; + } + +TInt Cdmatest::FetchLeafL( CStifItemParser& aItem ) + { + + TInt ret( KErrNone ); + // Print to UI + TestModuleIf().Printf( 0, _L("Camtest"), _L("FetchLeafL") ); + + iResultsFunction = NULL; + + TInt i( 0 ); + TPtrC8 nodename ( GetNextStringLC( aItem, _L( "nodename" ) )->Des() ) ; + + //TPtrC datafile; + TPtrC datafile( KNullDesC ); + i = aItem.GetNextString ( datafile ) ; + if ( i != KErrNone ) + { + iLog->Log(_L("FetchLeafL: ERROR Reading outfile argument: 0x%X"), i ); + //return i; + } + else + { + iSaveFileName = datafile; + iLog->Log( _L( " Save file nameis '%S'" ), &iSaveFileName ); + iResultsFunction = SaveDataL; + } + + SetURIL(nodename) ; + + /* + void FetchLeafObjectL( const TDesC8& aURI, const TDesC8& aLUID, + const TDesC8& aType, TInt aResultsRef, + TInt aStatusRef ); + */ + TPtrC8 parentURI(RemoveLastSeg(nodename)); + HBufC8 *luid = GetLuidAllocLC( parentURI ); + + Adapter()->FetchLeafObjectL( *iURI, *luid, KEmptyType, 7, 8 ) ; + if ( iStatus == MSmlDmAdapter::EOk ) + { + iLog->Log( _L("FetchLeafL: FetchLeafObjectL Successful! %d" ), iStatus ); + } + else + { + iLog->Log( _L("FetchLeafL: FetchLeafObjectL Error ! %d" ), iStatus ); + ret = KErrGeneral ; + } + CleanupStack::PopAndDestroy( luid ); + CleanupStack::PopAndDestroy( ); // nodename + iLog->Log( _L("FetchLeafL Test Complete with status %d" ), ret ); + return ret; + } + + +TInt Cdmatest::ExecuteLeafL( CStifItemParser& aItem ) + { + TInt ret( KErrNone ); + // Print to UI + TestModuleIf().Printf( 0, _L("Camtest"), _L("ExecuteLeafL") ); + + iResultsFunction = NULL; + + TPtrC8 nodename( GetNextStringLC ( aItem, _L("Nodename") )->Des() ) ; + TPtrC8 data( GetNextStringLC ( aItem, _L("Input file") )->Des() ) ; + + SetURIL(nodename) ; + + /* + virtual void ExecuteCommandL( const TDesC8& aURI, const TDesC8& aLUID, + const TDesC8& aArgument, const TDesC8& aType, + TInt aStatusRef ) = 0; + */ + TDataType type; + + TPtrC8 parentURI(RemoveLastSeg(nodename)); + HBufC8 *luid = GetLuidAllocLC( parentURI ); + + Adapter()->ExecuteCommandL( *iURI, *luid, data, KEmptyType, 11 ) ; + if ( iStatus == MSmlDmAdapter::EOk ) + { + iLog->Log( _L("ExecuteLeafL: ExecuteCommandL Successful! %d" ), iStatus ); + } + else + { + iLog->Log( _L("ExecuteLeafL: ExecuteCommandL FetchLeafObjectL Error ! %d" ), iStatus ); + ret = KErrGeneral ; + } + CleanupStack::PopAndDestroy( luid ); // luid + CleanupStack::PopAndDestroy(); // data + CleanupStack::PopAndDestroy(); // nodename + + iLog->Log( _L("ExecuteLeafL: Test Complete with status %d" ), ret ); + + return ret; + } + +TInt Cdmatest::CompleteCommandsL( CStifItemParser& /*aItem*/ ) + { + TRAPD( err, Adapter()->CompleteOutstandingCmdsL() ); + delete iAdapter; + iAdapter = NULL; + return err; + } +TInt Cdmatest::DeleteObjectL( CStifItemParser& aItem ) +{ + TInt ret( KErrNone ); + // Print to UI + TestModuleIf().Printf( 0, _L("Camtest"), _L("DeleteObjectL") ); + + TPtrC8 nodename( GetNextStringLC ( aItem, _L("Nodename") )->Des() ) ; + + SetURIL(nodename) ; + + HBufC8 *luid = GetLuidAllocLC( *iURI ); + Adapter()->DeleteObjectL( *iURI, *luid, 11 ) ; + if ( iStatus == MSmlDmAdapter::EOk ) + { + iLog->Log( _L("DeleteNode: DeleteObjectL Successful! %d" ), iStatus ); + } + else + { + iLog->Log( _L("DeleteNode: DeleteObjectL FetchLeafObjectL Error ! %d" ), iStatus ); + ret = KErrGeneral ; + } + CleanupStack::PopAndDestroy( luid ); // luid + CleanupStack::PopAndDestroy(); // nodename + iLog->Log( _L("ExecuteLeafDataL Test Complete with status %d" ), ret ); + + return ret; +} + +TInt Cdmatest::ExecuteLeafDataL( CStifItemParser& aItem ) + { + TInt ret( KErrNone ); + + // Print to UI + TestModuleIf().Printf( 0, _L("Camtest"), _L("ExecuteLeafL") ); + + iResultsFunction = NULL; + + TPtrC8 nodename( GetNextStringLC ( aItem, _L("Nodename") )->Des() ) ; + TPtrC8 data( GetNextStringLC ( aItem, _L("Input data") )->Des() ) ; + + SetURIL(nodename) ; + + /* + virtual void ExecuteCommandL( const TDesC8& aURI, const TDesC8& aLUID, + const TDesC8& aArgument, const TDesC8& aType, + TInt aStatusRef ) = 0; + */ + HBufC8 *luid = GetLuidAllocLC( *iURI ); + Adapter()->ExecuteCommandL( *iURI, *luid, data, KEmptyType, 11 ) ; + if ( iStatus == MSmlDmAdapter::EOk ) + { + iLog->Log( _L("ExecuteLeafDataL: ExecuteCommandL Successful! %d" ), iStatus ); + } + else + { + iLog->Log( _L("ExecuteLeafDataL: ExecuteCommandL FetchLeafObjectL Error ! %d" ), iStatus ); + ret = KErrGeneral ; + } + CleanupStack::PopAndDestroy(); // luid + CleanupStack::PopAndDestroy(); // data + CleanupStack::PopAndDestroy(); // nodename + iLog->Log( _L("ExecuteLeafDataL Test Complete with status %d" ), ret ); + + return ret; + } + + +HBufC8 *Cdmatest::LoadFileLC( const TDesC &aFileName, TDataType &aType ) + { + RFs fs ; + LEAVE_IF_ERROR( fs.Connect(), _L( "Could not connect fileserver: %d" ) ); + + CleanupClosePushL( fs ); + RFile file ; + LEAVE_IF_ERROR( file.Open(fs,aFileName,EFileRead), _L( "Could not open file: %d" ) ); + + + + CleanupClosePushL( file ); + TInt dataSize ; + LEAVE_IF_ERROR( file.Size( dataSize ), _L( "Could not get file size: %d" ) ); + HBufC8 *nodedata = HBufC8::NewL ( dataSize ); + CleanupStack::PushL( nodedata ); + TPtr8 nodedataptr( nodedata->Des() ); + LEAVE_IF_ERROR( file.Read( nodedataptr ), _L( "Could not read file: %d" ) ); + TDataRecognitionResult aDataType; + RApaLsSession ls ; + TInt err( ls.Connect() ); + if ( err == KErrNone ) + { + CleanupClosePushL( ls ); + err = ls.RecognizeData(aFileName, nodedataptr, aDataType) ; + if ( err == KErrNone ) + { + aType = aDataType.iDataType; + } + else + { + iLog->Log( _L("LoadFileLC: WARNING Failed to get type: %d" ), err ); + aType = TDataType( KDefaultType ); + } + CleanupStack::PopAndDestroy( &ls ); + } + else + { + iLog->Log( _L("LoadFileLC: WARNING Failed to connect rapalssession: %d" ), err ); + } + CleanupStack::Pop( nodedata ); + CleanupStack::PopAndDestroy( &file ); + CleanupStack::PopAndDestroy( &fs ); + CleanupStack::PushL( nodedata ); + return nodedata ; + } + +HBufC8 *Cdmatest::LoadFileLC( const TDesC8 &aFileName, TDataType &aType ) + { + TFileName fn ; + fn.Copy( aFileName ); + return LoadFileLC( fn, aType ); + } + + +void Cdmatest::SaveDataL( TInt /*aResultsRef*/, CBufBase& aObject, + const TDesC8& aType ) + { + iLog->Log( _L8( "Saving data of type: '%S'" ), &aType ); + RFs fs; + User::LeaveIfError( fs.Connect() ); + CleanupClosePushL( fs ); + RFile file; + User::LeaveIfError( file.Replace ( fs, iSaveFileName, EFileWrite ) ); + CleanupClosePushL( file ); + TPtrC8 p( aObject.Ptr( 0 ) ); + User::LeaveIfError( file.Write( p ) ); + CleanupStack::PopAndDestroy( 2 ); // file, fs + } + + + +void Cdmatest::FetchNodeResultsL( TInt /*aResultsRef*/, CBufBase& aObject, + const TDesC8& /*aType*/ ) + { + TPtrC8 ptr( aObject.Ptr( 0 ) ); + iLog->Log( _L8("FetchNodeResultsL for '%S': '%S'" ), iURI, &ptr ); + + if ( ptr.Length() > 0 ) + { + TPtrC8 last( LastURISeg( ptr ) ); + HBufC8 *oldUri = HBufC8::NewL( iURI->Length() ); + (*oldUri) = *iURI; + do + { + iLog->Log ( _L8( " Node: '%S' "), &last ); + HBufC8 *nUri = HBufC8::NewLC( oldUri->Length() + 1 + last.Length() ); + nUri->Des().Copy( *oldUri ) ; + nUri->Des().Append( '/' ); + nUri->Des().Append( last ); + + SetURIL( nUri ); + //iResultsFunction = FetchNodeResultsL; + + //TPtrC8 parentURI(RemoveLastSeg(*nUri)); + //HBufC8 *luid = GetLuidAllocLC( parentURI ); + CleanupStack::Pop( nUri ); + + HBufC8 *luid = GetLuidAllocLC( *iURI ); + + Adapter()->ChildURIListL( *nUri, KNullDesC8, *iEmptyMappingInfoArray, 4, 5 );//Dipak + + CleanupStack::PopAndDestroy( luid ); + + ptr.Set( RemoveLastURISeg( ptr ) ); + last.Set( LastURISeg( ptr ) ); + + } + while (last != KNullDesC8); + } + + } + + + +TPtrC8 Cdmatest::LastURISeg( const TDesC8& aURI ) + { + TInt i; + for( i = aURI.Length() - 1; i >= 0; i-- ) + { + if( aURI[i] == '/' ) + { + break; + } + } + + if( i == 0 ) + { + return aURI; + } + else + { + return aURI.Mid( i+1 ); + } + } +TPtrC8 Cdmatest::RemoveLastSeg(const TDesC8& aURI) + { + TInt i; + for(i=aURI.Length()-1;i>=0;i--) + { + if(aURI[i]==KNSmlDMUriSeparator) + { + break; + } + } + + if(i>0) + { + return aURI.Left(i); + } + else + { + return KNullDesC8(); + } + } + +// ------------------------------------------------------------------------------------------------ +// TPtrC8 Cdmatest::RemoveLastURISeg(const TDesC8& aURI) +// returns parent uri, i.e. removes last uri segment +// ------------------------------------------------------------------------------------------------ +TPtrC8 Cdmatest::RemoveLastURISeg( const TDesC8& aURI ) + { + TInt i; + for ( i = aURI.Length() - 1; i >= 0 ; i-- ) + { + if( aURI[i] == '/' ) + { + break; + } + } + if ( i > -1 ) + { + return aURI.Left( i ); + } + else + { + return KNullDesC8(); + } + } + +TPtrC Cdmatest::RemoveLastURISeg( const TDesC& aURI ) + { + TInt i; + for ( i = aURI.Length() - 1; i >= 0 ; i-- ) + { + if( aURI[i] == '/' ) + { + break; + } + } + if ( i > -1 ) + { + return aURI.Left( i ); + } + else + + { + return KNullDesC(); + } + } + +void Cdmatest::SetURIL( const TDesC& aURI ) + { + if ( iURI != NULL ) + { + delete iURI ; + iURI = NULL; + } + iURI = HBufC8::NewL( aURI.Length() ) ; + iURI->Des().Copy( aURI ); + } + +void Cdmatest::SetURIL( const TDesC8& aURI ) + { + if ( iURI != NULL ) + { + delete iURI ; + iURI = NULL; + } + iURI = HBufC8::NewL( aURI.Length() ) ; + iURI->Des().Copy( aURI ); + } + +void Cdmatest::SetURIL( HBufC8* aURI ) + { + if ( iURI != NULL ) + { + delete iURI ; + iURI = NULL; + } + iURI = aURI ; + } + + + +void Cdmatest::SetResultsL( + TInt aResultsRef, + CBufBase& aObject, + const TDesC8& aType ) + { + TPtrC8 ptr( aObject.Ptr(0) ); + iLog->Log( _L8( "SetResults, ref=%d, object='%S', type='%S'" ), aResultsRef, &ptr, &aType ); + if ( iResultsFunction ) + { + (this->*iResultsFunction)( aResultsRef, aObject, aType ); + iResultsFunction = NULL ; + } + + } + + +void Cdmatest::SetStatusL( TInt aStatusRef, + MSmlDmAdapter::TError aErrorCode ) + { + iStatus = aErrorCode ; + iLog->Log( _L( "SetStatusL, ref=%d, code=%d" ), aStatusRef, aErrorCode ); + + + } + +void Cdmatest::SetMappingL( const TDesC8& aURI, const TDesC8& aLUID ) + { + iLog->Log( _L8( "SetMappingL, aURI='%s', aLUID='%s'" ), aURI.Ptr(), aLUID.Ptr() ); + + iMappingTable.Append(TMapping( aURI, aLUID ) ) ; + } + +HBufC8* Cdmatest::GetLuidAllocL( const TDesC8& aURI ) + { + iLog->Log( _L8( "GetLuidAllocL, aURI='%S'" ), &aURI ); + HBufC8 *res = NULL; + for( TInt i(0); i < iMappingTable.Count(); i++ ) + { + if ( aURI == iMappingTable[i].iURI ) + { + res = iMappingTable[i].iLuid.AllocL(); + } + } + if ( res == NULL ) + { + res = HBufC8::NewL( 0 ); + } + iLog->Log( _L8( "GetLuidAllocL, response='%S'" ), res ); + return res; + } + +HBufC8* Cdmatest::GetLuidAllocLC( const TDesC8& aURI ) + { + iLog->Log( _L8( "GetLuidAllocL, aURI='%S'" ), &aURI ); + HBufC8 *res = NULL; + for( TInt i(0); i < iMappingTable.Count(); i++ ) + { + if ( aURI == iMappingTable[i].iURI ) + { + res = iMappingTable[i].iLuid.AllocLC(); + break; + } + } + if ( res == NULL ) + { + res = HBufC8::NewLC( 0 ); + } + iLog->Log( _L8( "GetLuidAllocLC, response='%S'" ), res ); + return res ; + } + +#ifdef __TARM_SYMBIAN_CONVERGENCY + +void Cdmatest::GetMappingInfoListL( const TDesC8& /*aURI*/, + CArrayFix& /*aSegmentList*/ ) + { + // do nothing + } + +#else +// nothing +#endif +//*************************************************************************** +// End of File diff -r d3981f4fe6a4 -r c742e1129640 omadmadapters/email/tsrc/src/emailtest.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omadmadapters/email/tsrc/src/emailtest.cpp Wed Jun 23 18:03:02 2010 +0300 @@ -0,0 +1,117 @@ +/* +* Copyright (c) 2008 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 DM adapter test component +* This is part of omadmextensions/adapter test application. +* +*/ + + + + + + +// INCLUDE FILES +#include +#include "emailTest.h" +#include + + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CemailTest::CemailTest +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +/*CemailTest::CemailTest( + CTestModuleIf& aTestModuleIf ): + CScriptBase( aTestModuleIf ) + { + }*/ +CemailTest::CemailTest( CTestModuleIf& aTestModuleIf ) + : Cdmatest( aTestModuleIf, KAdapterUid ) + { + } +// ----------------------------------------------------------------------------- +// CemailTest::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CemailTest::ConstructL() + { +/* iLog = CStifLogger::NewL( KamtestLogPath, + KamtestLogFile, + CStifLogger::ETxt, + CStifLogger::EFile, + EFalse );*///Commented the Part for emailTest Dipak + iLog = CStifLogger::NewL( KamtestLogPath, + KamtestLogFile, + CStifLogger::ETxt, + CStifLogger::EFile ); + + iLog->Log( _L( "Loading Adapter" ) ); + + Cdmatest::ConstructL(); + + } + +// ----------------------------------------------------------------------------- +// CemailTest::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CemailTest* CemailTest::NewL( + CTestModuleIf& aTestModuleIf ) + { + CemailTest* self = new (ELeave) CemailTest( aTestModuleIf ); + + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); + + return self; + + } + +// Destructor +CemailTest::~CemailTest() + { + + // Delete resources allocated from test methods +// Delete(); + + // Delete logger +// delete iLog; + + } + +// ========================== OTHER EXPORTED FUNCTIONS ========================= + +// ----------------------------------------------------------------------------- +// LibEntryL is a polymorphic Dll entry point. +// Returns: CScriptBase: New CScriptBase derived object +// ----------------------------------------------------------------------------- +// +EXPORT_C CScriptBase* LibEntryL( + CTestModuleIf& aTestModuleIf ) // Backpointer to STIF Test Framework + { + + return ( CScriptBase* ) CemailTest::NewL( aTestModuleIf ); + + } + + + +// End of File diff -r d3981f4fe6a4 -r c742e1129640 omadmadapters/email/tsrc/src/emailtestBlocks.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omadmadapters/email/tsrc/src/emailtestBlocks.cpp Wed Jun 23 18:03:02 2010 +0300 @@ -0,0 +1,108 @@ +/* +* Copyright (c) 2008 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 DM adapter test component +* This is part of omadmextensions/adapter test application. +* +*/ + + + + + + +// INCLUDE FILES +#include +#include +#include +#include "emailTest.h" +#include +#include +#include + + +//using namespace NApplicationManagement;//Dipak + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CemailTest::Delete +// Delete here all resources allocated and opened from test methods. +// Called from destructor. +// ----------------------------------------------------------------------------- +// +void CemailTest::Delete() + { + + } + +// ----------------------------------------------------------------------------- +// CemailTest::RunMethodL +// Run specified method. Contains also table of test mothods and their names. +// ----------------------------------------------------------------------------- +// +TInt CemailTest::RunMethodL( + CStifItemParser& aItem ) + { + + TStifFunctionInfo const KFunctions[] = + { + // Copy this line for every implemented function. + // First string is the function name used in TestScripter script file. + // Second is the actual implementation member function. + ENTRY( "DDFStructure", CemailTest::DDFStructureL), + ENTRY( "FetchNode", CemailTest::FetchNodeL ), + ENTRY( "FetchLeaf", CemailTest::FetchLeafL ), + ENTRY( "AddNode", CemailTest::AddNodeL ), + ENTRY( "UpdateLeaf", CemailTest::UpdateLeafL ), + ENTRY( "UpdateLeafData", CemailTest::UpdateLeafDataL ), + ENTRY( "Execute", CemailTest::ExecuteLeafL ), + ENTRY( "ExecuteData", CemailTest::ExecuteLeafDataL ), + ENTRY( "DeleteNode", CemailTest::DeleteObjectL ), + ENTRY( "StartAtomic", CemailTest::StartAtomicL), + ENTRY( "CommitAtomic", CemailTest::CommitAtomicL), + ENTRY( "RollbackAtomic", CemailTest::RollbackAtomicL), + ENTRY( "CompleteCommands", CemailTest::CompleteCommandsL), + }; + + const TInt count = sizeof( KFunctions ) / + sizeof( TStifFunctionInfo ); + + return RunInternalL( KFunctions, count, aItem ); + + } + + + +HBufC8 *CemailTest::GetNextStringLC ( CStifItemParser& aItem, const TDesC &aName ) + { + TPtrC nodename; + nodename.Set( KNullDesC ); + + TInt i( aItem.GetNextString ( nodename ) ); + if ( i != KErrNone ) + { + iLog->Log( _L( "ERROR Reading '%S' argument: 0x%X" ), &aName, i ); + } + else + { + iLog->Log( _L("%S: %S"), &aName, &nodename); + } + + HBufC8 *buf = HBufC8::NewLC( nodename.Length() ) ; + buf->Des().Copy( nodename ); + + return buf; + } + +// End of File diff -r d3981f4fe6a4 -r c742e1129640 omadmadapters/nsmldmbmadapter/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omadmadapters/nsmldmbmadapter/group/bld.inf Wed Jun 23 18:03:02 2010 +0300 @@ -0,0 +1,32 @@ +/* +* Copyright (c) 2006-2007 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: Build information file for project nsmldmbmadapter +* +*/ + + +#include + +PRJ_PLATFORMS +DEFAULT + +PRJ_EXPORTS + + +PRJ_MMPFILES +nsmldmbmadapter.mmp + +PRJ_TESTMMPFILES + +PRJ_TESTEXPORTS diff -r d3981f4fe6a4 -r c742e1129640 omadmadapters/nsmldmbmadapter/group/nsmldmbmadapter.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omadmadapters/nsmldmbmadapter/group/nsmldmbmadapter.mmp Wed Jun 23 18:03:02 2010 +0300 @@ -0,0 +1,45 @@ +/* +* Copyright (c) 2006 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: Project definition file for project nsmldmbmadapter +* +*/ + + +#include +#include + +TARGET nsmldmbmadapter.dll +TARGETTYPE PLUGIN +UID 0x10009d8d 0x101f6d2f + +CAPABILITY CAP_ECOM_PLUGIN +VENDORID VID_DEFAULT + +SOURCEPATH ../src +SOURCE nsmldmbmadapter.cpp +SOURCE nsmldmbmsettingstore.cpp + +START RESOURCE nsmldmbmadapter.rss +END + +//LANG sc + +USERINCLUDE ../inc + +//Default system include paths for middleware layer modules +APP_LAYER_SYSTEMINCLUDE + +SYSTEMINCLUDE /epoc32/include/ecom + +LIBRARY euser.lib ecom.lib cmmanagerdatabase.lib cmmanager.lib charconv.lib flogger.lib diff -r d3981f4fe6a4 -r c742e1129640 omadmadapters/nsmldmbmadapter/inc/bmadapterlogger.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omadmadapters/nsmldmbmadapter/inc/bmadapterlogger.h Wed Jun 23 18:03:02 2010 +0300 @@ -0,0 +1,103 @@ +/* +* Copyright (c) 2006 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: Logging functions for the component. +* +*/ + + + +#ifndef BMADAPTERLOGGER_H +#define BMADAPTERLOGGER_H + +#ifndef _DEBUG + +// UREL BUILD: +#define BMADAPTER_LOGGING_METHOD 0 // No logging in UREL builds + +#else + +// UDEB BUILD: +#define BMADAPTER_LOGGING_METHOD 1 // 0 = No logging, + // 1 = Flogger, + // 2 = RDebug +#endif // _DEBUG + + +#if BMADAPTER_LOGGING_METHOD == 1 // Flogger + +#include +_LIT(KBMADAPTERLOGFolder,"NSMLDMBMADAPTER"); +_LIT(KBMADAPTERLOGFile,"NSMLDMBMADAPTER.txt"); + +#define BMADAPTERLOGTEXT(x)\ + {\ + RFileLogger::Write(KBMADAPTERLOGFolder(),KBMADAPTERLOGFile(),EFileLoggingModeAppend,\ + x);\ + } + +#define BMADAPTERLOGSTRING(x)\ + {\ + _LIT8(tempLogDes,x);\ + RFileLogger::Write(KBMADAPTERLOGFolder(),KBMADAPTERLOGFile(),EFileLoggingModeAppend,\ + tempLogDes());\ + } + +#define BMADAPTERLOGSTRING2(x,y)\ + { _LIT8(tempLogDes,x);\ + RFileLogger::WriteFormat(KBMADAPTERLOGFolder(),\ + KBMADAPTERLOGFile(),\ + EFileLoggingModeAppend,\ + TRefByValue(tempLogDes()),y);\ + } + +#define BMADAPTERLOGSTRING3(x,y,z)\ + { _LIT8(tempLogDes,x);\ + RFileLogger::WriteFormat(KBMADAPTERLOGFolder(),\ + KBMADAPTERLOGFile(),\ + EFileLoggingModeAppend,\ + TRefByValue(tempLogDes()),y,z);\ + } + +#define BMADAPTERLOGSTRING4(w,x,y,z)\ + { _LIT8(tempLogDes,w);\ + RFileLogger::WriteFormat(KBMADAPTERLOGFolder(),\ + KBMADAPTERLOGFile(),\ + EFileLoggingModeAppend,\ + TRefByValue(tempLogDes()),x,y,z);\ + } + + +#elif BMADAPTER_LOGGING_METHOD == 2 // RDebug + +#include + +#define BMADAPTERLOGSTRING(x) RDebug::Print(x); +#define BMADAPTERLOGSTRING(x) RDebug::Print(_L(x)); +#define BMADAPTERLOGSTRING2(x,y) RDebug::Print(_L(x),y); +#define BMADAPTERLOGSTRING3(x,y,z) RDebug::Print(_L(x),y,z); +#define BMADAPTERLOGSTRING4(w,x,y,z) RDebug::Print(_L(w),x,y,z); + +#else // BMADAPTER_LOGGING_METHOD == 0 or invalid + +#define BMADAPTERLOGSTRING(x) +#define BMADAPTERLOGSTRING(x) +#define BMADAPTERLOGSTRING2(x,y) +#define BMADAPTERLOGSTRING3(x,y,z) +#define BMADAPTERLOGSTRING4(w,x,y,z) + +#endif // BMADAPTER_LOGGING_METHOD + +#endif // BMADAPTERLOGGER_H + +// End of File diff -r d3981f4fe6a4 -r c742e1129640 omadmadapters/nsmldmbmadapter/inc/nsmldmbmadapter.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omadmadapters/nsmldmbmadapter/inc/nsmldmbmadapter.h Wed Jun 23 18:03:02 2010 +0300 @@ -0,0 +1,887 @@ +/* +* Copyright (c) 2006 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: Device management adapter handling bearer management related settings +* +*/ + + + + +#ifndef NSMLDMBMADAPTER_H +#define NSMLDMBMADAPTER_H + +#include + +#include "nsmldmbmsettingstore.h" + +class CSmlDmBmCommandElement; +class CSmlDmBmSettingsElement; +class CNSmlDmBmSettingStore; + +/** The DDF version must be changed if any changes in DDF structure +( built in DDFStructureL() function ) */ +_LIT8( KNSmlDmBMAdapterDDFVersion, "1.1" ); +_LIT8( KNSmlDmBMAdapterTextPlain, "text/plain" ); + +/** Names of the nodes */ +/** When updating KNSmlDmBMAdapterBMURI also update +KNSmlDmBmAdapterURIMaxLength! */ +_LIT8(KNSmlDmBMAdapterBMURI, "./BearerManagementSNAP"); +_LIT8(KNSmlDmBMAdapterBM, "BearerManagementSNAP"); +_LIT8(KNSmlDmBMAdapterName, "Name"); +_LIT8(KNSmlDmBMAdapterIAPPriorityList, "IAPPriorityList"); +_LIT8(KNSmlDmBMAdapterEmbeddedSNAP, "EmbeddedSNAP"); +_LIT8(KNSmlDmBMAdapterMetadata, "Metadata"); +_LIT8(KNSmlDmBMAdapterProtected, "Protected"); +_LIT8(KNSmlDmBMAdapterHidden, "Hidden"); + +/** Descriptions of the nodes */ +_LIT8( KNSmlDmBMAdapterBMDescription, + "BearerManagement provides management of Access Point groups (SNAPs)"); +_LIT8( KNSmlDmBMAdapterDynamicDescription, + "Node presents a group of Access Points (SNAP)"); +_LIT8( KNSmlDmBMAdapterNameDescription, + "Name of the Access Point group"); +_LIT8( KNSmlDmBMAdapterIAPPriorityListDescription, + "Comma separated list of Access Point URIs in priority order."); +_LIT8( KNSmlDmBMAdapterEmbeddedSNAPDescription, + "URI of embedded Access Point group. All Access points of the Embedded \ + SNAP are seen as also belonging to this SNAP"); +_LIT8( KNSmlDmBMAdapterMetadataDescription, + "32 bit integer representing SNAP metadata. Following bitmasks indicate \ + meaning of the individual bits: \n 0x00000001 \t Internet: The SNAP is \ + the Internet SNAP. This may only be set to one SNAP object.\n \ + 0x00000002\tHighlight: SNAP is highlighted in certain UI dialog.\n \ + 0x00000004\tHidden: SNAP is hidden in certain UI dialog."); +_LIT8( KNSmlDmBMAdapterProtectedDescription, + "SNAP is protected with one of the following protection levels. \ + Protected object can not be modified without NetworkControl capability \n \ + 0 \t No protection \n 1 \t SNAP and related objects \n \ + 2 \t SNAP name is protected."); +_LIT8( KNSmlDmBMAdapterHiddenDescription, + "SNAP is set as hidden in the setting store"); + +/** Leaf nodes of snap node */ +_LIT8( KNSmlDmBMAllLeafNodes, + "Name/IAPPriorityList/Metadata/Protected/Hidden/EmbeddedSNAP"); +_LIT8( KNSmlDmBMAllLeafNodesNoEmbedded, + "Name/IAPPriorityList/Metadata/Protected/Hidden"); + +/** URI of for fetching IAP nodes */ +/** When updating KNSmlDmBMAdapterIAPURI also update +KNSmlDmBmAdapterAPURIMaxLength! */ +_LIT8( KNSmlDmBMAdapterIAPURI, "./AP" ); +/** Node name of AP adapter root */ +_LIT8( KNSmlDmBMAdapterIAPNode, "AP" ); +/** URI segment separator */ +/** When updating this literal also update +KNSmlDmBmAdapterAPURIMaxLength and KNSmlDmBmAdapterURIMaxLength! */ +_LIT8( KNSmlDmBmSeparator, "/" ); +/** URI segment separator */ +/** When updating KNSmlDmBMAdapterBMURI also update +KNSmlDmBmAdapterAPURIMaxLength and KNSmlDmBmAdapterURIMaxLength! */ +_LIT8( KNSmlDmBmUriListSeparator, "," ); +/** Prefix in URIs (removed for LUID mapping) */ +_LIT8( KNSmlDmBmAdapterURIPrefix, "./" ); + +/** Name prefix for unnamed snap nodes */ +_LIT8( KNSmlDmBMSNAPNamePrefix, "SNAP" ); +_LIT8( KNSmlDmBMBooleanTrue, "True" ); +_LIT8( KNSmlDmBMBooleanFalse, "False" ); + + +const TInt KNSmlDmBMGranularity = 4; +const TInt KNsmlDmBmSNAPNodeDepth = 2; +const TInt KNSmlDmBmInvalidRef = -1; + +/** Maximum length of snap URI including a separator character in URI List. +Node is not calculated here. KNSmlDmBMAdapterBMURI + KNSmlDmBmSeparator + +KNSmlDmBmUriListSeparator +*/ +const TInt KNSmlDmBmAdapterURIMaxLength = 24; + +/** Maximum length of AP URI including a separator character in URI List. +Node is not calculated here. KNSmlDmBMAdapterIAPURI + KNSmlDmBmSeparator + +KNSmlDmBmUriListSeparator +*/ +const TInt KNSmlDmBmAdapterAPURIMaxLength = 6; + +/** Maximum length of 32bit integer */ +const TInt KMaxLengthOf32bitInteger = 10; + +/** + * Bearer Management device management adapter + * + * Bearer Management device management adapter manages settings + * related to Service Network Access Points (SNAPs) which are + * used for groupin IAPs + * + * @lib nsmldmbmadapter + * @since S60 v3.2 + */ +class CNSmlDmBmAdapter : public CSmlDmAdapter + { + +public: + +/** Possible command types */ +enum TCommandType + { + EAddCmd, + EGetCmd, + EGetSizeCmd, + EDeleteCmd + }; + + /** + * Two-phased constructor. + */ + static CNSmlDmBmAdapter* NewL( MSmlDmCallback* aDmCallback ); + + /** + * Destructor. + */ + virtual ~CNSmlDmBmAdapter(); + + +// from base class CSmlDmAdapter + + /** + * The function returns current version of the DDF. + * + * @since S60 v3.2 + * @param aDDFVersion DDF version of the + * adapter. (filled by the adapter) + */ + void DDFVersionL( CBufBase& aDDFVersion ); + + /** + * The function for filling the DDF structure of the adapter + * + * @since S60 v3.2 + * @param aDDF Reference to root object. + */ + 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 is + * returned by calling SetStatusL function of MSmlDmCallback callback + * interface. + * + * @since S60 v3.2 + * @param aURI URI of the object + * @param aLUID LUID of the object + * @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 + */ + void UpdateLeafObjectL( const TDesC8& aURI, const TDesC8& aLUID, + const TDesC8& aObject, const TDesC8& aType, + TInt aStatusRef ); + /** + * The function deletes an object and its child objects. + * + * @since S60 v3.2 + * @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. + */ + void DeleteObjectL( const TDesC8& aURI, const TDesC8& aLUID, + TInt aStatusRef ); + + /** + * The function fetches data of a leaf object. The SetStatusL is used + * as described in UpdateLeafObjectL(). The data is returned by using the + * SetResultsL function of MSmlCallback callback interface. + * + * @since S60 v3.2 + * @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. + */ + 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. + * + * @since S60 v3.2 + * @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. + */ + 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. + * + * @since S60 v3.2 + * @param aURI URI of the parent object + * @param aLUID 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. + * @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. + */ + void ChildURIListL( const TDesC8& aURI, const TDesC8& aLUID, + const CArrayFix& aPreviousURISegmentList, + TInt aResultsRef, TInt aStatusRef ); + + /** + * The function adds node object. + * + * @since S60 v3.2 + * @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. + */ + void AddNodeObjectL( const TDesC8& aURI, const TDesC8& aParentLUID, + TInt aStatusRef ); + /** + * The adapter does not support streaming and no implementation is + * provided for this function. + * + * @since S60 v3.2 + * @param aURI URI of the object + * @param aLUID LUID of the object + * @param aStream 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. + */ + void UpdateLeafObjectL( const TDesC8& aURI, const TDesC8& aLUID, + RWriteStream*& aStream, const TDesC8& aType, + TInt aStatusRef ); + /** + * The adapter does not support execute command and does not + * provide implementation for this function. + * + * @since S60 v3.2 + * @param aURI URI of the command + * @param aLUID LUID of the object + * @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. + */ + void ExecuteCommandL( const TDesC8& aURI, const TDesC8& aLUID, + const TDesC8& aArgument, const TDesC8& aType, + TInt aStatusRef ); + /** + * The adapter does not support execute command and does not + * provide implementation for this function. + * + * @since S60 v3.2 + * @param aURI URI of the command + * @param aLUID LUID of the object + * @param aStream 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. + */ + void ExecuteCommandL( const TDesC8& aURI, const TDesC8& aLUID, + RWriteStream*& aStream, const TDesC8& aType, + TInt aStatusRef ); + /** + * The adapter does not support copy command and does not + * provide implementation for this function. + * + * @since S60 v3.2 + * @param aTargetURI Target URI for the command + * @param aTargetLUID LUID of the target object + * @param aSourceURI Source URI for the command + * @param aSourceLUID LUID of the source object + * @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. + */ + void CopyCommandL( const TDesC8& aTargetURI, const TDesC8& aTargetLUID, + const TDesC8& aSourceURI, const TDesC8& aSourceLUID, + const TDesC8& aType, TInt aStatusRef ); + /** + * Not supported + * @since S60 v3.2 + */ + void StartAtomicL(); + /** + * Not Supported + * @since S60 v3.2 + * + */ + void CommitAtomicL(); + /** + * Not supported. + * @since S60 v3.2 + */ + void RollbackAtomicL(); + /** + * Returns EFalse as the adapter does not support streaming + * + * @since S60 v3.2 + * @param aItemSize size limit for stream usage + * @return TBool EFalse as streaming is not supported + */ + TBool StreamingSupport( TInt& aItemSize ); + /** + * Not supported + * + * @since S60 v3.2 + */ + void StreamCommittedL(); + /** + * 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. + * + * @since S60 v3.2 + */ + void CompleteOutstandingCmdsL(); + + /** + * Function checks if a SNAP with the argument URI is buffered for + * later handling. If so, the function calls iSettingStore object + * to store the SNAP. This function is called by the iSettingStore + * object to check whether EmbeddedSNAP node referenced by a command is + * still in the buffer and needs to be stored first. + * + * @since S60 v3.2 + * @param aURI Descriptor containing the SNAP URI + */ + void StoreSnapIfBufferedL( const TDesC8& aURI ); + + + /** + * Function returns a pointer to a HBufC object containing a SNAP URI + * which correcponds to the argument LUID. + * + * @since S60 v3.2 + * @param aSnapId LUID of SNAP object + * @return Descriptor containing the SNAP URI. + */ + HBufC8* GetSnapUriFromLuidL( const TUint aSnapId ); + + + /** + * Function returns a pointer to HBufC object containing a + * comma separated list of IAP URIs according to the IAP LUIDs + * contained in the argument array. + * + * @since S60 v3.2 + * @param aIdArray Array of IAP LUIDs for which the URI list is formed. + * @return HBufC object containing a comma separated list of IAP URIs + */ + HBufC8* GetIapListL( const RArray& aIdArray ); + + + /** + * Function returns an array containing the LUIDs of IAP URIs listed in + * argument descriptor. + * + * @since S60 v3.2 + * @param aIAPList TDesC object containing a comma separated list of IAP + * URIs + * @return Array of IAP LUIDs that correspond to the argument URI list. + */ + RArray GetIdArrayL( const TDesC8& aIAPList); + + + /** + * Converts integer to 8bit descriptor + * + * @since S60 v3.2 + * @param aLuid The integer to be converted + * @return The Integer as a descriptor + */ + HBufC8* IntToDes8L( TInt aLuid) const; + + /** + * Converts 8bit descriptor to integer + * + * @since S60 v3.2 + * @param aLuid The descriptor to be converted + * @return Integer value of the descriptor + */ + TUint DesToIntL(const TDesC8& aLuid) const; + + /** + * Converts 8bit descriptor to a boolean value + * @since S60 v3.2 + * @param aBoolDes The descriptor to be converted + * @param aBool A pointer to a boolean where result is stored + * @return ETrue if conversion was succesful, otherwise EFalse + */ + TBool DesToBool(const TDesC8& aBoolDes, TBool& aBool ) const; + + /** + * Converts boolean value to 8bit descriptor + * @since S60 v3.2 + * @param aBool The boolean value to be converted + * @return The boolean value as a descriptor + */ + HBufC8* BoolToDes8LC( TBool aBool) const; + + + /** + * The function calls the GetLuidAllocL function of the MSmlDmCallback to + * get the LUID which is mapped to aURI. This function LUID is not found, + * the function allocates a null length string, i.e. the function + * allocates memory in every case. + * @since S60 v3.2 + * @param aURI URI of the object. + */ + HBufC8* GetLuidAllocL( const TDesC8& aURI ); + +private: + + /** + * Constructor + */ + CNSmlDmBmAdapter(); + + /** + * Constructor + * @param aDmCallback Callback object to the framework + */ + CNSmlDmBmAdapter( MSmlDmCallback* aDmCallback ); + + /** + * Second phase constructor + */ + void ConstructL(); + + + /** + * Searches the buffer for a SNAP with the parameter mapping name + * @param aMappingName Mapping Name of this SNAP + * @return Pointer to the CSmlDmBmSettingsElement object in buffer. + * The object is owned by the CNSmlDmBmAdapter. + */ + CSmlDmBmSettingsElement* GetSnapIfBuffered( const TDesC8& aMappingName); + + /** + * Returns the first URI from a list of URIs + * @param aURIList Comma separated list of URIs + * @return The first URI + */ + TPtrC8 FirstURI(const TDesC8& aURIList) const; + + /** + * Returns the number of URIs in a list of URIs + * @param aURIList Comma-separated list of URIs + * @return Number of URIs in the list. + */ + TInt NumOfURIs(const TDesC8& aURIList) const; + + + /** + * Removes the first URI from a list of URIs + * @param aURIList Comma separated list of URIs + * @return The first URI + */ + TPtrC8 RemoveFirstURI(const TDesC8& aURI) const; + + /** + * Parses the last URI segment from URI + * @param aURI The whole URI + * @return The last URI segment + */ + TPtrC8 LastURISeg(const TDesC8& aURI) const; + + /** + * Removes the last URI segment from URI + * @param aURI The whole URI + * @return The aURI without the last URI segment + */ + TPtrC8 RemoveLastURISeg(const TDesC8& aURI) const; + + /** + * Calculates the number of URI segments + * @param aURI The whole URI + * @return The number of URI segments + */ + TInt NumOfURISegs(const TDesC8& aURI) const; + + /** + * Checks if the URI refers to predefined SNAP (of format SNAPx) in which + * case operations should be successful even if passed LUID is empty. + * Maps the URI to found id. + * @param aURI The whole URI + * @param aLUID LUID + * @return The SNAP ID if found + */ + TInt MapPredefinedSnapsL( const TDesC8& aURI, const TDesC8& aLUID ); + + /** + * Tries to find predefined URI string (SNAPx) fronm input + * returns the ID. + * @param aURI The whole URI + * @return The SNAP ID if found + */ + TInt GetPredefinedSnapIdFromUri( const TDesC8& aURI ) const; + +private: //data + + /** + * Buffered commands. Contains a CSmlDmBmSettingsElement object + * for each SNAP. THese in turn contain commands for the SNAP. + */ + RPointerArray iBuffer; + + /** + * Setting store object, which is called for managing settings + * in CommsDat. Own. + */ + CNSmlDmBmSettingStore * iSettingStore; + + /** + * CmManager object for SNAP existence checking for + * direct accesses to pre-defined SNAPs + */ + RCmManagerExt iCmManagerExt; + + }; + + +/** + * CSmlDmBmCommandElement + * + * Helper class, which stores a single buffered command for a SNAP. + * @lib nsmldmbmadapter + * @since S60 v3.2 + */ + +class CSmlDmBmCommandElement : public CBase + { + +public: + + /** + * Two-phased constructor. + */ + static CSmlDmBmCommandElement* NewLC( TBool aLeaf, + TInt aStatusRef, + TInt aResultRef, + CNSmlDmBmAdapter::TCommandType aCmdType, + const TDesC8& aLastUriSeg, + const TDesC8& aData ); + + /** + * Destructor. + */ + ~CSmlDmBmCommandElement(); + + /** + * Returns the iExecuted member value of the object + * + * @since S60 v3.2 + * @return The iExecuted member value of the object + */ + inline TBool Executed(); + + /** + * Sets the iExecuted member value of the object + * + * @since S60 v3.2 + * @param aExecuted Executed value for the object. + */ + inline void SetExecuted( TBool aExecuted ); + + /** + * Returns the iStatus member value of the object + * + * @since S60 v3.2 + * @return The iStatus value of the object + */ + inline CSmlDmAdapter::TError Status(); + + /** + * Sets the iStatus member value of the object + * + * @since S60 v3.2 + * @param aStatus Status value for the object. + */ + inline void SetStatus( CSmlDmAdapter::TError aStatus ); + + /** + * Returns the iLeaf member value of the object + * + * @since S60 v3.2 + * @return The iLeaf member value of the object + */ + inline TBool Leaf(); + + /** + * Returns the iStatusRef member value of the object + * + * @since S60 v3.2 + * @return The iStatusRef member value of the object + */ + inline TInt StatusRef(); + + /** + * Returns the iResultRef member value of the object + * + * @since S60 v3.2 + * @return The iResultRef member value of the object + */ + inline TInt ResultRef(); + + /** + * Returns the iCmdType member value of the object + * + * @since S60 v3.2 + * @return The iCmdType member value of the object + */ + inline CNSmlDmBmAdapter::TCommandType CmdType(); + + /** + * Returns the iData member value of the object + * + * @since S60 v3.2 + * @return The iData member value of the object + */ + inline const HBufC8* Data(); + + /** + * Returns the iLastUriSeg member value of the object + * + * @since S60 v3.2 + * @return The iLastUriSeg member value of the object + */ + inline const HBufC8* LastUriSeg(); + + /** + * Sets the iData member value of the object + * + * @since S60 v3.2 + * @param aData Data set to the object. The data will be owned by + * the command object. + */ + inline void SetDataL( const TDesC8& aData ); + +private: + + CSmlDmBmCommandElement( TBool aLeaf, + TInt aStatusRef, + TInt aResultRef, + CNSmlDmBmAdapter::TCommandType aCmdType ); + + void ConstructL( const TDesC8& aLastUriSeg, const TDesC8& aData ); + + +private: //data + + /** + * Has command been executed. + * Set to ETrue when command is executed. + */ + TBool iExecuted; + + /** + * The execution status of an exeuted command. + * Filled in when command is executed. + */ + CSmlDmAdapter::TError iStatus; + + + /** + * True if commend is for a leaf node, False if it is for a Snap node. + */ + const TBool iLeaf; + + /** + * Reference for returning the status to DM framework. + */ + const TInt iStatusRef; + + /** + * Reference for returning result of Get command to the DM framework. + */ + const TInt iResultRef; + + /** + * Type of command. + */ + const CNSmlDmBmAdapter::TCommandType iCmdType; + + + /** + * Data which is either ment to be stored to setting store + * or which has been fetched from there. + */ + HBufC8* iData; + + /** + * Last segment in the command URI, which indicates the leaf node + * in question. For non leaf command empty string. + */ + HBufC8* iLastUriSeg; + + }; + + +/** + * CSmlDmBmSettingsElement + * + * Helper class which stores information of a single SNAP object + * into buffer. Contains the buffered commands for the + * SNAP as a list of CSmlBmCommandElement objects. + * + * @lib nsmldmbmadapter + * @since S60 v3.2 + */ + +class CSmlDmBmSettingsElement : public CBase + { + +public: + + /** + * Two-phased constructor. + */ + static CSmlDmBmSettingsElement* NewLC( const TDesC8& aMappingName ); + + /** + * Destructor. + */ + ~CSmlDmBmSettingsElement(); + + /** + * Returns a reference to iNodeBuf member. + * @since S60 v3.2 + * @return Reference to iNodeBuf member of the object + */ + inline RPointerArray& NodeBuf(); + + /** + * Returns the iMappingName member value. + * @since S60 v3.2 + * @return The iMappingName member value of the object + */ + inline const HBufC8* MappingName(); + + /** + * Returns the iExecuted member value. + * @since S60 v3.2 + * @return The iExecuted member value of the object + */ + inline TBool Executed(); + + /** + * Sets the iExecuted member value. + * @since S60 v3.2 + * @param aExecuted Value for the iExecuted member of the object + */ + inline void SetExecuted( TBool aExecuted ); + + /** + * Returns the iLuid member value. + * @since S60 v3.2 + * @return The iLuid member value of the object + */ + inline TInt Luid(); + + /** + * Sets the iLuid member value. + * @since S60 v3.2 + * @param aLuid Value for the iLuid member of the object + */ + inline void SetLuid( TInt aLuid ); + + +private: + + CSmlDmBmSettingsElement(); + + void ConstructL( const TDesC8& aMappingName ); + +private: //data + + /** + * Buffer of commands for this SNAP object. Commands + * are added as they come in from the framework and + * executed by the setting store. + */ + RPointerArray iNodeBuf; + + /** + * Indicates whether commands for this SNAP have been executed. + * Set to Erue by CNsmlDmBmSettingStore when object is handled. + */ + TBool iExecuted; + + /** + * LUID (Local UID) is the CommsDat id of the SNAP node. This is + * filled in when SNAP object is created in CommsDat. + */ + TInt iLuid; + + /** + * Mapping name of this SNAP node. This is mapped to the + * iLuid when the Snap is created and has id. + */ + HBufC8* iMappingName; + }; + +#include "nsmldmbmadapter.inl" + +#endif // NSMLDMBMADAPTER_H diff -r d3981f4fe6a4 -r c742e1129640 omadmadapters/nsmldmbmadapter/inc/nsmldmbmadapter.inl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omadmadapters/nsmldmbmadapter/inc/nsmldmbmadapter.inl Wed Jun 23 18:03:02 2010 +0300 @@ -0,0 +1,173 @@ +/* +* Copyright (c) 2006 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: Contains implementations of inline functions +* +*/ + + + +// ----------------------------------------------------------------------------- +// Returns the iExecuted member of the object +// ----------------------------------------------------------------------------- +// +TBool CSmlDmBmCommandElement::Executed() + { + return iExecuted; + } + +// ----------------------------------------------------------------------------- +// Returns the iStatus member of the object +// ----------------------------------------------------------------------------- +// +CSmlDmAdapter::TError CSmlDmBmCommandElement::Status() + { + return iStatus; + } + +// ----------------------------------------------------------------------------- +// Returns the iLeaf member of the object +// ----------------------------------------------------------------------------- +// +TBool CSmlDmBmCommandElement::Leaf() + { + return iLeaf; + } + +// ----------------------------------------------------------------------------- +// Returns the iStatusRef member of the object +// ----------------------------------------------------------------------------- +// +TInt CSmlDmBmCommandElement::StatusRef() + { + return iStatusRef; + } + +// ----------------------------------------------------------------------------- +// Returns the iResultRef member of the object +// ----------------------------------------------------------------------------- +// +TInt CSmlDmBmCommandElement::ResultRef() + { + return iResultRef; + } + +// ----------------------------------------------------------------------------- +// Returns the iCmdType member of the object +// ----------------------------------------------------------------------------- +// +CNSmlDmBmAdapter::TCommandType CSmlDmBmCommandElement::CmdType() + { + return iCmdType; + } + +// ----------------------------------------------------------------------------- +// Returns the iData member of the object +// ----------------------------------------------------------------------------- +// +const HBufC8* CSmlDmBmCommandElement::Data() + { + return iData; + } + +// ----------------------------------------------------------------------------- +// Returns the iLastUriSeg member of the object +// ----------------------------------------------------------------------------- +// +const HBufC8* CSmlDmBmCommandElement::LastUriSeg() + { + return iLastUriSeg; + } + +// ----------------------------------------------------------------------------- +// Sets the iExecuted member of the object +// ----------------------------------------------------------------------------- +// +void CSmlDmBmCommandElement::SetExecuted( TBool aExecuted ) + { + iExecuted = aExecuted; + } + +// ----------------------------------------------------------------------------- +// Sets the iStatus member of the object +// ----------------------------------------------------------------------------- +// +void CSmlDmBmCommandElement::SetStatus( CSmlDmAdapter::TError aStatus ) + { + iStatus = aStatus; + } + + +// ----------------------------------------------------------------------------- +// Sets the iData member of the object. Ownership of aData argument will be +// transfered to the CSmlDmBmCommandElement +// ----------------------------------------------------------------------------- +// +void CSmlDmBmCommandElement::SetDataL( const TDesC8& aData ) + { + if ( aData.Length() > iData->Length() ) + { + iData = iData->ReAllocL( aData.Length() ); + } + *iData = aData; + } + +//Function definitions for CSmlDmBmSettingsElement +// ----------------------------------------------------------------------------- +// Returns reference to iNodeBuf +// ----------------------------------------------------------------------------- +RPointerArray& CSmlDmBmSettingsElement::NodeBuf() + { + return iNodeBuf; + } + +// ----------------------------------------------------------------------------- +// Returns iMappingName +// ----------------------------------------------------------------------------- +const HBufC8* CSmlDmBmSettingsElement::MappingName() + { + return iMappingName; + } + +// ----------------------------------------------------------------------------- +// Returns iExecuted +// ----------------------------------------------------------------------------- +TBool CSmlDmBmSettingsElement::Executed() + { + return iExecuted; + } + +// ----------------------------------------------------------------------------- +// Sets the iExecuted member value +// ----------------------------------------------------------------------------- +void CSmlDmBmSettingsElement::SetExecuted( TBool aExecuted ) + { + iExecuted = aExecuted; + } + + +// ----------------------------------------------------------------------------- +// Returns iLuid +// ----------------------------------------------------------------------------- +TBool CSmlDmBmSettingsElement::Luid() + { + return iLuid; + } + +// ----------------------------------------------------------------------------- +// Sets the iExecuted member value +// ----------------------------------------------------------------------------- +void CSmlDmBmSettingsElement::SetLuid( TInt aLuid ) + { + iLuid = aLuid; + } diff -r d3981f4fe6a4 -r c742e1129640 omadmadapters/nsmldmbmadapter/inc/nsmldmbmsettingstore.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omadmadapters/nsmldmbmadapter/inc/nsmldmbmsettingstore.h Wed Jun 23 18:03:02 2010 +0300 @@ -0,0 +1,218 @@ +/* +* Copyright (c) 2006 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: The class manages snap data in Commsdat using CMManager +* +*/ + + + + +#ifndef NSMLDMBMSETTINGSTORE_H +#define NSMLDMBMSETTINGSTORE_H + +#include + +#include "nsmldmbmadapter.h" + +const TInt KShift8 = 8; + +class CNSmlDmBmAdapter; +class CSmlDmBmCommandElement; +class CSmlDmBmSettingsElement; + +/** + * Setting Store is used for managing settings in CommsDat + * + * The class provides functions for executing commands + * and sets of commands that involve manipulation of + * data in CommsDat. + * + * @lib nsmldmbmadapter + * @since S60 v3.2 + */ +class CNSmlDmBmSettingStore : public CBase + { + +public: + + /** + * Two-phased constructor. + */ + static CNSmlDmBmSettingStore * NewL( CNSmlDmBmAdapter* aAdapter ); + + /** + * Destructor. + */ + virtual ~CNSmlDmBmSettingStore(); + + + /** + * Executes all commands for the argument snap object. + * Executed commands are set as executed and status is filled + * in. For Get commands also fetched data is filled in the command. + * + * @since S60 v3.2 + * @param aSettings Settings object for the SNAP, contains all + * commands to be executed for the SNAP + */ + void StoreSnapL( CSmlDmBmSettingsElement& aSettings ); + + + /** + * Executes the argument command. Checks the node from + * for which the command is intended and calls node specific functions. + * + * @since S60 v3.2 + * @param aCmd Command to be executed + * @param aLuid LUID of the SNAP which command is referring. + */ + void ExecuteCmdL( CSmlDmBmCommandElement& aCmd, TUint aLuid); + + /** + * Fetches all SNAPs and inserts id of each SNAp into the argument array + * + * @since S60 v3.2 + * @param aLUIDArray Array for SNAP ids + */ + void GetSnapsL( RArray& aLUIDArray ); + +private: + + CNSmlDmBmSettingStore( CNSmlDmBmAdapter * aAdapter ); + + void ConstructL(); + +//----------- Commands for managing leaf nodes -------------------// + + /** + * Executes snap commands. The valid commands include + * get and delete. With get commands the iData + * memeber is used to pass fetched data back to caller. + * After execution of command the function fills in the status + * in aCmd.iStatus memeber and sets aCmd.iExecuted as True. The function + * leaves if command can not be executed for some reason. + * + * @param aCmd The command to be executed + * @param aLuid The id of the snap + */ + void ExecuteSnapCmdL( CSmlDmBmCommandElement& aCmd, TUint aLuid ); + + /** + * Executes iap list commands. The valid commands include + * update and get. With update commands data is read from the + * iData memeber of the argument command. With get commands the iData + * memeber is used to pass fetched data back to caller. + * After execution of command the function fills in the status + * in aCmd.iStatus memeber and sets aCmd.iExecuted as True. The function + * leaves if command can not be executed for some reason. + * + * @param aCmd The command to be executed + * @param aSnap The snap object + */ + void ExecuteIapsCmdL( CSmlDmBmCommandElement& aCmd, + RCmDestinationExt& aSnap ); + + /** + * Executes protection commands. The valid commands include + * update and get. With update commands data is read from the + * iData memeber of the argument command. With get commands the iData + * memeber is used to pass fetched data back to caller. + * After execution of command the function fills in the status + * in aCmd.iStatus memeber and sets aCmd.iExecuted as True. The function + * leaves if command can not be executed for some reason. + * + * @param aCmd The command to be executed + * @param aSnap The snap object + */ + void ExecuteProtectionCmdL( CSmlDmBmCommandElement& aCmd, + RCmDestinationExt& aSnap ); + + /** + * Executes hidden commands. The valid commands include + * update and get. With update commands data is read from the + * iData memeber of the argument command. With get commands the iData + * memeber is used to pass fetched data back to caller. + * After execution of command the function fills in the status + * in aCmd.iStatus memeber and sets aCmd.iExecuted as True. The function + * leaves if command can not be executed for some reason. + * + * @param aCmd The command to be executed + * @param aSnap The snap object + */ + void ExecuteHiddenCmdL( CSmlDmBmCommandElement& aCmd, + RCmDestinationExt& aSnap ); + + /** + * Executes metadata commands. The valid commands include + * update and get. With update commands data is read from the + * iData memeber of the argument command. With get commands the iData + * memeber is used to pass fetched data back to caller. + * After execution of command the function fills in the status + * in aCmd.iStatus memeber and sets aCmd.iExecuted as True. The function + * leaves if command can not be executed for some reason. + * + * @param aCmd The command to be executed + * @param aSnap The snap object + */ + void ExecuteMetadataCmdL( CSmlDmBmCommandElement& aCmd, + RCmDestinationExt& aSnap ); + + /** + * Executes embedded snap commands. The valid commands include + * update, get and delete. With update commands data is read from the + * iData memeber of the argument command. With get commands the iData + * memeber is used to pass fetched data back to caller. + * After execution of command the function fills in the status + * in aCmd.iStatus memeber and sets aCmd.iExecuted as True. The function + * leaves if command can not be executed for some reason. + * + * @param aCmd The command to be executed + * @param aLuid The id of the snap + */ + void ExecuteEmbeddedSnapCmdL( CSmlDmBmCommandElement& aCmd, + RCmDestinationExt& aSnap ); + /** + * Executes name commands. The valid commands include + * update and get. With update commands data is read from the + * iData memeber of the argument command. With get commands the iData + * memeber is used to pass fetched data back to caller. + * After execution of command the function fills in the status + * in aCmd.iStatus memeber and sets aCmd.iExecuted as True. The function + * leaves if command can not be executed for some reason. + * + * @param aCmd The command to be executed + * @param aSnap The snap object + */ + void ExecuteNameCmdL( CSmlDmBmCommandElement& aCmd, + RCmDestinationExt& aSnap ); + + +private: //data + + /** + * CmManager is used for accessing CommsDat. + */ + RCmManagerExt iCmManagerExt; + + /** + * Pointer to the adapter. This is used for + * querying data from DM framework when necessary + * and using helper functions. Not own. + */ + CNSmlDmBmAdapter* iAdapter; + + }; + + +#endif // NSmlDmBmSettingStore_H diff -r d3981f4fe6a4 -r c742e1129640 omadmadapters/nsmldmbmadapter/rom/nsmldmbmadapter.iby --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omadmadapters/nsmldmbmadapter/rom/nsmldmbmadapter.iby Wed Jun 23 18:03:02 2010 +0300 @@ -0,0 +1,31 @@ +/* +* Copyright (c) 2006 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: Image description file for project nsmldmbmadapter +* +*/ + + + +#ifndef NSMLDMBMADAPTER_IBY +#define NSMLDMBMADAPTER_IBY + +#include + +#ifdef __SYNCML_DM + +ECOM_PLUGIN( nsmldmbmadapter.dll, nsmldmbmadapter.rsc ) + +#endif // __SYNCML_DM + +#endif // NSMLDMBMADAPTER_IBY diff -r d3981f4fe6a4 -r c742e1129640 omadmadapters/nsmldmbmadapter/src/nsmldmbmadapter.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omadmadapters/nsmldmbmadapter/src/nsmldmbmadapter.cpp Wed Jun 23 18:03:02 2010 +0300 @@ -0,0 +1,1675 @@ +/* +* Copyright (c) 2006 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: Bearer management DM adapter. Provides handling of + Bearer management related settings in Device management +* +*/ + + + +#include +#include + +#include "nsmldmbmadapter.h" +#include "bmadapterlogger.h" + +// ======== MEMBER FUNCTIONS ======== + + +// -------------------------------------------------------------------------- +// Maps plugin UID to its factory function (constructor) +// -------------------------------------------------------------------------- +const TImplementationProxy ImplementationTable[] = + { + IMPLEMENTATION_PROXY_ENTRY(0x101f6d2f, + CNSmlDmBmAdapter::NewL) + }; + +// -------------------------------------------------------------------------- +// For ecom plugin implementation +// ------------------------------------------------------------------------- + +EXPORT_C const TImplementationProxy* ImplementationGroupProxy( TInt& aTableCount ) + { + aTableCount = sizeof(ImplementationTable) / sizeof(TImplementationProxy); + return ImplementationTable; + } + +// -------------------------------------------------------------------------- +// CNSmlDmBmAdapter::NewL +// -------------------------------------------------------------------------- +CNSmlDmBmAdapter* CNSmlDmBmAdapter::NewL( MSmlDmCallback* aDmCallback ) + { + BMADAPTERLOGSTRING("CNSmlDmBmAdapter::NewL: Start") + CNSmlDmBmAdapter* self = new (ELeave) CNSmlDmBmAdapter( aDmCallback ); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop( self ); + BMADAPTERLOGSTRING("CNSmlDmBmAdapter::NewL: End") + return self; + } + +// -------------------------------------------------------------------------- +// CNSmlDmBmAdapter::CNSmlDmBmAdapter +// -------------------------------------------------------------------------- + +CNSmlDmBmAdapter::CNSmlDmBmAdapter( MSmlDmCallback* aDmCallback ) + : CSmlDmAdapter( aDmCallback ) + { + } + +// -------------------------------------------------------------------------- +// CNSmlDmBmAdapter::ConstructL +// -------------------------------------------------------------------------- +void CNSmlDmBmAdapter::ConstructL() + { + BMADAPTERLOGSTRING( "CNSmlDmBmAdapter::CNSmlDmBmAdapter: Start" ) + iSettingStore = CNSmlDmBmSettingStore::NewL( this ); + BMADAPTERLOGSTRING( "CNSmlDmBmAdapter::CNSmlDmBmAdapter: End" ) + } + +// -------------------------------------------------------------------------- +// CNSmlDmBmAdapter::~CNSmlDmBmAdapter +// -------------------------------------------------------------------------- +CNSmlDmBmAdapter::~CNSmlDmBmAdapter() + { + BMADAPTERLOGSTRING( "CNSmlDmBmAdapter::~CNSmlDmBmAdapter: Start" ) + iBuffer.ResetAndDestroy(); + iBuffer.Close(); + delete iSettingStore; + BMADAPTERLOGSTRING( "CNSmlDmBmAdapter::~CNSmlDmBmAdapter: End" ) + } + +// -------------------------------------------------------------------------- +// CNSmlDmBmAdapter::DDFVersionL +// Returns ddf version nr +// -------------------------------------------------------------------------- +void CNSmlDmBmAdapter::DDFVersionL( CBufBase& aDDFVersion ) + { + BMADAPTERLOGSTRING( "CNSmlDmBmAdapter::DDFVersionL: Start" ) + aDDFVersion.InsertL( 0, KNSmlDmBMAdapterDDFVersion ); + BMADAPTERLOGSTRING( "CNSmlDmBmAdapter::DDFVersionL:End" ) + } + +// -------------------------------------------------------------------------- +// CNSmlDmBmAdapter::DDFStructureL +// Constructs the DDF structure +// -------------------------------------------------------------------------- +void CNSmlDmBmAdapter::DDFStructureL( MSmlDmDDFObject& aDDF ) + { + BMADAPTERLOGSTRING( "CNSmlDmBmAdapter::DDFStructureL: Start" ) + TSmlDmAccessTypes accessTypes; + + // BearerManagementSNAP + MSmlDmDDFObject& bm = aDDF.AddChildObjectL( KNSmlDmBMAdapterBM ); + accessTypes.SetGet(); + accessTypes.SetAdd(); + bm.SetAccessTypesL( accessTypes ); + bm.SetOccurenceL( MSmlDmDDFObject::EOne ); + bm.SetScopeL( MSmlDmDDFObject::EPermanent ); + bm.SetDFFormatL( MSmlDmDDFObject::ENode ); + bm.AddDFTypeMimeTypeL( KNSmlDmBMAdapterTextPlain ); + bm.SetDescriptionL( KNSmlDmBMAdapterBMDescription ); + accessTypes.Reset(); + + + // BearerManagementSNAP/ + MSmlDmDDFObject& dynamic1 = bm.AddChildObjectGroupL(); + accessTypes.SetAdd(); + accessTypes.SetDelete(); + accessTypes.SetGet(); + accessTypes.SetReplace(); + dynamic1.SetAccessTypesL( accessTypes ); + dynamic1.SetOccurenceL( MSmlDmDDFObject::EZeroOrMore ); + dynamic1.SetScopeL( MSmlDmDDFObject::EDynamic ); + dynamic1.SetDFFormatL( MSmlDmDDFObject::ENode ); + dynamic1.AddDFTypeMimeTypeL( KNSmlDmBMAdapterTextPlain ); + dynamic1.SetDescriptionL( KNSmlDmBMAdapterDynamicDescription ); + accessTypes.Reset(); + + + // BearerManagementSNAP//Name + MSmlDmDDFObject& name = dynamic1.AddChildObjectL( KNSmlDmBMAdapterName ); + accessTypes.SetAdd(); + accessTypes.SetGet(); + accessTypes.SetReplace(); + name.SetAccessTypesL( accessTypes ); + name.SetOccurenceL( MSmlDmDDFObject::EOne ); + name.SetScopeL( MSmlDmDDFObject::EDynamic ); + name.SetDFFormatL( MSmlDmDDFObject::EChr ); + name.SetDescriptionL( KNSmlDmBMAdapterNameDescription ); + accessTypes.Reset(); + + // BearerManagementSNAP//IAPPrioityList + MSmlDmDDFObject& iapList = + dynamic1.AddChildObjectL( KNSmlDmBMAdapterIAPPriorityList ); + accessTypes.SetAdd(); + accessTypes.SetGet(); + accessTypes.SetReplace(); + iapList.SetAccessTypesL( accessTypes ); + iapList.SetOccurenceL( MSmlDmDDFObject::EOne ); + iapList.SetScopeL( MSmlDmDDFObject::EDynamic ); + iapList.SetDFFormatL( MSmlDmDDFObject::EChr ); + iapList.SetDescriptionL( KNSmlDmBMAdapterIAPPriorityListDescription ); + accessTypes.Reset(); + + // BearerManagementSNAP//EmbeddedSNAP + MSmlDmDDFObject& embedded = + dynamic1.AddChildObjectL( KNSmlDmBMAdapterEmbeddedSNAP ); + accessTypes.SetAdd(); + accessTypes.SetDelete(); + accessTypes.SetGet(); + accessTypes.SetReplace(); + embedded.SetAccessTypesL( accessTypes ); + embedded.SetOccurenceL( MSmlDmDDFObject::EZeroOrOne ); + embedded.SetScopeL( MSmlDmDDFObject::EDynamic ); + embedded.SetDFFormatL( MSmlDmDDFObject::EChr ); + embedded.SetDescriptionL( KNSmlDmBMAdapterEmbeddedSNAPDescription ); + accessTypes.Reset(); + + // BearerManagementSNAP//Metadata + MSmlDmDDFObject& metadata = + dynamic1.AddChildObjectL( KNSmlDmBMAdapterMetadata ); + accessTypes.SetAdd(); + accessTypes.SetGet(); + accessTypes.SetReplace(); + metadata.SetAccessTypesL( accessTypes ); + metadata.SetOccurenceL( MSmlDmDDFObject::EOne ); + metadata.SetScopeL( MSmlDmDDFObject::EDynamic ); + metadata.SetDFFormatL( MSmlDmDDFObject::EInt ); + metadata.SetDescriptionL( KNSmlDmBMAdapterMetadataDescription ); + accessTypes.Reset(); + + + // BearerManagementSNAP//Protected + MSmlDmDDFObject& protection = + dynamic1.AddChildObjectL( KNSmlDmBMAdapterProtected ); + accessTypes.SetAdd(); + accessTypes.SetGet(); + accessTypes.SetReplace(); + protection.SetAccessTypesL( accessTypes ); + protection.SetOccurenceL( MSmlDmDDFObject::EOne ); + protection.SetScopeL( MSmlDmDDFObject::EDynamic ); + protection.SetDFFormatL( MSmlDmDDFObject::EInt ); + protection.SetDescriptionL( KNSmlDmBMAdapterProtectedDescription ); + accessTypes.Reset(); + + // BearerManagementSNAP//Hidden + MSmlDmDDFObject& hidden = dynamic1.AddChildObjectL( KNSmlDmBMAdapterHidden ); + accessTypes.SetAdd(); + accessTypes.SetGet(); + accessTypes.SetReplace(); + hidden.SetAccessTypesL( accessTypes ); + hidden.SetOccurenceL( MSmlDmDDFObject::EOne ); + hidden.SetScopeL( MSmlDmDDFObject::EDynamic ); + hidden.SetDFFormatL( MSmlDmDDFObject::EBool ); + hidden.SetDescriptionL( KNSmlDmBMAdapterHiddenDescription ); + accessTypes.Reset(); + + BMADAPTERLOGSTRING( "CNSmlDmBmAdapter::DDFStructureL: End" ) + } + +// ------------------------------------------------------------------------- +// CNSmlDmBmAdapter::UpdateLeafObjectL +// Adds or updates leaf node value. If snap object is +// in buffer this command is also buffered. Also if leaf node +// is embedded snap and that snap is buffered, the argument command +// is buffered. +// ------------------------------------------------------------------------- +void CNSmlDmBmAdapter::UpdateLeafObjectL( const TDesC8& aURI, + const TDesC8& aLUID, + const TDesC8& aObject, + const TDesC8& /*aType*/, + TInt aStatusRef ) + { + BMADAPTERLOGSTRING( "CNSmlDmBmAdapter::UpdateLeafObjectL: Start" ) + BMADAPTERLOGSTRING4( "\tUpdateLeafObjectL \tURI: %S, \n\tLUID: %S,\ + \tobject: %S ", + &aURI, &aLUID, &aObject ) + + TInt snapId = MapPredefinedSnapsL( aURI, aLUID ); + + // Check if parent snap node is found in the buffered settings + CSmlDmBmSettingsElement* snap = + GetSnapIfBuffered( RemoveLastURISeg( aURI ) ); + + // data for buffered SNAP -> Store command into buffer + if ( snap ) + { + CSmlDmBmCommandElement* cmd = + CSmlDmBmCommandElement::NewLC( ETrue, + aStatusRef, + KNSmlDmBmInvalidRef, + CNSmlDmBmAdapter::EAddCmd, + LastURISeg( aURI ), + aObject); + snap->NodeBuf().AppendL(cmd); + CleanupStack::Pop( cmd ); + BMADAPTERLOGSTRING2( "\tSnap %S found, buffering cmd", + snap->MappingName() ) + + } + // updates for an existing SNAP + else + { + + // If setting embedded SNAP node and the embedded SNAP node is still + // buffered -> Buffer also this command + if( !LastURISeg( aURI ).Compare( KNSmlDmBMAdapterEmbeddedSNAP ) ) + { + snap = GetSnapIfBuffered( aObject ); + + // embedded SNAP is buffered + if ( snap ) + { + CSmlDmBmCommandElement* cmd = + CSmlDmBmCommandElement::NewLC( ETrue, + aStatusRef, + KNSmlDmBmInvalidRef, + CNSmlDmBmAdapter::EAddCmd, + LastURISeg( aURI ), + aObject); + + // buffer this command + CSmlDmBmSettingsElement* setting = + CSmlDmBmSettingsElement::NewLC( RemoveLastURISeg( aURI ) ); + + // Check if SNAP was predefined or not + if( snapId == KErrNotFound ) + { + snapId = DesToIntL( aLUID ); + } + setting->SetLuid( snapId ); + iBuffer.AppendL( setting ); + CleanupStack::Pop( setting ); + setting->NodeBuf().AppendL(cmd); + CleanupStack::Pop( cmd ); + BMADAPTERLOGSTRING2( "\tEmbedded Snap %S buffered, buffering cmd", + snap->MappingName() ) + BMADAPTERLOGSTRING( "CNSmlDmBmAdapter::UpdateLeafObjectL: End" ) + return; + } + } + // execute command and return status + CSmlDmBmCommandElement* cmd = + CSmlDmBmCommandElement::NewLC( ETrue, + aStatusRef, + KNSmlDmBmInvalidRef, + CNSmlDmBmAdapter::EAddCmd, + LastURISeg( aURI ), + aObject); + if( snapId == KErrNotFound ) + { + snapId = DesToIntL( aLUID ); + } + iSettingStore->ExecuteCmdL( *cmd, snapId ); + BMADAPTERLOGSTRING2( "\tCmd executed with status: %d", + cmd->Status() ) + Callback().SetStatusL( aStatusRef, cmd->Status() ); + CleanupStack::PopAndDestroy( cmd ); + + } + BMADAPTERLOGSTRING( "CNSmlDmBmAdapter::UpdateLeafObjectL: End" ) + } +// -------------------------------------------------------------------------- +// CNSmlDmBmAdapter::DeleteObjectL +// Deletes node or leaf object. If the snap this command relates to is +// buffered, also the delete command is buffered. +// -------------------------------------------------------------------------- + +void CNSmlDmBmAdapter::DeleteObjectL( const TDesC8& aURI, + const TDesC8& aLUID, + TInt aStatusRef ) + { + BMADAPTERLOGSTRING( "CNSmlDmBmAdapter::DeleteObjectL: Start" ) + BMADAPTERLOGSTRING3( "\tDeleteObjectL \tURI: %S, \tLUID: %S", + &aURI, &aLUID ) + + CSmlDmBmCommandElement* cmd; + + TInt snapId = MapPredefinedSnapsL( aURI, aLUID ); + // check if node or leaf object and create command accordingly + // when updating, make sure that cmd is constructed + if ( NumOfURISegs( aURI ) == KNsmlDmBmSNAPNodeDepth ) + { + cmd = CSmlDmBmCommandElement::NewLC( EFalse, + aStatusRef, + KNSmlDmBmInvalidRef, + CNSmlDmBmAdapter::EDeleteCmd, + KNullDesC8, KNullDesC8 ); + } + else if ( ! LastURISeg( aURI ).Compare( KNSmlDmBMAdapterEmbeddedSNAP() ) ) + { + cmd = CSmlDmBmCommandElement::NewLC( ETrue, + aStatusRef, + KNSmlDmBmInvalidRef, + CNSmlDmBmAdapter::EDeleteCmd, + LastURISeg( aURI ), + KNullDesC8 ); + } + else + { + // unsupported node, framework should check this + Callback().SetStatusL( aStatusRef, CSmlDmAdapter::EError ); + BMADAPTERLOGSTRING( "\tCNSmlDmBmAdapter::DeleteObjectL: \ + Error, unsupported node" ) + return; + } + + // If this SNAP still in buffer -> buffer command for later execution + // Check if SNAP is found in the buffered settings + CSmlDmBmSettingsElement* snap = NULL; + if( cmd->Leaf() ) + { + snap = GetSnapIfBuffered( RemoveLastURISeg( aURI ) ); + } + else + { + snap = GetSnapIfBuffered( aURI ); + } + // when updating make sure that cmd is removed from cleanup + // stack and deleted if necessary + + // if cmd for buffered snap append cmd to buffer + if ( snap ) + { + snap->NodeBuf().AppendL( cmd ); + CleanupStack::Pop( cmd ); + BMADAPTERLOGSTRING2( "\tSnap %S found, buffering cmd", + snap->MappingName() ) + } + // if existing node, execute command + else if( aLUID.Length() > 0 || snapId != KErrNotFound ) + { + if( snapId == KErrNotFound ) + { + snapId = DesToIntL( aLUID ); + } + iSettingStore->ExecuteCmdL( *cmd, snapId ); + BMADAPTERLOGSTRING2( "\tCmd executed with status: %d ", + cmd->Status() ) + Callback().SetStatusL( aStatusRef, cmd->Status() ); + CleanupStack::PopAndDestroy( cmd ); + } + // unknown node + else + { + BMADAPTERLOGSTRING( "\tUnknown node\n" ) + Callback().SetStatusL( aStatusRef, CSmlDmAdapter::ENotFound ); + CleanupStack::PopAndDestroy( cmd ); + } + + BMADAPTERLOGSTRING( "CNSmlDmBmAdapter::DeleteObjectL: End" ) + } +// ------------------------------------------------------------------------- +// CNSmlDmBmAdapter::FetchLeafObjectL +// Fetches leaf object value. If the snap is buffered also this command +// will +// be buffered. +// ------------------------------------------------------------------------- +void CNSmlDmBmAdapter::FetchLeafObjectL( const TDesC8& aURI, + const TDesC8& aLUID, + const TDesC8& /*aType*/, + const TInt aResultsRef, + const TInt aStatusRef ) + { + BMADAPTERLOGSTRING( "NSmlDmBMAdapter::FetchLeafObjectL: Start" ) + BMADAPTERLOGSTRING3( "\tFetchLeafObjectL \tURI: %S, \tLUID: %S,", + &aURI, &aLUID ) + + TInt snapId = MapPredefinedSnapsL( aURI, aLUID ); + + // check if parent snap node is buffered + CSmlDmBmSettingsElement* snap = + GetSnapIfBuffered( RemoveLastURISeg( aURI ) ); + + // data for buffered SNAP -> Store command into buffer + if ( snap ) + { + CSmlDmBmCommandElement* cmd = + CSmlDmBmCommandElement::NewLC( ETrue, + aStatusRef, + aResultsRef, + CNSmlDmBmAdapter::EGetCmd, + LastURISeg( aURI ), + KNullDesC8); + snap->NodeBuf().AppendL( cmd ); + CleanupStack::Pop( cmd ); + BMADAPTERLOGSTRING2( "\tSnap %S found, buffering cmd", + snap->MappingName() ) + } + // otherwise execute cmd right away + else + { + + CSmlDmBmCommandElement* cmd = + CSmlDmBmCommandElement::NewLC( ETrue, + aStatusRef, + aResultsRef, + CNSmlDmBmAdapter::EGetCmd, + LastURISeg( aURI ), + KNullDesC8); + if( snapId == KErrNotFound ) + { + snapId = DesToIntL( aLUID ); + } + + iSettingStore->ExecuteCmdL( *cmd, snapId ); + BMADAPTERLOGSTRING2( "\tCmd executed with status: %d ", + cmd->Status() ) + // if executed return status + if ( cmd->Executed() ) + { + Callback().SetStatusL( aStatusRef, cmd->Status() ); + // if successful set results + if ( cmd->Status() == CSmlDmAdapter::EOk ) + { + BMADAPTERLOGSTRING2( "\tCmd executed with result: %S ", + cmd->Data() ) + CBufBase* result = CBufFlat::NewL( cmd->Data()->Size() ); + CleanupStack::PushL( result ); + result->InsertL( 0, *cmd->Data() ); + Callback().SetResultsL( aResultsRef, *result, KNullDesC8 ); + CleanupStack::PopAndDestroy( result ); + } + } + else + { + // failed to execute command + Callback().SetStatusL( aStatusRef, CSmlDmAdapter::EError ); + } + CleanupStack::PopAndDestroy( cmd ); + } + + BMADAPTERLOGSTRING( "NSmlDmBMAdapter::FetchLeafObjectL: End" ) + } + +// -------------------------------------------------------------------------- +// CNSmlDmBmAdapter::FetchLeafObjectSizeL +// Fetches leaf object size. If the snap is buffered also this command will +// be buffered. +// ------------------------------------------------------------------------- +void CNSmlDmBmAdapter::FetchLeafObjectSizeL( const TDesC8& aURI, + const TDesC8& aLUID, + const TDesC8& /* aType */, + TInt aResultsRef, + TInt aStatusRef ) + { + BMADAPTERLOGSTRING( "CNSmlDmBmAdapter::FetchLeafObjectSizeL: Start" ) + BMADAPTERLOGSTRING3( "\tFetchLeafObjectSizeL \tURI: %S, \tLUID: %S,", + &aURI, &aLUID ) + + TInt snapId = MapPredefinedSnapsL( aURI, aLUID ); + + // check if parent snap node is buffered + CSmlDmBmSettingsElement* snap = + GetSnapIfBuffered( RemoveLastURISeg( aURI ) ); + + // data for buffered SNAP -> Store command into buffer + if ( snap ) + { + CSmlDmBmCommandElement* cmd = + CSmlDmBmCommandElement::NewLC( ETrue, + aStatusRef, + aResultsRef, + CNSmlDmBmAdapter::EGetSizeCmd, + LastURISeg( aURI ), + KNullDesC8); + snap->NodeBuf().AppendL( cmd ); + CleanupStack::Pop( cmd ); + BMADAPTERLOGSTRING2( "\tSnap %S found, buffering cmd", + snap->MappingName() ) + } + // otherwise execute get size cmd right away + else + { + CSmlDmBmCommandElement* cmd = + CSmlDmBmCommandElement::NewLC( ETrue, + aStatusRef, + aResultsRef, + CNSmlDmBmAdapter::EGetSizeCmd, + LastURISeg( aURI ), + KNullDesC8); + if( snapId == KErrNotFound ) + { + snapId = DesToIntL( aLUID ); + } + iSettingStore->ExecuteCmdL( *cmd, snapId ); + BMADAPTERLOGSTRING2( "\tCmd executed with status: %d ", + cmd->Status() ) + // if executed get status + if ( cmd->Executed() ) + { + Callback().SetStatusL( aStatusRef, cmd->Status() ); + // if successful get results + if ( cmd->Status() == CSmlDmAdapter::EOk ) + { + BMADAPTERLOGSTRING2( "\tCmd executed with result: %S ", + cmd->Data() ) + CBufBase* result = CBufFlat::NewL( cmd->Data()->Size() ); + CleanupStack::PushL( result ); + result->InsertL( 0, *cmd->Data() ); + Callback().SetResultsL( aResultsRef, *result, KNullDesC8 ); + CleanupStack::PopAndDestroy( result ); + } + } + else + { + // failed to execute command + Callback().SetStatusL( aStatusRef, CSmlDmAdapter::EError ); + } + + CleanupStack::PopAndDestroy( cmd ); + } + BMADAPTERLOGSTRING( "CNSmlDmBmAdapter::FetchLeafObjectSizeL: End" ) + } + +// ------------------------------------------------------------------------ +// CNSmlDmBmAdapter::ChildURIListL +// Fetches child nodes of a node. these may be either all snap nodes +// or leaf nodes under a snap node. +// ------------------------------------------------------------------------ +void CNSmlDmBmAdapter::ChildURIListL( const TDesC8& aURI, + const TDesC8& aLUID, + const CArrayFix& + aPreviousURISegmentList, + TInt aResultsRef, + TInt aStatusRef ) + { + BMADAPTERLOGSTRING( "CNSmlDmBmAdapter::ChildURIListL: Start" ) + BMADAPTERLOGSTRING3( "\tChildURIListL URI: %S, LUID: %S ", + &aURI, &aLUID ) + + TInt snapId = MapPredefinedSnapsL( aURI, aLUID ); + + CBufBase* resultList = CBufFlat::NewL( KSmlMaxURISegLen ); + CleanupStack::PushL( resultList ); + // get all snap nodes + if ( !aURI.Compare(KNSmlDmBMAdapterBM) ) + { + RArray snaps = RArray( KNSmlDmBMGranularity ); + CleanupClosePushL( snaps ); + iSettingStore->GetSnapsL( snaps ); + TInt currentSNAP( -1 ); + for ( TInt i( 0 ); i < snaps.Count(); i++) + { + currentSNAP = snaps[i]; + BMADAPTERLOGSTRING2( "\tSnap id: %d, ", currentSNAP ) + + // check that not previously mapped + TBool found = EFalse; + + for ( TInt j( 0 ); j < aPreviousURISegmentList.Count(); j++ ) + { + TSmlDmMappingInfo mapping = aPreviousURISegmentList.At( j ); + // snap already has mapping + if ( currentSNAP == DesToIntL( mapping.iURISegLUID ) ) + { + BMADAPTERLOGSTRING2( " URI: %S exists ", &mapping.iURISeg ) + found = ETrue; + // add to result list + resultList->InsertL( resultList->Size(), + mapping.iURISeg); + break; + } + } + if ( !found ) + { + // This is new snap -> create URI and mapping and add + // node name to result + HBufC8* uri = HBufC8::NewLC( aURI.Length() + + KNSmlDmBmSeparator().Length() + + KSmlMaxURISegLen ); + + TPtr8 uriPtr = uri->Des(); + uriPtr.Format( aURI ); + uriPtr.Append( KNSmlDmBmSeparator ); + uriPtr.Append( KNSmlDmBMSNAPNamePrefix ); + HBufC8* luidBuf = IntToDes8L( currentSNAP ); + CleanupStack::PushL( luidBuf ); + uriPtr.Append( *luidBuf ); + + Callback().SetMappingL( uriPtr, *luidBuf ); + resultList->InsertL( resultList->Size(), + LastURISeg( uriPtr ) ); + BMADAPTERLOGSTRING2( "Creating mapping for URI %S ", &uriPtr ) + CleanupStack::PopAndDestroy( luidBuf ); + CleanupStack::PopAndDestroy( uri ); + } + // insert separator if not last + if ( i < snaps.Count() - 1 ) + { + resultList->InsertL( resultList->Size(), + KNSmlDmBmSeparator ); + } + } + CleanupStack::PopAndDestroy( &snaps ); + Callback().SetStatusL( aStatusRef, CSmlDmAdapter::EOk ); + Callback().SetResultsL( aResultsRef, *resultList, KNullDesC8 ); + } + // get child nodes of a snap node + else if ( NumOfURISegs( aURI ) == KNsmlDmBmSNAPNodeDepth ) + { + CSmlDmBmSettingsElement* snap = GetSnapIfBuffered( aURI ); + // if buffered, add this command to buffer + if( snap ) + { + CSmlDmBmCommandElement* cmd = + CSmlDmBmCommandElement::NewLC( EFalse, + aStatusRef, + aResultsRef, + CNSmlDmBmAdapter::EGetCmd, + KNullDesC8, + KNullDesC8 ); + snap->NodeBuf().AppendL( cmd ); + CleanupStack::Pop( cmd ); + BMADAPTERLOGSTRING2( "\tSnap %S found, buffering cmd", + snap->MappingName() ) + } + // existing snap must have luid mapped + else if( aLUID.Length() > 0 || snapId != KErrNotFound ) + { + CSmlDmBmCommandElement* cmd = + CSmlDmBmCommandElement::NewLC( EFalse, + aStatusRef, + aResultsRef, + CNSmlDmBmAdapter::EGetCmd, + KNullDesC8, + KNullDesC8 ); + if( snapId == KErrNotFound ) + { + snapId = DesToIntL( aLUID ); + } + + iSettingStore->ExecuteCmdL( *cmd, snapId ); + BMADAPTERLOGSTRING2( "\tCmd executed with status: %d ", + cmd->Status() ) + Callback().SetStatusL( aStatusRef, cmd->Status() ); + if( cmd->Status() == CSmlDmAdapter::EOk ) + { + resultList->InsertL( 0, *cmd->Data() ); + Callback().SetResultsL( aResultsRef, + *resultList, + KNullDesC8 ); + } + CleanupStack::PopAndDestroy( cmd ); + } + // invalid snap object + else + { + BMADAPTERLOGSTRING( "\tCNSmlDmBmAdapter::ChildURIListL: Error, \ + invalid snap node" ) + Callback().SetStatusL( aStatusRef, CSmlDmAdapter::ENotFound ); + } + } + else + { + BMADAPTERLOGSTRING( "\tChildURIListL: Invalid URI" ) + } + CleanupStack::PopAndDestroy( resultList ); + BMADAPTERLOGSTRING( "CNSmlDmBmAdapter::ChildURIListL: End" ) + } + +// -------------------------------------------------------------------------- +// CNSmlDmBmAdapter::AddNodeObjectL +// Adds a snap node. The node is buffered until all data is received. +// -------------------------------------------------------------------------- +void CNSmlDmBmAdapter::AddNodeObjectL( const TDesC8& aURI, + const TDesC8& aParentLUID, + TInt aStatusRef ) + { + BMADAPTERLOGSTRING( "CNSmlDmBmAdapter::AddNodeObjectL: Start" ) + BMADAPTERLOGSTRING3( "\tAddNodeObjectL \tURI: %S, \tparent LUID: %S,", + &aURI, &aParentLUID ) + if ( NumOfURISegs( aURI ) == KNsmlDmBmSNAPNodeDepth ) + { + // if same node already exists command fails + CSmlDmBmSettingsElement* setting = GetSnapIfBuffered( aURI ); + if( setting || aParentLUID.Compare( KNullDesC8) ) + { + BMADAPTERLOGSTRING( "\t Snap exists" ) + Callback().SetStatusL( aStatusRef, CSmlDmAdapter::EAlreadyExists ); + } + else if ( LastURISeg( aURI ).Length() > KSmlMaxURISegLen ) + { + BMADAPTERLOGSTRING( "\t Node name too long" ) + Callback().SetStatusL( aStatusRef, CSmlDmAdapter::EError ); + } + else + { + // Store command in buffer for later processing + setting = CSmlDmBmSettingsElement::NewLC( aURI ); + iBuffer.AppendL( setting ); + CleanupStack::Pop( setting ); + + // store the add node command + CSmlDmBmCommandElement* command = + CSmlDmBmCommandElement::NewLC( EFalse, + aStatusRef, + KNSmlDmBmInvalidRef, + CNSmlDmBmAdapter::EAddCmd, + KNullDesC8, + KNullDesC8 ); + TInt index( iBuffer.Count() - 1 ); + iBuffer[index]->NodeBuf().AppendL( command ); + CleanupStack::Pop( command ); + BMADAPTERLOGSTRING( "\t Cmd buffered" ) + } + } + + BMADAPTERLOGSTRING( "CNSmlDmBmAdapter::AddNodeObjectL: End" ) + } + +// ------------------------------------------------------------------------- +// CNSmlDmBmAdapter::UpdateLeafObjectL +// Not supported +// ------------------------------------------------------------------------- +void CNSmlDmBmAdapter::UpdateLeafObjectL( const TDesC8& /* aURI */, + const TDesC8& /* aLUID */, + RWriteStream*& /* aStream */, + const TDesC8& /* aType */, + TInt /* aStatusRef */ ) + { + BMADAPTERLOGSTRING( "CNSmlDmBmAdapter::UpdateLeafObjectL: Start" ) + BMADAPTERLOGSTRING( "CNSmlDmBmAdapter::UpdateLeafObjectL: End" ) + } + + + +// ------------------------------------------------------------------------- +// CNSmlDmBmAdapter::ExecuteCommandL +// Not supported +// ------------------------------------------------------------------------- +void CNSmlDmBmAdapter::ExecuteCommandL( const TDesC8& /* aURI */, + const TDesC8& /* aLUID */, + const TDesC8& /* aArgument */, + const TDesC8& /* aType */, + TInt aStatusRef ) + { + BMADAPTERLOGSTRING( "CNSmlDmBmAdapter::ExecuteCommandL: Start" ) + Callback().SetStatusL(aStatusRef, CSmlDmAdapter::EError); + BMADAPTERLOGSTRING( "CNSmlDmBmAdapter::ExecuteCommandL: End" ) + } +// ------------------------------------------------------------------------- +// CNSmlDmBmAdapter::ExecuteCommandL +// Not supported +// ------------------------------------------------------------------------- +void CNSmlDmBmAdapter::ExecuteCommandL( const TDesC8& /* aURI */, + const TDesC8& /* aLUID */, + RWriteStream*& /* aStream */, + const TDesC8& /* aType */, + TInt aStatusRef ) + { + BMADAPTERLOGSTRING( "CNSmlDmBmAdapter::ExecuteCommandL: Start" ) + Callback().SetStatusL( aStatusRef, CSmlDmAdapter::EError ); + BMADAPTERLOGSTRING( "CNSmlDmBmAdapter::ExecuteCommandL: End" ) + } + +// ------------------------------------------------------------------------- +// CNSmlDmBmAdapter::CopyCommandL +// Not supported +// ------------------------------------------------------------------------- +void CNSmlDmBmAdapter::CopyCommandL( const TDesC8& /* aTargetURI */ , + const TDesC8& /* aTargetLUID */ , + const TDesC8& /* aSourceURI */ , + const TDesC8& /* aSourceLUID */, + const TDesC8& /* aType */ , + TInt aStatusRef ) + { + //not supported + BMADAPTERLOGSTRING( "CNSmlDmBmAdapter::CopyCommandL: Sart" ) + Callback().SetStatusL( aStatusRef, CSmlDmAdapter::EError ); + BMADAPTERLOGSTRING( "CNSmlDmBmAdapter::CopyCommandL: End" ) + } +// ------------------------------------------------------------------------- +// CNSmlDmBmAdapter::StartAtomicL +// Not supported +// ------------------------------------------------------------------------- +void CNSmlDmBmAdapter::StartAtomicL() + { + BMADAPTERLOGSTRING( "CNSmlDmBmAdapter::StartAtomicL: Start" ) + BMADAPTERLOGSTRING( "CNSmlDmBmAdapter::StartAtomicL: End" ) + } +// ------------------------------------------------------------------------- +// CNSmlDmBmAdapter::CommitAtomicL +// Not supported +// ------------------------------------------------------------------------- +void CNSmlDmBmAdapter::CommitAtomicL() + { + BMADAPTERLOGSTRING( "CNSmlDmBmAdapter::CommitAtomicL: Start" ) + BMADAPTERLOGSTRING( "CNSmlDmBmAdapter::CommitAtomicL: End" ) + } + +// ------------------------------------------------------------------------- +// CNSmlDmBmAdapter::RollbackAtomicL +// Not supported +// ------------------------------------------------------------------------- +void CNSmlDmBmAdapter::RollbackAtomicL() + { + BMADAPTERLOGSTRING( "CNSmlDmBmAdapter::RollbackAtomicL: Start" ) + BMADAPTERLOGSTRING( "CNSmlDmBmAdapter::RollbackAtomicL: End" ) + } + +TBool CNSmlDmBmAdapter::StreamingSupport( TInt& /* aItemSize */ ) + { + BMADAPTERLOGSTRING( "CNSmlDmBmAdapter::StreamingSupport: Start" ) + BMADAPTERLOGSTRING( "CNSmlDmBmAdapter::StreamingSupport: End" ) + return EFalse; + } +// ------------------------------------------------------------------------- +// CNSmlDmBmAdapter::StreamCommittedL +// Not supported +// ------------------------------------------------------------------------- +void CNSmlDmBmAdapter::StreamCommittedL() + { + BMADAPTERLOGSTRING( "CNSmlDmBmAdapter::StreamCommittedL: Start" ) + BMADAPTERLOGSTRING( "CNSmlDmBmAdapter::StreamCommittedL: End" ) + } + +// ------------------------------------------------------------------------- +// CNSmlDmBmAdapter::CompleteOutstandingCmdsL +// CNSmlDmBmAdapter::CompleteOutstandingCmdsL +// ------------------------------------------------------------------------- +void CNSmlDmBmAdapter::CompleteOutstandingCmdsL() + { + BMADAPTERLOGSTRING( "CNSmlDmBmAdapter::CompleteOutstandingCmdsL: Start" ) + CSmlDmBmSettingsElement* settings( NULL ); + CSmlDmBmCommandElement* cmd( NULL ); + TInt err(0); + // Read through the buffer and execute commands + for ( TInt i(0); i < iBuffer.Count(); ) + { + settings = iBuffer[i]; + if( settings->NodeBuf().Count() ) + { + // the setting may be executed already if it has been an embedded + // snap for another snap + if ( !settings->Executed() ) + { + //execute commands for snap + TRAP( err, iSettingStore->StoreSnapL( *settings )); + } + // if can't recover from error, don't continue processing + // commands + if( err == KErrNoMemory || + err == KErrDiskFull ) + { + BMADAPTERLOGSTRING2( "\tCNSmlDmBmAdapter::\ + CompleteOutstandingCmdsL: Error %d", err ) + User::Leave( err ); + } + // if this is a new snap and created successfully, map luid + if ( !settings->NodeBuf()[0]->Leaf() && + settings->NodeBuf()[0]->CmdType() == CNSmlDmBmAdapter::EAddCmd && + settings->NodeBuf()[0]->Executed() && + settings->NodeBuf()[0]->Status() == CSmlDmAdapter::EOk ) + { + HBufC8* luid = IntToDes8L( settings->Luid() ); + CleanupStack::PushL( luid ); + Callback().SetMappingL( *settings->MappingName(), *luid ); + BMADAPTERLOGSTRING3( "\t Setting mapping %S - %S ", + settings->MappingName(), luid ) + CleanupStack::PopAndDestroy( luid ); + } + // set status for all commands executed and remove the command + for ( TInt j( 0 ); j < settings->NodeBuf().Count(); ) + { + + cmd = settings->NodeBuf()[j]; + + // return status values if executed + if ( cmd->Executed() ) + { + + Callback().SetStatusL( cmd->StatusRef(), + cmd->Status() ); + // for certain errors, don't continue command execution + if( cmd->Status() == CSmlDmAdapter::ENoMemory ) + { + // commands are deleted + iBuffer.ResetAndDestroy(); + BMADAPTERLOGSTRING( "\tCmd failed with CSmlDmAdapter::ENoMemory" ) + User::Leave( KErrNoMemory ); + } + else if( cmd->Status() == CSmlDmAdapter::EDiskFull ) + { + // commands are deleted + iBuffer.ResetAndDestroy(); + BMADAPTERLOGSTRING( "\tCmd failed with CSmlDmAdapter::EDiskFull" ) + User::Leave( KErrDiskFull ); + } + else + { + BMADAPTERLOGSTRING2( + "\tCmd failed with CSmlDmAdapter::%d", + cmd->Status() ) + } + // for get commands, also return the results + if ( cmd->CmdType() == CNSmlDmBmAdapter::EGetCmd || + cmd->CmdType() == CNSmlDmBmAdapter::EGetSizeCmd ) + { + CBufBase* result = CBufFlat::NewL( cmd->Data()->Size() ); + CleanupStack::PushL( result ); + result->InsertL( 0, *cmd->Data() ); + Callback().SetResultsL( cmd->ResultRef(), + *result, + KNullDesC8 ); + CleanupStack::PopAndDestroy( result ); + } + } + else + { + Callback().SetStatusL( cmd->StatusRef(), + CSmlDmAdapter::EError ); + } + settings->NodeBuf().Remove( j ); + delete cmd; + } + } + + // delete settings element and remove it from buffer + delete settings; + iBuffer.Remove( i ); + } + BMADAPTERLOGSTRING( "CNSmlDmBmAdapter::CompleteOutstandingCmdsL: End" ) + } + + + +// ------------------------------------------------------------------------- +// CNSmlDmBmAdapter::StoreSnapIfBufferedL +// If argument snap is found in the buffer iSettingStore->StoreSNAPL is +// called +// for it and LUID is mapped. SNAP is set as executed. +// This is called when checking if snap has embedded snap reference to +// another +// snap which is stored further in the command buffer. +// All embedded snap commands of this type are buffered and execution only +// happens with CompleteOutstandingCmdsL call. +// ------------------------------------------------------------------------- + +void CNSmlDmBmAdapter::StoreSnapIfBufferedL( const TDesC8& aURI ) + { + BMADAPTERLOGSTRING( "CNSmlDmBmAdapter::StoreSnapIfBufferedL: Start" ) + CSmlDmBmSettingsElement* snap = GetSnapIfBuffered( aURI ); + // if snap is in buffer and is a new snap + if( snap && !snap->Luid() ) + { + iSettingStore->StoreSnapL( *snap ); + // set mapping if succesfully executed + if ( snap->NodeBuf()[0]->Executed() && + snap->NodeBuf()[0]->Status() == CSmlDmAdapter::EOk ) + { + HBufC8* luid = IntToDes8L( snap->Luid() ); + CleanupStack::PushL( luid ); + Callback().SetMappingL( *snap->MappingName(), *luid); + CleanupStack::PopAndDestroy( luid ); + } + } + BMADAPTERLOGSTRING( "CNSmlDmBmAdapter::StoreSnapIfBufferedL: End" ) + } +// ------------------------------------------------------------------------- +// CNSmlDmBmAdapter::GetSnapUriFromLuidL +// Returns heap desciptor holding snap node URI matching the argument LUID +// ------------------------------------------------------------------------- +HBufC8* CNSmlDmBmAdapter::GetSnapUriFromLuidL( const TUint aSnapId ) + { + BMADAPTERLOGSTRING( "CNSmlDmBmAdapter::GetSnapURIFromLUIDL: Start" ) + HBufC8* uri( NULL ); + MSmlDmAdapter::TError err( MSmlDmAdapter::EOk ); + CBufBase* fetchRes = CBufFlat::NewL( KSmlMaxURISegLen ); + CleanupStack::PushL( fetchRes ); + // fetch all snap nodes + Callback().FetchLinkL( KNSmlDmBMAdapterBMURI, *fetchRes, err ); + + TPtr8 snapNodes = fetchRes->Ptr( 0 ); + + TInt numSnaps = NumOfURISegs( snapNodes ); + + // get uri-luid mappings for snap nodes + for ( TInt i( 0 ); i < numSnaps; i++ ) + { + TPtrC8 node = LastURISeg( snapNodes ); + + HBufC8* uriSeg = HBufC8::NewLC( KNSmlDmBmAdapterURIMaxLength + + node.Length()); + uriSeg->Des().Append( KNSmlDmBMAdapterBM() ); + uriSeg->Des().Append( KNSmlDmBmSeparator() ); + uriSeg->Des().Append( node ); + + HBufC8* luid = Callback().GetLuidAllocL( *uriSeg ); + CleanupStack::PopAndDestroy( uriSeg ); + CleanupStack::PushL( luid ); + // node may not have luid mapped if it's just created + if( luid->Size() ) + { + TInt id = DesToIntL( *luid ); + CleanupStack::PopAndDestroy( luid ); + if ( aSnapId == id ) + { + uri = HBufC8::NewLC( KNSmlDmBMAdapterBMURI().Size() + + KNSmlDmBmSeparator().Size() + + node.Size() ); + + uri->Des().Append( KNSmlDmBMAdapterBMURI() ); + uri->Des().Append( KNSmlDmBmSeparator() ); + uri->Des().Append( node ); + break; + } + } + else + { + CleanupStack::PopAndDestroy( luid ); + } + snapNodes = RemoveLastURISeg( snapNodes ); + } + + if( uri ) + { + CleanupStack::Pop( uri ); + } + + CleanupStack::PopAndDestroy( fetchRes ); + + BMADAPTERLOGSTRING( "CNSmlDmBmAdapter::IdArrayToIAPList: End" ) + return uri; + } + +// ------------------------------------------------------------------------- +// CNSmlDmBmAdapter::GetIapListL +// Returns heap desciptor holding a comma separated list of AP node URIs +// matching the luids in the argument array. +// ------------------------------------------------------------------------- +HBufC8* CNSmlDmBmAdapter::GetIapListL( const RArray& aIdArray ) + { + BMADAPTERLOGSTRING( "CNSmlDmBmAdapter::GetIapListL: Start" ) + HBufC8* iapList = HBufC8::NewLC( aIdArray.Count() * + ( KNSmlDmBmAdapterAPURIMaxLength + + KSmlMaxURISegLen ) ); + MSmlDmAdapter::TError err; + CBufBase* fetchRes = CBufFlat::NewL( KSmlMaxURISegLen ); + CleanupStack::PushL( fetchRes ); + // fetch dynamic AP nodes, so that LUID mapping is created + Callback().FetchLinkL( KNSmlDmBMAdapterIAPURI, *fetchRes, err ); + + // list of all nodes has a trailing '/' unlike regular uris, remove that + // for further handling + TPtr8 iapNodes = fetchRes->Ptr( 0 ); + if ( iapNodes.Length() > 0 && iapNodes[iapNodes.Length() - 1] == '/') + { + iapNodes = iapNodes.Left( iapNodes.Length() - 1 ); + } + + TInt numAPs = NumOfURISegs( iapNodes ); + + CArrayFixFlat* mappings = + new (ELeave) CArrayFixFlat( numAPs * + sizeof( TSmlDmMappingInfo ) ); + CleanupStack::PushL( mappings ); + + // get uri-luid mappings for all ap nodes + HBufC8* luid = NULL; + for ( TInt i( 0 ); i < numAPs; i++ ) + { + TSmlDmMappingInfo m; + m.iURISeg = LastURISeg( iapNodes ); + + HBufC8* uriSeg = HBufC8::NewLC( KNSmlDmBmAdapterAPURIMaxLength + + m.iURISeg.Length() ); + uriSeg->Des().Replace( 0, + uriSeg->Length(), + KNSmlDmBMAdapterIAPNode() ); + uriSeg->Des().Append( KNSmlDmBmSeparator() ); + uriSeg->Des().Append( m.iURISeg ); + + luid = Callback().GetLuidAllocL( *uriSeg ); + CleanupStack::PopAndDestroy( uriSeg ); + CleanupStack::PushL( luid ); + m.iURISegLUID.Set( *luid ); + mappings->AppendL( m ); + iapNodes = RemoveLastURISeg( iapNodes ); + } + + // find out URIs matching argument IAP ids + for (TInt i(0); i < aIdArray.Count(); i++) + { + TBool found = EFalse; + + for ( TInt j( 0 ); j < mappings->Count(); j++ ) + { + if ( aIdArray[i] == DesToIntL( mappings->At( j ).iURISegLUID ) ) + { + // add to result + iapList->Des().Append( KNSmlDmBMAdapterIAPURI() ); + iapList->Des().Append( KNSmlDmBmSeparator() ); + iapList->Des().Append( mappings->At(j).iURISeg ); + // not last -> add separator + if ( i < aIdArray.Count() - 1 ) + { + iapList->Des().Append( KNSmlDmBmUriListSeparator ); + } + found = ETrue; + break; + } + } + if ( ! found ) + { + BMADAPTERLOGSTRING( "CNSmlDmBmAdapter::GetIapListL: \ + Error IAP matching id not found" ) + User::Leave( KErrNotFound ); + } + } + + // cleanup each allocated luid + CleanupStack::PopAndDestroy( numAPs ); + CleanupStack::PopAndDestroy( mappings ); + CleanupStack::PopAndDestroy( fetchRes ); + CleanupStack::Pop( iapList ); + BMADAPTERLOGSTRING( "CNSmlDmBmAdapter::GetIapListL: End" ) + return iapList; + } + +// ------------------------------------------------------------------------- +// CNSmlDmBmAdapter::GetIdArrayL +// Returns array holding LUIDs matching the AP node in the argument list. +// ------------------------------------------------------------------------- +RArray CNSmlDmBmAdapter::GetIdArrayL( const TDesC8& aIAPList ) + { + BMADAPTERLOGSTRING( "CNSmlDmBmAdapter::GetIdArrayL: Start" ) + TPtrC8 uri; + RArray iaps; + CleanupClosePushL( iaps ); + uri.Set( aIAPList ); + // fetch AP nodes so that mappings are created + MSmlDmAdapter::TError err; + CBufBase* fetchRes = CBufFlat::NewL( KSmlMaxURISegLen ); + CleanupStack::PushL( fetchRes ); + // fetch dynamic AP nodes, so that LUID mappings are created + Callback().FetchLinkL( KNSmlDmBMAdapterIAPURI, *fetchRes, err ); + + for ( TInt i(0), n = NumOfURIs( aIAPList ); i < n; i++ ) + { + TPtrC8 thisURI = FirstURI( uri ); + // remove ./ from beginning + TPtrC8 apUri = thisURI.Mid( KNSmlDmBmAdapterURIPrefix().Length() ); + HBufC8* luid = Callback().GetLuidAllocL( apUri ); + CleanupStack::PushL( luid ); + TInt id = DesToIntL( *luid ); + CleanupStack::PopAndDestroy( luid ); + iaps.Append( id ); + uri.Set( RemoveFirstURI( uri ) ); + } + + CleanupStack::PopAndDestroy( fetchRes ); + CleanupStack::Pop( &iaps ); + BMADAPTERLOGSTRING( "CNSmlDmBmAdapter::GetIdArrayL: End" ) + return iaps; + } + +// -------------------------------------------------------------------------- +// CNSmlDmBmAdapter::IntToDes8L +// Converts integer to 8bit descriptor +// -------------------------------------------------------------------------- +HBufC8* CNSmlDmBmAdapter::IntToDes8L( TInt aLuid ) const + { + HBufC8* buf = HBufC8::NewL( KMaxLengthOf32bitInteger ); + TPtr8 ptrBuf = buf->Des(); + + // Unless aLuid is casted as TInt64, PC-Lint reports: + // Significant prototype coercion + // + ptrBuf.Num( TInt64( aLuid ) ); + return buf; + } + +// -------------------------------------------------------------------------- +// CNSmlDmBmAdapter::DesToIntL +// Converts 8bit descriptor to int +// -------------------------------------------------------------------------- +TUint CNSmlDmBmAdapter::DesToIntL( const TDesC8& aLuid ) const + { + __UHEAP_MARK; + TLex8 lex( aLuid ); + TUint value( 0 ); + User::LeaveIfError( lex.Val( value ) ); + __UHEAP_MARKEND; + return value; + } + +// -------------------------------------------------------------------------- +// CNSmlDmBmAdapter::DesToBool +// Converts 8bit descriptor to a boolean value +// -------------------------------------------------------------------------- +TBool CNSmlDmBmAdapter::DesToBool(const TDesC8& aBoolDes, TBool& aBool ) const + { + __UHEAP_MARK; + if ( !aBoolDes.Compare( KNSmlDmBMBooleanTrue ) ) + { + aBool = ETrue; + } + else if ( !aBoolDes.Compare( KNSmlDmBMBooleanFalse ) ) + { + aBool = EFalse; + } + else + { + __UHEAP_MARKEND; + return EFalse; + } + __UHEAP_MARKEND; + return ETrue; + } + +// -------------------------------------------------------------------------- +// CNSmlDmBmAdapter::BoolToDes8LC +// Converts boolean value to 8bit descriptor +// -------------------------------------------------------------------------- + +HBufC8* CNSmlDmBmAdapter::BoolToDes8LC( TBool aBool) const + { + HBufC8* ret; + if( aBool ) + { + ret = HBufC8::NewLC( KNSmlDmBMBooleanTrue().Size() ); + ret->Des().Append( KNSmlDmBMBooleanTrue() ); + } + else + { + ret = HBufC8::NewLC( KNSmlDmBMBooleanFalse().Size() ); + ret->Des().Append( KNSmlDmBMBooleanFalse() ); + } + return ret; + } + + +// -------------------------------------------------------------------------- +// CNSmlDmBmAdapter::GetLuidAllocL +// The function calls the GetLuidAllocL function of the MSmlDmCallback to get +// the LUID which is mapped to aURI. +// -------------------------------------------------------------------------- +HBufC8* CNSmlDmBmAdapter::GetLuidAllocL( const TDesC8& aURI ) + { + return Callback().GetLuidAllocL( aURI ); + } + + +// -------------------------------------------------------------------------- +// CNSmlDmBmAdapter::GetSnapIfBuffered +// Returns a pointer to the snap CSmlDmBmSettingsElement object if found in +// the buffer +// -------------------------------------------------------------------------- +CSmlDmBmSettingsElement* CNSmlDmBmAdapter::GetSnapIfBuffered( const TDesC8& + aMappingName ) + { + CSmlDmBmSettingsElement* settings = NULL; + for ( TInt i( 0 ); iMappingName()->Compare( aMappingName ) ) + { + settings = iBuffer[i]; + break; + } + } + return settings; + } +// ------------------------------------------------------------------------- +// CNSmlDmBmAdapter::FirstURI +// Returns the first URI from a list of URIs +// ------------------------------------------------------------------------- +TPtrC8 CNSmlDmBmAdapter::FirstURI( const TDesC8& aURIList ) const + { + __UHEAP_MARK; + TInt i; + for ( i = 0; i < aURIList.Length(); i++ ) + { + if ( aURIList[i] == ',' ) + { + break; + } + } + if ( i == aURIList.Length() - 1 ) + { + __UHEAP_MARKEND; + return aURIList; + } + else + { + __UHEAP_MARKEND; + return aURIList.Mid( 0, i ); + } + } + +// -------------------------------------------------------------------------- +// CNSmlDmBmAdapter::NumOfURIs +// Returns the num of uris +// -------------------------------------------------------------------------- +TInt CNSmlDmBmAdapter::NumOfURIs( const TDesC8& aURIList ) const + { + __UHEAP_MARK; + if ( !aURIList.Length() ) + { + return 0; + } + TInt numOfURIs( 1 ); + for ( TInt i(0); i < aURIList.Length(); i++ ) + { + if ( aURIList[i] == ',' ) + { + numOfURIs++; + } + } + __UHEAP_MARKEND; + return numOfURIs; + } + +// -------------------------------------------------------------------------- +// CNSmlDmBmAdapter::RemoveFirstURI +// extracts first uri an returns the remaining part of the uri list +// -------------------------------------------------------------------------- +TPtrC8 CNSmlDmBmAdapter::RemoveFirstURI( const TDesC8& aURIList ) const + { + __UHEAP_MARK; + TInt i; + for ( i = 0; i < aURIList.Length(); i++ ) + { + if ( aURIList[i] == ',' ) + { + break; + } + } + if ( i < aURIList.Length() ) + { + __UHEAP_MARKEND; + return aURIList.Mid( i + 1 ); + } + else + { + __UHEAP_MARKEND; + return aURIList.Mid( i ); + } + + } +// -------------------------------------------------------------------------- +// CNSmlDmBmAdapter::LastURISeg +// Returns the last uri segemnt of a uri. +// -------------------------------------------------------------------------- +TPtrC8 CNSmlDmBmAdapter::LastURISeg( const TDesC8& aURI ) const + { + __UHEAP_MARK; + TInt i; + for ( i=aURI.Length()-1; i >= 0; i-- ) + { + if ( aURI[i]=='/' ) + { + break; + } + } + if ( i==0 ) + { + __UHEAP_MARKEND; + return aURI; + } + else + { + __UHEAP_MARKEND; + return aURI.Mid( i + 1 ); + } + } + +// -------------------------------------------------------------------------- +// CNSmlDmBmAdapter::RemoveLastURISeg +// returns parent uri, i.e. removes last uri segment +// -------------------------------------------------------------------------- +TPtrC8 CNSmlDmBmAdapter::RemoveLastURISeg( const TDesC8& aURI ) const + { + __UHEAP_MARK; + TInt i; + for ( i = aURI.Length()-1; i >= 0; i-- ) + { + if ( aURI[i]=='/' ) + { + break; + } + } + if ( i > -1 ) + { + __UHEAP_MARKEND; + return aURI.Left( i ); + } + else + { + __UHEAP_MARKEND; + return aURI; + } + + } + + + +// -------------------------------------------------------------------------- +// CNSmlDmBmAdapter::NumOfURISegs +// Returns the num of uri segs +// -------------------------------------------------------------------------- +TInt CNSmlDmBmAdapter::NumOfURISegs( const TDesC8& aURI ) const + { + __UHEAP_MARK; + TInt numOfURISegs( 1 ); + for ( TInt i(0); i < aURI.Length(); i++ ) + { + if ( aURI[i]=='/' ) + { + numOfURISegs++; + } + } + __UHEAP_MARKEND; + return numOfURISegs; + } + +TInt CNSmlDmBmAdapter::MapPredefinedSnapsL( const TDesC8& aURI, const TDesC8& aLUID ) +{ + TInt snapId( KErrNotFound ); + // If this is an add to pre-defined SNAPs then LUID we get is empty, but we still need + // to handle it. + if( aLUID.Length() == 0 && ( ( snapId = GetPredefinedSnapIdFromUri( aURI ) ) != KErrNotFound ) ) + { + // Check if SNAP with given ID exists (from CmManager) + iCmManagerExt.OpenL(); + TRAPD( err, RCmDestinationExt dest = iCmManagerExt.DestinationL( snapId ) ); + iCmManagerExt.Close(); + + // If exists -> Call SetMapping to set LUID. + if( err == KErrNone ) + { + HBufC8* uri = HBufC8::NewLC( KNSmlDmBMAdapterBM().Length() + + KNSmlDmBmSeparator().Length() + + KSmlMaxURISegLen ); + + TPtr8 uriPtr = uri->Des(); + uriPtr.Format( KNSmlDmBMAdapterBM ); + uriPtr.Append( KNSmlDmBmSeparator ); + uriPtr.Append( KNSmlDmBMSNAPNamePrefix ); + HBufC8* luidBuf = IntToDes8L( snapId ); + CleanupStack::PushL( luidBuf ); + uriPtr.Append( *luidBuf ); + + Callback().SetMappingL( uriPtr, *luidBuf ); + + BMADAPTERLOGSTRING2( "Creating mapping for URI %S ", &uriPtr ) + CleanupStack::PopAndDestroy( luidBuf ); + CleanupStack::PopAndDestroy( uri ); + } + } + return snapId; +} + +TInt CNSmlDmBmAdapter::GetPredefinedSnapIdFromUri( const TDesC8& aURI ) const + { + TInt ret = KErrNotFound; + + // First check that URI starts with BearerManagementSNAP + TInt startIndex = aURI.Find( KNSmlDmBMAdapterBM ); + + if( startIndex == KErrNotFound ) + { + return KErrNotFound; + } + + // Then assume there is separator + startIndex += KNSmlDmBMAdapterBM().Length() + KNSmlDmBmSeparator().Length(); + + if( startIndex >= aURI.Length() ) + { + // No separator. This was an access to ./BearerManagementSNAP + return KErrNotFound; + } + + TPtrC8 predefinedUriStart = aURI.Mid( startIndex ); + + startIndex = predefinedUriStart.Find( KNSmlDmBMSNAPNamePrefix ); + + // Result should be zero ( = start of string) + if( startIndex != 0 ) + { + return KErrNotFound; + } + + startIndex += KNSmlDmBMSNAPNamePrefix().Length(); + + TInt endIndex = 0; + + endIndex = predefinedUriStart.Find( KNSmlDmBmSeparator ); + + + + if ( endIndex == KErrNotFound ) + { + TPtrC8 snapId = predefinedUriStart.Mid( startIndex ); + TRAPD( err, ret = DesToIntL( snapId ) ); + if( err != KErrNone ) + { + ret = KErrNotFound; + } + } + else + { + TPtrC8 snapId = predefinedUriStart.Mid( startIndex, endIndex - startIndex ); + TRAPD( err, ret = DesToIntL( snapId ) ); + if( err != KErrNone ) + { + ret = KErrNotFound; + } + } + return ret; + } + + + +//---------------------- CSmlDmBmCommandElement -------------------------// + +// -------------------------------------------------------------------------- +// CSmlDmBmCommandElement* CSmlDmBmCommandElement::NewLC +// -------------------------------------------------------------------------- + +CSmlDmBmCommandElement* CSmlDmBmCommandElement::NewLC( TBool aLeaf, + TInt aStatusRef, + TInt aResultRef, + CNSmlDmBmAdapter::TCommandType aCmdType, + const TDesC8& aLastUriSeg, + const TDesC8& aData ) + { + CSmlDmBmCommandElement* self = new (ELeave) CSmlDmBmCommandElement( aLeaf, + aStatusRef, + aResultRef, + aCmdType ); + CleanupStack::PushL(self); + self->ConstructL( aLastUriSeg, aData ); + return self; + } + +// -------------------------------------------------------------------------- +// CSmlDmBmCommandElement::~CSmlDmBmCommandElement +// -------------------------------------------------------------------------- +CSmlDmBmCommandElement::~CSmlDmBmCommandElement() + { + delete iLastUriSeg; + delete iData; + } + +// -------------------------------------------------------------------------- +// CSmlDmBmCommandElement::CSmlDmBmCommandElement +// -------------------------------------------------------------------------- +CSmlDmBmCommandElement::CSmlDmBmCommandElement( TBool aLeaf, + TInt aStatusRef, + TInt aResultRef, + CNSmlDmBmAdapter::TCommandType aCmdType ) + : iStatus( CSmlDmAdapter::EError ), + iLeaf( aLeaf ), + iStatusRef( aStatusRef ), + iResultRef( aResultRef ), + iCmdType( aCmdType ), + iData( NULL ) + + { + } + +// -------------------------------------------------------------------------- +// CSmlDmBmCommandElement::ConstructL +// -------------------------------------------------------------------------- +void CSmlDmBmCommandElement::ConstructL( const TDesC8& aLastUriSeg, + const TDesC8& aData ) + { + iLastUriSeg = aLastUriSeg.AllocL(); + iData = aData.AllocL(); + } + +//---------------------- CSmlDmBmSettingsElement -------------------------// + +// -------------------------------------------------------------------------- +// CSmlDmBmSettingsElement* CSmlDmBmSettingsElement::NewLC +// -------------------------------------------------------------------------- +CSmlDmBmSettingsElement* CSmlDmBmSettingsElement::NewLC( const TDesC8& aMappingName ) + { + CSmlDmBmSettingsElement* self = new (ELeave) CSmlDmBmSettingsElement(); + CleanupStack::PushL(self); + self->ConstructL( aMappingName ); + return self; + } +// -------------------------------------------------------------------------- +// CSmlDmBmSettingsElement::~CSmlDmBmSettingsElement +// -------------------------------------------------------------------------- +CSmlDmBmSettingsElement::~CSmlDmBmSettingsElement() + { + // deallocate all elements + iNodeBuf.ResetAndDestroy(); + iNodeBuf.Close(); + delete iMappingName; + } + +// -------------------------------------------------------------------------- +// CSmlDmBmSettingsElement::CSmlDmBmSettingsElement +// -------------------------------------------------------------------------- +CSmlDmBmSettingsElement::CSmlDmBmSettingsElement() + : iExecuted( EFalse ), + iLuid( 0 ), + iMappingName( NULL ) + { + + } +// -------------------------------------------------------------------------- +// CSmlDmBmSettingsElement::ConstructL +// -------------------------------------------------------------------------- +void CSmlDmBmSettingsElement::ConstructL( const TDesC8& aMappingName ) + { + iMappingName = aMappingName.AllocL(); + } diff -r d3981f4fe6a4 -r c742e1129640 omadmadapters/nsmldmbmadapter/src/nsmldmbmadapter.rss --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omadmadapters/nsmldmbmadapter/src/nsmldmbmadapter.rss Wed Jun 23 18:03:02 2010 +0300 @@ -0,0 +1,45 @@ +CHARACTER_SET UTF8/* +* Copyright (c) 2006 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: Resource definitions for project nsmldmbmadapter +* +*/ + + + +#include + +RESOURCE REGISTRY_INFO theRegistryInfo + { + dll_uid = 0x101f6d2f; //The DLL's 3rd UID. + interfaces = + { + INTERFACE_INFO + { + interface_uid = 0x102018B4; //DM interface UID + implementations = + { + IMPLEMENTATION_INFO + { + implementation_uid = 0x101f6d2f; // BM adapter implementation UID + version_no = 1; + display_name = ""; + default_data = ""; + opaque_data = ""; + } + }; + } + }; + } + +// End of File diff -r d3981f4fe6a4 -r c742e1129640 omadmadapters/nsmldmbmadapter/src/nsmldmbmsettingstore.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omadmadapters/nsmldmbmadapter/src/nsmldmbmsettingstore.cpp Wed Jun 23 18:03:02 2010 +0300 @@ -0,0 +1,851 @@ +/* +* Copyright (c) 2006 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: Provides settings management in CommsDat. +* +*/ + + + + +#include +#include +#include +#include +#include + +#include "nsmldmbmsettingstore.h" +#include "nsmldmbmadapter.h" +#include "bmadapterlogger.h" + +// ----------------------------------------------------------------------------- +// CNSmlDmBmSettingStore::NewL +// ----------------------------------------------------------------------------- +CNSmlDmBmSettingStore* CNSmlDmBmSettingStore::NewL( CNSmlDmBmAdapter * aAdapter ) + { + CNSmlDmBmSettingStore* self = new (ELeave) CNSmlDmBmSettingStore( aAdapter ); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + + +// ----------------------------------------------------------------------------- +// CNSmlDmBmSettingStore::CNSmlDmBmSettingStore +// ----------------------------------------------------------------------------- +CNSmlDmBmSettingStore::CNSmlDmBmSettingStore( CNSmlDmBmAdapter * aAdapter ) + : iAdapter( aAdapter ) + { + } + +// ----------------------------------------------------------------------------- +// CNSmlDmBmSettingStore::ConstructL +// ----------------------------------------------------------------------------- +void CNSmlDmBmSettingStore::ConstructL() + { + iCmManagerExt.OpenL(); + } + +// ----------------------------------------------------------------------------- +// CNSmlDmBmSettingStore::~CNSmlDmBmSettingStore +// ----------------------------------------------------------------------------- +CNSmlDmBmSettingStore::~CNSmlDmBmSettingStore() + { + iCmManagerExt.Close(); + } + +// ----------------------------------------------------------------------------- +// CNSmlDmBmSettingStore::StoreSnapL +// Stores data related to a snap object. Executes commands for the snap and fills +// in status and for get commands result values. +// ----------------------------------------------------------------------------- +void CNSmlDmBmSettingStore::StoreSnapL( CSmlDmBmSettingsElement& aSettings ) + { + // this snap has been handled + aSettings.SetExecuted( ETrue ); + + // error empty settings object + if ( !aSettings.NodeBuf().Count() ) + { + BMADAPTERLOGSTRING( "StoreSnapL: Error, No commands found" ) + return; + } + + TInt nameCmdInd( -1 ); + TInt startInd( 0 ); + RCmDestinationExt snap; + TInt snapId( 0 ); + + // New SNAP to be stored, first command is add node + if( !aSettings.NodeBuf()[0]->Leaf() && + aSettings.NodeBuf()[0]->CmdType() == CNSmlDmBmAdapter::EAddCmd) + { + CSmlDmBmCommandElement* snapCmd( NULL ); + CSmlDmBmCommandElement* nameCmd( NULL ); + + snapCmd = aSettings.NodeBuf()[0]; + startInd = 1; + + // find name command + for ( TInt i( 0 ); i < aSettings.NodeBuf().Count(); i++) + { + if ( aSettings.NodeBuf()[i]->Leaf() && + !aSettings.NodeBuf()[i]->LastUriSeg()->Compare( KNSmlDmBMAdapterName ) ) + { + nameCmd = aSettings.NodeBuf()[i]; + nameCmdInd = i; + break; + } + } + // Snap can be created when name cmd exists + if ( snapCmd && nameCmd ) + { + HBufC* name = HBufC::NewLC( nameCmd->Data()->Size() ); + TPtr namePtr = name->Des(); + CnvUtfConverter::ConvertToUnicodeFromUtf8( namePtr, *nameCmd->Data() ); + snap = iCmManagerExt.CreateDestinationL( namePtr ); + CleanupStack::PopAndDestroy( name ); + CleanupClosePushL( snap ); + + snap.UpdateL(); + snapCmd->SetStatus( CSmlDmAdapter::EOk ); + nameCmd->SetStatus( CSmlDmAdapter::EOk ); + snapCmd->SetExecuted( ETrue ); + nameCmd->SetExecuted( ETrue ); + aSettings.SetLuid( snap.Id() ); + } + else + { + BMADAPTERLOGSTRING( "StoreSnapL: Error, SNAP doesn't have necessary data and can't be stored" ) + return; + } + } + // existing SNAP + else + { + snap = iCmManagerExt.DestinationL( aSettings.Luid() ); + CleanupClosePushL( snap ); + } + snapId = snap.Id(); + TInt err( KErrNone ); + // execute all remaining commands for the snap + // starting after add node cmd + for ( TInt i( startInd ); i < aSettings.NodeBuf().Count(); i++ ) + { + // name command is already executed -> skipped + if ( i != nameCmdInd ) + { + CSmlDmBmCommandElement* currentCmd = aSettings.NodeBuf()[i]; + // handle leaf commands + // leaves are trapped and if possible + // execution continues with remaining commands + if ( currentCmd->Leaf() ) + { + // name + if ( !currentCmd->LastUriSeg()->Compare( KNSmlDmBMAdapterName() ) ) + { + // name is set more than once within same message + TRAP( err, ExecuteNameCmdL( *currentCmd, snap ) ); + } + // metadata + else if ( !currentCmd->LastUriSeg()->Compare( KNSmlDmBMAdapterMetadata ) ) + { + TRAP( err, ExecuteMetadataCmdL( *currentCmd, snap ) ); + } + // protected + else if ( !currentCmd->LastUriSeg()->Compare( KNSmlDmBMAdapterProtected ) ) + { + TRAP( err, ExecuteProtectionCmdL( *currentCmd, snap ) ); + } + // hidden + else if ( !currentCmd->LastUriSeg()->Compare( KNSmlDmBMAdapterHidden ) ) + { + TRAP( err, ExecuteHiddenCmdL( *currentCmd, snap ) ); + } + // iap list + else if ( !currentCmd->LastUriSeg()->Compare( KNSmlDmBMAdapterIAPPriorityList ) ) + { + TRAP( err, ExecuteIapsCmdL( *currentCmd, snap ) ); + } + // embedded snap + else if ( !currentCmd->LastUriSeg()->Compare( KNSmlDmBMAdapterEmbeddedSNAP ) ) + { + TRAP( err, ExecuteEmbeddedSnapCmdL( *currentCmd, snap ) ); + } + else + { + // invalid node + BMADAPTERLOGSTRING( "StoreSnapL: Error, Invalid node name" ) + currentCmd->SetStatus( CSmlDmAdapter::ENotFound ); + err = KErrNone; + } + } + // snap node + else + { + TRAP( err, ExecuteSnapCmdL( *currentCmd, snap.Id() ) ); + // no more commands will be executed + // after snap is deleted + if( currentCmd->CmdType() == CNSmlDmBmAdapter::EDeleteCmd ) + { + break; + } + } + + // handle errors, check if execution may continue + if( err != KErrNone ) + { + // cases where not worth continuing + // attempt to return status codes however + if( err == KErrNoMemory ) + { + currentCmd->SetStatus( CSmlDmAdapter::ENoMemory ); + currentCmd->SetExecuted( ETrue ); + break; + } + else if( err == KErrDiskFull ) + { + currentCmd->SetStatus( CSmlDmAdapter::EDiskFull ); + currentCmd->SetExecuted( ETrue ); + break; + } + // cases where command execution continues + else if( err == KErrNotFound ) + { + currentCmd->SetStatus( CSmlDmAdapter::ENotFound ); + } + else if( err == KErrArgument ) + { + currentCmd->SetStatus( CSmlDmAdapter::EInvalidObject ); + } + else + { + currentCmd->SetStatus( CSmlDmAdapter::EError ); + } + // if error occurred, reopen snap to dismis any changes + // continue with rest of buffered commands + CleanupStack::PopAndDestroy( &snap ); + snap = iCmManagerExt.DestinationL( snapId ); + CleanupClosePushL( snap ); + } + // if leaf cmd execution was successful and data written -> update the snap + else if( currentCmd->Leaf() && + currentCmd->Status() == CSmlDmAdapter::EOk && + currentCmd->CmdType() != CNSmlDmBmAdapter::EGetCmd && + currentCmd->CmdType() != CNSmlDmBmAdapter::EGetSizeCmd ) + { + snap.UpdateL(); + } + else + { + BMADAPTERLOGSTRING( + "StoreSnapL: Leaf cmd execution unsuccessful" ) + } + currentCmd->SetExecuted( ETrue ); + + } + } + CleanupStack::PopAndDestroy( &snap ); + } + +// ----------------------------------------------------------------------------- +// CNSmlDmBmSettingStore::ExecuteCmdL +// Executes a single command +// ----------------------------------------------------------------------------- +void CNSmlDmBmSettingStore::ExecuteCmdL( CSmlDmBmCommandElement& aCmd, TUint aLuid) + { + if( !aCmd.Leaf() ) + { + ExecuteSnapCmdL( aCmd, aLuid ); + } + else + { + // snap can be opened + RCmDestinationExt snap = iCmManagerExt.DestinationL( aLuid ); + CleanupClosePushL( snap ); + // name + if ( !aCmd.LastUriSeg()->Compare( KNSmlDmBMAdapterName ) ) + { + ExecuteNameCmdL( aCmd, snap ); + } + // iap list + else if ( !aCmd.LastUriSeg()->Compare( KNSmlDmBMAdapterIAPPriorityList ) ) + { + ExecuteIapsCmdL( aCmd, snap ); + } + // metadata + else if ( !aCmd.LastUriSeg()->Compare( KNSmlDmBMAdapterMetadata ) ) + { + ExecuteMetadataCmdL( aCmd, snap ); + } + // protected + else if ( !aCmd.LastUriSeg()->Compare( KNSmlDmBMAdapterProtected ) ) + { + ExecuteProtectionCmdL( aCmd, snap ); + } + // hidden + else if ( !aCmd.LastUriSeg()->Compare( KNSmlDmBMAdapterHidden ) ) + { + ExecuteHiddenCmdL( aCmd, snap ); + } + // embedded snap + else if ( !aCmd.LastUriSeg()->Compare( KNSmlDmBMAdapterEmbeddedSNAP ) ) + { + ExecuteEmbeddedSnapCmdL( aCmd, snap ); + } + else + { + // invalid node + BMADAPTERLOGSTRING( "ExecuteCmdL: Error, Invalid node name" ) + aCmd.SetStatus( CSmlDmAdapter::ENotFound ); + } + // update snap if necessary + if( aCmd.Status() == CSmlDmAdapter::EOk && + aCmd.CmdType() != CNSmlDmBmAdapter::EGetCmd && + aCmd.CmdType() != CNSmlDmBmAdapter::EGetSizeCmd) + { + snap.UpdateL(); + } + aCmd.SetExecuted( ETrue ); + CleanupStack::PopAndDestroy( &snap ); + } + } + + +// ----------------------------------------------------------------------------- +// CNSmlDmBmSettingStore::GetSnapsL +// Fetches all snap ids +// ----------------------------------------------------------------------------- +void CNSmlDmBmSettingStore::GetSnapsL( RArray& aLUIDArray ) + { + iCmManagerExt.AllDestinationsL( aLUIDArray); + } + +// ----------------------------------------------------------------------------- +// CNSmlDmBmSettingStore::ExecuteSnapCmdL +// Executes a command for snap node. Either delete or get, adds are handled +// in StoreSNAPL +// ----------------------------------------------------------------------------- +void CNSmlDmBmSettingStore::ExecuteSnapCmdL( CSmlDmBmCommandElement& aCmd, TUint aLuid ) + { + RCmDestinationExt snap = iCmManagerExt.DestinationL( aLuid ); + CleanupClosePushL( snap ); + if ( aCmd.CmdType() == CNSmlDmBmAdapter::EGetCmd ) + { + TBool found( EFalse ); + // get child node list + + // check if snap has embedded snap + for ( TInt i(0), c = snap.ConnectionMethodCount(); i < c; i++ ) + { + RCmConnectionMethodExt cm = snap.ConnectionMethodL( i ); + if ( cm.GetBoolAttributeL( CMManager::ECmDestination ) ) + { + found = ETrue; + break; + } + } + if( found ) + { + aCmd.SetDataL( KNSmlDmBMAllLeafNodes ); + } + else + { + aCmd.SetDataL( KNSmlDmBMAllLeafNodesNoEmbedded ); + } + + aCmd.SetStatus( CSmlDmAdapter::EOk ); + aCmd.SetExecuted( ETrue ); + CleanupStack::PopAndDestroy( &snap ); + } + else if ( aCmd.CmdType() == CNSmlDmBmAdapter::EDeleteCmd ) + { + snap.DeleteLD(); + aCmd.SetStatus( CSmlDmAdapter::EOk ); + aCmd.SetExecuted( ETrue ); + CleanupStack::Pop( &snap ); + } + else + { + BMADAPTERLOGSTRING( "ExecuteSnapCmdL: Error, Invalid cmd type" ) + aCmd.SetStatus( CSmlDmAdapter::EError ); + CleanupStack::PopAndDestroy( &snap ); + } + } + +// --------------------------------------------------------------------------- +// CNSmlDmBmSettingStore::ExecuteIapsCmdL +// Executes an iap list command (add or get). +// --------------------------------------------------------------------------- +// +void CNSmlDmBmSettingStore::ExecuteIapsCmdL( CSmlDmBmCommandElement& aCmd, + RCmDestinationExt& aSnap ) + { + // for add command replace the list of iaps with the new one + if ( aCmd.CmdType() == CNSmlDmBmAdapter::EAddCmd ) + { + // remove old iaps + for( TInt i(0); i < aSnap.ConnectionMethodCount(); ) + { + RCmConnectionMethodExt cm = aSnap.ConnectionMethodL( i ); + // if iap, remove + if ( !cm.GetBoolAttributeL( CMManager::ECmDestination ) ) + { + aSnap.RemoveConnectionMethodL( cm ); + } + // otherwise skip the ebedded snap entry + else + { + i++; + } + } + // add new list of iaps + RArray iaps = iAdapter->GetIdArrayL( *aCmd.Data() ); + CleanupClosePushL( iaps ); + TInt wildcard(0); + for ( TInt i( 0 ); i < iaps.Count(); i++ ) + { + RCmConnectionMethodExt cm = iCmManagerExt.ConnectionMethodL( iaps[i] ); + aSnap.AddConnectionMethodL( cm ); + if ( aSnap.PriorityL( cm ) != CMManager::KDataMobilitySelectionPolicyPriorityWildCard ) + { + // set the priority of iap as it's index in the list + // but preceding any iaps with wildcard priority. + aSnap.ModifyPriorityL( cm, i - wildcard ); + } + else + { + wildcard++; + } + } + aCmd.SetStatus( CSmlDmAdapter::EOk ); + CleanupStack::PopAndDestroy( &iaps ); + } + // for get command fetch the list of iaps + else if ( aCmd.CmdType() == CNSmlDmBmAdapter::EGetCmd || + aCmd.CmdType() == CNSmlDmBmAdapter::EGetSizeCmd ) + { + RArray ids; + CleanupClosePushL( ids ); + for ( TInt i(0), c = aSnap.ConnectionMethodCount(); i < c; i++ ) + { + // if not embedded snap or hidden, insert into iap list + // (hidden iaps not handled by internet adapter, so link won't be found) + if( !aSnap.ConnectionMethodL(i).GetBoolAttributeL( CMManager::ECmDestination ) && + !aSnap.ConnectionMethodL(i).GetBoolAttributeL( CMManager::ECmHidden ) ) + { + ids.Insert( aSnap.ConnectionMethodL(i).GetIntAttributeL( + CMManager::ECmIapId ), i ); + } + } + if ( ids.Count() > 0) + { + HBufC8* iapList = iAdapter->GetIapListL( ids ); + CleanupStack::PushL( iapList ); + aCmd.SetDataL( *iapList ); + CleanupStack::PopAndDestroy( iapList ); + } + else + { + aCmd.SetDataL( KNullDesC8 ); + } + CleanupStack::PopAndDestroy( &ids ); + // for size command, set the command data to be the + // size of the fetched data + if( aCmd.CmdType() == CNSmlDmBmAdapter::EGetSizeCmd ) + { + HBufC8* size = iAdapter->IntToDes8L( aCmd.Data()->Size() ); + CleanupStack::PushL( size ); + aCmd.SetDataL( *size ); + CleanupStack::PopAndDestroy( size ); + } + aCmd.SetStatus( CSmlDmAdapter::EOk ); + aCmd.SetExecuted( ETrue ); + } + else + { + // unsupported command + // this is checked by framework + aCmd.SetStatus( CSmlDmAdapter::EError ); + BMADAPTERLOGSTRING( "ExecuteIapsCmdL: Error, Only Add, Get and Get size commands supported" ) + } + } + +// --------------------------------------------------------------------------- +// CNSmlDmBmSettingStore::ExecuteProtectionCmdL +// Executes an protected command (add or get). +// --------------------------------------------------------------------------- +// +void CNSmlDmBmSettingStore::ExecuteProtectionCmdL( CSmlDmBmCommandElement& aCmd, + RCmDestinationExt& aSnap ) + { + if ( aCmd.CmdType() == CNSmlDmBmAdapter::EAddCmd ) + { + __UHEAP_MARK; + TInt data( iAdapter->DesToIntL( *aCmd.Data() ) ); + // is proper protection level + if ( data == CMManager::EProtLevel0 ) + { + aSnap.SetProtectionL( CMManager::EProtLevel0 ); + aCmd.SetStatus( CSmlDmAdapter::EOk ); + } + else if ( data == CMManager::EProtLevel1 ) + { + aSnap.SetProtectionL( CMManager::EProtLevel1 ); + aCmd.SetStatus( CSmlDmAdapter::EOk ); + } + else if ( data == CMManager::EProtLevel2 ) + { + aSnap.SetProtectionL( CMManager::EProtLevel2 ); + aCmd.SetStatus( CSmlDmAdapter::EOk ); + } + else + { + aCmd.SetStatus( CSmlDmAdapter::EInvalidObject ); + } + __UHEAP_MARKEND; + } + else if ( aCmd.CmdType() == CNSmlDmBmAdapter::EGetCmd || + aCmd.CmdType() == CNSmlDmBmAdapter::EGetSizeCmd ) + { + HBufC8* data = iAdapter->IntToDes8L( aSnap.ProtectionLevel() ); + CleanupStack::PushL( data ); + aCmd.SetDataL( *data ); + CleanupStack::PopAndDestroy( data ); + + // for size command, set the command data to be the + // size of the fetched data + if( aCmd.CmdType() == CNSmlDmBmAdapter::EGetSizeCmd ) + { + HBufC8* size = iAdapter->IntToDes8L( aCmd.Data()->Size() ); + CleanupStack::PushL( size ); + aCmd.SetDataL( *size ); + CleanupStack::PopAndDestroy( size ); + } + + aCmd.SetStatus( CSmlDmAdapter::EOk ); + aCmd.SetExecuted( ETrue ); + } + else + { + // unsupported command + // this is checked by framework + aCmd.SetStatus( CSmlDmAdapter::EError ); + BMADAPTERLOGSTRING( "ExecuteProtectionCmdL: Error, Only Add, Get and Get size commands supported" ) + } + } + +// --------------------------------------------------------------------------- +// CNSmlDmBmSettingStore::ExecuteHiddenCmdL +// Executes hidden command (add or get) +// --------------------------------------------------------------------------- +// +void CNSmlDmBmSettingStore::ExecuteHiddenCmdL( CSmlDmBmCommandElement& aCmd, + RCmDestinationExt& aSnap ) + { + if ( aCmd.CmdType() == CNSmlDmBmAdapter::EAddCmd ) + { + __UHEAP_MARK; + TBool data; + if( iAdapter->DesToBool( *aCmd.Data(), data ) ) + { + aSnap.SetHiddenL( data ); + aCmd.SetStatus( CSmlDmAdapter::EOk ); + } + else + { + aCmd.SetStatus( CSmlDmAdapter::EInvalidObject ); + } + __UHEAP_MARKEND; + } + else if ( aCmd.CmdType() == CNSmlDmBmAdapter::EGetCmd || + aCmd.CmdType() == CNSmlDmBmAdapter::EGetSizeCmd ) + { + HBufC8* data = iAdapter->BoolToDes8LC( aSnap.IsHidden() ); + aCmd.SetDataL( *data ); + CleanupStack::PopAndDestroy( data ); + // for size command, set the command data to be the + // size of the fetched data + if( aCmd.CmdType() == CNSmlDmBmAdapter::EGetSizeCmd ) + { + HBufC8* size = iAdapter->IntToDes8L( aCmd.Data()->Size() ); + CleanupStack::PushL( size ); + aCmd.SetDataL( *size ); + CleanupStack::PopAndDestroy( size ); + } + aCmd.SetStatus( CSmlDmAdapter::EOk ); + aCmd.SetExecuted( ETrue ); + } + else + { + // unsupported command + // this is checked by framework + aCmd.SetStatus( CSmlDmAdapter::EError ); + BMADAPTERLOGSTRING( "ExecuteHiddenCmdL: Error, Only Add, Get and Get size commands supported" ) + } + } + +// --------------------------------------------------------------------------- +// CNSmlDmBmSettingStore::ExecuteMetadataCmdL +// Executes metadata command (add or get) +// --------------------------------------------------------------------------- +// +void CNSmlDmBmSettingStore::ExecuteMetadataCmdL( CSmlDmBmCommandElement& aCmd, + RCmDestinationExt& aSnap ) + { + if ( aCmd.CmdType() == CNSmlDmBmAdapter::EAddCmd ) + { + __UHEAP_MARK; + + TInt data( iAdapter->DesToIntL( *aCmd.Data() ) ); + // AND with inversed bit masks to check if data + // has bits set that are not defined for metadata + if( ( data & + ~CMManager::ESnapMetadataHighlight & + ~CMManager::ESnapMetadataHiddenAgent & + ~CMManager::ESnapMetadataPurpose ) ) + { + aCmd.SetStatus( CSmlDmAdapter::EError ); + } + // set value for each metadata bit + else + { + aSnap.SetMetadataL( CMManager::ESnapMetadataHighlight, + CMManager::ESnapMetadataHighlight & data ); + aSnap.SetMetadataL( CMManager::ESnapMetadataHiddenAgent, + CMManager::ESnapMetadataHiddenAgent & data ); + aSnap.SetMetadataL( CMManager::ESnapMetadataPurpose, + ( CMManager::ESnapMetadataPurpose & data ) >> KShift8 ); + aCmd.SetStatus( CSmlDmAdapter::EOk ); + } + __UHEAP_MARKEND; + } + else if ( aCmd.CmdType() == CNSmlDmBmAdapter::EGetCmd || + aCmd.CmdType() == CNSmlDmBmAdapter::EGetSizeCmd ) + { + // get all metadata values + TInt metadata(0); + metadata = aSnap.MetadataL( CMManager::ESnapMetadataHighlight ) + + aSnap.MetadataL( CMManager::ESnapMetadataHiddenAgent ) + + ( aSnap.MetadataL( CMManager::ESnapMetadataPurpose ) << KShift8 ); + HBufC8* data = iAdapter->IntToDes8L( metadata ); + CleanupStack::PushL( data ); + aCmd.SetDataL( *data ); + CleanupStack::PopAndDestroy( data ); + + // for size command, set the command data to be the + // size of the fetched data + if( aCmd.CmdType() == CNSmlDmBmAdapter::EGetSizeCmd ) + { + HBufC8* size = iAdapter->IntToDes8L( aCmd.Data()->Size() ); + CleanupStack::PushL( size ); + aCmd.SetDataL( *size ); + CleanupStack::PopAndDestroy( size ); + } + aCmd.SetStatus( CSmlDmAdapter::EOk ); + aCmd.SetExecuted( ETrue ); + } + else + { + // unsupported command + // this is checked by framework + aCmd.SetStatus( CSmlDmAdapter::EError ); + BMADAPTERLOGSTRING( "ExecuteMetadataCmdL: Error, Only Add, Get and Get size commands supported" ) + } + } + +// --------------------------------------------------------------------------- +// CNSmlDmBmSettingStore::ExecuteEmbeddedSnapCmdL +// Executes embedded snap command (add, get or delete) +// --------------------------------------------------------------------------- +// +void CNSmlDmBmSettingStore::ExecuteEmbeddedSnapCmdL( CSmlDmBmCommandElement& aCmd, + RCmDestinationExt& aSnap ) + { + if ( aCmd.CmdType() == CNSmlDmBmAdapter::EAddCmd ) + { + // Remove ./ from beginning of the URI + TPtrC8 embeddedUri = aCmd.Data()->Mid( KNSmlDmBmAdapterURIPrefix().Length() ); + + // if the embedded snap is still in buffer it's stored here + iAdapter->StoreSnapIfBufferedL( embeddedUri ); + // LUID mapping is assumed done by this time + + // get SNAP id for the URI + HBufC8* luid = iAdapter->GetLuidAllocL( embeddedUri ); + CleanupStack::PushL( luid ); + if ( luid->Size() > 0 ) + { + TInt id = iAdapter->DesToIntL( *luid ); + + // open snap with the id + RCmDestinationExt embedded = iCmManagerExt.DestinationL( id ); + CleanupClosePushL( embedded ); + + // check if snap has an existing embedded snap + for ( TInt i(0), c = aSnap.ConnectionMethodCount(); i < c; i++ ) + { + RCmConnectionMethodExt cm = aSnap.ConnectionMethodL( i ); + // remove existing embedded snap before adding new one + if ( cm.GetBoolAttributeL( CMManager::ECmDestination ) ) + { + aSnap.DeleteConnectionMethodL( cm ); + break; + } + } + aSnap.AddEmbeddedDestinationL( embedded ); + CleanupStack::PopAndDestroy( &embedded ); + aCmd.SetStatus( CSmlDmAdapter::EOk ); + } + else + { + // no luid for the uri + BMADAPTERLOGSTRING( "ExecuteEmbeddedSnapCmdL: No LUID found for embedded snap" ) + aCmd.SetStatus( CSmlDmAdapter::EInvalidObject ); + } + aCmd.SetExecuted( ETrue ); + CleanupStack::PopAndDestroy( luid ); + } + else if ( aCmd.CmdType() == CNSmlDmBmAdapter::EGetCmd || + aCmd.CmdType() == CNSmlDmBmAdapter::EGetSizeCmd ) + { + // get destination + TInt embeddedId( -1 ); + for ( TInt i( 0 ), c = aSnap.ConnectionMethodCount(); i < c; i++ ) + { + RCmConnectionMethodExt cm = aSnap.ConnectionMethodL( i ); + // check if embedded + if ( cm.GetBoolAttributeL( CMManager::ECmDestination ) ) + { + // get snap id + embeddedId = cm.GetIntAttributeL( CMManager::ECmId ); + + // CMManager::ECmId returns element id, + // GetSnapUriFromLuidL needs record id + embeddedId = ( embeddedId & KCDMaskShowRecordId ) >> KShift8; + + HBufC8* embeddedUri = iAdapter->GetSnapUriFromLuidL( embeddedId ); + CleanupStack::PushL( embeddedUri ); + + if( !embeddedUri ) + { + embeddedId = -1; + break; + } + aCmd.SetDataL( *embeddedUri ); + CleanupStack::PopAndDestroy( embeddedUri ); + + // for size command, set the command data to be the + // size of the fetched data + if( aCmd.CmdType() == CNSmlDmBmAdapter::EGetSizeCmd ) + { + HBufC8* size = iAdapter->IntToDes8L( aCmd.Data()->Size() ); + CleanupStack::PushL( size ); + aCmd.SetDataL( *size ); + CleanupStack::PopAndDestroy( size ); + } + aCmd.SetStatus( CSmlDmAdapter::EOk ); + aCmd.SetExecuted( ETrue ); + break; + } + } + // if no embedded snap exists return not found + if ( embeddedId < 0 ) + { + BMADAPTERLOGSTRING( "ExecuteEmbeddedSnapCmdL: Get, No embedded snap found" ) + aCmd.SetStatus( CSmlDmAdapter::ENotFound ); + aCmd.SetExecuted( ETrue ); + } + } + else if ( aCmd.CmdType() == CNSmlDmBmAdapter::EDeleteCmd ) + { + TBool found( EFalse); + for ( TInt i( 0 ), c = aSnap.ConnectionMethodCount(); i < c; i++ ) + { + RCmConnectionMethodExt cm = aSnap.ConnectionMethodL( i ); + // find embedded snap and delete it + if ( cm.GetBoolAttributeL( CMManager::ECmDestination ) ) + { + found = ETrue; + aSnap.DeleteConnectionMethodL( cm ); + aCmd.SetStatus( CSmlDmAdapter::EOk ); + break; + } + } + if ( !found ) + { + BMADAPTERLOGSTRING( "ExecuteEmbeddedSnapCmdL: Delete, No embedded snap found" ) + aCmd.SetStatus( CSmlDmAdapter::ENotFound ); + aCmd.SetExecuted( ETrue ); + } + } + else + { + // unsupported command + // this is checked by framework + aCmd.SetStatus( CSmlDmAdapter::EError ); + aCmd.SetExecuted( ETrue ); + BMADAPTERLOGSTRING( "ExecuteEmbeddedSnapCmdL: Error, command not supported" ) + } + } + +// --------------------------------------------------------------------------- +// CNSmlDmBmSettingStore::ExecuteNameCmdL +// Executes name command (add or get ) +// --------------------------------------------------------------------------- +// +void CNSmlDmBmSettingStore::ExecuteNameCmdL( CSmlDmBmCommandElement& aCmd, + RCmDestinationExt& aSnap ) + { + if ( aCmd.CmdType() == CNSmlDmBmAdapter::EAddCmd ) + { + HBufC* name = HBufC::NewLC( aCmd.Data()->Size() ); + TPtr namePtr = name->Des(); + CnvUtfConverter::ConvertToUnicodeFromUtf8( namePtr, *aCmd.Data() ); + aSnap.SetNameL( namePtr ); + CleanupStack::PopAndDestroy( name ); + aCmd.SetStatus( CSmlDmAdapter::EOk ); + } + else if ( aCmd.CmdType() == CNSmlDmBmAdapter::EGetCmd || + aCmd.CmdType() == CNSmlDmBmAdapter::EGetSizeCmd ) + { + HBufC* data = aSnap.NameLC(); + HBufC8* data8 = HBufC8::NewLC( data->Size() ); + TPtr8 toPtr = data8->Des(); + CnvUtfConverter::ConvertFromUnicodeToUtf8( toPtr, *data ); + aCmd.SetDataL( *data8 ); + CleanupStack::PopAndDestroy( data8 ); + CleanupStack::PopAndDestroy( data ); + + // for size command, set the command data to be the + // size of the fetched data + if( aCmd.CmdType() == CNSmlDmBmAdapter::EGetSizeCmd ) + { + HBufC8* size = iAdapter->IntToDes8L( aCmd.Data()->Size() ); + CleanupStack::PushL( size ); + aCmd.SetDataL( *size ); + CleanupStack::PopAndDestroy( size ); + } + aCmd.SetStatus( CSmlDmAdapter::EOk ); + aCmd.SetExecuted( ETrue ); + } + else + { + // unsupported command + // this is checked by framework + aCmd.SetStatus( CSmlDmAdapter::EError ); + BMADAPTERLOGSTRING( "ExecuteEmbeddedSnapCmdL: Error, Only Add, Get and Get size commands supported" ) + } + } + diff -r d3981f4fe6a4 -r c742e1129640 omadmadapters/rom/omadmadapters.iby --- a/omadmadapters/rom/omadmadapters.iby Fri Jun 11 13:29:40 2010 +0300 +++ b/omadmadapters/rom/omadmadapters.iby Wed Jun 23 18:03:02 2010 +0300 @@ -34,7 +34,7 @@ #endif #ifdef FF_DM_STREAMING_ADAPTER -REM ECOM_PLUGIN(nsmldmstreamingadapter.dll,nsmldmstreamingadapter.rsc) +ECOM_PLUGIN(nsmldmstreamingadapter.dll,nsmldmstreamingadapter.rsc) #endif #ifdef FF_DM_BROWSER_ADAPTER @@ -48,7 +48,7 @@ #endif // __SYNCML_DS #ifdef __SYNCML_DM_EMAIL // SyncML device management email settings plug-in -REM ECOM_PLUGIN(nsmldmemailadapter.dll,nsmldmemailadapter.rsc) +ECOM_PLUGIN(nsmldmemailadapter.dll,nsmldmemailadapter.rsc) #endif // __SYNCML_DM_EMAIL #ifdef __SYNCML_DM_MMS // SyncML device management MMS settings plug-in @@ -76,7 +76,7 @@ ECOM_PLUGIN( nsmldmalwaysonadapter.dll, nsmldmalwaysonadapter.rsc ) #endif // __ALWAYS_ONLINE_PDPCONTEXT2 -REM ECOM_PLUGIN( nsmldmbmadapter.dll, nsmldmbmadapter.rsc ) +ECOM_PLUGIN( nsmldmbmadapter.dll, nsmldmbmadapter.rsc ) #ifdef FF_RUNTIME_DEVICE_CAPABILITY_CONFIGURATION REM ECOM_PLUGIN(dcmodmadapter.dll,dcmodmadapter.rsc) diff -r d3981f4fe6a4 -r c742e1129640 omadmadapters/streamingadapter/bld/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omadmadapters/streamingadapter/bld/bld.inf Wed Jun 23 18:03:02 2010 +0300 @@ -0,0 +1,34 @@ +/* +* ============================================================================== +* Name : bld.inf +* Part of : OMA DM Adapter +* +* 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: build info file for streaming adapter +* +*/ + +#include + +PRJ_EXPORTS + +../conf/streamingadapter.confml APP_LAYER_CONFML(streamingadapter.confml) +../conf/streamingadapter_20024310.crml APP_LAYER_CRML(streamingadapter_20024310.crml) + +PRJ_MMPFILES +nsmlstreamingadapter.mmp + + + + diff -r d3981f4fe6a4 -r c742e1129640 omadmadapters/streamingadapter/bld/nsmlstreamingadapter.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omadmadapters/streamingadapter/bld/nsmlstreamingadapter.mmp Wed Jun 23 18:03:02 2010 +0300 @@ -0,0 +1,58 @@ +/* +* ============================================================================== +* Name : nsmldmstreamingadapter.mmp +* Part of : nsmldmstreamingadapter +* +* 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 dm adapters +* This is part of omadmextensions. +* +*/ + + +#include "defaultcaps.hrh" +#include + +CAPABILITY CAP_ECOM_PLUGIN +TARGET nsmldmstreamingadapter.dll +TARGETTYPE PLUGIN +UID 0x10009D8D 0x20024310 +VENDORID VID_DEFAULT + +APP_LAYER_SYSTEMINCLUDE +SYSTEMINCLUDE /epoc32/include/ecom +SOURCEPATH ../src + +USERINCLUDE ../inc + + +SOURCE nsmlstreamingadapter.cpp + +START RESOURCE nsmldmstreamingadapter.rss +TARGET nsmldmstreamingadapter.rsc +LANGUAGE_IDS +END + +LIBRARY euser.lib +LIBRARY ecom.lib +LIBRARY nsmldebug.lib +LIBRARY nsmlagentcommon.lib +LIBRARY centralrepository.lib +LIBRARY commdb.lib +LIBRARY nsmldmiapmatcher.lib +LIBRARY mpsettengine.lib + + + +SMPSAFE diff -r d3981f4fe6a4 -r c742e1129640 omadmadapters/streamingadapter/conf/streamingadapter.confml Binary file omadmadapters/streamingadapter/conf/streamingadapter.confml has changed diff -r d3981f4fe6a4 -r c742e1129640 omadmadapters/streamingadapter/conf/streamingadapter_20024310.crml Binary file omadmadapters/streamingadapter/conf/streamingadapter_20024310.crml has changed diff -r d3981f4fe6a4 -r c742e1129640 omadmadapters/streamingadapter/inc/nsmlstreamingadapter.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omadmadapters/streamingadapter/inc/nsmlstreamingadapter.h Wed Jun 23 18:03:02 2010 +0300 @@ -0,0 +1,238 @@ +/* +* Name : nsmldmstreamingadapter.h +* Part of : nsmldmstreamingadapter +* +* 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 dm adapters +* This is part of omadmextensions. +* +*/ + + +#ifndef __NSMLDMSTREAMINGADAPTER_H__ +#define __NSMLDMSTREAMINGADAPTER_H__ + +// INCLUDES +#include +#include +#include "nsmldmconstants.h" + +const TInt KMaxLengthStreamingName = 255; +const TInt KMaxLengthToProxy = 255; +const TInt KMaxLengthNetInfo = 255; +const TInt KMaxLengthTempInfo = 10; + +const TInt KMinPort = 1024; +const TInt KMaxPort = 65535; +const TInt KPortDiff = 5; +const TUint KNSmlDMStreamingAdapterImplUid = 0x20024311; + +const TInt KMnMaxBwGPRS = 9050; +const TInt KMxMaxBwGPRS = 40200; +const TInt KMnSusBwGPRS = 6335; +const TInt KMxSusBwGPRS = 28140; + +const TInt KMnMaxBwEGPRS = 44800; +const TInt KMxMaxBwEGPRS = 108800; +const TInt KMnSusBwEGPRS = 26880; +const TInt KMxSusBwEGPRS = 65280; + +const TInt KMnMaxBwWCDMA = 64000; +const TInt KMxMaxBwWCDMA = 384000; +const TInt KMnSusBwWCDMA = 44800; +const TInt KMxSusBwWCDMA = 268800; + +const TInt KMnMaxBwHSDPA = 600000; +const TInt KMxMaxBwHSDPA = 3600000; +const TInt KMnSusBwHSDPA = 420000; +const TInt KMxSusBwHSDPA = 2520000; + +const TInt KMnMaxBwWLAN = 64000; +const TInt KMxMaxBwWLAN = 3000000; +const TInt KMnSusBwWLAN = 44800; +const TInt KMxSusBwWLAN = 2100000; + +const TInt KMnMaxBwCDMA = 9050; +const TInt KMxMaxBwCDMA = 40200; +const TInt KMnSusBwCDMA = 6335; +const TInt KMxSusBwCDMA = 28140; + +const TInt KMnMaxBwCDMA2000 = 9050; +const TInt KMxMaxBwCDMA2000 = 40200; +const TInt KMnSusBwCDMA2000 = 6335; +const TInt KMxSusBwCDMA2000 = 28140; + + +/* +const TInt KMnMaxBw = 5000; + +const TInt KMnMaxBwGPRS = 99995; // < +const TInt KMnMaxBw3G = 1920001; // < +const TInt KMnMaxBwEGPRS = 199995; // < +const TInt KMnMaxBwWLAN = 4300001; // < +const TInt KMnMaxBwHSDPA = 3999995; // < +const TInt KMnMaxBwCDMA = 99995; // < +const TInt KMnMaxBwCDMA2000 = 153601; // < */ + + + + +// MACROS + +class CMPSettingsModel; + +// the DDF version must be changed if any changes in DDF structure +// ( built in DDFStructureL() function ) +_LIT8( KNSmlDMStreamingAdapterDDFVersion, "1.0" ); + +_LIT8 (KNSmlURISeparator ,"/"); + +_LIT8( KNSmlDMStreamingAdapterTextPlain, "text/plain" ); +_LIT8( KNSmlDMStreamingAdapterNodeName, "Streaming" ); +_LIT8( KNSmlDMStreamingAdapterDescription, "The parent object holding all Streaming Settings" ); + +_LIT8( KNSmlDMStreamingAdapterVal, "Name/To-Proxy/To-NapID/NetInfo/MIN-UDP-PORT/MAX-UDP-PORT" ); +_LIT8( KNSmlDMStreamingAdapterName, "Name" ); +_LIT8( KNSmlDMStreamingAdapterNameDescription, "Streaming configuration name" ); +_LIT8( KNSmlDMStreamingAdapterToProxy, "To-Proxy" ); +_LIT8( KNSmlDMStreamingAdapterToProxyDescription, "Streaming proxy server ID" ); +_LIT8( KNSmlDMStreamingAdapterToNapID, "To-NapID" ); +_LIT8( KNSmlDMStreamingAdapterToNapIDDescription, "The APN that is used for Streaming" ); +_LIT8( KNSmlDMStreamingAdapterNetInfo, "NetInfo" ); +_LIT8( KNSmlDMStreamingAdapterNetInfoVal, "GPRS/EGPRS/WCDMA/CDMA/CDMA2000/WLAN/HSDPA" ); + +_LIT8( KNSmlDMStreamingAdapterNetInfoGPRS, "GPRS" ); +_LIT8( KNSmlDMStreamingAdapterNetInfoEGPRS, "EGPRS" ); +_LIT8( KNSmlDMStreamingAdapterNetInfoWCDMA, "WCDMA" ); +_LIT8( KNSmlDMStreamingAdapterNetInfoCDMA2000, "CDMA2000" ); +_LIT8( KNSmlDMStreamingAdapterNetInfoWLAN, "WLAN" ); +_LIT8( KNSmlDMStreamingAdapterNetInfoCDMA, "CDMA" ); +_LIT8( KNSmlDMStreamingAdapterNetInfoHSDPA, "HSDPA" ); + +_LIT8( KNSmlDMStreamingAdapterNetInfoDescription, "The parameter which contains networks information" ); +_LIT8( KNSmlDMStreamingAdapterMinUdpPort, "MIN-UDP-PORT" ); +_LIT8( KNSmlDMStreamingAdapterMinUdpPortDescription, "The min port number used for streaming" ); +_LIT8( KNSmlDMStreamingAdapterMaxUdpPort, "MAX-UDP-PORT" ); +_LIT8( KNSmlDMStreamingAdapterMaxUdpPortDescription, "The max port number used for streaming" ); + +_LIT8( KCommaSep,","); + + + +// CLASS DECLARATION +class CNSmlDmStreamingAdapter : public CSmlDmAdapter + { +public: // constructors and destructor + static CNSmlDmStreamingAdapter* NewL(MSmlDmCallback* aDmCallback ); + static CNSmlDmStreamingAdapter* NewLC(MSmlDmCallback* aDmCallback ); + + virtual ~CNSmlDmStreamingAdapter(); + +//private: ///new functions +public: ///new functions + + void SetNetInfoL(const TDesC8& aObject,const TDesC8 &aDes,TDataBearer aBearer,const TInt aStatusRef,const TInt aMnMaxBw, const TInt aMxMaxBw,const TInt aMnSusBw, const TInt aMxSusBw); + + CSmlDmAdapter::TError GetNetInfoL(CBufBase& aObject,TDataBearer aBearer,const TDesC8 &aDes); + + void SetLeafPropertiesL( MSmlDmDDFObject& aObject, + const TSmlDmAccessTypes& aAccessTypes, + const TDesC8& aDescription ) const; + CNSmlDmStreamingAdapter(TAny* aEcomArguments); + /** + * Two-phased constructor. + */ + void ConstructL(); + CSmlDmAdapter::TError FetchLeafObjectL( const TDesC8& aURI, CBufBase& aObject ); + + void SetMinUDPPortL(const TDesC8& aObject,const TInt aStatusRef); + + void SetMaxUDPPortL(const TDesC8& aObject,const TInt aStatusRef); + + void SetDefaultApL(const TDesC8& aObject,const TInt aStatusRef); + + CSmlDmAdapter::TError GetDefaultApL(CBufBase& aObject); + +//private: // from base classes +public: // from base classes + // Adapter interface from CSmlDmAdapter + void DDFVersionL( CBufBase& aDDFVersion ); + void DDFStructureL( MSmlDmDDFObject& aDDF ); + void UpdateLeafObjectL( const TDesC8& aURI, const TDesC8& aLUID, + const TDesC8& aObject, const TDesC8& aType, + const TInt aStatusRef ); + void DeleteObjectL( const TDesC8& aURI, const TDesC8& aLUID, TInt aStatusRef ); + void FetchLeafObjectL( const TDesC8& aURI, const TDesC8& aLUID, + const TDesC8& aType, const TInt aResultsRef, + const TInt aStatusRef ); + void ChildURIListL( const TDesC8& aURI, const TDesC8& aLUID, + const CArrayFix& aPreviousURISegmentList, + const TInt aResultsRef, const TInt aStatusRef ); + void AddNodeObjectL( const TDesC8& aURI, const TDesC8& aParentLUID, + const TInt aStatusRef ); + + void UpdateLeafObjectL( const TDesC8& aURI, const TDesC8& aLUID, + RWriteStream*& aStream, const TDesC8& aType, + const TInt aStatusRef ); + void FetchLeafObjectSizeL( const TDesC8& aURI, const TDesC8& aLUID, + const TDesC8& aType, const TInt aResultsRef, + const TInt aStatusRef ); + + void ExecuteCommandL( const TDesC8& aURI, const TDesC8& aLUID, + const TDesC8& aArgument, + const TDesC8& aType, + const TInt aStatusRef ); + + void ExecuteCommandL( const TDesC8& aURI, const TDesC8& aLUID, + RWriteStream*& aStream, + const TDesC8& aType, + const TInt aStatusRef ); + + void CopyCommandL( const TDesC8& aTargetURI, const TDesC8& aTargetLUID, + const TDesC8& aSourceURI, + const TDesC8& aSourceLUID, + const TDesC8& aType, TInt aStatusRef ); + void StartAtomicL(); + void CommitAtomicL(); + void RollbackAtomicL(); + TBool StreamingSupport( TInt& aItemSize ); + void StreamCommittedL(); + void CompleteOutstandingCmdsL(); + + static void Cleanup( TAny* aAny ); + + /** + * Fills the given information to a DDF Object node. + * @param aNode The node whose data is filled. + * @param aAccTypes The access types of the node. + * @param aOccurance Occurance of the node. + * @param aScope The scope of the node. + * @param aFormat The format of the node's data, i.e. node/chr/bin/... + * @param aDescription Informal description of the node. + */ + void FillNodeInfoL( MSmlDmDDFObject& aNode, + const TSmlDmAccessTypes& aAccTypes, + MSmlDmDDFObject::TOccurence aOccurrence, + MSmlDmDDFObject::TScope aScope, + MSmlDmDDFObject::TDFFormat aFormat, + const TDesC8& aDescription ) const; + +private: + MSmlDmCallback* iDmCallback; + + CMPSettingsModel* iModel; + + }; + +#endif // __NSMLDMSTREAMINGADAPTER_H__ diff -r d3981f4fe6a4 -r c742e1129640 omadmadapters/streamingadapter/inc/streamingadapterCRKeys.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omadmadapters/streamingadapter/inc/streamingadapterCRKeys.h Wed Jun 23 18:03:02 2010 +0300 @@ -0,0 +1,36 @@ +/* +* Name : streamingadapterCRKeys.h +* Part of : streamingadapter +* +* 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 dm adapters +* This is part of omadmextensions. +* +*/ + +#ifndef STREAMINGADAPTERCRKEYS_H +#define STREAMINGADAPTERCRKEYS_H + +// CONSTANTS + +// key uid +const TUid KCRUidStreamingAdapter = {0x20024310}; + +// Configuration Name for Streaming Adapter +const TUint32 KStreamingConfigurationName = 0x00000001; + + +#endif // STREAMINGADAPTERCRKEYS_H + +// End of File diff -r d3981f4fe6a4 -r c742e1129640 omadmadapters/streamingadapter/src/nsmldmstreamingadapter.rss --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omadmadapters/streamingadapter/src/nsmldmstreamingadapter.rss Wed Jun 23 18:03:02 2010 +0300 @@ -0,0 +1,49 @@ +/* +* ============================================================================ +* Name : nsmlstreaming.rss +* Part of : streaming adapter +* +* 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 dm adapters +* This is part of omadmextensions. +* +*/ + +CHARACTER_SET UTF8 + +#include +#include "nsmldmconstants.h" + +RESOURCE REGISTRY_INFO theRegistryInfo + { + dll_uid = 0x20024310;//The DLL's 3rd UID. + interfaces = + { + INTERFACE_INFO + { + interface_uid = KNSmlDMInterfaceUid; // DM interface UID + implementations = + { + IMPLEMENTATION_INFO + { + implementation_uid = 0x20024311; // DM browser implementation UID + version_no = 1; + display_name = ""; + default_data = ""; + opaque_data = ""; + } + }; + } + }; + } diff -r d3981f4fe6a4 -r c742e1129640 omadmadapters/streamingadapter/src/nsmlstreamingadapter.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omadmadapters/streamingadapter/src/nsmlstreamingadapter.cpp Wed Jun 23 18:03:02 2010 +0300 @@ -0,0 +1,1380 @@ +/* +* Name : nsmldmstreamingadapter.cpp +* Part of : nsmldmstreamingadapter +* Interface : ecom / SmlDmAdapter +* +* 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 dm adapters +* This is part of omadmextensions. +* +*/ + + +//INCLUDE FILES +#include // For TImplementationProxy definition +#include +#include +#include // CommsDB columname defs +#include +#include +#include +#include +#include + + +#include "nsmldebug.h" +#include "nsmlconstants.h" +#include "nsmldmconst.h" +#include "nsmlstreamingadapter.h" +#include "nsmldmiapmatcher.h" +#include "streamingadapterCRKeys.h" + +#ifndef __WINS__ +// This lowers the unnecessary compiler warning (armv5) to remark. +// "Warning: #174-D: expression has no effect..." is caused by +// DBG_ARGS8 macro in no-debug builds. +#pragma diag_remark 174 +#endif + + +// ----------------------------------------------------------------------------- +// CNSmlDmStreamingAdapter* CNSmlDmStreamingAdapter::NewL( ) +// ----------------------------------------------------------------------------- +CNSmlDmStreamingAdapter* CNSmlDmStreamingAdapter::NewL(MSmlDmCallback* aDmCallback ) + { + _DBG_FILE("CNSmlDmStreamingAdapter::NewL(): begin"); + CNSmlDmStreamingAdapter* self = NewLC( aDmCallback ); + CleanupStack::Pop(); + _DBG_FILE("CNSmlDmStreamingAdapter::NewL(): end"); + return self; + } + +// ----------------------------------------------------------------------------- +// CNSmlDmStreamingAdapter* CNSmlDmStreamingAdapter::NewLC( ) +// ----------------------------------------------------------------------------- +CNSmlDmStreamingAdapter* CNSmlDmStreamingAdapter::NewLC(MSmlDmCallback* aDmCallback ) + { + _DBG_FILE("CNSmlDmStreamingAdapter::NewLC(): begin"); + CNSmlDmStreamingAdapter* self = new (ELeave) CNSmlDmStreamingAdapter(aDmCallback); + CleanupStack::PushL(self); + self->ConstructL(); + self->iDmCallback = aDmCallback; + _DBG_FILE("CNSmlDmStreamingAdapter::NewLC(): end"); + return self; + } + + + +// ----------------------------------------------------------------------------- +// CNSmlDmStreamingAdapter::~CNSmlDmStreamingAdapter() +// ----------------------------------------------------------------------------- +CNSmlDmStreamingAdapter::~CNSmlDmStreamingAdapter() + { + _DBG_FILE("CNSmlDmStreamingAdapter::~CNSmlDmStreamingAdapter(): begin"); + if(iModel) + delete iModel; + _DBG_FILE("CNSmlDmStreamingAdapter::~CNSmlDmStreamingAdapter(): end"); + } + +// ----------------------------------------------------------------------------- +// CNSmlDmStreamingAdapter::CNSmlDmStreamingAdapter() +// ----------------------------------------------------------------------------- + +CNSmlDmStreamingAdapter::CNSmlDmStreamingAdapter(TAny* aEcomArguments):CSmlDmAdapter(aEcomArguments) + { + _DBG_FILE("CNSmlDmStreamingAdapter::CNSmlDmStreamingAdapter(aEcomArguments): begin"); + _DBG_FILE("CNSmlDmStreamingAdapter::CNSmlDmStreamingAdapter(aEcomArguments): end"); + } + + +void CNSmlDmStreamingAdapter::ConstructL() + { + _DBG_FILE("CNSmlDmStreamingAdapter::ConstructL: begin"); + if ( !iModel ) + { + RImplInfoPtrArray impl; + CleanupStack::PushL( TCleanupItem( Cleanup, &impl ) ); + CMPSettingsModel::ListImplementationsL( impl ); + if( impl.Count() > 0 ) + { + _DBG_FILE("CStreamingAdapter::ConstructL: Creating CMPSettingsModel"); + // using the first available implementation + iModel= CMPSettingsModel::NewL( impl[0]->ImplementationUid() ); + _DBG_FILE("CStreamingAdapter::ConstructL: Creating CMPSettingsModel Done" ); + } + CleanupStack::PopAndDestroy(); // implArray + // Load default values + //iModel->LoadSettingsL(EConfigDefault); + if(iModel) + iModel->LoadSettingsL(EConfigUser); + } + _DBG_FILE("CNSmlDmStreamingAdapter::ConstructL: end"); + } + +// ----------------------------------------------------------------------------- +// CNSmlDmStreamingAdapter::SetLeafPropertiesL() +// ----------------------------------------------------------------------------- +void CNSmlDmStreamingAdapter::SetLeafPropertiesL( MSmlDmDDFObject& aObject, + const TSmlDmAccessTypes& aAccessTypes, + const TDesC8& aDescription ) const + { + aObject.SetAccessTypesL( aAccessTypes ); + aObject.SetScopeL( MSmlDmDDFObject::EPermanent ); + aObject.SetDFFormatL( MSmlDmDDFObject::EChr ); + aObject.AddDFTypeMimeTypeL( KNSmlDMStreamingAdapterTextPlain ); + aObject.SetDescriptionL( aDescription ); + } + + +// ----------------------------------------------------------------------------- +// CNSmlDmStreamingAdapter::DDFVersionL() +// ----------------------------------------------------------------------------- +void CNSmlDmStreamingAdapter::DDFVersionL(CBufBase& aDDFVersion) + { + _DBG_FILE("CNSmlDmStreamingAdapter::DDFVersionL(TDes& aDDFVersion): begin"); + aDDFVersion.InsertL(0,KNSmlDMStreamingAdapterDDFVersion); + _DBG_FILE("CNSmlDmStreamingAdapter::DDFVersionL(TDes& aDDFVersion): end"); + } + + +// ----------------------------------------------------------------------------- +// CNSmlDmStreamingAdapter::DDFStructureL() +// +// ----------------------------------------------------------------------------- +void CNSmlDmStreamingAdapter::DDFStructureL( MSmlDmDDFObject& aDDF ) + { + _DBG_FILE("CNSmlDmStreamingAdapter::DDFStructureL(): begin"); + + TSmlDmAccessTypes accessTypes; + accessTypes.SetGet(); + + TSmlDmAccessTypes accessNoDeleteTypes; + accessNoDeleteTypes.SetGet(); + accessNoDeleteTypes.SetReplace(); + + _DBG_FILE("CNSmlDmStreamingAdapter::DDFStructureL(): Creating Node KNSmlDMStreamingAdapterNodeName"); + MSmlDmDDFObject& dmStreamingAdap = aDDF.AddChildObjectL( KNSmlDMStreamingAdapterNodeName ); + dmStreamingAdap.SetAccessTypesL( accessTypes ); + dmStreamingAdap.SetScopeL( MSmlDmDDFObject::EPermanent ); + dmStreamingAdap.SetDescriptionL( KNSmlDMStreamingAdapterDescription ); + + + _DBG_FILE("CNSmlDmStreamingAdapter::DDFStructureL(): Creating Node KNSmlDMStreamingAdapterName"); + MSmlDmDDFObject& confName = dmStreamingAdap.AddChildObjectL(KNSmlDMStreamingAdapterName); + FillNodeInfoL( confName, + accessNoDeleteTypes, + MSmlDmDDFObject::EOne, + MSmlDmDDFObject::EPermanent, + MSmlDmDDFObject::EChr, + KNSmlDMStreamingAdapterNameDescription ); + + + _DBG_FILE("CNSmlDmStreamingAdapter::DDFStructureL(): Creating Node KNSmlDMStreamingAdapterToProxy"); + MSmlDmDDFObject& toProxyID = dmStreamingAdap.AddChildObjectL(KNSmlDMStreamingAdapterToProxy); + FillNodeInfoL( toProxyID, + accessNoDeleteTypes, + MSmlDmDDFObject::EOne, + MSmlDmDDFObject::EPermanent, + MSmlDmDDFObject::EChr, + KNSmlDMStreamingAdapterToProxyDescription ); + + + _DBG_FILE("CNSmlDmStreamingAdapter::DDFStructureL(): Creating Node KNSmlDMStreamingAdapterToNapID"); + MSmlDmDDFObject& toNapID = dmStreamingAdap.AddChildObjectL(KNSmlDMStreamingAdapterToNapID); + FillNodeInfoL( toNapID, + accessNoDeleteTypes, + MSmlDmDDFObject::EOne, + MSmlDmDDFObject::EPermanent, + MSmlDmDDFObject::EChr, + KNSmlDMStreamingAdapterToNapIDDescription ); + + + + _DBG_FILE("CNSmlDmStreamingAdapter::DDFStructureL(): Creating Node KNSmlDMStreamingAdapterNetInfo"); + MSmlDmDDFObject& netInfo = dmStreamingAdap.AddChildObjectL(KNSmlDMStreamingAdapterNetInfo); + FillNodeInfoL( netInfo, + accessTypes, + MSmlDmDDFObject::EOne, + MSmlDmDDFObject::EPermanent, + MSmlDmDDFObject::ENode, + KNSmlDMStreamingAdapterNetInfo ); + + + _DBG_FILE("CNSmlDmStreamingAdapter::DDFStructureL(): Creating Node KNSmlDMStreamingAdapterNetInfoGPRS"); + MSmlDmDDFObject& netInfoGPRS = netInfo.AddChildObjectL(KNSmlDMStreamingAdapterNetInfoGPRS); + FillNodeInfoL( netInfoGPRS, + accessNoDeleteTypes, + MSmlDmDDFObject::EOne, + MSmlDmDDFObject::EPermanent, + MSmlDmDDFObject::EChr, + KNSmlDMStreamingAdapterNetInfo ); + + + _DBG_FILE("CNSmlDmStreamingAdapter::DDFStructureL(): Creating Node KNSmlDMStreamingAdapterNetInfoEGPRS"); + MSmlDmDDFObject& netInfoEGPRS = netInfo.AddChildObjectL(KNSmlDMStreamingAdapterNetInfoEGPRS); + FillNodeInfoL( netInfoEGPRS, + accessNoDeleteTypes, + MSmlDmDDFObject::EOne, + MSmlDmDDFObject::EPermanent, + MSmlDmDDFObject::EChr, + KNSmlDMStreamingAdapterNetInfo ); + + + _DBG_FILE("CNSmlDmStreamingAdapter::DDFStructureL(): Creating Node KNSmlDMStreamingAdapterNetInfoWCDMA"); + MSmlDmDDFObject& netInfoWCDMA = netInfo.AddChildObjectL(KNSmlDMStreamingAdapterNetInfoWCDMA); + FillNodeInfoL( netInfoWCDMA, + accessNoDeleteTypes, + MSmlDmDDFObject::EOne, + MSmlDmDDFObject::EPermanent, + MSmlDmDDFObject::EChr, + KNSmlDMStreamingAdapterNetInfo ); + + + + _DBG_FILE("CNSmlDmStreamingAdapter::DDFStructureL(): Creating Node KNSmlDMStreamingAdapterNetInfoCDMA2000"); + MSmlDmDDFObject& netInfoCDMA2000 = netInfo.AddChildObjectL(KNSmlDMStreamingAdapterNetInfoCDMA2000); + FillNodeInfoL( netInfoCDMA2000, + accessNoDeleteTypes, + MSmlDmDDFObject::EOne, + MSmlDmDDFObject::EPermanent, + MSmlDmDDFObject::EChr, + KNSmlDMStreamingAdapterNetInfo ); + + + _DBG_FILE("CNSmlDmStreamingAdapter::DDFStructureL(): Creating Node KNSmlDMStreamingAdapterNetInfoWLAN"); + MSmlDmDDFObject& netInfoWLAN = netInfo.AddChildObjectL(KNSmlDMStreamingAdapterNetInfoWLAN); + FillNodeInfoL( netInfoWLAN, + accessNoDeleteTypes, + MSmlDmDDFObject::EOne, + MSmlDmDDFObject::EPermanent, + MSmlDmDDFObject::EChr, + KNSmlDMStreamingAdapterNetInfo ); + + + _DBG_FILE("CNSmlDmStreamingAdapter::DDFStructureL(): Creating Node KNSmlDMStreamingAdapterNetInfoCDMA"); + MSmlDmDDFObject& netInfoCDMA = netInfo.AddChildObjectL(KNSmlDMStreamingAdapterNetInfoCDMA); + FillNodeInfoL( netInfoCDMA, + accessNoDeleteTypes, + MSmlDmDDFObject::EOne, + MSmlDmDDFObject::EPermanent, + MSmlDmDDFObject::EChr, + KNSmlDMStreamingAdapterNetInfo ); + + + + _DBG_FILE("CNSmlDmStreamingAdapter::DDFStructureL(): Creating Node KNSmlDMStreamingAdapterNetInfoHSDPA"); + MSmlDmDDFObject& netInfoHSDPA = netInfo.AddChildObjectL(KNSmlDMStreamingAdapterNetInfoHSDPA); + FillNodeInfoL( netInfoHSDPA, + accessNoDeleteTypes, + MSmlDmDDFObject::EOne, + MSmlDmDDFObject::EPermanent, + MSmlDmDDFObject::EChr, + KNSmlDMStreamingAdapterNetInfo ); + + + _DBG_FILE("CNSmlDmStreamingAdapter::DDFStructureL(): Creating Node KNSmlDMStreamingAdapterMinUdpPort"); + MSmlDmDDFObject& minUdpPort = dmStreamingAdap.AddChildObjectL(KNSmlDMStreamingAdapterMinUdpPort); + FillNodeInfoL( minUdpPort, + accessNoDeleteTypes, + MSmlDmDDFObject::EOne, + MSmlDmDDFObject::EPermanent, + MSmlDmDDFObject::EInt, + KNSmlDMStreamingAdapterMinUdpPortDescription ); + + + _DBG_FILE("CNSmlDmStreamingAdapter::DDFStructureL(): Creating Node KNSmlDMStreamingAdapterMaxUdpPort"); + MSmlDmDDFObject& maxUdpPort = dmStreamingAdap.AddChildObjectL(KNSmlDMStreamingAdapterMaxUdpPort); + FillNodeInfoL( maxUdpPort, + accessNoDeleteTypes, + MSmlDmDDFObject::EOne, + MSmlDmDDFObject::EPermanent, + MSmlDmDDFObject::EInt, + KNSmlDMStreamingAdapterMaxUdpPortDescription ); + + _DBG_FILE("CNSmlDmStreamingAdapter::DDFStructureL(): end"); + } + +void CNSmlDmStreamingAdapter::SetNetInfoL(const TDesC8& aObject,const TDesC8 &aDes,TDataBearer aBearer,const TInt aStatusRef,const TInt aMnMaxBw, const TInt aMxMaxBw,const TInt aMnSusBw,const TInt aMxSusBw) + { + TInt aSusBw; + TInt aMaxBw; + TLex8 aConv; + TInt err; + //aConv = aObject; + TInt ret = aObject.Locate(KCommaSep()[0]); + TInt ret1 = aObject.LocateReverse(KCommaSep()[0]); + + TInt len = aObject.Length() - (ret1 + 1); + TPtrC8 segment1 = aObject.Right( len ); + aConv = segment1; + + TPtrC8 firstSeg = aObject.Left( ret ); + if(firstSeg.Compare(aDes)) + { + DBG_ARGS8(_S8("CNSmlDmStreamingAdapter::SetNetInfoL() - %d: Error in SetMaxBandwidth"), aBearer); + iDmCallback->SetStatusL( aStatusRef, CSmlDmAdapter::EInvalidObject); + return; + } + + + err = aConv.Val(aMaxBw); + if(err != KErrNone) + { + DBG_ARGS8(_S8("CNSmlDmStreamingAdapter::SetNetInfoL() - %d: Error in Conversion"), aBearer); + iDmCallback->SetStatusL( aStatusRef, CSmlDmAdapter::EError); + return; + } + + if(aMaxBw > 0) + { + err = iModel->SetMaxBandwidth(aMaxBw,aBearer); + } + else + { + _DBG_FILE("CNSmlDmStreamingAdapter::UpdateLeafObjectL(): Error in SetMaxBandwidth"); + iDmCallback->SetStatusL( aStatusRef, CSmlDmAdapter::EError); + return; + } + + if(err != KErrNone) + { + DBG_ARGS8(_S8("CNSmlDmStreamingAdapter::SetNetInfoL() - %d: Error in SetMaxBandwidth"), aBearer); + iDmCallback->SetStatusL( aStatusRef, CSmlDmAdapter::EError); + return; + //return retValue; + } + + + TBuf8 aSusBf; + for(TInt i = (ret+1); i < (ret1); i++) + { + aSusBf.Append(aObject[i]); + } + aConv = aSusBf; + err = aConv.Val(aSusBw); + if(err != KErrNone) + { + DBG_ARGS8(_S8("CNSmlDmStreamingAdapter::SetNetInfoL() - %d: Error in Conversion"), aBearer); + iDmCallback->SetStatusL( aStatusRef, CSmlDmAdapter::EError); + return; + } + + if(aSusBw > 0) + { + err = iModel->SetSustainBandwidth(aSusBw,aBearer); + } + else + { + _DBG_FILE("CNSmlDmStreamingAdapter::UpdateLeafObjectL(): Error in SetSustainBandwidth"); + iDmCallback->SetStatusL( aStatusRef, CSmlDmAdapter::EError); + return; + } + + if(err != KErrNone) + { + DBG_ARGS8(_S8("CNSmlDmStreamingAdapter::SetNetInfoL() - %d: Error in SetSustainBandwidth"), aBearer); + iDmCallback->SetStatusL( aStatusRef, CSmlDmAdapter::EError); + return; + } + if(aMaxBw > aMxMaxBw || aMaxBw < aMnMaxBw) + { + DBG_ARGS8(_S8("CNSmlDmStreamingAdapter::SetNetInfoL() - %d: Error Invalid aMaxBw"), aBearer); + iDmCallback->SetStatusL( aStatusRef, CSmlDmAdapter::EError); + return; + } + if(aSusBw > aMxSusBw || aSusBw < aMnSusBw) + { + DBG_ARGS8(_S8("CNSmlDmStreamingAdapter::SetNetInfoL() - %d: Error Invalid aSusBw"), aBearer); + iDmCallback->SetStatusL( aStatusRef, CSmlDmAdapter::EError); + return; + } + + iModel->StoreSettingsL(); + + iDmCallback->SetStatusL( aStatusRef, CSmlDmAdapter::EOk); + } + +// ----------------------------------------------------------------------------- +// CNSmlDmStreamingAdapter::UpdateLeafObjectL() +// ----------------------------------------------------------------------------- +void CNSmlDmStreamingAdapter::UpdateLeafObjectL( const TDesC8& aURI, + const TDesC8& aLUID, + const TDesC8& aObject, + const TDesC8& aType, + const TInt aStatusRef ) + { + _DBG_FILE("CNSmlDmStreamingAdapter::UpdateLeafObjectL(): begin"); + + //CSmlDmAdapter::TError retValue = CSmlDmAdapter::EOk; + TInt ret = aURI.LocateReverse(KNSmlURISeparator()[0]); + if ( ret == KErrNotFound ) + { + //retValue = CSmlDmAdapter::EError; + iDmCallback->SetStatusL( aStatusRef, CSmlDmAdapter::EError ); + } + else + { + //iDmCallback->SetStatusL( aStatusRef, CSmlDmAdapter::EOk ); + TInt len = aURI.Length() - (ret + 1); + TPtrC8 segment = aURI.Right( len ); + + if(segment == KNSmlDMStreamingAdapterName) + { + // Set for Streaming Configuration Name + _DBG_FILE("CNSmlDmStreamingAdapter::UpdateLeafObjectL(): KNSmlDMStreamingAdapterName"); + TBuf aBuf; + TInt aErr; + CRepository* centrep( NULL); + aBuf.Zero(); + if(aObject.Length() <= KMaxLengthStreamingName) + { + aBuf.Copy(aObject); + } + else + { + _DBG_FILE("CNSmlDmStreamingAdapter::UpdateLeafObjectL(): Error in KMaxLengthStreamingName"); + iDmCallback->SetStatusL( aStatusRef, CSmlDmAdapter::ETooLargeObject); + return; + } + + centrep = CRepository::NewLC( KCRUidStreamingAdapter ); + if ( centrep ) + { + _DBG_FILE("CNSmlDmStreamingAdapter::UpdateLeafObjectL(): Inside Cenrep Get"); + aErr = centrep->Set( KStreamingConfigurationName, aBuf ); + if(aErr != KErrNone) + { + _DBG_FILE("CNSmlDmStreamingAdapter::UpdateLeafObjectL(): Error in CenRep Get"); + iDmCallback->SetStatusL( aStatusRef, CSmlDmAdapter::EError); + CleanupStack::PopAndDestroy(centrep); + return; + } + CleanupStack::PopAndDestroy(centrep); + iModel->StoreSettingsL(); + iDmCallback->SetStatusL( aStatusRef, CSmlDmAdapter::EOk ); + } + else + { + _DBG_FILE("CNSmlDmStreamingAdapter::UpdateLeafObjectL(): Error in Creating the cenrep"); + iDmCallback->SetStatusL( aStatusRef, CSmlDmAdapter::EError ); + } + } + else if(segment == KNSmlDMStreamingAdapterToProxy) + { + // Set for Streaming settings proxy address + _DBG_FILE("CNSmlDmStreamingAdapter::UpdateLeafObjectL(): KNSmlDMStreamingAdapterToProxy"); + TBuf aBuf; + if(aObject.Length() <= KMaxLengthToProxy) + { + aBuf.Copy(aObject); + } + else + { + _DBG_FILE("CNSmlDmStreamingAdapter::UpdateLeafObjectL(): Error in KMaxLengthToProxy"); + iDmCallback->SetStatusL( aStatusRef, CSmlDmAdapter::ETooLargeObject); + return; + } + ret = iModel->SetProxyHostNameL(aBuf); + if(ret != KErrNone) + { + DBG_ARGS8(_S8("CNSmlDmStreamingAdapter::UpdateLeafObjectL(): Error in SetProxyHostNameL %d"), ret); + iDmCallback->SetStatusL( aStatusRef, CSmlDmAdapter::EError ); + return; + } + iModel->StoreSettingsL(); + iDmCallback->SetStatusL( aStatusRef, CSmlDmAdapter::EOk ); + } + else if(segment == KNSmlDMStreamingAdapterToNapID) + { + SetDefaultApL(aObject,aStatusRef); + /* + TInt aNap; + TUint32 aNapId; + TLex8 aConv; + aConv = aObject; + CNSmlDMIAPMatcher* iapmatch = CNSmlDMIAPMatcher::NewL( &Callback() ); + CleanupStack::PushL(iapmatch); + + aNap = iapmatch->IAPIdFromURIL(aObject); + + if(aNap == KErrNotFound) + { + DBG_ARGS8(_S8("CNSmlDmStreamingAdapter::UpdateLeafObjectL(): Error in IAPIdFromURIL %d"), aNap); + iDmCallback->SetStatusL( aStatusRef, CSmlDmAdapter::EInvalidObject ); + return; + } + + aNapId = aNap; + CleanupStack::PopAndDestroy(); // iapMatch + + TInt ret;// = aConv.Val(aNapId,EDecimal); + ret = iModel->SetDefaultAp(aNapId); + if(ret == KErrNone) + { + DBG_ARGS8(_S8("CNSmlDmStreamingAdapter::UpdateLeafObjectL(): SetDefaultAp success %d"), ret); + iModel->StoreSettingsL(); + iDmCallback->SetStatusL( aStatusRef, CSmlDmAdapter::EOk ); + } + else + { + DBG_ARGS8(_S8("CNSmlDmStreamingAdapter::UpdateLeafObjectL(): Error in SetDefaultAp %d"), ret); + iDmCallback->SetStatusL( aStatusRef, CSmlDmAdapter::EInvalidObject ); + }*/ + } + else if(segment == KNSmlDMStreamingAdapterNetInfoGPRS) + { + // Set for the netwrok information when Databearer is GPRS + _DBG_FILE("CNSmlDmStreamingAdapter::UpdateLeafObjectL(): KNSmlDMStreamingAdapterNetInfoGPRS"); + SetNetInfoL(aObject,KNSmlDMStreamingAdapterNetInfoGPRS,EBearerGPRS,aStatusRef,KMnMaxBwGPRS,KMxMaxBwGPRS,KMnSusBwGPRS,KMxSusBwGPRS); + } + else if(segment == KNSmlDMStreamingAdapterNetInfoEGPRS) + { + // Set for the netwrok information when Databearer is EGPRS + _DBG_FILE("CNSmlDmStreamingAdapter::UpdateLeafObjectL(): KNSmlDMStreamingAdapterNetInfoEGPRS"); + SetNetInfoL(aObject,KNSmlDMStreamingAdapterNetInfoEGPRS,EBearerEGPRS,aStatusRef,KMnMaxBwEGPRS,KMxMaxBwEGPRS,KMnSusBwEGPRS,KMxSusBwEGPRS); + } + else if(segment == KNSmlDMStreamingAdapterNetInfoWCDMA) + { + // Set for the netwrok information when Databearer is WCDMA + _DBG_FILE("CNSmlDmStreamingAdapter::UpdateLeafObjectL(): KNSmlDMStreamingAdapterNetInfoWCDMA"); + SetNetInfoL(aObject,KNSmlDMStreamingAdapterNetInfoWCDMA,EBearerWCDMA,aStatusRef,KMnMaxBwWCDMA,KMxMaxBwWCDMA,KMnSusBwWCDMA,KMxSusBwWCDMA); + } + else if(segment == KNSmlDMStreamingAdapterNetInfoCDMA2000) + { + // Set for the netwrok information when Databearer is CDMA2000 + _DBG_FILE("CNSmlDmStreamingAdapter::UpdateLeafObjectL(): KNSmlDMStreamingAdapterNetInfoCDMA2000"); + SetNetInfoL(aObject,KNSmlDMStreamingAdapterNetInfoCDMA2000,EBearerCDMA2000,aStatusRef,KMnMaxBwCDMA2000,KMxMaxBwCDMA2000,KMnSusBwCDMA2000,KMxSusBwCDMA2000); + } + else if(segment == KNSmlDMStreamingAdapterNetInfoWLAN) + { + // Set for the netwrok information when Databearer is WLAN + _DBG_FILE("CNSmlDmStreamingAdapter::UpdateLeafObjectL(): KNSmlDMStreamingAdapterNetInfoWLAN"); + SetNetInfoL(aObject,KNSmlDMStreamingAdapterNetInfoWLAN,EBearerWLAN,aStatusRef,KMnMaxBwWLAN,KMxMaxBwWLAN,KMnSusBwWLAN,KMxSusBwWLAN); + } + else if(segment == KNSmlDMStreamingAdapterNetInfoCDMA) + { + // Set for the netwrok information when Databearer is CDMA + _DBG_FILE("CNSmlDmStreamingAdapter::UpdateLeafObjectL(): KNSmlDMStreamingAdapterNetInfoCDMA"); + SetNetInfoL(aObject,KNSmlDMStreamingAdapterNetInfoCDMA,EBearerCDMA,aStatusRef,KMnMaxBwCDMA,KMxMaxBwCDMA,KMnSusBwCDMA,KMxSusBwCDMA); + } + else if(segment == KNSmlDMStreamingAdapterNetInfoHSDPA) + { + // Set for the netwrok information when Databearer is HSDPA + _DBG_FILE("CNSmlDmStreamingAdapter::UpdateLeafObjectL(): KNSmlDMStreamingAdapterNetInfoHSDPA"); + SetNetInfoL(aObject,KNSmlDMStreamingAdapterNetInfoHSDPA,EBearerHSDPA,aStatusRef,KMnMaxBwHSDPA,KMxMaxBwHSDPA,KMnSusBwHSDPA,KMxSusBwHSDPA); + } + else if(segment == KNSmlDMStreamingAdapterMinUdpPort) + { + // Set for the min udp port for streaming settings + SetMinUDPPortL(aObject,aStatusRef); + /* + _DBG_FILE("CNSmlDmStreamingAdapter::UpdateLeafObjectL(): KNSmlDMStreamingAdapterMinUdpPort"); + TInt aMinPort; + TInt aMaxPort; + TLex8 aConv; + TInt ret = KErrNone; + aConv = aObject; + ret = iModel->GetMaxUDPPort(aMaxPort); + if(ret != KErrNone) + { + DBG_ARGS8(_S8("CNSmlDmStreamingAdapter::UpdateLeafObjectL(): Error in GetMaxUDPPort: %d"), ret); + iDmCallback->SetStatusL( aStatusRef, CSmlDmAdapter::EError); + return; + } + ret = aConv.Val(aMinPort); + if(ret != KErrNone) + { + _DBG_FILE("CNSmlDmStreamingAdapter::UpdateLeafObjectL(): Error in conversion"); + iDmCallback->SetStatusL( aStatusRef, CSmlDmAdapter::EError); + return; + } + + + if(aMinPort < (aMaxPort - KPortDiff) && aMinPort >= KMinPort && aMinPort < KMaxPort) + { + ret = iModel->SetMinUDPPort(aMinPort); + if(ret != KErrNone) + { + DBG_ARGS8(_S8("CNSmlDmStreamingAdapter::UpdateLeafObjectL(): Error in SetMinUDPPort: %d"), ret); + iDmCallback->SetStatusL( aStatusRef, CSmlDmAdapter::EError); + return; + } + iModel->StoreSettingsL(); + iDmCallback->SetStatusL( aStatusRef, CSmlDmAdapter::EOk); + } + else + { + _DBG_FILE("CNSmlDmStreamingAdapter::UpdateLeafObjectL(): Invalid Port value"); + iDmCallback->SetStatusL( aStatusRef, CSmlDmAdapter::EInvalidObject); + } + */ + } + else if(segment == KNSmlDMStreamingAdapterMaxUdpPort) + { + SetMaxUDPPortL(aObject,aStatusRef); + // Set for the max udp port for streaming settings + /* + _DBG_FILE("CNSmlDmStreamingAdapter::UpdateLeafObjectL(): begin"); + TInt aMaxPort; + TInt aMinPort; + TLex8 aConv; + TInt ret = KErrNone; + aConv = aObject; + ret = iModel->GetMinUDPPort(aMinPort); + if(ret != KErrNone) + { + DBG_ARGS8(_S8("CNSmlDmStreamingAdapter::UpdateLeafObjectL(): Error in GetMinUDPPort: %d"), ret); + iDmCallback->SetStatusL( aStatusRef, CSmlDmAdapter::EError); + return; + } + ret = aConv.Val(aMaxPort); + if(ret != KErrNone) + { + _DBG_FILE("CNSmlDmStreamingAdapter::UpdateLeafObjectL(): Error in conversion"); + iDmCallback->SetStatusL( aStatusRef, CSmlDmAdapter::EError); + return; + } + + if(aMaxPort > (aMinPort + KPortDiff) && aMaxPort >= KMinPort && aMaxPort <= KMaxPort ) + { + ret = iModel->SetMaxUDPPort(aMaxPort); + if(ret != KErrNone) + { + DBG_ARGS8(_S8("CNSmlDmStreamingAdapter::UpdateLeafObjectL(): Error in SetMaxUDPPort: %d"), ret); + iDmCallback->SetStatusL( aStatusRef, CSmlDmAdapter::EError); + return; + } + iModel->StoreSettingsL(); + iDmCallback->SetStatusL( aStatusRef, CSmlDmAdapter::EOk); + } + else + { + _DBG_FILE("CNSmlDmStreamingAdapter::UpdateLeafObjectL(): Invalid Port value"); + iDmCallback->SetStatusL( aStatusRef, CSmlDmAdapter::EInvalidObject); + } */ + } + } + _DBG_FILE("CNSmlDmStreamingAdapter::UpdateLeafObjectL(): end"); + } + + void CNSmlDmStreamingAdapter::SetDefaultApL(const TDesC8& aObject,const TInt aStatusRef) + { + TInt aNap; + TUint32 aNapId; + TLex8 aConv; + aConv = aObject; + CNSmlDMIAPMatcher* iapmatch = CNSmlDMIAPMatcher::NewL( &Callback() ); + CleanupStack::PushL(iapmatch); + + aNap = iapmatch->IAPIdFromURIL(aObject); + + if(aNap == KErrNotFound) + { + DBG_ARGS8(_S8("CNSmlDmStreamingAdapter::UpdateLeafObjectL(): Error in IAPIdFromURIL %d"), aNap); + iDmCallback->SetStatusL( aStatusRef, CSmlDmAdapter::EInvalidObject ); + return; + } + + aNapId = aNap; + CleanupStack::PopAndDestroy(); // iapMatch + + TInt ret;// = aConv.Val(aNapId,EDecimal); + ret = iModel->SetDefaultAp(aNapId); + if(ret == KErrNone) + { + DBG_ARGS8(_S8("CNSmlDmStreamingAdapter::UpdateLeafObjectL(): SetDefaultAp success %d"), ret); + iModel->StoreSettingsL(); + iDmCallback->SetStatusL( aStatusRef, CSmlDmAdapter::EOk ); + } + else + { + DBG_ARGS8(_S8("CNSmlDmStreamingAdapter::UpdateLeafObjectL(): Error in SetDefaultAp %d"), ret); + iDmCallback->SetStatusL( aStatusRef, CSmlDmAdapter::EInvalidObject ); + } + } + + void CNSmlDmStreamingAdapter::SetMinUDPPortL(const TDesC8& aObject,const TInt aStatusRef) + { + _DBG_FILE("CNSmlDmStreamingAdapter::UpdateLeafObjectL(): KNSmlDMStreamingAdapterMinUdpPort"); + TInt aMinPort; + TInt aMaxPort; + TLex8 aConv; + TInt ret = KErrNone; + aConv = aObject; + ret = iModel->GetMaxUDPPort(aMaxPort); + if(ret != KErrNone) + { + DBG_ARGS8(_S8("CNSmlDmStreamingAdapter::UpdateLeafObjectL(): Error in GetMaxUDPPort: %d"), ret); + iDmCallback->SetStatusL( aStatusRef, CSmlDmAdapter::EError); + return; + } + ret = aConv.Val(aMinPort); + if(ret != KErrNone) + { + _DBG_FILE("CNSmlDmStreamingAdapter::UpdateLeafObjectL(): Error in conversion"); + iDmCallback->SetStatusL( aStatusRef, CSmlDmAdapter::EError); + return; + } + + + if(aMinPort < (aMaxPort - KPortDiff) && aMinPort >= KMinPort && aMinPort < KMaxPort) + { + ret = iModel->SetMinUDPPort(aMinPort); + if(ret != KErrNone) + { + DBG_ARGS8(_S8("CNSmlDmStreamingAdapter::UpdateLeafObjectL(): Error in SetMinUDPPort: %d"), ret); + iDmCallback->SetStatusL( aStatusRef, CSmlDmAdapter::EError); + return; + } + iModel->StoreSettingsL(); + iDmCallback->SetStatusL( aStatusRef, CSmlDmAdapter::EOk); + } + else + { + _DBG_FILE("CNSmlDmStreamingAdapter::UpdateLeafObjectL(): Invalid Port value"); + iDmCallback->SetStatusL( aStatusRef, CSmlDmAdapter::EInvalidObject); + } + } + + void CNSmlDmStreamingAdapter::SetMaxUDPPortL(const TDesC8& aObject,const TInt aStatusRef) + { + _DBG_FILE("CNSmlDmStreamingAdapter::UpdateLeafObjectL(): begin"); + TInt aMaxPort; + TInt aMinPort; + TLex8 aConv; + TInt ret = KErrNone; + aConv = aObject; + ret = iModel->GetMinUDPPort(aMinPort); + if(ret != KErrNone) + { + DBG_ARGS8(_S8("CNSmlDmStreamingAdapter::UpdateLeafObjectL(): Error in GetMinUDPPort: %d"), ret); + iDmCallback->SetStatusL( aStatusRef, CSmlDmAdapter::EError); + return; + } + ret = aConv.Val(aMaxPort); + if(ret != KErrNone) + { + _DBG_FILE("CNSmlDmStreamingAdapter::UpdateLeafObjectL(): Error in conversion"); + iDmCallback->SetStatusL( aStatusRef, CSmlDmAdapter::EError); + return; + } + + if(aMaxPort > (aMinPort + KPortDiff) && aMaxPort >= KMinPort && aMaxPort <= KMaxPort ) + { + ret = iModel->SetMaxUDPPort(aMaxPort); + if(ret != KErrNone) + { + DBG_ARGS8(_S8("CNSmlDmStreamingAdapter::UpdateLeafObjectL(): Error in SetMaxUDPPort: %d"), ret); + iDmCallback->SetStatusL( aStatusRef, CSmlDmAdapter::EError); + return; + } + iModel->StoreSettingsL(); + iDmCallback->SetStatusL( aStatusRef, CSmlDmAdapter::EOk); + } + else + { + _DBG_FILE("CNSmlDmStreamingAdapter::UpdateLeafObjectL(): Invalid Port value"); + iDmCallback->SetStatusL( aStatusRef, CSmlDmAdapter::EInvalidObject); + } + } + + +// ----------------------------------------------------------------------------- +// CNSmlDmStreamingAdapter::DeleteObjectL() +// ----------------------------------------------------------------------------- +void CNSmlDmStreamingAdapter::DeleteObjectL( const TDesC8& /*aURI*/, + const TDesC8& /*aLUID*/, + const TInt aStatusRef ) + { + _DBG_FILE("CNSmlDmStreamingAdapter::DeleteLeafObjectL( ): begin"); + _DBG_FILE("CNSmlDmStreamingAdapter::DeleteLeafObjectL( ): end"); + iDmCallback->SetStatusL( aStatusRef, CSmlDmAdapter::ENotAllowed ); + } + + +// ----------------------------------------------------------------------------- +// CNSmlDmStreamingAdapter::FetchLeafObjectL( const TDesC8& aURI, const TDesC8& aLUID, +// const TDesC8& aType, const TInt aResultsRef, const TInt aStatusRef ) +// ----------------------------------------------------------------------------- +void CNSmlDmStreamingAdapter::FetchLeafObjectL( const TDesC8& aURI, + const TDesC8& /*aLUID*/, + const TDesC8& aType, + const TInt aResultsRef, + const TInt aStatusRef ) + { + _DBG_FILE("CNSmlDmStreamingAdapter::FetchLeafObjectL(): begin"); + + CBufBase *object = CBufFlat::NewL( 1 ); + CleanupStack::PushL( object ); + + CSmlDmAdapter::TError retValue = FetchLeafObjectL( aURI, *object ); + + iDmCallback->SetStatusL( aStatusRef, retValue ); + iDmCallback->SetResultsL( aResultsRef, *object, aType ); + CleanupStack::PopAndDestroy(); //object + _DBG_FILE("CNSmlDmStreamingAdapter::FetchLeafObjectL(): end"); + } + + +// ----------------------------------------------------------------------------- +// CNSmlDmStreamingAdapter::ChildURIListL( const TDesC& aURI, +// const TDesC& aParentLUID, const CArrayFix& aPreviousURISegmentList, +// const TInt aResultsRef, const TInt aStatusRef ) +// ----------------------------------------------------------------------------- +void CNSmlDmStreamingAdapter::ChildURIListL( const TDesC8& aURI, + const TDesC8& /*aParentLUID*/, + const CArrayFix& /*aPreviousURISegmentList*/, + const TInt aResultsRef, + const TInt aStatusRef ) + { + _DBG_FILE("CNSmlDmStreamingAdapter::ChildURIListL(): begin"); + CSmlDmAdapter::TError retValue = CSmlDmAdapter::EOk; + CBufBase* currentURISegmentList = CBufFlat::NewL( 1 ); + CleanupStack::PushL( currentURISegmentList ); + TInt ret = aURI.LocateReverse(KNSmlURISeparator()[0]); + if ( ret == KErrNotFound ) + { + ret = -1; + } + TInt len = aURI.Length() - ( ret + 1 ); + TPtrC8 segment = aURI.Right( len ); + + if ( segment == KNSmlDMStreamingAdapterNodeName ) + { + _DBG_FILE("CNSmlDmStreamingAdapter::ChildURIListL(): begin"); + currentURISegmentList->InsertL( currentURISegmentList->Size(), KNSmlDMStreamingAdapterVal() ); + } + else if ( segment == KNSmlDMStreamingAdapterNetInfo ) + { + _DBG_FILE("CNSmlDmStreamingAdapter::ChildURIListL(): begin"); + currentURISegmentList->InsertL( currentURISegmentList->Size(), KNSmlDMStreamingAdapterNetInfoVal() ); + } + + else + { + retValue = CSmlDmAdapter::EError; + } + iDmCallback->SetStatusL( aStatusRef, retValue ); + iDmCallback->SetResultsL( aResultsRef, *currentURISegmentList, KNullDesC8 ); + CleanupStack::PopAndDestroy(); //currentURISegmentList + _DBG_FILE("CNSmlDmStreamingAdapter::ChildURIListL(): end"); + } + + +// ----------------------------------------------------------------------------- +// CNSmlDmStreamingAdapter::AddNodeObjectL( const TDesC8& aURI, +// const TDesC8& aParentLUID, const TInt aStatusRef ) +// ----------------------------------------------------------------------------- +void CNSmlDmStreamingAdapter::AddNodeObjectL( const TDesC8& /*aURI*/, + const TDesC8& /*aParentLUID*/, + const TInt aStatusRef ) + { + _DBG_FILE("CNSmlDmStreamingAdapter::AddNodeObjectL(): begin"); + iDmCallback->SetStatusL( aStatusRef, CSmlDmAdapter::ENotAllowed ); + _DBG_FILE("CNSmlDmStreamingAdapter::AddNodeObjectL(): end"); + } + +// ----------------------------------------------------------------------------- +// CNSmlDmStreamingAdapter::UpdateLeafObjectL() +// ----------------------------------------------------------------------------- +void CNSmlDmStreamingAdapter::UpdateLeafObjectL( const TDesC8& /*aURI*/, + const TDesC8& /*aLUID*/, + RWriteStream*& /*aStream*/, + const TDesC8& /*aType*/, + const TInt aStatusRef ) + { + _DBG_FILE("CNSmlDmStreamingAdapter::UpdateLeafObjectL(): stream: begin"); + iDmCallback->SetStatusL( aStatusRef, CSmlDmAdapter::EError ); + _DBG_FILE("CNSmlDmStreamingAdapter::UpdateLeafObjectL(): stream: end"); + } + + +// ----------------------------------------------------------------------------- +// CNSmlDmStreamingAdapter::FetchLeafObjectSizeL( const TDesC8& aURI, +// const TDesC8& aLUID, const TDesC8& aType, TInt aResultsRef, TInt aStatusRef ) +// ----------------------------------------------------------------------------- +void CNSmlDmStreamingAdapter::FetchLeafObjectSizeL( const TDesC8& aURI, + const TDesC8& /*aLUID*/, + const TDesC8& aType, + const TInt aResultsRef, + const TInt aStatusRef ) + { + + _DBG_FILE("CNSmlDmStreamingAdapter::FetchLeafObjectSizeL(): begin"); + + CBufBase *object = CBufFlat::NewL( 1 ); + CleanupStack::PushL( object ); + CSmlDmAdapter::TError retValue = FetchLeafObjectL( aURI, *object ); + + TInt objSizeInBytes = object->Size(); + TBuf8<2> stringObjSizeInBytes; + stringObjSizeInBytes.Num( objSizeInBytes ); + object->Reset(); + object->InsertL( 0, stringObjSizeInBytes ); + + iDmCallback->SetStatusL( aStatusRef, retValue ); + iDmCallback->SetResultsL( aResultsRef, *object, aType ); + CleanupStack::PopAndDestroy(); //object + _DBG_FILE("CNSmlDmStreamingAdapter::FetchLeafObjectSizeL(): end"); + } + + +// ----------------------------------------------------------------------------- +// CNSmlDmStreamingAdapter::ExecuteCommandL( const TDesC8& aURI, +// const TDesC8& aParentLUID, TDesC8& aArgument, const TDesC8& aType, TInt aStatusRef ) +// ----------------------------------------------------------------------------- +void CNSmlDmStreamingAdapter::ExecuteCommandL( const TDesC8& aURI, const TDesC8& aLUID, const TDesC8& aArgument, const TDesC8& aType, const TInt aStatusRef ) + { + _DBG_FILE("CNSmlDmStreamingAdapter::ExecuteCommandL(): begin"); + iDmCallback->SetStatusL( aStatusRef, CSmlDmAdapter::EError ); + _DBG_FILE("CNSmlDmStreamingAdapter::ExecuteCommandL(): end"); + } + +// ----------------------------------------------------------------------------- +// CNSmlDmStreamingAdapter::ExecuteCommandL( const TDesC8& aURI, +// const TDesC8& aParentLUID, RWriteStream*& aStream, const TDesC8& aType, +// TInt aStatusRef ) +// ----------------------------------------------------------------------------- +void CNSmlDmStreamingAdapter::ExecuteCommandL( const TDesC8& /*aURI*/, + const TDesC8& /*aParentLUID*/, + RWriteStream*& /*aStream*/, + const TDesC8& /*aType*/, + const TInt aStatusRef ) + { + _DBG_FILE("CNSmlDmStreamingAdapter::ExecuteCommandL(): stream: begin"); + iDmCallback->SetStatusL( aStatusRef, CSmlDmAdapter::EError ); + _DBG_FILE("CNSmlDmStreamingAdapter::ExecuteCommandL(): stream: end"); + } + +// ----------------------------------------------------------------------------- +// CNSmlDmStreamingAdapter::CopyCommandL( const TDesC8& aTargetURI, const TDesC8& +// aSourceURI, const TDesC8& aSourceLUID, const TDesC8& /*aType*/, TInt aStatusRef ) +// ----------------------------------------------------------------------------- +void CNSmlDmStreamingAdapter::CopyCommandL( const TDesC8& /*aTargetURI*/, const TDesC8& + /*aTargetLUID*/, const TDesC8& /*aSourceURI*/, + const TDesC8& /*aSourceLUID*/, + const TDesC8& /*aType*/, TInt aStatusRef ) + { + _DBG_FILE("CNSmlDmStreamingAdapter::CopyCommandL(): begin"); + iDmCallback->SetStatusL( aStatusRef, CSmlDmAdapter::EError ); + _DBG_FILE("CNSmlDmStreamingAdapter::CopyCommandL(): end"); + } + +// -------------------------------------- +// CNSmlDmStreamingAdapter::StartAtomicL() +// -------------------------------------- +void CNSmlDmStreamingAdapter::StartAtomicL() + { + _DBG_FILE("CNSmlDmStreamingAdapter::StartAtomicL(): begin"); + _DBG_FILE("CNSmlDmStreamingAdapter::StartAtomicL(): end"); + } + +// --------------------------------------- +// CNSmlDmStreamingAdapter::CommitAtomicL() +// --------------------------------------- +void CNSmlDmStreamingAdapter::CommitAtomicL() + { + _DBG_FILE("CNSmlDmStreamingAdapter::CommitAtomicL(): begin"); + _DBG_FILE("CNSmlDmStreamingAdapter::CommitAtomicL(): end"); + } + +// ----------------------------------------- +// CNSmlDmStreamingAdapter::RollbackAtomicL() +// ----------------------------------------- +void CNSmlDmStreamingAdapter::RollbackAtomicL() + { + _DBG_FILE("CNSmlDmStreamingAdapter::RollbackAtomicL(): begin"); + _DBG_FILE("CNSmlDmStreamingAdapter::RollbackAtomicL(): end"); + } + +// ----------------------------------------------------------- +// CNSmlDmStreamingAdapter::StreamingSupport( TInt& aItemSize ) +// ----------------------------------------------------------- +TBool CNSmlDmStreamingAdapter::StreamingSupport( TInt& /*aItemSize*/ ) + { + _DBG_FILE("CNSmlDmStreamingAdapter::StreamingSupport(): begin"); + _DBG_FILE("CNSmlDmStreamingAdapter::StreamingSupport(): end"); + return EFalse; + } + +// ------------------------------------------ +// CNSmlDmStreamingAdapter::StreamCommittedL() +// ------------------------------------------ +void CNSmlDmStreamingAdapter::StreamCommittedL() + { + _DBG_FILE("CNSmlDmStreamingAdapter::StreamCommittedL(): begin"); + _DBG_FILE("CNSmlDmStreamingAdapter::StreamCommittedL(): end"); + } + +// -------------------------------------------------- +// CNSmlDmStreamingAdapter::CompleteOutstandingCmdsL() +// -------------------------------------------------- +void CNSmlDmStreamingAdapter::CompleteOutstandingCmdsL() + { + _DBG_FILE("CNSmlDmStreamingAdapter::CompleteOutstandingCmdsL(): begin"); + _DBG_FILE("CNSmlDmStreamingAdapter::CompleteOutstandingCmdsL(): end"); + } + + +CSmlDmAdapter::TError CNSmlDmStreamingAdapter::GetNetInfoL(CBufBase& aObject,TDataBearer aBearer,const TDesC8 &aDes) + { + TBuf8 aNetInfoBuf; + CSmlDmAdapter::TError retValue = CSmlDmAdapter::EOk; + TInt err; + aNetInfoBuf.Append(aDes); + aNetInfoBuf.Append(KCommaSep); + + TInt aSusBw = 0; + err = iModel->GetSustainBandwidth(aSusBw,aBearer); + if(err != KErrNone) + { + DBG_ARGS8(_S8("CNSmlDmStreamingAdapter::GetNetInfoL() - %d: Error in GetSustainBandwidth: %d"),aBearer,err); + retValue = CSmlDmAdapter::EError; + return retValue; + } + TBuf8 aSusBwBuf; + aSusBwBuf.Num(aSusBw); + aNetInfoBuf.Append(aSusBwBuf); + aNetInfoBuf.Append(KCommaSep); + //aObject.InsertL(0,aSusBwBuf); + + + TInt aMaxBw; + err = iModel->GetMaxBandwidth(aMaxBw,aBearer); + if(err != KErrNone) + { + DBG_ARGS8(_S8("CNSmlDmStreamingAdapter::GetNetInfoL() - %d: Error in GetMaxBandwidth: %d"),aBearer,err); + retValue = CSmlDmAdapter::EError; + return retValue; + } + TBuf8 aMaxBwBuf; + aMaxBwBuf.Num(aMaxBw); + aNetInfoBuf.Append(aMaxBwBuf); + + aObject.InsertL(0,aNetInfoBuf); + retValue= CSmlDmAdapter::EOk; + return retValue; + } +// ----------------------------------------------------------------------------- +// CNSmlDmDevDetailAdapter::FetchLeafObjectL() +// ----------------------------------------------------------------------------- +CSmlDmAdapter::TError CNSmlDmStreamingAdapter::FetchLeafObjectL( const TDesC8& aURI, + CBufBase& aObject ) + { + _DBG_FILE("CNSmlDmInfoAdapter::FetchLeafObjectL(): begin"); + CSmlDmAdapter::TError retValue = CSmlDmAdapter::EOk; + TInt ret = aURI.LocateReverse(KNSmlURISeparator()[0]); + TInt err = KErrNone; + if ( ret == KErrNotFound ) + { + retValue = CSmlDmAdapter::EError; + } + else + { + TInt len = aURI.Length() - (ret + 1); + TPtrC8 segment = aURI.Right( len ); + + if(segment == KNSmlDMStreamingAdapterName) + { + // Get for Streaming Configuration Setting name(It is not displayed for the user). + _DBG_FILE("CNSmlDmStreamingAdapter::FetchLeafObjectL(): KNSmlDMStreamingAdapterName"); + TBuf8 aName; + CRepository* centrep( NULL); + aName.Zero(); + centrep = CRepository::NewLC( KCRUidStreamingAdapter ); + + if ( centrep ) + { + _DBG_FILE("CNSmlDmStreamingAdapter::FetchLeafObjectL(): Error in CenRep"); + TFullName temp; + + if (centrep->Get( KStreamingConfigurationName, temp )==KErrNone && temp.Length() ) + { + _DBG_FILE("CNSmlDmStreamingAdapter::FetchLeafObjectL(): Cenrep Get"); + temp.Trim(); + aName.Copy(temp); + } + else + { + _DBG_FILE("CNSmlDmStreamingAdapter::FetchLeafObjectL(): Error in Cenrep Get"); + retValue = CSmlDmAdapter::EError; + CleanupStack::PopAndDestroy(centrep); + return retValue; + } + CleanupStack::PopAndDestroy(centrep); + } + aObject.InsertL(0,aName); + retValue= CSmlDmAdapter::EOk; + } + else if(segment == KNSmlDMStreamingAdapterToProxy) + { + // Get for Proxy Address of the streaming settings. + _DBG_FILE("CNSmlDmStreamingAdapter::FetchLeafObjectL(): KNSmlDMStreamingAdapterToProxy"); + TBuf uri; + err = iModel->GetProxyHostName(uri); + if(err != KErrNone) + { + DBG_ARGS8(_S8("CNSmlDmStreamingAdapter::FetchLeafObjectL(): Error in GetProxyHostName: %d"), err); + retValue = CSmlDmAdapter::EError; + return retValue; + } + TPtr8 ptr = uri.Collapse(); + aObject.InsertL(0,ptr); + retValue= CSmlDmAdapter::EOk; + } + else if(segment == KNSmlDMStreamingAdapterToNapID) + { + // Get for Access Point that is set in the streaming settings + retValue = GetDefaultApL(aObject); + retValue = CSmlDmAdapter::EOk; // even if no AP set return with null value + return retValue; + /* + _DBG_FILE("CNSmlDmStreamingAdapter::FetchLeafObjectL(): KNSmlDMStreamingAdapterToNapID"); + TUint32 aNapId; + err = iModel->GetDefaultAp(aNapId); + if(err != KErrNone) + { + DBG_ARGS8(_S8("CNSmlDmStreamingAdapter::FetchLeafObjectL(): Error in GetDefaultAp: %d"), err); + retValue = CSmlDmAdapter::EError; + return retValue; + } + CNSmlDMIAPMatcher* iapmatch = CNSmlDMIAPMatcher::NewL( &Callback() ); + CleanupStack::PushL(iapmatch); + + HBufC8* uri8 = iapmatch->URIFromIAPIdL( aNapId ); + + if( uri8 ) + { + CleanupStack::PushL(uri8); + aObject.InsertL(0,uri8->Des()); + retValue= CSmlDmAdapter::EOk; + CleanupStack::PopAndDestroy(); // uri8 + } + else + { + _DBG_FILE("CNSmlDmStreamingAdapter::FetchLeafObjectL(): Error in URIFromIAPIdL:ENotFound"); + retValue= CSmlDmAdapter::ENotFound; + } + CleanupStack::PopAndDestroy(); // iapMatch */ + + } + else if(segment == KNSmlDMStreamingAdapterNetInfoHSDPA) + { + // Get for network information when data bearer is HSDPA + _DBG_FILE("CNSmlDmStreamingAdapter::FetchLeafObjectL(): KNSmlDMStreamingAdapterNetInfoHSDPA"); + retValue = GetNetInfoL(aObject,EBearerHSDPA,KNSmlDMStreamingAdapterNetInfoHSDPA); + return retValue; + + + } + else if(segment == KNSmlDMStreamingAdapterNetInfoGPRS) + { + // Get for network information when data bearer is GPRS + _DBG_FILE("CNSmlDmInfoAdapter::FetchLeafObjectL(): KNSmlDMStreamingAdapterNetInfoGPRS"); + retValue = GetNetInfoL(aObject,EBearerGPRS,KNSmlDMStreamingAdapterNetInfoGPRS); + return retValue; + } + else if(segment == KNSmlDMStreamingAdapterNetInfoEGPRS) + { + // Get for network information when data bearer is EGPRS + _DBG_FILE("CNSmlDmInfoAdapter::FetchLeafObjectL(): KNSmlDMStreamingAdapterNetInfoEGPRS"); + retValue = GetNetInfoL(aObject,EBearerEGPRS,KNSmlDMStreamingAdapterNetInfoEGPRS); + return retValue; + } + else if(segment == KNSmlDMStreamingAdapterNetInfoWCDMA) + { + // Get for network information when data bearer is WCDMA + _DBG_FILE("CNSmlDmInfoAdapter::FetchLeafObjectL(): KNSmlDMStreamingAdapterNetInfoWCDMA"); + retValue = GetNetInfoL(aObject,EBearerWCDMA,KNSmlDMStreamingAdapterNetInfoWCDMA); + return retValue; + } + else if(segment == KNSmlDMStreamingAdapterNetInfoCDMA) + { + // Get for network information when data bearer is CDMA + _DBG_FILE("CNSmlDmInfoAdapter::FetchLeafObjectL(): KNSmlDMStreamingAdapterNetInfoCDMA"); + retValue = GetNetInfoL(aObject,EBearerCDMA,KNSmlDMStreamingAdapterNetInfoCDMA); + return retValue; + } + else if(segment == KNSmlDMStreamingAdapterNetInfoCDMA2000) + { + // Get for network information when data bearer is CDMA2000 + _DBG_FILE("CNSmlDmInfoAdapter::FetchLeafObjectL(): KNSmlDMStreamingAdapterNetInfoCDMA2000"); + retValue = GetNetInfoL(aObject,EBearerCDMA2000,KNSmlDMStreamingAdapterNetInfoCDMA2000); + return retValue; + } + else if(segment == KNSmlDMStreamingAdapterNetInfoWLAN) + { + // Get for network information when data bearer is WLAN + _DBG_FILE("CNSmlDmInfoAdapter::FetchLeafObjectL(): KNSmlDMStreamingAdapterNetInfoWLAN"); + retValue = GetNetInfoL(aObject,EBearerWLAN,KNSmlDMStreamingAdapterNetInfoWLAN); + return retValue; + } + else if(segment == KNSmlDMStreamingAdapterMinUdpPort) + { + // Get for Min UDP port of streaming settings + _DBG_FILE("CNSmlDmInfoAdapter::FetchLeafObjectL(): KNSmlDMStreamingAdapterMinUdpPort"); + TInt aMinPort; + err = iModel->GetMinUDPPort(aMinPort); + if(err != KErrNone) + { + DBG_ARGS8(_S8("CNSmlDmInfoAdapter::FetchLeafObjectL(): Error in GetMinUDPPort: %d"), err); + retValue = CSmlDmAdapter::EError; + return retValue; + } + TBuf8<10> aMinPortBuf; + aMinPortBuf.Num(aMinPort); + aObject.InsertL(0,aMinPortBuf); + retValue= CSmlDmAdapter::EOk; + } + else if(segment == KNSmlDMStreamingAdapterMaxUdpPort) + { + // Get for Max UDP port of streaming settings + _DBG_FILE("CNSmlDmInfoAdapter::FetchLeafObjectL(): KNSmlDMStreamingAdapterMaxUdpPort"); + TInt aMaxPort; + err = iModel->GetMaxUDPPort(aMaxPort); + if(err != KErrNone) + { + DBG_ARGS8(_S8("CNSmlDmInfoAdapter::FetchLeafObjectL(): Error in GetMaxUDPPort: %d"), err); + retValue= CSmlDmAdapter::EError; + return retValue; + } + TBuf8<10> aMaxPortBuf; + aMaxPortBuf.Num(aMaxPort); + aObject.InsertL(0,aMaxPortBuf); + retValue= CSmlDmAdapter::EOk; + } + } + _DBG_FILE("CNSmlDmInfoAdapter::FetchLeafObjectL(): end"); + return retValue; + } + + + CSmlDmAdapter::TError CNSmlDmStreamingAdapter::GetDefaultApL(CBufBase& aObject) + { + CSmlDmAdapter::TError retValue = CSmlDmAdapter::EOk; + _DBG_FILE("CNSmlDmStreamingAdapter::FetchLeafObjectL(): KNSmlDMStreamingAdapterToNapID"); + TUint32 aNapId; + TInt err; + err = iModel->GetDefaultAp(aNapId); + if(err != KErrNone) + { + DBG_ARGS8(_S8("CNSmlDmStreamingAdapter::FetchLeafObjectL(): Error in GetDefaultAp: %d"), err); + retValue = CSmlDmAdapter::EError; + return retValue; + } + CNSmlDMIAPMatcher* iapmatch = CNSmlDMIAPMatcher::NewL( &Callback() ); + CleanupStack::PushL(iapmatch); + + HBufC8* uri8 = iapmatch->URIFromIAPIdL( aNapId ); + + if( uri8 ) + { + CleanupStack::PushL(uri8); + aObject.InsertL(0,uri8->Des()); + retValue= CSmlDmAdapter::EOk; + CleanupStack::PopAndDestroy(); // uri8 + } + else + { + _DBG_FILE("CNSmlDmStreamingAdapter::FetchLeafObjectL(): Error in URIFromIAPIdL:ENotFound"); + retValue= CSmlDmAdapter::ENotFound; + } + CleanupStack::PopAndDestroy(); // iapMatch + return retValue; + } + + +// --------------------------------------------------------------------------- +// CNSmlDmFotaAdapter::FillNodeInfoL() +// Fills the DDF node info. +// --------------------------------------------------------------------------- +// +void CNSmlDmStreamingAdapter::FillNodeInfoL( MSmlDmDDFObject& aNode, + const TSmlDmAccessTypes& aAccTypes, + MSmlDmDDFObject::TOccurence aOccurrence, + MSmlDmDDFObject::TScope aScope, + MSmlDmDDFObject::TDFFormat aFormat, + const TDesC8& aDescription ) const + { + _DBG_FILE("CNSmlDmInfoAdapter::FillNodeInfoL(): end"); + aNode.SetAccessTypesL( aAccTypes ); + aNode.SetOccurenceL( aOccurrence ); + aNode.SetScopeL( aScope ); + aNode.SetDFFormatL( aFormat ); + + if( aFormat != MSmlDmDDFObject::ENode ) + { + aNode.AddDFTypeMimeTypeL( KNSmlDMStreamingAdapterTextPlain ); + } + + aNode.SetDescriptionL( aDescription ); + _DBG_FILE("CNSmlDmInfoAdapter::FillNodeInfoL(): end"); + } + +/* + +TInt CNSmlDmStreamingAdapter::ThreadFunction(TAny* aStarted) + { + _DBG_FILE("CNSmlDmInfoAdapter::ThreadFunction(): Start"); + CTrapCleanup* cleanup = CTrapCleanup::New(); + _DBG_FILE("CNSmlDmInfoAdapter::CTrapCleanup New"); + RMsgQueueBase& aMsgQ= *(RMsgQueueBase*) aStarted; + CNetworkInfo * aNetInfo; + TRAPD(err,aNetInfo = CNetworkInfo::NewL()); + _DBG_FILE("CNSmlDmInfoAdapter::CNetworkInfo New"); + TRAP(err,aNetInfo->GetNetworkInfoL(aMsgQ)); + _DBG_FILE("CNSmlDmInfoAdapter::ThreadFunction(): End"); + delete aNetInfo; + delete cleanup; + } +*/ + +// ----------------------------------------------------------------------------- +// CStreamingAdapter::Cleanup +// ----------------------------------------------------------------------------- +// +void CNSmlDmStreamingAdapter::Cleanup( TAny* aAny ) + { + RImplInfoPtrArray* implArray = + reinterpret_cast< RImplInfoPtrArray*> ( aAny ); + implArray->ResetAndDestroy(); + implArray->Close(); + } + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +#ifndef IMPLEMENTATION_PROXY_ENTRY +#define IMPLEMENTATION_PROXY_ENTRY(aUid, aFuncPtr) {{aUid},(aFuncPtr)} +#endif + +const TImplementationProxy ImplementationTable[] = + { + IMPLEMENTATION_PROXY_ENTRY(KNSmlDMStreamingAdapterImplUid, CNSmlDmStreamingAdapter::NewL) + }; + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +EXPORT_C const TImplementationProxy* ImplementationGroupProxy( TInt& aTableCount ) + { + _DBG_FILE("ImplementationGroupProxy() for CNSmlDmStreamingAdapter: begin"); + aTableCount = sizeof(ImplementationTable) / sizeof(TImplementationProxy); + _DBG_FILE("ImplementationGroupProxy() for CNSmlDmStreamingAdapter: end"); + return ImplementationTable; + } + +// End of file +