javaextensions/satsa/apdu/src.s60/cstscardoperationsfacade.cpp
changeset 21 2a9601315dfc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javaextensions/satsa/apdu/src.s60/cstscardoperationsfacade.cpp	Mon May 03 12:27:20 2010 +0300
@@ -0,0 +1,237 @@
+/*
+* 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 "rmmcustomapi.h"
+#include "cstscardoperationsfacade.h"
+#include <mmtsy_names.h>// TSY and Phone name
+#include "logger.h"
+
+namespace java
+{
+namespace satsa
+{
+
+//  CONSTANTS
+//TApdu info and data
+const TUint8 KSTSTApduInfoLength = 16;
+
+//service types, used for RMmCustomAPI's TApdu info part
+const TUint8 KSTSSendApdu = 79;
+const TUint8 KSTSGetATR = 80;
+
+//application type, used for RMmCustomAPI's TApdu info part
+const TUint8 KSTSAPDUAppTypeJavaApp = 3;
+
+//Empty
+const TUint8 KSTSEmpty = 0x00;
+
+//header + lc + data +le
+const TInt KSTSApduDataMaxLength = 4 + 1 + 0xFF + 1;
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CSTSCardOperationsFacade::CSTSCardOperationsFacade
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CSTSCardOperationsFacade::CSTSCardOperationsFacade() :
+        iCustomAPI(), iInfoPtr(NULL, 0), iDataPtr(NULL, 0), iGSMNetwork(EFalse)
+{
+
+}
+
+// -----------------------------------------------------------------------------
+// CSTSCardOperationsFacade::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CSTSCardOperationsFacade::ConstructL()
+{
+    User::LeaveIfError(iSession.Connect());
+    //Load in the phone device driver
+    User::LeaveIfError(iSession.LoadPhoneModule(KMmTsyModuleName));
+
+    User::LeaveIfError(iPhone.Open(iSession, KMmTsyPhoneName));
+
+    User::LeaveIfError(iCustomAPI.Open(iPhone));
+
+    //find out which network mode phone is using
+    RMobilePhone::TMobilePhoneNetworkMode networkMode;
+    TInt err = iPhone.GetCurrentMode(networkMode);
+
+    if (err == KErrNone && networkMode == RMobilePhone::ENetworkModeGsm)
+    {
+        iGSMNetwork = ETrue;
+    }
+
+    iPhone.Close();
+
+    iInfoBuf = HBufC8::NewL(KSTSTApduInfoLength);
+    iDataBuf = HBufC8::NewL(KSTSApduDataMaxLength);
+
+    iApduReq = new(ELeave) RMmCustomAPI::TApdu();
+}
+
+// -----------------------------------------------------------------------------
+// CSTSCardOperationsFacade::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CSTSCardOperationsFacade* CSTSCardOperationsFacade::NewL()
+{
+    CSTSCardOperationsFacade* self = new(ELeave) CSTSCardOperationsFacade;
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+    return self;
+}
+
+// Destructor
+CSTSCardOperationsFacade::~CSTSCardOperationsFacade()
+{
+    delete iApduReq;
+    delete iDataBuf;
+    delete iInfoBuf;
+
+    iCustomAPI.Close();
+    iSession.Close();
+
+    //is constructor has leaved, this is not closed so do it again
+    iPhone.Close();
+}
+
+// -----------------------------------------------------------------------------
+// CSTSCardOperationsFacade::SendAPDUReq
+//
+// -----------------------------------------------------------------------------
+//
+void CSTSCardOperationsFacade::SendAPDUReq(TRequestStatus& aStatus,
+        TUint8 aCardReaderId, TDes8* aCmdData)
+{
+    LOG(ESATSA, EInfo, "CSTSCardOperationsFacade::SendAPDUReq() called");
+    DoSend(aStatus, KSTSSendApdu, aCardReaderId, aCmdData);
+}
+
+// -----------------------------------------------------------------------------
+// CSTSCardOperationsFacade::GetResponseBytes
+//
+// -----------------------------------------------------------------------------
+//
+void CSTSCardOperationsFacade::GetResponseBytes(TDes8* aRspData)
+{
+    *aRspData = *iApduReq->iData;
+}
+
+// -----------------------------------------------------------------------------
+// CSTSCardOperationsFacade::CancelAPDUReq
+//
+// -----------------------------------------------------------------------------
+//
+void CSTSCardOperationsFacade::CancelAPDUReq()
+{
+    iCustomAPI.CancelAsyncRequest(ECustomSendAPDUReqIPC);
+}
+
+// -----------------------------------------------------------------------------
+// CSTSCardOperationsFacade::GetATRL
+//
+// -----------------------------------------------------------------------------
+//
+void CSTSCardOperationsFacade::GetATR(TDes8& aATR, TUint8 aReader)
+{
+    LOG(ESATSA, EInfo, "CSTSCardOperationsFacade::GetATRL called!");
+    TRequestStatus status;
+    DoSend(status, KSTSGetATR, aReader, &aATR);
+    User::WaitForRequest(status);
+    LOG1(ESATSA, EInfo, "status: %d", status.Int());
+    if (status.Int() != KErrNone)
+    {
+        //null will be returned, if some error occured
+        aATR = KNullDesC8();
+    }
+    else
+    {
+        LOG(ESATSA, EInfo, "Copy the response");
+        //copy ATR data
+        aATR = *iApduReq->iData;
+        LOG(ESATSA, EInfo, "After copying the response");
+
+    }
+
+}
+
+// -----------------------------------------------------------------------------
+// CSTSCardOperationsFacade::DoSend
+//
+// -----------------------------------------------------------------------------
+//
+void CSTSCardOperationsFacade::DoSend(TRequestStatus& aStatus,
+                                      TUint8 aServiceType, TUint8 aReader, TDes8* aCmdData)
+{
+    LOG(ESATSA, EInfo, "CSTSCardOperationsFacade::DoSend() called");
+
+    _LIT(KSTSBufferTooSmall,
+         "CSTSCardOperationsFacade::DoSend: iInfoBuf too small");
+    __ASSERT_ALWAYS((iInfoBuf->Des().MaxLength() >= KSTSTApduInfoLength),
+                    User::Panic(KSTSBufferTooSmall, KErrArgument));
+
+    LOG(ESATSA, EInfo, "Check Comand Data");
+
+    _LIT(KSTSEmptyCommand, "CSTSCardOperationsFacade::DoSend: aCmdData is NULL");
+    __ASSERT_ALWAYS((aCmdData), User::Panic(KSTSEmptyCommand, KErrArgument));
+
+    LOG(ESATSA, EInfo, "Set Info Part");
+    //set info part
+    iInfoBuf->Des().SetLength(0);
+    iInfoBuf->Des().Append(aServiceType);
+    iInfoBuf->Des().Append(aReader);
+    iInfoBuf->Des().Append(KSTSAPDUAppTypeJavaApp);
+    iInfoBuf->Des().Append(KSTSEmpty); //Padding byte, always zero
+
+    iInfoPtr.Set(iInfoBuf->Des());
+    iApduReq->iInfo = &iInfoPtr;
+
+    LOG(ESATSA, EInfo, "Set Data Part");
+    //set data part
+    iDataBuf->Des().SetLength(0);
+    iDataBuf->Des().Append(*aCmdData);
+
+    iDataPtr.Set(iDataBuf->Des());
+    iApduReq->iData = &iDataPtr;
+    LOG(ESATSA, EInfo, "Calling iCustomAPI.SendAPDUReq");
+    iCustomAPI.SendAPDUReq(aStatus, *iApduReq);
+    LOG(ESATSA, EInfo, "--- CSTSCardOperationsFacade::DoSend() ");
+}
+
+// -----------------------------------------------------------------------------
+// CSTSCardOperationsFacade::IsGSMNetwork
+//
+// -----------------------------------------------------------------------------
+//
+TBool CSTSCardOperationsFacade::IsGSMNetwork() const
+{
+    return iGSMNetwork;
+}
+
+} // namespace satsa
+} // namespace java
+//  End of File
+