diff --git a/app/src/main/java/com/mob/utsmyanmar/ui/dashboard/DashboardScreen.kt b/app/src/main/java/com/mob/utsmyanmar/ui/dashboard/DashboardScreen.kt index 87ac2cd..a25c389 100644 --- a/app/src/main/java/com/mob/utsmyanmar/ui/dashboard/DashboardScreen.kt +++ b/app/src/main/java/com/mob/utsmyanmar/ui/dashboard/DashboardScreen.kt @@ -131,7 +131,7 @@ fun DashboardScreen2( val signOnProcess = EchoTestProcess.getInstance() val request = when (activeHostAction) { "Echo Test" -> signOnProcess.enqueue(false) - "Log-Off" -> signOnProcess.enqueueLogOff() + "Sign-Off" -> signOnProcess.enqueueLogOff() else -> signOnProcess.enqueueLogOn() } request.startSignOn(object : SignOnListener { @@ -262,40 +262,10 @@ fun DashboardScreen2( ) Item( - title = "Echo Test", subTitle = "Test Connection Status", + title = "Sign-Off", subTitle = "Sign off from System", onClick = { scope.launch { drawerState.close() } - openHostActionDialog("Echo Test") - }, - leadingIcon = { - Icon( - painterResource(R.drawable.ic_up_down_arrow), - contentDescription = "icon", - tint = Color.LegacyRed - ) - }, - trailingIcon = {}, - ) - Item( - title = "Log-On", subTitle = "Log on to System", - onClick = { - scope.launch { drawerState.close() } - openHostActionDialog("Log-On") - }, - leadingIcon = { - Icon( - painterResource(R.drawable.ic_lock), - contentDescription = "icon", - tint = Color.LegacyRed - ) - }, - trailingIcon = {}, - ) - Item( - title = "Log-Off", subTitle = "Log off from System", - onClick = { - scope.launch { drawerState.close() } - openHostActionDialog("Log-Off") + openHostActionDialog("Sign-Off") }, leadingIcon = { Icon( diff --git a/paylibs/src/main/java/com/utsmyanmar/paylibs/isobuilder/DecodePackage.java b/paylibs/src/main/java/com/utsmyanmar/paylibs/isobuilder/DecodePackage.java index 32ae247..618cd5d 100644 --- a/paylibs/src/main/java/com/utsmyanmar/paylibs/isobuilder/DecodePackage.java +++ b/paylibs/src/main/java/com/utsmyanmar/paylibs/isobuilder/DecodePackage.java @@ -353,40 +353,45 @@ public class DecodePackage { // Get the value of the variable length part if (outField.getLengthType() > 0) { int varLen; - if( hostName == HostName.BPC) { + if (hostName == HostName.BPC) { varLen = outField.getLengthType(); + } else if (outField.getDataType() == FieldConfig.SDK_8583_DATA_ASC + && outField.getLengthType() == 2) { + // Mirror EncodePackage MPU ASC packing (F60/F62/F63): + // FieldUtils prepends a 4-digit ASCII length, and encode + // BCD-encodes those 4 digits as a 2-byte length prefix. + varLen = 2; } else { varLen = (outField.getLengthType() + 1) / 2; } - // Get the length of the byte array -// int varLen = (outField.getLengthType() + 1) / 2; -// varLen = outField.getLengthType(); - byte[] varValue = new byte[varLen]; - if(i==62 || i==63){ - tmpLen++; - } + if (tmpLen + varLen > body.length) { + if (printLog) { + LogUtil.e(TAG, "field pos:" + i + " length prefix truncated. tmpLen=" + + tmpLen + " need=" + varLen + " bodyLen=" + body.length); + } + break; + } System.arraycopy(body, tmpLen, varValue, 0, varValue.length); // Length of data length - tmpLen += varLen; //tmp len 54 + tmpLen += varLen; // Number of bytes of variable length data int datLen; int bcdLength = 0; - if( hostName == HostName.BPC) { - bcdLength = Integer.parseInt(new String(varValue)); //31 + if (hostName == HostName.BPC) { + bcdLength = Integer.parseInt(new String(varValue)); } else { - bcdLength = Utils.bcdToint(varValue); //31 -// bcdLength = Integer.parseInt(new String(varValue)); //31 + bcdLength = Utils.bcdToint(varValue); } // Determine the data type (binary type data is not processed) if (outField.getDataType() == FieldConfig.SDK_8583_DATA_BCD) { - if( hostName == HostName.BPC) { - datLen = bcdLength ; + if (hostName == HostName.BPC) { + datLen = bcdLength; } else { datLen = (bcdLength / 2) + (bcdLength % 2); } @@ -403,20 +408,14 @@ public class DecodePackage { // Take the value of the variable length part。 nextData = new byte[datLen]; - //tmp len 55 - - try { - if(hostName == HostName.BPC) { - System.arraycopy(body, tmpLen, nextData, 0, datLen); - } else { -// System.arraycopy(body, tmpLen, nextData, 0, body.length-tmpLen); - System.arraycopy(body, tmpLen, nextData, 0, datLen); - } - -// - } catch (IndexOutOfBoundsException e){ - e.printStackTrace(); - System.arraycopy(body, tmpLen, nextData, 0, datLen); + int available = Math.max(0, body.length - tmpLen); + int copyLen = Math.min(datLen, available); + if (copyLen < datLen && printLog) { + LogUtil.e(TAG, "field pos:" + i + " data truncated. need=" + + datLen + " available=" + available + " tmpLen=" + tmpLen); + } + if (copyLen > 0) { + System.arraycopy(body, tmpLen, nextData, 0, copyLen); } // Data length diff --git a/paylibs/src/main/java/com/utsmyanmar/paylibs/isobuilder/builderx/ISOMsgX.java b/paylibs/src/main/java/com/utsmyanmar/paylibs/isobuilder/builderx/ISOMsgX.java index bd7c630..fc56b53 100644 --- a/paylibs/src/main/java/com/utsmyanmar/paylibs/isobuilder/builderx/ISOMsgX.java +++ b/paylibs/src/main/java/com/utsmyanmar/paylibs/isobuilder/builderx/ISOMsgX.java @@ -121,6 +121,9 @@ public class ISOMsgX extends BaseISOMsgX{ case AUTHORIZATION_COMPLETE: MTI = "0220"; break; + case CZ_SIGN_OFF: + MTI = "0820"; + break; } Map rm = EncodePackage.preAssemblyBase(bitmap,hostName); diff --git a/paylibs/src/main/java/com/utsmyanmar/paylibs/sign_on/EchoTestProcess.java b/paylibs/src/main/java/com/utsmyanmar/paylibs/sign_on/EchoTestProcess.java index a3730e8..67bd432 100644 --- a/paylibs/src/main/java/com/utsmyanmar/paylibs/sign_on/EchoTestProcess.java +++ b/paylibs/src/main/java/com/utsmyanmar/paylibs/sign_on/EchoTestProcess.java @@ -264,10 +264,14 @@ public class EchoTestProcess { LogUtil.d(TAG, "Starting TX LOG OFF"); PayDetail payDetail = tradeData.getPayDetail(); + tradeData.setField60("00000028002"); + payDetail.setSettleData("001"); + payDetail.setProcessCode(TransactionsType.LOG_OFF.processCode); payDetail.setTransType(TransactionsType.LOG_OFF.name); payDetail.setTransactionType(TransactionsType.LOG_OFF.value); - byte[] sendBytes = isoMsgX.buildISOPackets(tradeData, BitmapConfig.BPC_ECHO_TEST, MessageType.NETWORK_MANAGEMENT); + + byte[] sendBytes = isoMsgX.buildISOPackets(tradeData, BitmapConfig.CZ_LOG_OFF, MessageType.CZ_SIGN_OFF); ISOSocket.getInstance().enqueue(sendBytes, sendBytes.length,false, new ISOCallback() { @Override diff --git a/paylibs/src/main/java/com/utsmyanmar/paylibs/utils/MessageType.java b/paylibs/src/main/java/com/utsmyanmar/paylibs/utils/MessageType.java index c1220d9..4d95806 100644 --- a/paylibs/src/main/java/com/utsmyanmar/paylibs/utils/MessageType.java +++ b/paylibs/src/main/java/com/utsmyanmar/paylibs/utils/MessageType.java @@ -7,6 +7,8 @@ public enum MessageType { REVERSAL, CZ_REVERSAL, NETWORK_MANAGEMENT, + + CZ_SIGN_OFF, TC_ADVICE, BATCH_UPLOAD, SETTLEMENT, diff --git a/paylibs/src/main/java/com/utsmyanmar/paylibs/utils/iso_utils/BitmapConfig.java b/paylibs/src/main/java/com/utsmyanmar/paylibs/utils/iso_utils/BitmapConfig.java index b80308b..1b686cd 100644 --- a/paylibs/src/main/java/com/utsmyanmar/paylibs/utils/iso_utils/BitmapConfig.java +++ b/paylibs/src/main/java/com/utsmyanmar/paylibs/utils/iso_utils/BitmapConfig.java @@ -202,7 +202,7 @@ public class BitmapConfig { public static final String CZ_PRE_AUTH_VOID="703C058008C08000"; public static final String CZ_PRE_AUTH_COMP="703805802CC08000"; public static final String CZ_PRE_AUTH_COMP_VOID="7038058008C00000"; - + public static final String CZ_LOG_OFF = "0020010000C00012"; public static final String UPI_SALE = "7020058020C09200"; public static final String FINEXUS_BATCH_UPLOAD="703C078008C00200";