omadm/omadmextensions/adapters/email/inc/nsmldmemailadapter.h
changeset 0 3ce708148e4d
child 2 a5fecba4b1e4
equal deleted inserted replaced
-1:000000000000 0:3ce708148e4d
       
     1 /*
       
     2 * Copyright (c) 2004 Nokia Corporation and/or its subsidiary(-ies). 
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:    DM Email Settings Adapter
       
    15  *
       
    16 */
       
    17 
       
    18 
       
    19 
       
    20 
       
    21 
       
    22 #ifndef __NSMLDMEMAILADAPTER_H__
       
    23 #define __NSMLDMEMAILADAPTER_H__
       
    24 
       
    25 // -----------------------------------------------------------------------------
       
    26 // Includes
       
    27 // -----------------------------------------------------------------------------
       
    28 #include <e32base.h>
       
    29 #include <smldmadapter.h>
       
    30 #include <msvapi.h>
       
    31 
       
    32 // -----------------------------------------------------------------------------
       
    33 // Class forwards
       
    34 // -----------------------------------------------------------------------------
       
    35 class CImSmtpSettings;
       
    36 class CImPop3Settings;
       
    37 class CImImap4Settings;
       
    38 class CImIAPPreferences;
       
    39 class CMsvSession;
       
    40 class CEmailAccounts;
       
    41 
       
    42 
       
    43 // -----------------------------------------------------------------------------
       
    44 // Definitions
       
    45 // -----------------------------------------------------------------------------
       
    46 
       
    47 // the DDF version must be changed if any changes in DDF structure 
       
    48 // ( built in DDFStructureL() function )
       
    49 //
       
    50 _LIT8( KNSmlDMEmailDDFVersion, "1.1" ); 
       
    51 
       
    52 _LIT8( KNSmlDMEmailTextPlain, "text/plain" );
       
    53 _LIT8( KNSmlDMEmailNodeName, "Email" );
       
    54 _LIT8( KNSmlDMEmailDescription, "The interior object holds all email objects" );
       
    55 _LIT8( KNSmlDMDynamicNodeDescription, "Placeholder for one or more Email objects" );
       
    56 _LIT8( KNSmlDMNameDescription, "Displayable Account Name for the Email Settings" );
       
    57 _LIT8( KNSmlDMUIDDescription, "User ID for email account" );
       
    58 _LIT8( KNSmlDMPWDescription, "Password for email account " );
       
    59 _LIT8( KNSmlDMUAddrDescription, "User's email address" );
       
    60 _LIT8( KNSmlDMUNameDescription, "Displayable name for the user" );
       
    61 _LIT8( KNSmlDMMrcvDescription, "Host name of the receiving  (IMAP/POP3) server" );
       
    62 _LIT8( KNSmlDMMsndDescription, "Host name of the SMTP server" );
       
    63 _LIT8( KNSmlDMMproDescription, "Remote mailbox protocol" );
       
    64 _LIT8( KNSmlDMUseSecConDescription, "Secure connection is used or not" );
       
    65 _LIT8( KNSmlDMUseSauthDescription, "SMTP authentication is used or not" );
       
    66 _LIT8( KNSmlDMSauthUIDDescription, "SMTP authenticatio user Id" );
       
    67 _LIT8( KNSmlDMSauthPWDescription, "SMTP authentication password" );
       
    68 _LIT8( KNSmlDMPtxtSAuthDescription, "Plain text SMTP authentication is allowed or not" );
       
    69 _LIT8( KNSmlDMDelFetDescription, "Defines whether to delete fetched mail from remote server" );
       
    70 _LIT8( KNSmlDMUseAPOPDescription, "Defines whether  the APOP is used or not" );
       
    71 _LIT8( KNSmlDMRcvPortDescription, "Port for IMAP4 or POP3" );
       
    72 _LIT8( KNSmlDMSndPortDescription, "Port for SMTP" );
       
    73 _LIT8( KNSmlDMToNapIDDescription, "Link to connectivity information" );
       
    74 
       
    75 _LIT8( KNSmlDMSToNapIDDescription, "Link to connectivity information for sending SMTP" );
       
    76 _LIT8( KNSmlDMSUseSecConDescription, "Defines whether SSL/TLS security is used in SMTP" );
       
    77 _LIT8( KNSmlDMUseStartTLSDescription, "Defines whether StartTLS is used in IMAP/POP" );
       
    78 _LIT8( KNSmlDMSUseStartTLSDescription, "Defines whether StartTLS is in SMTP" );
       
    79 _LIT8( KNSmlDMMrcvPortDescription, "Defines the port number of the IMAP/POP server" );
       
    80 _LIT8( KNSmlDMMsndPortDescription, "Defines the port number of the SMTP server" );
       
    81 _LIT8( KNSmlDMFolderPathDescription, "Defines the mailbox folder path" );
       
    82 
       
    83 _LIT8( KNSmlDMEmailDynamicNode, "" );
       
    84 _LIT8( KNSmlDMEmailName, "Name" );
       
    85 _LIT8( KNSmlDMEmailUID, "UID" );
       
    86 _LIT8( KNSmlDMEmailPW, "PW" );
       
    87 _LIT8( KNSmlDMEmailUAddr, "UAddr" );
       
    88 _LIT8( KNSmlDMEmailUName, "UName" );
       
    89 _LIT8( KNSmlDMEmailMrcv, "Mrcv" );
       
    90 _LIT8( KNSmlDMEmailMsnd, "Msnd" );
       
    91 _LIT8( KNSmlDMEmailMpro, "Mpro" );
       
    92 _LIT8( KNSmlDMEmailUseAPOP, "UseAPOP" );
       
    93 _LIT8( KNSmlDMEmailUseSecCon, "UseSecCon" );
       
    94 _LIT8( KNSmlDMEmailUseSauth, "UseSauth" );
       
    95 _LIT8( KNSmlDMEmailSauthUID, "SauthUID" );
       
    96 _LIT8( KNSmlDMEmailSauthPW, "SauthPW" );
       
    97 _LIT8( KNSmlDMEmailPtxtSAuth, "PtxtSAuth" );
       
    98 //_LIT8( KNSmlDMEmailRcvPort, "RcvPort" );
       
    99 //_LIT8( KNSmlDMEmailSndPort, "SndPort" );
       
   100 _LIT8( KNSmlDMEmailToNapID, "ToNapID" );
       
   101 _LIT8( KNSmlDMEmailIAPUri, "AP" );
       
   102 
       
   103 _LIT8( KNSmlDMEmailSToNapID, "SToNapID" );
       
   104 _LIT8( KNSmlDMEmailSUseSecCon, "SUseSecCon" );
       
   105 _LIT8( KNSmlDMEmailUseStartTLS, "UseStartTLS" );
       
   106 _LIT8( KNSmlDMEmailSUseStartTLS, "SUseStartTLS" );
       
   107 _LIT8( KNSmlDMEmailMrcvPort, "MrcvPort" );
       
   108 _LIT8( KNSmlDMEmailMsndPort, "MsndPort" );
       
   109 _LIT8( KNSmlDMEmailFolderPath, "FolderPath" );
       
   110 
       
   111 _LIT8( KNSmlDMEmailMproPOP, "POP" );
       
   112 _LIT8( KNSmlDMEmailMproIMAP, "IMAP" );
       
   113 _LIT8( KNSmlDMEmailTrue, "True" );
       
   114 _LIT8( KNSmlDMEmailFalse, "False" );
       
   115 
       
   116 _LIT8( KNSmlDMEmailListOfLeafs, "Name/UID/PW/UAddr/UName/Mrcv/Msnd/Mpro/UseSecCon/UseSauth/SauthUID/SauthPW/PtxtSAuth/ToNapID/SToNapID/SUseSecCon/UseStartTLS/SUseStartTLS/MrcvPort/MsndPort/UseAPOP/FolderPath" );
       
   117 _LIT8( KNSmlDMEmailSeparator8, "/" );
       
   118 _LIT8( KNSmlEmailUriDotSlash, "./");
       
   119 
       
   120 const TInt KNSmlDmFatMinimumFileSize = 512;
       
   121 const TInt KNSmlSmtpMessageTypeValue = 0x10001028;
       
   122 const TInt KNSmlDefaultMaxLimit = 1024*10; //maximum message size (default)
       
   123 const TInt KNSmlDmEmailGranularity = 4;
       
   124 const TUint32 KNSmlDmEmailAlwaysAskIap = 0;
       
   125 
       
   126 const TInt KNSmlDMEmailNormalSmtpPort = 25;
       
   127 const TInt KNSmlDMEmailSslSmtpPort = 465;
       
   128 const TInt KNSmlDMEmailNormalImap4Port = 143;
       
   129 const TInt KNSmlDMEmailNormalPop3Port = 110;
       
   130 const TInt KNSmlDMEmailSslWrappedImap4Port = 993;
       
   131 const TInt KNSmlDMEmailSslWrappedPop3Port = 995;
       
   132 const TInt KNSmlDMEmailDefaultHeaderCount = 30;
       
   133 
       
   134 const TInt KNSmlDmEmailImapLuidLow = 50000;
       
   135 const TInt KNSmlDmEmailImapLuidHigh = 100000;
       
   136 const TInt KNSmlDmEmailPopLuidHigh = 150000;
       
   137 const TUint32 KNSmlDMEmailMaxPortNbr = 0xffff;
       
   138 
       
   139 /**
       
   140 * The main class of the SyncML DM Email adapter.
       
   141 *
       
   142 *  @since 
       
   143 */
       
   144 class CNSmlDmEmailAdapter : public CSmlDmAdapter, public MMsvSessionObserver
       
   145     {
       
   146 public:
       
   147     /**
       
   148      * The one phase constructor
       
   149      *
       
   150      */
       
   151     static CNSmlDmEmailAdapter* NewL(MSmlDmCallback* aDmCallback );
       
   152 
       
   153     /** 
       
   154      * The destructor
       
   155      *
       
   156      */
       
   157     virtual ~CNSmlDmEmailAdapter();
       
   158 
       
   159     // Adapter interface from CSmlDmAdapter
       
   160     /**
       
   161      * The function returns current version of the DDF.  By asking
       
   162      * current DDF versions from adapters DM Module can control *
       
   163      * possible changes in the data structure and send the changed DDF
       
   164      * description to a management server.  This function is always
       
   165      * called after DDFStructureL.  
       
   166      * @param aVersion DDF version of the
       
   167      * adapter. (filled by the adapter) 
       
   168      * @publishedPartner 
       
   169      * @prototype
       
   170      */
       
   171 
       
   172     void DDFVersionL( CBufBase& aDDFVersion );
       
   173     /**
       
   174      * The function for filling the DDF structure of the adapter
       
   175      * This function is only called once, immediately after the adapter is created.
       
   176      * @param aDDFObject   Reference to root object. A DM adapter starts filling
       
   177      * the data structure by calling AddChildObjectL to the root object and
       
   178      * so describes the DDF of the adapter. 
       
   179      * @publishedPartner
       
   180      * @prototype
       
   181     */
       
   182     void DDFStructureL( MSmlDmDDFObject& aDDF );
       
   183     /**
       
   184      * The function creates new leaf objects, or replaces data in existing leaf
       
   185      * objects. The information about the success of the command should be
       
   186      * returned by calling SetStatusL function of MSmlDmCallback callback
       
   187      * interface. This makes it possible to buffer the commands.  However, all
       
   188      * the status codes for buffered commands must be returned at the latest when
       
   189      * the adapter's CompleteOutstandingCmdsL() is called.
       
   190      * @param aURI         URI of the object
       
   191      * @param aLUID        LUID of the object (if the adapter has earlier returned a
       
   192      *                    LUID to the DM Module). For new objects, this is the LUID
       
   193      *                    inherited through the parent node.
       
   194      * @param aObject      Data of the object.
       
   195      * @param aType        MIME type of the object
       
   196      * @param aStatusRef   Reference to correct command, i.e. this reference
       
   197      *                    must be used when calling the SetStatusL of this command
       
   198      * @publishedPartner
       
   199      * @prototype
       
   200     */
       
   201     void UpdateLeafObjectL( const TDesC8& aURI, const TDesC8& aLUID, 
       
   202                             const TDesC8& aObject, const TDesC8& aType, 
       
   203                             TInt aStatusRef );
       
   204     /**
       
   205      * The function deletes an object and its child objects. The SetStatusL
       
   206      * should be used as described in UpdateLeafObjectL()
       
   207      * @param aURI     URI of the object
       
   208      * @param aLUID        LUID of the object (if the adapter have earlier returned
       
   209      *                     LUID to the DM Module).
       
   210      * @param aStatusRef   Reference to correct command, i.e. this reference must
       
   211      *                     be used when calling the SetStatusL of this command.
       
   212      * @publishedPartner
       
   213      * @prototype
       
   214     */
       
   215     void DeleteObjectL( const TDesC8& aURI, const TDesC8& aLUID, 
       
   216                         const TInt aStatusRef );
       
   217     /**
       
   218      * The function fetches data of a leaf object. The SetStatusL should be used
       
   219      * as described in UpdateLeafObjectL(). The data is returned by using the
       
   220      * SetResultsL function of MSmlCallback callback interface, and may be streamed.
       
   221      * @param aURI         URI of the object
       
   222      * @param aLUID            LUID of the object (if the adapter have earlier
       
   223      *                       returned LUID to the DM Module).   
       
   224      * @param aType            MIME type of the object
       
   225      * @param aResultsRef  Reference to correct results, i.e. this reference
       
   226      *                         must be used when returning the result by calling
       
   227      *                         the SetResultsL.
       
   228      * @param aStatusRef       Reference to correct command, i.e. this reference
       
   229      *                         must be used when calling the SetStatusL of this
       
   230      *                         command.
       
   231      * @publishedPartner
       
   232      * @prototype
       
   233     */
       
   234     void FetchLeafObjectL( const TDesC8& aURI, const TDesC8& aLUID, 
       
   235                            const TDesC8& aType, const TInt aResultsRef, 
       
   236                            const TInt aStatusRef );
       
   237     /**
       
   238      * The function fetches URI list. An adapter returns the list of URI segments
       
   239      * under the given URI be separated by slash ("/"). The URI segment names for
       
   240      * new objects must be given by the adapter.
       
   241      * The list is returned by calling the SetResultsL function of MSmlCallback
       
   242      * callback interface. Results from this call MUST NOT be streamed.
       
   243      * @param aParentURI                   URI of the parent object
       
   244      * @param aParentLUID              LUID of the parent object (if the
       
   245      *                                     adapter have earlier returned LUID to
       
   246      *                                     the DM Module).   
       
   247      * @param aPreviousURISegmentList  URI list with mapping LUID information,
       
   248      *                                     which is known by DM engine. An adapter
       
   249      *                                     can use this information when verifying
       
   250      *                                     if old objects still exists. An adapter
       
   251      *                                     also knows what objects are new to DM
       
   252      *                                     engine and can provide LUID mapping for
       
   253      *                                     them. aPreviousURISegmentList parameter
       
   254      *                                     (see above) helps to recognise new
       
   255      *                                     objects.
       
   256      * @param aResultsRef              Reference to correct results, i.e. this
       
   257      *                                     reference must be used when returning
       
   258      *                                     the result by calling the SetResultsL.
       
   259      * @param aStatusRef                   Reference to correct command, i.e. this
       
   260      *                                     reference must be used when calling the
       
   261      *                                     SetStatusL of this command.
       
   262      * @publishedPartner
       
   263      * @prototype
       
   264     */
       
   265     void ChildURIListL( const TDesC8& aURI, 
       
   266                         const TDesC8& aLUID, 
       
   267                      const CArrayFix<TSmlDmMappingInfo>& aPreviousURISegmentList,
       
   268         const TInt aResultsRef, const TInt aStatusRef );
       
   269     /**
       
   270      * The function adds node object. In some cases an implementation of the
       
   271      * function may be empty function, if the node object does not need concrete
       
   272      * database update. Still this function may be helpful to an adapter, i.e. in
       
   273      * passing mapping LUID of the node to DM Module. The SetStatusL should be
       
   274      * used as described in UpdateLeafObjectL()
       
   275      * @param aURI         URI of the object
       
   276      * @param aParentLUID  LUID of the parent object (if the adapter have
       
   277      *                         earlier returned LUID to the DM Module).   
       
   278      * @param aStatusRef       Reference to correct command, i.e. this reference
       
   279      *                         must be used when calling the SetStatusL of this
       
   280      *                         command.
       
   281      * @publishedPartner
       
   282      * @prototype
       
   283     */
       
   284     void AddNodeObjectL( const TDesC8& aURI, const TDesC8& aParentLUID, 
       
   285                          const TInt aStatusRef );
       
   286     /**
       
   287      * The function creates new leaf objects, or replaces data in existing leaf
       
   288      * objects, in the case where data is large enough to be streamed. The
       
   289      * information about the success of the command should be returned by calling
       
   290      * SetStatusL function of MSmlDmCallback callback interface. This makes it
       
   291      * possible to buffer the commands.  However, all the status codes for buffered
       
   292      * commands must be returned at the latest when the CompleteOutstandingCmdsL()
       
   293      * of adapter is called.
       
   294      * @param aURI     URI of the object
       
   295      * @param aLUID        LUID of the object (if the adapter has earlier returned a
       
   296      *                     LUID to the DM Module). For new objects, this is the LUID
       
   297      *                     inherited through the parent node.
       
   298      * @param aStream  Data of the object. Adapter should create write stream
       
   299      *                     and return, when data is written to stream by DM agent,
       
   300      *                     StreamCommittedL() is called by DM engine
       
   301      * @param aType        MIME type of the object
       
   302      * @param aStatusRef   Reference to correct command, i.e. this reference
       
   303      *                     must be used when calling the SetStatusL of this
       
   304      *                     command.
       
   305      * @publishedPartner
       
   306      * @prototype
       
   307     */
       
   308     void UpdateLeafObjectL( const TDesC8& aURI, const TDesC8& aLUID, 
       
   309                             RWriteStream*& aStream, const TDesC8& aType, 
       
   310                             const TInt aStatusRef );
       
   311     /**
       
   312      * The function fetches the size of the data of a leaf object. The size is
       
   313      * in bytes, and must reflect the number of bytes that will be transferred
       
   314      * when the framework calls FetchLeafObjectL. The SetStatusL should be used
       
   315      * as described in FetchLeafObjectL(). The size value is returned by using
       
   316      * the SetResultsL function of MSmlCallback callback interface, and must be
       
   317      * a decimal integer expressed as a string, eg. "1234".
       
   318      * Results from this call MUST NOT be streamed.
       
   319      * @param aURI         URI of the object
       
   320      * @param aLUID            LUID of the object (if the adapter have earlier
       
   321      *                         returned LUID to the DM Module).   
       
   322      * @param aType            MIME type of the object
       
   323      * @param aResultsRef  Reference to correct results, i.e. this reference
       
   324      *                         must be used when returning the result by calling
       
   325      *                         the SetResultsL.
       
   326      * @param aStatusRef       Reference to correct command, i.e. this reference
       
   327      *                         must be used when calling the SetStatusL of this
       
   328      *                         command.
       
   329      * @publishedPartner
       
   330      * @prototype
       
   331     */
       
   332     void FetchLeafObjectSizeL( const TDesC8& aURI, const TDesC8& aLUID, 
       
   333                                const TDesC8& aType, const TInt aResultsRef, 
       
   334                                const TInt aStatusRef );
       
   335     /**
       
   336      * The function implements execute command. The information about the success
       
   337      * of the command should be returned by calling SetStatusL function of
       
   338      * MSmlDmCallback callback interface. This makes it possible to buffer the
       
   339      * commands.
       
   340      * However, all the status codes for buffered commands must be returned at
       
   341      * the latest when the CompleteOutstandingCmdsL() of adapter is called.
       
   342      * @param aURI         URI of the command
       
   343      * @param aLUID            LUID of the object (if the adapter have earlier
       
   344      *                         returned LUID to the DM Module).   
       
   345      * @param aArgument        Argument for the command
       
   346      * @param aType            MIME type of the object 
       
   347      * @param aStatusRef       Reference to correct command, i.e. this reference
       
   348      *                         must be used when calling the SetStatusL of this
       
   349      *                         command.
       
   350      * @publishedPartner
       
   351      * @prototype
       
   352     */
       
   353     void ExecuteCommandL( const TDesC8& aURI, const TDesC8& aLUID, 
       
   354                           const TDesC8& aArgument, const TDesC8& aType, 
       
   355                           const TInt aStatusRef );
       
   356     /**
       
   357      * The function implements execute command. The information about the
       
   358      * success of the command should be returned by calling SetStatusL function
       
   359      * of MSmlDmCallback callback interface. This makes it possible to buffer the
       
   360      * commands.
       
   361      * However, all the status codes for buffered commands must be returned at
       
   362      * the latest when the CompleteOutstandingCmdsL() of adapter is called.
       
   363      * @param aURI         URI of the command
       
   364      * @param aLUID            LUID of the object (if the adapter have earlier
       
   365      *                         returned LUID to the DM Module).   
       
   366      * @param aStream      Argument for the command. Adapter should create
       
   367      *                         write stream and return, when data is written to
       
   368      *                         stream by DM agent, StreamCommittedL() is called by
       
   369      *                         DM engine
       
   370      * @param aType            MIME type of the object 
       
   371      * @param aStatusRef       Reference to correct command, i.e. this reference
       
   372      *                         must be used when calling the SetStatusL of this
       
   373      *                         command.
       
   374      * @publishedPartner
       
   375      * @prototype
       
   376     */
       
   377     void ExecuteCommandL( const TDesC8& aURI, const TDesC8& aLUID, 
       
   378                           RWriteStream*& aStream, const TDesC8& aType, 
       
   379                           const TInt aStatusRef );
       
   380     /**
       
   381      * The function implements copy command. The information about the success of
       
   382      * the command should be returned by calling SetStatusL function of
       
   383      * MSmlDmCallback callback interface. This makes it possible to buffer the
       
   384      * commands.
       
   385      * However, all the status codes for buffered commands must be returned at
       
   386      * the latest when the CompleteOutstandingCmdsL() of adapter is called.
       
   387      * @param aTargetURI       Target URI for the command
       
   388      * @param aSourceLUID  LUID of the target object (if one exists, and if the adapter
       
   389      *                         has earlier returned a LUID to the DM Module).   
       
   390      * @param aSourceURI       Source URI for the command
       
   391      * @param aSourceLUID  LUID of the source object (if the adapter has
       
   392      *                         earlier returned a LUID to the DM Module).   
       
   393      * @param aType            MIME type of the objects
       
   394      * @param aStatusRef       Reference to correct command, i.e. this reference
       
   395      *                         must be used when calling the SetStatusL of this
       
   396      *                         command.
       
   397      * @publishedPartner
       
   398      * @prototype
       
   399     */
       
   400     void CopyCommandL( const TDesC8& aTargetURI, const TDesC8& aTargetLUID, 
       
   401                        const TDesC8& aSourceURI, const TDesC8& aSourceLUID, 
       
   402                        const TDesC8& aType, TInt aStatusRef );
       
   403     /**
       
   404      * The function indicates start of Atomic command.
       
   405      * @publishedPartner
       
   406      * @prototype
       
   407     */
       
   408     void StartAtomicL();
       
   409     /**
       
   410      * The function indicates successful end of Atomic command. The adapter
       
   411      * should commit all changes issued between StartAtomicL() and
       
   412      * CommitAtomicL()
       
   413      * @publishedPartner
       
   414      * @prototype
       
   415     */
       
   416     void CommitAtomicL();
       
   417     /**
       
   418      * The function indicates unsuccessful end of Atomic command. The adapter
       
   419      * should rollback all changes issued between StartAtomicL() and
       
   420      * RollbackAtomicL(). If rollback fails for a command, adapter should use
       
   421      * SetStatusL() to indicate it.
       
   422      * @publishedPartner
       
   423      * @prototype
       
   424     */
       
   425     void RollbackAtomicL();
       
   426     /**
       
   427      * Returns ETrue if adapter supports streaming otherwise EFalse.
       
   428      * @param aItemSize size limit for stream usage
       
   429      * @return TBool ETrue for streaming support
       
   430      * @publishedPartner
       
   431      * @prototype
       
   432     */
       
   433     TBool StreamingSupport( TInt& aItemSize );
       
   434     /**
       
   435      * Called when stream returned from UpdateLeafObjectL or ExecuteCommandL has
       
   436      * been written to and committed. Not called when fetching item.
       
   437      * @publishedPartner
       
   438      * @prototype
       
   439     */  
       
   440     void StreamCommittedL();
       
   441     /**
       
   442      * The function tells the adapter that all the commands of the message that
       
   443      * can be passed to the adapter have now been passed.  This indciates that
       
   444      * the adapter must supply status codes and results to any buffered commands.
       
   445      * This must be done at latest by the time this function returns.
       
   446      * This function is used at the end of SyncML messages, and during processing
       
   447      * of Atomic.   In the case of Atomic processing, the function will be
       
   448      * followed by a call to CommitAtomicL or RollbackAtomicL.
       
   449      * @publishedPartner
       
   450      * @prototype
       
   451     */
       
   452     void CompleteOutstandingCmdsL();
       
   453 
       
   454 protected:  
       
   455     /**
       
   456      * Inherited from MMsvSessionObserver
       
   457      * Indicates an event has occurred.
       
   458      * @param aEvent Indicates the event type. 
       
   459      * @param aArg1 Event type-specific argument value 
       
   460      * @param aArg2 Event type-specific argument value 
       
   461      * @param aArg3 Event type-specific argument value 
       
   462      */
       
   463     void HandleSessionEventL( TMsvSessionEvent aEvent, TAny* aArg1, TAny* aArg2,
       
   464                               TAny* aArg3 );
       
   465 
       
   466 private:
       
   467 
       
   468 struct TNSmlEmailCommandElement
       
   469     {
       
   470     HBufC8* iLastUriSeg;
       
   471     HBufC8* iData;
       
   472     TInt iStatusRef;
       
   473     TBool iLeaf;
       
   474     CSmlDmAdapter::TError iStatus;
       
   475     };
       
   476 
       
   477 enum TNSmlEmailAccountType
       
   478     {
       
   479     EImap,
       
   480     EPop,
       
   481     EUnknown
       
   482     };
       
   483 
       
   484 enum TNSmlEmailSecuritySetting
       
   485     {
       
   486     EUseSecCon = 1,
       
   487     EUseStartTls,
       
   488     ESuseSecCon,
       
   489     ESuseStartTls,
       
   490     };
       
   491 
       
   492 struct TNSmlEmailSettingsElement
       
   493     {
       
   494     CArrayFixFlat<TNSmlEmailCommandElement> *iNodeBuf;
       
   495     /* iMappingName = Email/xxxx */
       
   496     HBufC8* iMappingName;
       
   497     HBufC* iName;
       
   498     CImSmtpSettings* iSmtpSettings;
       
   499     CImPop3Settings* iPop3Settings;
       
   500     CImImap4Settings* iImap4Settings;
       
   501     CImIAPPreferences* iIapPref;
       
   502     CImIAPPreferences* iSmtpIapPref;
       
   503     
       
   504     TBool iExecuted;
       
   505     TInt iLuid;
       
   506     TBool iJustFetch;
       
   507     CNSmlDmEmailAdapter::TNSmlEmailAccountType iAccType;
       
   508     TInt iAccId;
       
   509     TMsvId iServiceId;
       
   510     };
       
   511 
       
   512     /**
       
   513     * C++ default constructor.
       
   514     */
       
   515     void ConstructL();
       
   516     CNSmlDmEmailAdapter();
       
   517     CNSmlDmEmailAdapter( MSmlDmCallback* aDmCallback );
       
   518 
       
   519     /**
       
   520      * Initializes the buffer for leaf nodes.
       
   521      * @param    aURI URI of the object
       
   522      * @param    aObject The data to be updated
       
   523      * @param    aStatusRef The status reference
       
   524      * @param    aIndex The index to command buffer
       
   525      * @return   status of the operation
       
   526      */
       
   527     TInt FirstAddLeafL(const TDesC8& aURI, 
       
   528         const TDesC8& aObject, 
       
   529         TInt aStatusRef,
       
   530         TInt aIndex);
       
   531 
       
   532     /**
       
   533      * Updates the value of leaf object
       
   534      * @param    aLastUriSeg URI of the object
       
   535      * @param    aObject The data to be updated
       
   536      * @param    aIndex The index to node buffer
       
   537      * @param    aCommand The index to command buffer
       
   538      * @return   status of the operation
       
   539      */
       
   540     TInt DoAddLeafObjectL(const TDesC8& aLastUriSeg, 
       
   541         const TDesC8& aObject,
       
   542         TInt aIndex, 
       
   543         TInt aCommand);
       
   544 
       
   545     /**
       
   546      * Set the default values to email account
       
   547      * @param    aIndex The index to node buffer
       
   548      * @return   none
       
   549      */
       
   550     void SetDefaultSettingsL(TInt aIndex);
       
   551 
       
   552     /**
       
   553      * Converts 16bit descriptor to integer
       
   554      * @param    aLuid The descriptor to be converted
       
   555      * @return    Integer value of the descriptor
       
   556      */
       
   557     TInt DesToInt(const TDesC& aLuid) const;
       
   558 
       
   559     /**
       
   560      * Converts 8bit descriptor to integer
       
   561      * @param    aLuid The descriptor to be converted
       
   562      * @return    Integer value of the descriptor
       
   563      */
       
   564     TInt DesToInt(const TDesC8& aLuid) const;
       
   565 
       
   566     /**
       
   567      * Converts integer to 16bit descriptor
       
   568      * @param    aLuid The integer to be converted
       
   569      * @return    The Integer as a descriptor
       
   570      */
       
   571     HBufC* IntToDesLC(const TInt aLuid) const;
       
   572 
       
   573     /**
       
   574      * Converts integer to 8bit descriptor
       
   575      * @param    aLuid The integer to be converted
       
   576      * @return    The Integer as a descriptor
       
   577      */
       
   578     HBufC8* IntToDes8LC(const TInt aLuid) const;
       
   579 
       
   580     /**
       
   581      * Converts 16bit descriptor to 8bit descriptor
       
   582      * @param    aSource The descriptor to be converted
       
   583      * @return    The 8bit descriptor
       
   584      */
       
   585     HBufC8* ConvertTo8LC( const TDesC& aSource ) const;
       
   586 
       
   587     /**
       
   588      * Transfers the email settings from memory to phones permanent data store
       
   589      * @param    aIndex The index to command buffer
       
   590      * @return    Luid of the email account
       
   591      */
       
   592     TInt ValidateAndStoreSettingsL(TInt aIndex);
       
   593 
       
   594     /**
       
   595      * Restores the settings to the adapter from phones permanent data store
       
   596      * @param    aIndex The index to command buffer
       
   597      * @return    Status of the operation
       
   598      */
       
   599     TInt DoRestoreSettingsL(TInt aIndex);
       
   600 
       
   601     /**
       
   602      * Opens the CMsvSession if it is not open already
       
   603      * @param    none
       
   604      * @return    Status of the operation
       
   605      */
       
   606     TInt OpenSessionL();
       
   607 
       
   608     /**
       
   609      * Parses the last URI segment from URI
       
   610      * @param    aURI The whole URI
       
   611      * @return    The last URI segment
       
   612      */
       
   613     TPtrC8 LastURISeg(const TDesC8& aURI) const; 
       
   614 
       
   615     /**
       
   616      * Removes the last URI segment from URI
       
   617      * @param    aURI The whole URI
       
   618      * @return    The aURI without the last URI segment
       
   619      */
       
   620     TPtrC8 RemoveLastURISeg(const TDesC8& aURI) const;
       
   621 
       
   622     /**
       
   623      * Calculates the number of URI segments
       
   624      * @param    aURI The whole URI
       
   625      * @return    The number of URI segments
       
   626      */
       
   627     TInt NumOfURISegs(const TDesC8& aURI) const;
       
   628 
       
   629     /**
       
   630      * Fills the DDF node with desired properties
       
   631      * @param    aNode           Reference to node or leaf which info to be filled.
       
   632      * @param    aAccTypes       Access rights for a leaf / node.
       
   633      * @param    aOccurrence     Occurance of the node / leaf.
       
   634      * @param    aScope          Scope (dynamic / permanent) of the leaf / node.
       
   635      * @param    aFormat         Data format of the leaf / node.
       
   636      * @param    aDescription    Description of the node / leaf.
       
   637      * @param    aDefaultValue   Default value for a leaf or node.
       
   638      * @return    none
       
   639      */
       
   640     void FillNodeInfoL( MSmlDmDDFObject& aNode,
       
   641         const TSmlDmAccessTypes& aAccTypes, 
       
   642                         MSmlDmDDFObject::TOccurence aOccurrence, 
       
   643                         MSmlDmDDFObject::TScope aScope, 
       
   644                         MSmlDmDDFObject::TDFFormat aFormat,
       
   645                         const TDesC8& aDescription) const;
       
   646 
       
   647     /**
       
   648      * Parses the dot and slash in start of URI away
       
   649      * @param    aURI The whole URI
       
   650      * @return    The URI without dot and slash in start
       
   651      */
       
   652     TPtrC8 RemoveDotSlash(const TDesC8& aURI) const;
       
   653 
       
   654     /**
       
   655      * Fetches the value of leaf node
       
   656      * @param    aURI The whole URI
       
   657      * @param    aLUID The LUID
       
   658      * @param    aObject The storage for the result
       
   659      * @return    Status of the operation
       
   660      */
       
   661     CSmlDmAdapter::TError FetchObjectL(const TDesC8& aURI, 
       
   662         const TDesC8& aLUID,
       
   663         CBufBase& aObject);
       
   664 
       
   665     /**
       
   666      * Calculates correct account id from the LUID
       
   667      * @param    aAccType Account Type
       
   668      * @param    aAccId Account ID
       
   669      * @param    aLuid The LUID
       
   670      * @return    none
       
   671      */
       
   672     void GetIdByLuid( TNSmlEmailAccountType& aAccType, 
       
   673                       TInt& aAccId, const TInt aLuid ) const;
       
   674 
       
   675     /**
       
   676      * Calculates LUID from the account id
       
   677      * @param    aAccType Account Type
       
   678      * @param    aAccId Account ID
       
   679      * @param    aLuid The LUID
       
   680      * @return    none
       
   681      */
       
   682     void SetLuidById( const TNSmlEmailAccountType& aAccType, 
       
   683                       const TInt& aAccId, TInt& aLuid ) const;
       
   684 
       
   685     /**
       
   686      * Checks if the account with given id exists
       
   687      * @param    aAccs Pointer to CEmailAccount object
       
   688      * @param    aAccType Account Type
       
   689      * @param    aId Account ID
       
   690      * @param    aIndex The LUIDIndex to the command buffer
       
   691      * @return    True if the account exists
       
   692      */
       
   693     TBool AccountExistsL( CEmailAccounts* aAccs, 
       
   694                          const TNSmlEmailAccountType aAccType, 
       
   695                          const TInt aId,
       
   696                          TInt aIndex );
       
   697 
       
   698     /**
       
   699      * Sets the parameters related to STARTTLS and SSL/TLS
       
   700      * @param    aObject The value(True/False) to be set
       
   701      * @param    aThisElem The element of which value is to be set.
       
   702      * @param    aSetting The setting which value is to be set
       
   703      * @return    none
       
   704      */
       
   705     void SetDefaultSecurityL(const TDesC8& aObject,
       
   706                           const TNSmlEmailSettingsElement* aThisElem,
       
   707                           const TNSmlEmailSecuritySetting aSetting
       
   708         ) const;
       
   709 
       
   710     /**
       
   711      * Fetches the parameters related to STARTTLS and SSL/TLS
       
   712      * @param    aObject The storage for the value
       
   713      * @param    aElem The element of which value is fetched.
       
   714      * @param    aSetting The setting which value is fetched.
       
   715      * @return    Status of the operation
       
   716      */
       
   717     CSmlDmAdapter::TError FetchSecurityValueL(CBufBase& aObject, 
       
   718         const TNSmlEmailSettingsElement* aElem,
       
   719         const TNSmlEmailSecuritySetting aSetting ) const;
       
   720 		
       
   721 		/**
       
   722      * Creates the mapping for the email account preset
       
   723      * @param    aURI The whole URI
       
   724      * @return   the luid of the email account specified im aURI, else -1
       
   725      */
       
   726 		TInt ConstructTreeL(const TDesC8& aURI);
       
   727 		
       
   728 private:
       
   729     // Pointer to CMsvSession
       
   730     CMsvSession* iMsvSession;
       
   731     // The buffer for received commands
       
   732     CArrayFixFlat<TNSmlEmailSettingsElement>* iBuffer;
       
   733     };
       
   734 
       
   735 #endif // __NSMLDMEMAILADAPTER_H__
       
   736 
       
   737 // End of File