cpsecplugins/cpadvancedsecplugin/src/advsecsettingscertlistbuilder_symbian.cpp
changeset 63 989397f9511c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cpsecplugins/cpadvancedsecplugin/src/advsecsettingscertlistbuilder_symbian.cpp	Thu Oct 14 13:56:11 2010 +0300
@@ -0,0 +1,344 @@
+/*
+* Copyright (c) 2010 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:  Helper class to construct certificate list
+*
+*/
+
+#include "advsecsettingscertlistbuilder_symbian.h"
+#include "advsecsettingslabeledcertinfo_symbian.h"
+#include "advsecsettingsstoreuids.h"    // KAdvSecSettingsDeviceCertStore
+#include <x509cert.h>                   // CX509Certificate
+#include <ccertattributefilter.h>       // CCertAttributeFilter
+#include <X509CertNameParser.h>         // X509CertNameParser::PrimaryAndSecondaryNameL
+#include <stl/_auto_ptr.h>              // std::auto_ptr
+
+_LIT(KNameSeparator, " ");
+
+// implemented in advsecsettingssecuritymodulemodel_symbian_p.cpp
+QString CopyStringL(const TDesC16 &aDes16);
+
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// CAdvSecSettingsCertListBuilder::NewL()
+// ---------------------------------------------------------------------------
+//
+CAdvSecSettingsCertListBuilder *CAdvSecSettingsCertListBuilder::NewL(
+    RFs &aFs, CUnifiedCertStore &aCertStore)
+{
+    CAdvSecSettingsCertListBuilder *self = new(ELeave) CAdvSecSettingsCertListBuilder(
+        aFs, aCertStore);
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+    return self;
+}
+
+// ---------------------------------------------------------------------------
+// CAdvSecSettingsCertListBuilder::~CAdvSecSettingsCertListBuilder()
+// ---------------------------------------------------------------------------
+//
+CAdvSecSettingsCertListBuilder::~CAdvSecSettingsCertListBuilder()
+{
+    Cancel();
+    iLabeledCertInfos.ResetAndDestroy();
+    delete iCertificate;
+    delete iCertAttributeFilter;
+    iCertInfoArray.Close();
+    iCertList = NULL;
+    iClientInfoArray = NULL;
+    iClientStatus = NULL;
+}
+
+// ---------------------------------------------------------------------------
+// CAdvSecSettingsCertListBuilder::GetCertificateList()
+// ---------------------------------------------------------------------------
+//
+void CAdvSecSettingsCertListBuilder::GetCertificateList(
+    QList<AdvSecSettingsCertificate*> &certList,
+    RMPointerArray<CCTCertInfo> &aCertInfoArray,
+    TRequestStatus &aStatus)
+{
+    aStatus = KRequestPending;
+    if (!IsActive() && (iState == EIdle)) {
+        iClientStatus = &aStatus;
+        iCertList = &certList;
+        iClientInfoArray = &aCertInfoArray;
+
+        iCertInfoArray.Close();
+        ResetCertAttributeFilter();
+        iCertStore.List(iCertInfoArray, *iCertAttributeFilter, iStatus);
+        iState = EListingCerts;
+        SetActive();
+   } else {
+        TRequestStatus *status = &aStatus;
+        User::RequestComplete(status, KErrInUse);
+    }
+}
+
+// ---------------------------------------------------------------------------
+// CAdvSecSettingsCertListBuilder::DoCancel()
+// ---------------------------------------------------------------------------
+//
+void CAdvSecSettingsCertListBuilder::DoCancel()
+{
+    switch (iState) {
+    case EListingCerts:
+        iCertStore.CancelList();
+        break;
+    case ERetrievingCert:
+        iCertStore.CancelRetrieve();
+        break;
+    case EProcessingCert:
+        // nothing to do
+        break;
+    default:
+        break;
+    }
+    User::RequestComplete(iClientStatus, KErrCancel);
+    iClientStatus = NULL;
+    iState = EIdle;
+}
+
+// ---------------------------------------------------------------------------
+// CAdvSecSettingsCertListBuilder::RunL()
+// ---------------------------------------------------------------------------
+//
+void CAdvSecSettingsCertListBuilder::RunL()
+{
+    User::LeaveIfError(iStatus.Int());
+    switch (iState) {
+    case EListingCerts:
+        ProcessFirstCertificateL();
+        break;
+    case ERetrievingCert:
+        ProcessNextCertificateL();
+        break;
+    case EProcessingCert:
+        ProcessNextCertificateL();
+        break;
+    default:
+        ASSERT(EFalse);
+        break;
+    }
+}
+
+// ---------------------------------------------------------------------------
+// CAdvSecSettingsCertListBuilder::RunError()
+// ---------------------------------------------------------------------------
+//
+TInt CAdvSecSettingsCertListBuilder::RunError(TInt aError)
+{
+    User::RequestComplete(iClientStatus, aError);
+    iClientStatus = NULL;
+    iState = EIdle;
+    return KErrNone;
+}
+
+// ---------------------------------------------------------------------------
+// CAdvSecSettingsCertListBuilder::CAdvSecSettingsCertListBuilder()
+// ---------------------------------------------------------------------------
+//
+CAdvSecSettingsCertListBuilder::CAdvSecSettingsCertListBuilder(RFs &aFs,
+    CUnifiedCertStore &aCertStore) : CActive(CActive::EPriorityLow),
+    iFs(aFs), iCertStore(aCertStore), iCertPtr(0,0)
+{
+    CActiveScheduler::Add(this);
+}
+
+// ---------------------------------------------------------------------------
+// CAdvSecSettingsCertListBuilder::ConstructL()
+// ---------------------------------------------------------------------------
+//
+void CAdvSecSettingsCertListBuilder::ConstructL()
+{
+    iCertAttributeFilter = CCertAttributeFilter::NewL();
+}
+
+// ---------------------------------------------------------------------------
+// CAdvSecSettingsCertListBuilder::ResetCertAttributeFilter()
+// ---------------------------------------------------------------------------
+//
+void CAdvSecSettingsCertListBuilder::ResetCertAttributeFilter()
+{
+    ASSERT(iCertAttributeFilter);
+    iCertAttributeFilter->iLabelIsSet = EFalse;
+    iCertAttributeFilter->iUidIsSet = EFalse;
+    iCertAttributeFilter->iFormatIsSet = EFalse;
+    iCertAttributeFilter->iKeyUsage = EX509UsageAll;
+    iCertAttributeFilter->iOwnerTypeIsSet = EFalse;
+    iCertAttributeFilter->iSubjectKeyIdIsSet = EFalse;
+    iCertAttributeFilter->iIssuerKeyIdIsSet = EFalse;
+}
+
+// ---------------------------------------------------------------------------
+// CAdvSecSettingsCertListBuilder::ProcessFirstCertificateL()
+// ---------------------------------------------------------------------------
+//
+void CAdvSecSettingsCertListBuilder::ProcessFirstCertificateL()
+{
+    iCertInfoIndex = 0;
+    StartProcessingCertificateL();
+}
+
+// ---------------------------------------------------------------------------
+// CAdvSecSettingsCertListBuilder::ProcessNextCertificateL()
+// ---------------------------------------------------------------------------
+//
+void CAdvSecSettingsCertListBuilder::ProcessNextCertificateL()
+{
+    CompleteProcessingCertificateL();
+    ++iCertInfoIndex;
+    StartProcessingCertificateL();
+}
+
+// ---------------------------------------------------------------------------
+// CAdvSecSettingsCertListBuilder::StartProcessingCertificateL()
+// ---------------------------------------------------------------------------
+//
+void CAdvSecSettingsCertListBuilder::StartProcessingCertificateL()
+{
+    if (iCertInfoIndex < iCertInfoArray.Count()) {
+        CCTCertInfo *certInfo = iCertInfoArray[iCertInfoIndex];
+
+        if ((certInfo->CertificateOwnerType() == ECACertificate) &&
+            (certInfo->CertificateFormat() == EX509Certificate)) {
+            // Have to retrieve the cert to add parts of subject
+            // to certificate label. For example, all Java certs
+            // have the same label by default.
+            if (iCertificate) {
+                delete iCertificate;
+                iCertificate = NULL;
+            }
+            iCertificate = HBufC8::NewL(certInfo->Size());
+            iCertPtr.Set(iCertificate->Des());
+            iCertStore.Retrieve(*certInfo, iCertPtr, iStatus);
+            iState = ERetrievingCert;
+            SetActive();
+        } else {
+            // Certificate label can be used as such.
+            TRequestStatus *status = &iStatus;
+            User::RequestComplete(status, KErrNone);
+            iState = EProcessingCert;
+            SetActive();
+        }
+
+    } else {
+        ReturnCertificateListL();
+
+        User::RequestComplete(iClientStatus, KErrNone);
+        iClientStatus = NULL;
+        iState = EIdle;
+    }
+}
+
+// ---------------------------------------------------------------------------
+// CAdvSecSettingsCertListBuilder::CompleteProcessingCertificateL()
+// ---------------------------------------------------------------------------
+//
+void CAdvSecSettingsCertListBuilder::CompleteProcessingCertificateL()
+{
+    ASSERT(iCertInfoIndex < iCertInfoArray.Count());
+    CCTCertInfo *certInfo = iCertInfoArray[iCertInfoIndex];
+
+    CAdvSecSettingsLabeledCertInfo *labeledCertInfo =
+        new(ELeave) CAdvSecSettingsLabeledCertInfo(*certInfo);
+    CleanupStack::PushL(labeledCertInfo);
+    labeledCertInfo->SetLabelL(certInfo->Label());
+
+    if (iCertificate) {
+        CX509Certificate *cert = CX509Certificate::NewL(*iCertificate);
+        CleanupStack::PushL(cert);
+
+        HBufC *primaryName = NULL;
+        HBufC *secondaryName = NULL;
+        TInt err = X509CertNameParser::PrimaryAndSecondaryNameL(*cert,
+            primaryName, secondaryName, certInfo->Label());
+        if (!err) {
+            if (primaryName && primaryName->Length()) {
+                labeledCertInfo->AppendLabelL(KNameSeparator, *primaryName);
+            } else {
+                if (secondaryName && secondaryName->Length()) {
+                    labeledCertInfo->AppendLabelL(KNameSeparator, *secondaryName);
+                }
+            }
+        }
+
+        CleanupStack::PopAndDestroy(cert);
+        delete iCertificate;
+        iCertificate = NULL;
+    }
+
+    iLabeledCertInfos.AppendL(labeledCertInfo);
+    CleanupStack::Pop(labeledCertInfo);
+}
+
+// ---------------------------------------------------------------------------
+// CAdvSecSettingsCertListBuilder::ReturnCertificateListL()
+// ---------------------------------------------------------------------------
+//
+void CAdvSecSettingsCertListBuilder::ReturnCertificateListL()
+{
+    TLinearOrder<CAdvSecSettingsLabeledCertInfo> order( CAdvSecSettingsLabeledCertInfo::Compare );
+    iLabeledCertInfos.Sort( order );
+
+    iCertList->clear();
+    iClientInfoArray->Reset();
+    TInt count = iLabeledCertInfos.Count();
+    for (TInt index = 0; index < count; index++) {
+        const CCTCertInfo &certInfo = iLabeledCertInfos[index]->CertInfo();
+        iClientInfoArray->AppendL(&certInfo);
+
+        std::auto_ptr<AdvSecSettingsCertificate> cert(new(ELeave) AdvSecSettingsCertificate);
+        cert->setModelIndex(index);
+        cert->setCertType(CertType(certInfo));
+        cert->setLabel(CopyStringL(iLabeledCertInfos[index]->Label()));
+        iCertList->append(cert.release());
+    }
+    iLabeledCertInfos.ResetAndDestroy();
+    iCertInfoArray.Reset();
+}
+
+// ---------------------------------------------------------------------------
+// CAdvSecSettingsCertListBuilder::CertType()
+// ---------------------------------------------------------------------------
+//
+AdvSecSettingsCertificate::CertificateType CAdvSecSettingsCertListBuilder::CertType(
+    const CCTCertInfo &aCertInfo)
+{
+    AdvSecSettingsCertificate::CertificateType type =
+        AdvSecSettingsCertificate::NotDefined;
+    TUid storeType;
+    switch (aCertInfo.CertificateOwnerType()) {
+    case ECACertificate:
+        type = AdvSecSettingsCertificate::AuthorityCertificate;
+        break;
+    case EUserCertificate:
+        storeType = aCertInfo.Handle().iTokenHandle.iTokenTypeUid;
+        if (storeType.iUid == KAdvSecSettingsDeviceCertStore) {
+            type = AdvSecSettingsCertificate::DeviceCertificate;
+        } else {
+            type = AdvSecSettingsCertificate::PersonalCertificate;
+        }
+        break;
+    case EPeerCertificate:
+        type = AdvSecSettingsCertificate::TrustedSiteCertificate;
+        break;
+    default:
+        break;
+    }
+    return type;
+}
+