javaextensions/satsa/apdu/src.s60/cstsfiledatamanager.cpp
branchRCL_3
changeset 14 04becd199f91
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javaextensions/satsa/apdu/src.s60/cstsfiledatamanager.cpp	Tue Apr 27 16:30:29 2010 +0300
@@ -0,0 +1,364 @@
+/*
+* Copyright (c) 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:
+ *
+*/
+
+
+// INCLUDE FILES
+#include "cstsfiledatamanager.h"
+#include <JavaUtils.h>
+
+#include <utf.h>
+#include "cstsauthtype.h"
+#include "cstspinattributes.h"
+
+namespace java
+{
+namespace satsa
+{
+
+// CONSTANTS
+//max size got from PKCS#15 standard, TokenInfo.label field description
+const TInt KSTSWIMLabelMaxLength = 255;
+const TInt KSTSWIMPathMaxLength = 6;
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CSTSFileDataManager::CSTSFileDataManager
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CSTSFileDataManager::CSTSFileDataManager() :
+        CActive(EPriorityNormal), iWimLabelAndPathDone(EFalse)
+{
+    CActiveScheduler::Add(this);
+    iState = ENotReady;
+}
+
+// -----------------------------------------------------------------------------
+// CSTSFileDataManager::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CSTSFileDataManager::ConstructL()
+{
+    iWait = new(ELeave) CActiveSchedulerWait;
+    iMidpProv = CWimJavaUtils::NewL();
+}
+
+// -----------------------------------------------------------------------------
+// CSTSFileDataManager::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CSTSFileDataManager* CSTSFileDataManager::NewL()
+{
+    CSTSFileDataManager* self = new(ELeave) CSTSFileDataManager();
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+    return self;
+}
+
+// Destructor
+CSTSFileDataManager::~CSTSFileDataManager()
+{
+
+    delete iMidpProv;
+    delete iWait;
+
+    delete iACFData;
+    delete iACIFData;
+    delete iWimPath;
+    delete iWimLabel16;
+
+}
+
+// -----------------------------------------------------------------------------
+// CSTSFileDataManager::InitializeL
+//
+// -----------------------------------------------------------------------------
+void CSTSFileDataManager::InitializeL()
+{
+    iMidpProv->Initialize(iStatus);
+    iState = EInitializing;
+    WaitAndCheckL();
+}
+
+// -----------------------------------------------------------------------------
+// CSTSFileDataManager::RetrieveACIFContentL
+//
+// -----------------------------------------------------------------------------
+const TDesC8& CSTSFileDataManager::RetrieveACIFContentL()
+{
+    TInt fileSize = 0;
+    iMidpProv->GetACIFSize(fileSize, iStatus);
+    iState = EGettingACIFSize;
+    WaitAndCheckL();
+
+    //allocate buffer for file data
+    HBufC8* tmp = HBufC8::NewL(fileSize);
+    delete iACIFData;
+    iACIFData = tmp;
+
+    TPtr8 wholeData(iACIFData->Des());
+
+    iMidpProv->RetrieveACIFContent(wholeData, iStatus);
+    iState = ERetrievingACIF;
+    WaitAndCheckL();
+
+    return *iACIFData;
+
+}
+
+// -----------------------------------------------------------------------------
+// CSTSFileDataManager::RetrieveACFContentL
+//
+// -----------------------------------------------------------------------------
+const TDesC8& CSTSFileDataManager::RetrieveACFContentL(
+    const TDesC8& aFileIdOrPath)
+{
+    TInt fileSize = 0;
+    iMidpProv->GetACFSize(fileSize, aFileIdOrPath, iStatus);
+    iState = EGettingACFSize;
+    WaitAndCheckL();
+    //allocate buffer for file data
+    HBufC8* tmp = HBufC8::NewL(fileSize);
+    delete iACFData;
+    iACFData = tmp;
+
+    TPtr8 wholeData(iACFData->Des());
+
+    iMidpProv->RetrieveACFContent(wholeData, aFileIdOrPath, iStatus);
+    iState = ERetrievingACF;
+    WaitAndCheckL();
+
+    return *iACFData;
+
+}
+
+// -----------------------------------------------------------------------------
+// CSTSFileDataManager::GetAuthObjsInfoL
+//
+// -----------------------------------------------------------------------------
+void CSTSFileDataManager::GetAuthObjectsL(CArrayPtr<CSTSAuthType>* aAuthTypes,
+        const RArray<TInt>& aAuthIdList)
+{
+    TInt auhtIdCount = aAuthIdList.Count();
+
+    if (auhtIdCount > 0)
+    {
+
+        RArray<TJavaPINParams> authObjsInfoList(auhtIdCount);
+
+        iMidpProv->GetAuthObjsInfo(aAuthIdList, authObjsInfoList, iStatus);
+        iState = EGettingAuthObjsInfo;
+        WaitAndCheckL();
+
+        //make conversion to own struct
+        TInt count = authObjsInfoList.Count();
+
+        for (TInt i = 0; i < count; i++)
+        {
+            //creates authType and add values
+            CSTSAuthType* currentObject = CSTSAuthType::NewLC();
+            currentObject->SetAuthIDL(authObjsInfoList[i].iAuthId);
+            currentObject->SetLabelL(authObjsInfoList[i].iPINLabel);
+
+            CSTSPinAttributes* pinAttr = CSTSPinAttributes::NewLC(
+                                             authObjsInfoList[i].iPinType,
+                                             authObjsInfoList[i].iMinLength,
+                                             authObjsInfoList[i].iStoredLength,
+                                             authObjsInfoList[i].iMaxLength,
+                                             authObjsInfoList[i].iPinReference,
+                                             authObjsInfoList[i].iPadChar, authObjsInfoList[i].iFlags);
+
+            currentObject->SetPinAttributesL(*pinAttr);
+
+            CleanupStack::PopAndDestroy(pinAttr);
+
+            //append authType to the parameter array (ownership transferred)
+            aAuthTypes->AppendL(currentObject);
+            CleanupStack::Pop(currentObject);
+
+        }
+
+        authObjsInfoList.Close();
+
+    }
+
+}
+
+// -----------------------------------------------------------------------------
+// CSTSFileDataManager::RetrieveWIMLabelL
+//
+// -----------------------------------------------------------------------------
+const TDesC& CSTSFileDataManager::RetrieveWIMLabelL()
+{
+    doRetrieveWIMLabelAndPathL();
+    return *iWimLabel16;
+
+}
+
+// -----------------------------------------------------------------------------
+// CSTSFileDataManager::RetrieveWIMPathL
+//
+// -----------------------------------------------------------------------------
+const TDesC8& CSTSFileDataManager::RetrieveWIMPathL()
+{
+    doRetrieveWIMLabelAndPathL();
+    return *iWimPath;
+}
+
+// -----------------------------------------------------------------------------
+// CSTSFileDataManager::WaitAndCheckL
+//
+// -----------------------------------------------------------------------------
+void CSTSFileDataManager::WaitAndCheckL()
+{
+
+    SetActive();
+
+    if (!iWait->IsStarted())
+    {
+        iWait->Start();
+    }
+    User::LeaveIfError(iError);
+}
+
+// -----------------------------------------------------------------------------
+// CSTSFileDataManager::doRetrieveWIMLabelAndPathL
+// Retrieves WIM label and path and saves values to member variables.
+// Saves information that retrieve is done and does not do retrieve if it is
+// already done.
+// -----------------------------------------------------------------------------
+void CSTSFileDataManager::doRetrieveWIMLabelAndPathL()
+{
+    if (!iWimLabelAndPathDone)
+    {
+        //allocate buffer for WIM label
+        HBufC8* wimLabelBuf = HBufC8::NewLC(KSTSWIMLabelMaxLength);
+        TPtr8 wimLabel(wimLabelBuf->Des());
+
+        //allocate buffer for WIM path
+        HBufC8* tmpPath = HBufC8::NewL(KSTSWIMPathMaxLength);
+        delete iWimPath;
+        iWimPath = tmpPath;
+        TPtr8 wimPath(iWimPath->Des());
+
+        iMidpProv->RetrieveWimLabelAndPath(wimLabel, wimPath, iStatus);
+        iState = EGettingWimLabelAndPath;
+        WaitAndCheckL();
+
+        //convert label to TDesC format
+        //allocate member buffer for WIM label
+        HBufC16* tmpLabel16 = HBufC16::NewL(wimLabel.Length());
+        delete iWimLabel16;
+        iWimLabel16 = tmpLabel16;
+        TPtr16 label16(iWimLabel16->Des());
+
+        TInt err = CnvUtfConverter::ConvertToUnicodeFromUtf8(label16, wimLabel);
+        User::LeaveIfError(err);
+        CleanupStack::PopAndDestroy(wimLabelBuf);
+        //save information that both has retrieved
+        iWimLabelAndPathDone = ETrue;
+    }
+}
+
+// -----------------------------------------------------------------------------
+// CSTSFileDataManager::RunL
+//
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CSTSFileDataManager::RunL()
+{
+    iError = iStatus.Int();
+    iState = EReady;
+    iWait->AsyncStop();
+}
+
+// -----------------------------------------------------------------------------
+// CSTSFileDataManager::DoCancel
+// Cancels all possible active actions
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CSTSFileDataManager::DoCancel()
+{
+    switch (iState)
+    {
+    case EInitializing:
+    {
+        iMidpProv->CancelInitialize();
+        break;
+    }
+    case EGettingACIFSize:
+    {
+        iMidpProv->CancelGetACIFSize();
+        break;
+    }
+    case ERetrievingACIF:
+    {
+        iMidpProv->CancelRetrieveACIFContent();
+        break;
+    }
+    case EGettingACFSize:
+    {
+        iMidpProv->CancelGetACFSize();
+        break;
+    }
+    case ERetrievingACF:
+    {
+        iMidpProv->CancelRetrieveACFContent();
+        break;
+    }
+    case EGettingAuthObjsInfo:
+    {
+        iMidpProv->CancelGetAuthObjsInfo();
+        break;
+    }
+    case EGettingWimLabelAndPath:
+    {
+        iMidpProv->CancelRetrieveWimLabelAndPath();
+        break;
+    }
+
+    default:
+    {
+        // nothing to cancel
+    }
+    }
+    iState = EReady;
+    iError = KErrCancel;
+}
+
+// -----------------------------------------------------------------------------
+// CSTSFileDataManager::RunError
+// If leave occures in RunL,this method is called.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CSTSFileDataManager::RunError(TInt /*aError*/)
+{
+    //must return KErrNone
+    return KErrNone;
+}
+
+} // namespace satsa
+} // namespace java
+//  End of File