internal static int InterpretEnd(byte[] decodedData) { int retVal = 0; int index = 0; try { int len = decodedData.Length; int tagLen = 0; String tagValStr = ""; while (true) { if (index > (len - GMPConstants.LEN_DATA_TAG)) { break; } //get next tag int tag = MessageBuilder.GetTag(decodedData, index, out index); switch (tag) { case GMPCommonTags.TAG_RESP_CODE: tagLen = MessageBuilder.GetLength(decodedData, index, out index); tagValStr = MessageBuilder.ByteArrayToString(decodedData, index, tagLen); index += tagLen; if (!tagValStr.Equals(GMPResCodes.SUCCESS)) { throw new Exception("İşlem başarısız"); } break; } } } catch { retVal = -1; } return(retVal); }
/// <summary> /// Parse TLV data /// </summary> /// <param name="data"></param> /// byte array of tlv /// <returns>parsed tlv class</returns> internal static TLV[] Parse(byte[] bytesRead) { int index = 0; List <TLV> tlvList = new List <TLV>(); //int len = MessageBuilder.GetLength(bytesRead, index, out index); while (index < bytesRead.Length) { int tag = MessageBuilder.GetTag(bytesRead, index, out index); if (tag == 14675986) { break; } int tagLenValue = MessageBuilder.GetLength(bytesRead, index, out index); byte[] value = new byte[tagLenValue]; Array.Copy(bytesRead, index, value, 0, tagLenValue); index += tagLenValue; tlvList.Add(new TLV(tag, tagLenValue, value)); } return(tlvList.ToArray()); }
internal static RSAItems InterpretRSA(byte[] identityBytes) { int index = 0; RSAItems rsaItems = new RSAItems(); rsaItems.DevInfo = new DeviceInfo(); try { int len = MessageBuilder.GetLength(identityBytes, index, out index); int tagLen = 0; String tagValStr = ""; while (true) { if (index > (len - GMPConstants.LEN_DATA_TAG)) { break; } //get next tag int tag = MessageBuilder.GetTag(identityBytes, index, out index); int tagVal = 0; switch (tag) { case GMPCommonTags.TAG_SEQUNCE: tagLen = MessageBuilder.GetLength(identityBytes, index, out index); tagVal = MessageBuilder.ConvertBcdToInt(identityBytes, index, tagLen); index += tagLen; rsaItems.SeqNumber = tagVal; break; case GMPDataTags.DT_MOD_KEY: tagLen = MessageBuilder.GetLength(identityBytes, index, out index); rsaItems.Modulus = MessageBuilder.GetBytesFromOffset(identityBytes, index, tagLen); index += tagLen; break; case GMPDataTags.DT_EXP_KEY: tagLen = MessageBuilder.GetLength(identityBytes, index, out index); rsaItems.Exponent = MessageBuilder.GetBytesFromOffset(identityBytes, index, tagLen); index += tagLen; break; case GMPDataTags.DT_ECR_BRAND: tagLen = MessageBuilder.GetLength(identityBytes, index, out index); tagValStr = MessageBuilder.ByteArrayToString(identityBytes, index, tagLen); index += tagLen; rsaItems.DevInfo.DevBrand = tagValStr; break; case GMPDataTags.DT_ECR_MODEL: tagLen = MessageBuilder.GetLength(identityBytes, index, out index); tagValStr = MessageBuilder.ByteArrayToString(identityBytes, index, tagLen); index += tagLen; rsaItems.DevInfo.DevModel = tagValStr; break; case GMPCommonTags.TAG_RESP_CODE: tagLen = MessageBuilder.GetLength(identityBytes, index, out index); tagValStr = MessageBuilder.ByteArrayToString(identityBytes, index, tagLen); index += tagLen; if (!tagValStr.Equals(GMPResCodes.SUCCESS)) { throw new Exception("İşlem başarısız"); } break; case GMPDataTags.DT_ECR_SERIAL: tagLen = MessageBuilder.GetLength(identityBytes, index, out index); tagValStr = MessageBuilder.ByteArrayToString(identityBytes, index, tagLen); index += tagLen; rsaItems.DevInfo.TerminalNo = tagValStr; break; default: tagLen = MessageBuilder.GetLength(identityBytes, index, out index); index += tagLen; break; } } } catch { rsaItems.SeqNumber = -1; } //if no response code //rsaItems.SeqNumber = -1; return(rsaItems); }
public FPUResponse(byte[] bytesRead, bool extractError) { int index = 0; int msgType = 0; try { //first 2 bytes len byte lrc = 0; for (int i = 0; i < (bytesRead.Length - 1); i++) { lrc ^= bytesRead[i]; } if (bytesRead[bytesRead.Length - 1] != lrc) { // Throw CRCException throw new Exception("LRC not match"); } index = 0; //TERMINAL SERIAL List <byte> serial = new List <byte>(); for (int i = 0; i < GMPConstants.LEN_SERIAL; i++) { serial.Add(bytesRead[index + i]); } this.fiscalId = Encoding.ASCII.GetString(serial.ToArray()); index += GMPConstants.LEN_SERIAL; //MESSAGE TYPE msgType = MessageBuilder.ByteArrayToHex(bytesRead, index, 3); /* get message len */ index += 3; if (msgType == Identifier.KEY_RESPONSE) { int tempIndex = 0; int len = MessageBuilder.GetLength(bytesRead, index, out tempIndex); tags = MessageBuilder.GetBytesFromOffset(bytesRead, index, len + tempIndex - index); return; } if (msgType != RESPONSE_MSG_ID) { if (msgType != Identifier.TRIPLEDES_RESPONSE) { throw new InvalidOperationException("Response Message Incorrect"); } } } catch (InvalidOperationException) { throw new Exception("Message id error"); } catch (Exception ex) { throw new Exception("Invalid data"); } try { int len = MessageBuilder.GetLength(bytesRead, index, out index); if (FiscalPrinter.TripleKey != null && msgType == RESPONSE_MSG_ID) { byte[] msgBuffer = MessageBuilder.GetBytesFromOffset(bytesRead, index, len); byte[] desData = MessageBuilder.DecryptTriple(msgBuffer, msgBuffer.Length, FiscalPrinter.TripleKey); bytesRead = desData; body = bytesRead; index = 0; len = bytesRead.Length; } int msgOffset = index; int lastIndex = index; while (index < len + msgOffset) { //get next tag lastIndex = index; int tag = MessageBuilder.GetTag(bytesRead, index, out index); switch (tag) { case GMPCommonTags.TAG_SEQUNCE: int lenSeq = MessageBuilder.GetLength(bytesRead, index, out index); int seq = MessageBuilder.ConvertBcdToInt(bytesRead, index, lenSeq); index += lenSeq; this.seqNum = seq; break; case FPUDataTags.ERROR: int lenErrorTag = MessageBuilder.GetLength(bytesRead, index, out index); this.errCode = bytesRead[index]; // MessageBuilder.ConvertBcdToInt(bytesRead, index, lenErrorTag); index += lenErrorTag; break; case FPUDataTags.STATE: int lenStateTag = MessageBuilder.GetLength(bytesRead, index, out index); int state = MessageBuilder.ConvertBcdToInt(bytesRead, index, lenStateTag); index += lenStateTag; this.fpuState = (State)state; break; case FPUDataTags.ENDOFMSG: int lenEndMsg = MessageBuilder.GetLength(bytesRead, index, out index); index = len; break; case FPUDataTags.INDEX: break; default: int tagLenValue = MessageBuilder.GetLength(bytesRead, index, out index); int buffIndx = 0; int counter = 0; int tagIdSize = (index - lastIndex); if (tags != null && tags.Length > 0) { buffIndx = tags.Length; int buffSize = tags.Length + tagLenValue + tagIdSize; Array.Resize(ref tags, buffSize); } else { tags = new byte[tagLenValue + tagIdSize]; } while (buffIndx < tags.Length) { tags[buffIndx] = bytesRead[counter + lastIndex]; counter++; buffIndx++; } index += tagLenValue; break; } } } catch (Exception ex) { throw new Exception("Invalid Data"); } if (!extractError) { return; } #if NONE if (errCode != 0) { throw new FPUException("" + errCode); } #endif try { switch (errCode) { case 0: if (this.SequenceNum < 0) { throw new InvalidOperationException("Invalid Data"); } return; case 1: // ERR_DATA_CORRUPT : Veri eksik gelmiş (uzunluk kadar gelmeli) throw new FramingException(); case 2: // ERR_CRC : Veri değişmiş throw new ChecksumException(); case 3: // ERR_INVALID_STATE : Uygulama durumu uygun değil switch (fpuState) { case State.ON_PWR_RCOVR: throw new PowerFailureException(); case State.IN_SERVICE: // throw new SVCPasswordOrPointException(); case State.SRV_REQUIRED: throw new BlockingException(GetErrorMessage(errCode)); } throw new CmdSequenceException((int)fpuState); case 4: // ERR_INVALID_CMD : Böyle bir komut desteklenmiyor throw new UndefinedFunctionException(); case 5: // ERR_INVALID_PRM : Parametre geçersiz throw new ParameterException(); case 6: // ERR_OPERATION_FAILED : Operasyon başarısız throw new InvalidOperationException("Error Code" + errCode); case 7: // ERR_CLEAR_REQUIRED : SİLME gerekli (hata sonrası) //return FiscalPrinter.Printer.InterruptReport(); throw new ClearRequiredException(); //throw new ClearRequired("Error code : " + errCode); case 8: // ERR_NO_PAPER : Kağıt yok throw new NoReceiptRollException(); case 11: // ERR_FM_LOAD_ERROR : Mali bellek bilgileri alınırken hata oluştu throw new FiscalCommException("Error code : " + errCode); case 12: // ERR_FM_REMOVED : Mali bellek takılı değil throw new FiscalCommException("Error code : " + errCode); case 13: // ERR_FM_MISMATCH : Mali bellek uyumsuzluğu throw new FiscalUndefinedException("Error code : " + errCode); case 14: // ERR_NEW_FM : Mali bellek formatlanmalı throw new FMNewException(); case 15: // ERR_FM_INIT : Mali bellek formatlanırken hata oluştu case 16: // ERR_FM_FISCALIZE : Mali bellek malileştirme yapılamadı throw new PrinterException("Error code : " + errCode); case 17: // ERR_FM_DAILY_LIMIT : Günlük z limit throw new LimitExceededOrZRequiredException("Error code : " + errCode); case 18: // ERR_FM_FULL : Mali bellek doldu throw new FMFullException(); case 19: // ERR_FM_FORMATTED : Mali bellek daha önce formatlanmış throw new AlreadyFiscalizedException(); case 20: // ERR_FM_CLOSED : Mali bellek kapatılmış throw new FiscalClosedException(); case 21: // ERR_FM_INVALID : Geçersiz mali bellek throw new FiscalUndefinedException(); case 22: // ERR_FM_SAM_CARD : Sertifika bilgisi SAM karttan alınamadı throw new PrinterException("Error code : " + errCode); case 31: // ERR_EJ_LOAD : Ekü bilgileri alınırken hata oluştu case 32: // ERR_EJ_REMOVED : Ekü çıkarıldı throw new EJCommException(); case 33: // ERR_EJ_MISMATCH : Ekü kasaya ait değil throw new EJIdMismatchException("Ej id does not match"); case 34: // ERR_EJ_OLD : Eski ekü (Sadece ekü raporları) throw new EJChangedException(); case 35: // ERR_NEW_EJ : Yeni ekü takıldı, onay bekliyor throw new EJFormatException(); case 36: // ERR_EJ_ZREQUIRED : Ekü değiştirilemez, z gerekli throw new NoEJAreaException(); case 37: // ERR_EJ_INIT : Yeni eküye geçilemiyor throw new EJWaitingForInitException(); case 38: // ERR_EJ_FULL : Ekü doldu throw new EJFullException(); case 39: // ERR_EJ_FORMATTED : Ekü daha önce formatlanmış throw new EJIdMismatchException("Formatted ej"); case 51: // ERR_RCPT_TOTAL_LIMIT : Fiş limiti aşıldı throw new ReceiptLimitExceededException(); case 52: // ERR_RCPT_SALE_COUNT : Fiş kalem adedi aşıldı throw new PrinterException("MAKSİMUM SATIR\nSAYISI AŞILDI"); case 53: // ERR_INVALID_SALE : Satış işlemi geçersiz case 54: // ERR_INVALID_VOID : İptal işlemi geçersiz throw new InvalidOperationException("Error Code" + errCode); case 55: // ERR_INVALID_CORR : Düzeltme işlemi yapılamaz case 56: // ERR_INVALID_ADJ : İndirim/Artırım işlemi yapılamaz throw new AdjustmentException(); case 57: // ERR_INVALID_PAYMENT : Ödeme işlemi geçersiz throw new InvalidPaymentException(); case 58: // ERR_PAYMENT_LIMIT : Asgari ödeme sayısı aşıldı throw new InvalidOperationException("Error Code" + errCode); case 59: // ERR_DAILY_PLU_LIMIT : Günlük ürün satışı aşıldı throw new LimitExceededOrZRequiredException(); case 71: // ERR_VAT_NOT_DEFINED : Kdv oranı tanımsız case 72: // ERR_SECTION_NOT_DEFINED : Kısım tanımlanmamış throw new UndefinedFunctionException(); case 73: // ERR_PLU_NOT_DEFINED : Tanımsız ürün throw new ProductNotFoundException(); case 74: // ERR_CREDIT_NOT_DEFINED : Kredili ödeme bilgisi eksik/geçersiz case 75: // ERR_CURRENCY_NOT_DEFINED : Dövizli ödeme bilgisi eksik/geçersiz throw new System.IO.InvalidDataException(PosMessage.PAYMENT_INVALID); case 76: // ERR_EJSEARCH_NO_RESULT : Eküde kayıt bulunamadı throw new NoDocumentFoundException(); case 77: // ERR_FMSEARCH_NO_RESULT : Mali bellekte kayıt bulunamadı throw new NoProperZFound(); case 78: // ERR_SUBCAT_NOT_DEFINED : Alt ürün grubu tanımlı değil throw new NoDocumentFoundException(); case 91: // ERR_CASHIER_AUTH : Kasiyer yetkisi yetersiz throw new CashierAutorizeException(tags); case 92: // ERR_HAS_SALE : Satış var (Örn: Kdv değişemez) throw new InvalidOperationException("Error Code" + errCode); case 93: // ERR_HAS_RECEIPT : Son fiş z değil (Örn: Logo değişemez) throw new ZRequiredException(); case 94: // ERR_NOT_ENOUGH_MONEY : Kasada yeterli para yok throw new NegativeResultException(); case 95: // ERR_DAILY_RCPT_COUNT : Günlük fiş sayısı limit aşıldı throw new LimitExceededOrZRequiredException("Error Code" + errCode); case 96: // ERR_DAILY_TOTAL_LIMIT : Günlük toplam aşıldı throw new LimitExceededOrZRequiredException("Error Code" + errCode); case 97: // ERR_ECR_NONFISCAL : Kasa mali değil throw new EcrNonFiscalException(); case 111: // ERR_LINE_LEN : Satır uzunluğu beklenenden fazla case 112: // ERR_INVALID_VATRATE : Kdv oranı geçersiz case 113: // ERR_INVALID_DEPTNO : Dept numarası geçersiz case 114: // ERR_INVALID_PLUNO : Plu numarası geçersiz case 115: // ERR_INVALID_NAME : Geçersiz tanım (ürün adı, kısım adı, kredi adı...vs) case 116: // ERR_INVALID_BARCODE : Barkod geçersiz case 117: // ERR_INVALID_OPTION : Geçersiz opsiyon throw new ParameterException("Error code : " + errCode); case 118: // ERR_TOTAL_MISMATCH : Toplam tutmuyor throw new SubtotalNotMatchException(); case 119: // ERR_INVALID_QUANTITY : Geçersiz miktar case 120: // ERR_INVALID_AMOUNT : Geçersiz tutar throw new ParameterException("Error code : " + errCode); case 121: // ERR_INVALID_FISCAL_ID : //Mali numara hatalı throw new FiscalMismatchException("Error code : " + errCode); case 131: // Kapaklar açıldı case 132: // Mali bellek mesh zarar verildi case 133: // HUB mesh zarar verildi throw new BlockingException(GetErrorMessage(errCode)); case 134: // Z Raporu gerekli throw new ZRequiredException("Z RAPORU ALINMAMIS\nRAPOR ALINIZ(GiRiS)"); case 135: // Ekü tak ve yeniden başlat case 136: // Sertifika yükelenemedi case 137: // Tarih-Saat ayarla case 138: // Günlük bellek ile mali bellek uyuşmazlığı case 139: // DB uyumsuzluğu case 140: // Log hatalı case 141: // SRAM hatalı case 142: // Sertifika uyumsuzluğu case 143: // Versiyon hatası case 144: // Günlük log sayısı aştı throw new BlockingException(GetErrorMessage(errCode)); case 145: // YAZARKASAYI YENİDEN BAŞLAT"}, throw new BlockingException(GetErrorMessage(errCode)); break; case 146: // KASİYER/SERVİS GÜNLÜK YANLIŞ ŞİFRE GİRİŞİ SAYISINI AŞTI"} throw new LimitExceededOrZRequiredException(); break; case 147: // MALİLEŞTİRME YAPILDI. YENİDEN BAŞLAT"}, throw new BlockingException(GetErrorMessage(errCode)); break; case 148: // GİB'e BAĞLANILAMADI. TEKRAR DENE(İŞLEM DURDURMA)"} throw new CashierAutorizeException("GİB'e BAĞLANILAMADI\nTEKRAR DENE"); break; default: throw new PosException("Error code : " + errCode); } } catch (PosException pe) { pe.ErrorCode = errCode; throw pe; } }
internal static FPUMessage Parse(byte[] bytesRead) { FPUMessage fpuMessage = new FPUMessage(); int index = 0; int len = bytesRead.Length; int lastGrpId = 0; byte[] value; while (true) { try { if (index >= (len)) { break; } //get next tag int currIndex = index + 1; int tag = MessageBuilder.GetTag(bytesRead, index, out index); int tagLength = MessageBuilder.GetLength(bytesRead, index, out index); if (tag == FPUDataTags.ENDOFMSG) { index += tagLength; continue; } value = new byte[tagLength]; Array.Copy(bytesRead, index, value, 0, tagLength); // if it is tag if (index - currIndex == GMPConstants.LEN_DATA_TAG) { TLV tlv = new TLV(tag, tagLength, value); // check there is defined group id before if (lastGrpId > 0) { TLVGroup matchTlv = fpuMessage.FindGroup(lastGrpId); if (matchTlv == null) { matchTlv = new TLVGroup(tag); } matchTlv.Add(tlv); } else { fpuMessage.AddTag(tlv); } index += tagLength; } else { lastGrpId = tag; fpuMessage.AddGroup(new TLVGroup(tag)); } } catch (System.Exception ex) { } } return(fpuMessage); }