vpnengine/pkiservice/src/certificaterequeststore.cpp
changeset 0 33413c0669b9
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/vpnengine/pkiservice/src/certificaterequeststore.cpp	Thu Dec 17 09:14:51 2009 +0200
@@ -0,0 +1,201 @@
+/*
+* Copyright (c) 2007 - 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:   Class, which handles storing and accessing certificate requests.
+*
+*/
+
+
+
+#include <bautils.h>
+
+#include "certificaterequeststore.h"
+
+
+_LIT(KCertReqPat, "*.req");
+_LIT(KCertReqFileNameFormat, "certreq(%d).req");
+
+
+CCertificateRequestStore* CCertificateRequestStore::NewL()
+    {
+    CCertificateRequestStore* self = new (ELeave) CCertificateRequestStore;
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+    
+    return self;
+    }
+
+
+void CCertificateRequestStore::ConstructL()
+    {
+    User::LeaveIfError(iFileSession.Connect());
+    User::LeaveIfError(iFileSession.PrivatePath(iPrivatePath));
+    User::LeaveIfError(iFileSession.SetSessionPath(iPrivatePath));
+    }
+
+
+CCertificateRequestStore::~CCertificateRequestStore()
+    {
+    iFileSession.Close();
+    }
+
+
+TInt CCertificateRequestStore::CertReqCountL()
+    {
+    TInt count(0);
+
+    TFindFile* fileFinder = new (ELeave) TFindFile(iFileSession);
+    CleanupDeletePushL(fileFinder);
+    
+    CDir* fileList = NULL;
+    TInt err = fileFinder->FindWildByDir(KCertReqPat, iPrivatePath, fileList);
+    
+    switch(err)
+        {
+        case KErrNone:
+            count = fileList->Count();
+            delete fileList;
+            fileList = NULL;
+            break;
+        case KErrNotFound:
+            //No saved requests.
+            //Returns zero.
+            break;
+        default:
+            User::Leave(err);
+            break;                
+        }
+      
+    CleanupStack::PopAndDestroy(fileFinder);
+    return count;
+    
+    }
+
+   
+
+CArrayFixFlat<TCertificateRequestListEntry>* CCertificateRequestStore::GetCertReqListLC()
+    {
+    CArrayFixFlat<TCertificateRequestListEntry>* list = 
+                new (ELeave) CArrayFixFlat<TCertificateRequestListEntry>(3);
+    CleanupStack::PushL(list);
+        
+    TCertificateRequestListEntry certReqInfo;
+    
+    TFindFile* fileFinder = new (ELeave)TFindFile(iFileSession);
+    CleanupDeletePushL(fileFinder);
+    
+    CDir* fileList;
+    TInt err = fileFinder->FindWildByDir(KCertReqPat, iPrivatePath, fileList);
+
+    switch(err)
+        {        
+        case KErrNone:        
+            CleanupStack::PushL(fileList);            
+            for (TInt i = 0; i < fileList->Count(); i++)
+                {
+                certReqInfo.iObjectName = (*fileList)[i].iName;                
+                list->AppendL(certReqInfo);                
+                }            
+            CleanupStack::PopAndDestroy(); // fileList
+            break;
+        case KErrNotFound:
+            //No saved requests.
+            //Returns zero length array.
+            break;
+        default:
+            User::Leave(err);
+            break;
+        }
+    
+    CleanupStack::PopAndDestroy(fileFinder);
+    return list;
+    }
+
+
+HBufC* CCertificateRequestStore::SaveCertRequestLC(const TDesC8& aCertReqData)
+    {
+    
+    TFileName* certReqFileName = GetNewCertReqFileNameLC();
+    
+    RFile certReqFile;    
+    User::LeaveIfError(certReqFile.Create(iFileSession, *certReqFileName, EFileWrite));
+    CleanupClosePushL(certReqFile);    
+    
+    TInt err = certReqFile.Write(aCertReqData);    
+    
+    CleanupStack::PopAndDestroy(); //certReqFile
+    
+    if (err != KErrNone)
+        {
+        //Just in case
+        iFileSession.Delete(*certReqFileName);
+        User::Leave(err);
+        }
+    
+
+    HBufC* certReqObjectName = certReqFileName->AllocL();    
+    CleanupStack::PopAndDestroy(certReqFileName);
+    CleanupStack::PushL(certReqObjectName);    
+    
+    return certReqObjectName;
+    }
+
+
+HBufC8* CCertificateRequestStore::ReadCertRequestLC(const TDesC& aCertReqObjectName)
+    {
+    RFile file;
+    User::LeaveIfError(file.Open(iFileSession, aCertReqObjectName, EFileRead));
+    CleanupClosePushL(file);
+
+    TInt requestSize(0);
+    User::LeaveIfError(file.Size(requestSize));
+    
+    HBufC8* requestData = HBufC8::NewLC(requestSize);
+    TPtr8 requestDataPtr(requestData->Des());
+    
+    User::LeaveIfError(file.Read(requestDataPtr));
+
+    CleanupStack::Pop(requestData);
+    CleanupStack::PopAndDestroy(); //file
+    
+    CleanupStack::PushL(requestData);
+    
+    return requestData;
+    }
+
+
+void CCertificateRequestStore::DeleteCertRequestL(const TDesC& aCertReqObjectName)
+    {
+    User::LeaveIfError(iFileSession.Delete(aCertReqObjectName));
+    }
+
+
+TFileName* CCertificateRequestStore::GetNewCertReqFileNameLC()
+    {
+    TFileName* fileName = new (ELeave) TFileName;
+    CleanupDeletePushL(fileName);
+             
+    TInt i = 0;    
+    do
+        {
+        fileName->Format(KCertReqFileNameFormat, i);
+        if (!BaflUtils::FileExists(iFileSession, *fileName))
+            {
+            break;
+            }
+        ++i;
+        }while(i > 0); //loop infinite.
+            
+    return fileName;
+    }