wim/WimServer/inc/WimCertUtil.h
changeset 0 164170e6151a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/wim/WimServer/inc/WimCertUtil.h	Tue Jan 26 15:20:08 2010 +0200
@@ -0,0 +1,405 @@
+/*
+* Copyright (c) 2004-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:  Interface which handles certificate related operations
+*
+*/
+
+
+
+#ifndef WIMCERTUTIL_H
+#define WIMCERTUTIL_H
+
+
+//INCLUDES
+#include "WimClsv.h"
+#include "Wimi.h"
+#include <ct.h> 
+
+
+// FORWARD DECLARATIONS
+class CWimCertInfo;
+class CCTCertInfo;
+class CWimUtilityFuncs;
+
+// CONSTANTS
+typedef HBufC8* PHBufC8;
+typedef TPtr8* PTPtr8;
+
+
+// CLASS DECLARATION
+/**
+*  Utility class that handles certificate related operations.
+
+*  @since Series60 3.0
+*/
+class CWimCertUtil : public CActive
+    {
+    public:  // Constructors and destructor
+
+        /**
+        * Two-phased constructor.
+        * @param aToken -Reference to current token
+        */
+        static CWimCertUtil* NewL( MCTToken& aToken );
+
+        /**
+        * Destructor
+        */
+        virtual ~CWimCertUtil();
+        
+    public: // New functions
+
+        /**
+        * 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.         
+        */
+        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.
+        */
+        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)
+        */
+        void RetrieveCertByIndexL( const TInt aIndex,
+                                   TDes8& aEncodedCert, 
+                                   TRequestStatus& aStatus );
+
+    private:
+
+        /**
+        * By default Symbian 2nd phase constructor is private.
+        */
+        void ConstructL();
+
+        /**
+        * C++ default constructor.
+        * @param aToken -Reference to current token
+        */
+        CWimCertUtil( MCTToken& aToken );
+
+        /**
+        * Get count of certificates in WIM
+        * @param aRef       WIM card reference pointer.
+        * @param aCertCount Count of certificates in WIM card pointed by aRef
+        * @param aUsage     Certificate usage.
+        * @return Status returned by WIMI. See in WimClsv.h.
+        */
+        WIMI_STAT GetCertificateCountByWIM( WIMI_Ref_t* aRef, 
+                                            TUint8& aCertCount, 
+                                            TUint8 aUsage ) const;
+        /**
+        * Get certificate extra data
+        * @param aWimRef         WIM card reference pointer.
+        * @param aUsage          Certificate usage.
+        * @param aKeyHash        Key hash of certificate
+        * @param aCertExtrasInfo Returned extra data
+        * @return Status returned by WIMI.
+        */
+        WIMI_STAT GetExtrasFromWimRefL( 
+                                    WIMI_Ref_t* aWimRef,
+                                    TInt8 aUsage,
+                                    TDesC8& aKeyHash,
+                                    TCertExtrasInfo& aCertExtrasInfo ) const;
+
+        /**
+        * Allocates memory for the array which is filled by server.
+        * @param  aWimCertInfoArr    -Array to be initialized 
+        * @param  aCount             -Count of elements in the array         
+        */
+        void AllocWimCertInfoL( TWimCertInfo* aWimCertInfoArr, TInt aCount );
+        
+        /**
+        * Deallocates memory from the array.
+        */
+        void DeallocWimCertInfo();   
+        
+        /**
+        * Allocates memory for a struct which is filled by server.
+        */
+        void AllocMemoryForCertDetailsL();
+
+        /**
+        * Creates new certificate objects which can be returned to the caller.
+        */
+        void CreateNewCertObjectsL();
+        
+        /**
+        * Creates new wim certificate objects.
+        */
+        void CreateNewWimCertObjectL();
+
+        /**
+        * Gets trusted usages.
+        */
+        void GetTrustedUsagesL();
+
+        /**
+        * Completion of trusted usages.
+        */
+        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. 
+        */
+        void SignalOwnStatusAndComplete();
+        
+        /**
+        * Copies data to caller's buffer by using pointer.
+        */
+        void CopyRetrievedCertData();
+
+        /**
+        * DeAllocates memory from member variables, which are used
+        * when communicating with WIM.
+        */
+        void DeallocCertHBufs();
+
+        /**
+        * If user has cancelled initialization process, dealloc references 
+        * from loaded certs. 
+        */
+        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 );
+
+        /**
+        * Copy certificate extra data
+        * @param aCert           Reference to certificate
+        * @param aCertExtrasInfo Returned extra data
+        */
+        void CopyCertExtrasInfoL( WIMI_Ref_t* aCert,
+                                  TCertExtrasInfo& aCertExtrasInfo ) const;
+
+        /**
+        * Return count of certificates in WIM
+        * @param aType           Certificate type
+        * @return Count of certificates
+        */
+        TUint8 CertCount( TWimEntryType aType );
+
+        /**
+        * Get certificate reference list
+        * @param aCertAddrLst
+        * @param aCertInfoArr
+        * @param aCertEntryType
+        */
+        void CertRefLstL( TCertificateAddressList aCertAddrLst, 
+                          TWimCertInfo* aCertInfoArr, 
+                          TWimEntryType aCertEntryType );
+
+        /**
+        * Get certificate extra data
+        * @param aKeyId
+        * @param aCertExtrasInfo
+        * @param aUsage
+        * @param aStatus
+        */
+        void GetCertExtrasL( const TPtr8* aKeyId, 
+                             TCertExtrasInfo& aCertExtrasInfo,
+                             TUint aUsage,
+                             TRequestStatus& aStatus );
+
+        /**
+        * Get certificate details
+        * @param aCertAddr
+        * @param aWimCertDetails
+        */
+        void CertDetailsL( const TCertificateAddress aCertAddr, 
+                           TWimCertDetails& aWimCertDetails );
+
+        /**
+        *
+        * @param aTmpWimRef
+        * @param aUsage
+        * @param aCertNum
+        * @param aCertRefLst
+        * @param aCertInfoLst
+        * @return Error code returned by WIMI
+        */
+        WIMI_STAT GetCertificateFromWimRefL( WIMI_Ref_t* aTmpWimRef,
+                                             TInt8 aUsage,
+                                             TUint8& aCertNum,
+                                             TUint32* aCertRefLst,
+                                             TWimCertInfo* aCertInfoLst );
+
+        /**
+        * Copy certificate info
+        * @param aCertInfo
+        * @param aCert
+        */
+        void CopyCertificateInfo( TWimCertInfo& aCertInfo,
+                                  WIMI_Ref_t* aCert );
+
+    private: //from CActive
+        
+        /**
+        * Different phases are handled here.
+        */
+        void RunL();
+
+        /**
+        * Cancellation function
+        * Deallocates member variables and completes client status with
+        * KErrCancel error code.
+        */
+        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:
+
+        /**
+        * Seven different phases, which are used to 
+        * Read certificates from WIM cache, create new certificate objects and
+        * retrieve certificate
+        */
+        enum TPhase
+            {
+            EListCertsFromWim,
+            ECreateNewCertObjects,
+            EGetTrustedUsages,
+            ECertObjectsDone,
+            ETrustedUsagesDone,
+            ERetrieveCertificate,
+            ERetrievingCompleted
+            };
+
+        //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;
+        //Reference to current token. Needed in CCTCertInfo creation.
+        MCTToken&                       iToken;
+        //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;
+        //Pointer to utility functions. Owned.
+        CWimUtilityFuncs*               iWimUtilFuncs;
+    };
+
+#endif  //WIMCERTUTIL_H
+
+// End of File