--- /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
+