wim/inc/WimCertConverter.h
changeset 0 164170e6151a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/wim/inc/WimCertConverter.h	Tue Jan 26 15:20:08 2010 +0200
@@ -0,0 +1,444 @@
+/*
+* Copyright (c) 2002 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  Interface which handles certificate related operations
+*
+*/
+
+
+
+#ifndef WIMCERTCONVERTER_H
+#define WIMCERTCONVERTER_H
+
+
+//INCLUDES
+#include "WimClsv.h"        
+#include <e32base.h>
+#include <ct.h> 
+
+// FORWARD DECLARATIONS
+class RWimCertMgmt;
+class CWimCertInfo;
+class CCTCertInfo;
+
+// CONSTANTS
+typedef HBufC8* PHBufC8;
+typedef TPtr8* PTPtr8;
+
+
+
+//CLASS DECLARATION
+/**
+*  Interface which handles certificate related operations 
+*  with WimServer.
+*  Caller can add a certificate, remove a certificate,
+*  list a certificate and get certificate details.
+*
+*  @lib WimClient
+*  @since Series60 2.1
+*/
+class CWimCertConverter: public CActive
+    {
+
+    public:
+
+        /**
+        * Two-phased constructor.
+        * @param aToken -Reference to current token
+        */
+        IMPORT_C static CWimCertConverter* NewL( MCTToken& aToken );
+
+        
+        /**
+        * Restores certificates from WIM cache. If Restore cannot find
+        * any certificate, it will return KErrNotFound to caller.
+        * @param  aArray    -Array where new certificates are 
+        *                   inserted. Caller is responsible 
+        *                   to deallocate CWimCertInfo -objects
+        *                   by calling ResetAndDestroy.(IN/OUT)
+        * @param  aStatus   -Status from caller.         
+        * @return void
+        */
+        IMPORT_C void Restore( RPointerArray<CWimCertInfo>& aArray, 
+                               TRequestStatus& aStatus );
+
+        
+        /** 
+        * Cancels outgoing Restore operation. Sets an internal flag to true. 
+        * After necessary cleanup, caller is signalled with KErrCancel 
+        * -error code.
+        * @return void
+        */
+        IMPORT_C void CancelRestore();
+        
+        /**
+        * Retrieves the actual certificate. In case of other cert than
+        * Url cert the binary encoded certificate is written into the 
+        * aEncodedCert parameter. In case of Url cert the data is 
+        * the actual url.
+        * @param  aIndex. Used to point iCertRefLst and iCertInfoArr 
+        *         -arrays for correct certificate.
+        * @param  aEncodedCert. A buffer to put the certificate in. 
+        * @param  aStatus. A request status that is completed when the 
+        *         operation has finished.(IN/OUT)
+        * @return void
+        */
+        IMPORT_C void RetrieveCertByIndexL( const TInt aIndex,
+                                           TDes8& aEncodedCert, 
+                                           TRequestStatus& aStatus );
+
+        /**
+        * Cancels an ongoing Retrieve operation.
+        * If retrieve is cancelled, then operation is completed with 
+        * KErrCancel -error code.
+        * @return void
+        */
+        IMPORT_C void CancelRetrieve();
+
+        
+        /** 
+        * Adds a certificate to the cert store.
+        * The caller of this function owns all its parameters.
+        * @since Series 60 2.6
+        * @param  aLabel  -The label of the certificate to add 
+        * @param  aFormat  -The format of the certificate. Supported formats are
+                           EX509Certificate, EWTLSCertificate,
+                           EX509CertificateUrl and EWTLSCertificateUrl 
+        * @param  aCertificateOwnerType  -The owner type. Supported types are
+                                        ECACertificate and EUserCertificate.
+        * @param  aSubjectKeyId  -The Subject key ID
+        * @param  aIssuerKeyId  -The issuer key ID
+        * @param  aCert  -The certificate to add
+        * @param  aStatus  This is completed with the return result 
+        *         when the add has completed (IN/OUT)
+        * @return  void
+        */
+        IMPORT_C void AddCertificate( const TDesC& aLabel, 
+                              const TCertificateFormat aFormat,
+                              const TCertificateOwnerType aCertificateOwnerType, 
+                              const TKeyIdentifier& aSubjectKeyId,
+                              const TKeyIdentifier& aIssuerKeyId,
+                              const TDesC8& aCert, 
+                              TRequestStatus& aStatus );
+        
+        /**
+        * Cancels an ongoing add operation.
+        * @since Series 60 2.6
+        * @return void
+        */
+        IMPORT_C void CancelAddCertificate();
+
+        /** 
+        * Removes a certificate from WIM.
+        * @since Series 60 2.6
+        * @param aIndex     -Used to point iCertInfoArr 
+        *                   for the certificate to be removed.
+        * @param aStatus    -Status from caller 
+        * @return void      
+        */
+        IMPORT_C void RemoveL( const TInt aIndex, TRequestStatus& aStatus );
+
+        /** 
+        * Cancels ongoing remove operation.
+        * @since Series 60 2.6
+        * @return void
+        */
+        IMPORT_C void CancelRemove();
+
+        /**
+        * Destructor
+        */
+        IMPORT_C virtual ~CWimCertConverter();
+
+    private:
+
+        /**
+        * By default Symbian 2nd phase constructor is private.
+        */
+        void ConstructL();
+
+        /**
+        * C++ default constructor.
+        * @param aToken -Reference to current token
+        */
+        CWimCertConverter( MCTToken& aToken );
+
+    private: //from CActive
+        
+        /**
+        * Different phases are handled here.
+        * @return void
+        */
+        void RunL();
+
+        /**
+        * Cancellation function
+        * Deallocates member variables and completes client status with
+        * KErrCancel error code.
+        * @return void
+        */
+        void DoCancel();
+
+        /**
+        * The active scheduler calls this function if this active 
+        * object's RunL() function leaves. 
+        * Handles necessary cleanup and completes request with
+        * received error code.
+        * @param aError -The error code which caused this function call.
+        * @return TInt  -Error code to activescheduler, is always KErrNone.
+        */ 
+        TInt RunError( TInt aError );
+        
+    private:
+        
+        /**
+        * Allocates memory for the array which is filled by server.
+        * @param  aWimCertInfoArr    -Array to be initialized 
+        * @param  aCount             -Count of elements in the array         
+        * @return void
+        */
+        void AllocWimCertInfoL( TWimCertInfo* aWimCertInfoArr, TInt aCount );  
+        
+        /**
+        * Deallocates memory from the array.
+        * @return void
+        */
+        void DeallocWimCertInfo();   
+        
+        /**
+        * Allocates memory for a struct which is filled by server.
+        * @return void
+        */
+        void AllocMemoryForCertDetailsL();
+
+        /**
+        * Creates new certificate objects which can be returned to the caller.
+        * @return void
+        */
+        void CreateNewCertObjectsL();
+        
+        /**
+        * Creates new wim certificate objects.
+        * @return void
+        */
+        void CreateNewWimCertObjectL();
+
+        /**
+        * Gets trusted usages.
+        * @return void
+        */
+        void GetTrustedUsagesL();
+
+        /**
+        * Completion of trusted usages.
+        * @return void
+        */
+        void TrustedUsagesDoneL();
+
+        /**
+        * Sets own iStatus to KRequestPending, and signals it 
+        * with User::RequestComplete() -request. This gives chance 
+        * to activescheduler to run other active objects. After a quick
+        * visit in activescheduler, signal returns to RunL() and starts next
+        * phase of operation. 
+        * @return void
+        */
+        void SignalOwnStatusAndComplete();
+        
+        /**
+        * Allocates memory for member variables, which are needed when adding
+        * a certificate asynchronously to WIM.
+        * @param aLabel -certificate label (IN)
+        * @param aIssuerKeyId -Issuer KeyId of a certificate 
+        * @param aSubjectKeyId -Subject KeyId of a certificate
+        * @param aCert -certificate data
+        * @return void
+        */
+        void AllocMemoryForAddCertL( const TDesC& aLabel, 
+                            const TKeyIdentifier& aIssuerKeyId, 
+                            const TKeyIdentifier& aSubjectKeyId,
+                            const TDesC8& aCert );
+
+        /**
+        * Copies data to caller's buffer by using pointer.
+        * @return void
+        */
+        void CopyRetrievedCertData();
+
+
+        /**
+        * DeAllocates memory from member variables, which are used
+        * when communicating with WIM.
+        * @return void
+        */
+        void DeallocCertHBufs();
+
+        /**
+        * If user has cancelled initialization process, dealloc references 
+        * from loaded certs. 
+        * @return void
+        */
+        void DeallocReferences();
+
+        /**
+        * Returns certificate format according to received index.
+        * @param aIndex -index of the certificate to be returned.
+        * @return TCertificateFormat -format of the certificate
+        */
+        TCertificateFormat GetCertFormatByIndex( TInt aIndex );
+
+    private:
+
+        /**
+        * Ten different phases, which are used to 
+        * Read certificates from WIM cache, create new certificate objects,
+        * retrieve certificate, add certificate and remove certificate.
+        */
+        enum TPhase
+            {
+            EListCertsFromWim,
+            ECreateNewCertObjects,
+            EGetTrustedUsages,
+            ECertObjectsDone,
+            ETrustedUsagesDone,
+            ERetrieveCertificate,
+            ERetrievingCompleted,
+            EAddCertificate,
+            EAddCertificateCompleted,
+            ERemove,
+            ERemoveCompleted
+            };
+                   
+    private:
+              
+        //Client status is stored here while operation
+        //on the server side is done.
+        TRequestStatus*                 iClientStatus;
+        
+        //Array which is used to contain new certificate objects.
+        //Not owned. Caller is responsible to destroy array.
+        RPointerArray<CWimCertInfo>*    iArray;
+        
+        //Details of the certificate. Owned.
+        TWimCertDetails                 iWimCertDetails;
+        
+        //Struct which is used when adding a certificate
+        //to WIM.
+        TWimCertAddParameters           iParam;
+
+        //Struct which is used when removing a certificate for WIM.
+        TWimCertRemoveAddr              iWimCertRemoveAddr;    
+        
+        //Reference to current token. Needed in CCTCertInfo creation.
+        MCTToken&                       iToken;
+        
+        //Handle to connection with server. Owned.
+        RWimCertMgmt*                   iConnectionHandle;
+        
+        //Typedefs for the reference to certificate. Owned.
+        TCertificateAddressList         iCertRefLst; 
+        
+        // Certificate information structure. Owned.
+        TWimCertInfo*                    iCertInfoArr;
+        
+        //Used to handle different phases.
+        TPhase                          iPhase;
+                
+        //Index to point which certificate we want to be retrieved
+        TInt                            iCertRetrieveIndex;
+                 
+        //Used to inform the size of the array, needed in array construction/
+        //destruction.
+        TInt                            iArraySize;
+        
+        //The count of certificates
+        TUint8                          iCertCount;
+
+        //Pointer to HBufC8*. This is used as an array when listing every 
+        //certificate from WIM to an array during startup. Owned.
+        PHBufC8*                        iLabel;
+
+        //Pointer to HBufC8*. This is used as an array when listing every 
+        //certificate from WIM to an array during startup. Owned.
+        PHBufC8*                        iKeyId;
+
+        //Pointer to HBufC8*. This is used as an array when listing every 
+        //certificate from WIM to an array during startup. Owned.
+        PHBufC8*                        iCAId;
+
+        //Pointer to HBufC8*. This is used as an array when listing every 
+        //certificate from WIM to an array during startup. Owned.
+        PHBufC8*                        iIssuerHash;
+
+        //Pointer to iLabel. Also used as an array. Owned.        
+        PTPtr8*                         iLabelPtr;
+
+        //Pointer to iKeyId. Also used as an array. Owned.        
+        PTPtr8*                         iKeyIdPtr;
+
+        //Pointer to iCAId. Also used as an array. Owned.        
+        PTPtr8*                         iCAIdPtr;
+
+        //Pointer to iIssuerHash. Also used as an array. Owned.
+        PTPtr8*                         iIssuerHashPtr;
+            
+        //Modifiable 8-bit descriptor which points
+        //to caller's descriptor. We copy retrieved certificate
+        //data to this descriptor. Owned.
+        TDes8*                          iEncodedCert;
+
+        //Buffer which is used to contain certificate data. Owned.
+        HBufC8*                         iCertHBufOne;
+        //Pointer to iCertHBufOne. Owned.
+        TPtr8*                          iCertHBufOnePtr;
+
+        //Buffer which is used to contain certificate data. Owned.        
+        HBufC8*                         iCertHBufTwo;
+        //Pointer to iCertHBufTwo. Owned.
+        TPtr8*                          iCertHBufTwoPtr;
+
+        //Buffer which is used to contain certificate data. Owned.        
+        HBufC8*                         iCertHBufThree;
+        //Pointer to iCertHBufThree. Owned.
+        TPtr8*                          iCertHBufThreePtr;
+
+        //Buffer which is used to contain certificate data. Owned.        
+        HBufC8*                         iCertHBufFour;
+        //Pointer to iCertHBufFour. Owned.
+        TPtr8*                          iCertHBufFourPtr;
+        //ActiveSchedulerWaiter for certificate extra information
+        //fetching.
+        CActiveSchedulerWait            iActiveSchedulerWait;
+        //Pointer for trusted usage buffer
+        HBufC*                          iTrustedUsages;
+        //Pointer to trusted usage buffer pointer
+        TPtr*                           iTrustedUsagesPtr;
+        //Index pointing to certificate elements
+        TUint8                          iIndex;
+        //Pointer to one certificate info, owned
+        CCTCertInfo*                    iCert;
+        //Pointer to one WIM specific certificate info, owned
+        CWimCertInfo*                   iCertInfo;
+        //An array of trusted usage oids
+        RArray<HBufC*>*                 iOids;
+        //Package structure for certificate extra info
+        TCertExtrasInfo                 iCertExtrasInfo;
+        //Pointer for key identifier buffer
+        HBufC8*                         iKeyIdBuf;
+        //Used to point right keyId when retrieving extra data
+        TPtr8*                          iKeyIdPointer;
+
+    };
+
+
+#endif  //WIMCERTCONVERTER_H