int VTDROderMeter::Read(const char* buf) { OderMeter* ptrMeter = (OderMeter*) buf; tNow = ToSystime(ptrMeter->vTime); tInstall = ToSystime(ptrMeter->installTime); startMeter = BCD2INT((const char*) (ptrMeter->startValue), sizeof(ptrMeter->startValue)) / 10.0; sumMeterRaw = ntohl(*(int*)(ptrMeter->oderMeter)); sumMeter = BCD2INT((const char*) (ptrMeter->oderMeter), sizeof(ptrMeter->oderMeter)) / 10.0; return sizeof(*ptrMeter); }
void cNitFilter::Process(u_short Pid, u_char Tid, const u_char *Data, int Length) { SI::NIT nit(Data, false); if (!nit.CheckCRCAndParse()) return; // Some broadcasters send more than one NIT, with no apparent way of telling which // one is the right one to use. This is an attempt to find the NIT that contains // the transponder it was transmitted on and use only that one: int ThisNIT = -1; if (!networkId) { for (int i = 0; i < numNits; i++) { if (nits[i].networkId == nit.getNetworkId()) { if (nit.getSectionNumber() == 0) { // all NITs have passed by for (int j = 0; j < numNits; j++) { if (nits[j].hasTransponder) { networkId = nits[j].networkId; //printf("taking NIT with network ID %d\n", networkId); //XXX what if more than one NIT contains this transponder??? break; } } if (!networkId) { //printf("none of the NITs contains transponder %d\n", Transponder()); return; } } else { ThisNIT = i; break; } } } if (!networkId && ThisNIT < 0 && numNits < MAXNITS) { if (nit.getSectionNumber() == 0) { *nits[numNits].name = 0; SI::Descriptor *d; for (SI::Loop::Iterator it; (d = nit.commonDescriptors.getNext(it)); ) { switch (d->getDescriptorTag()) { case SI::NetworkNameDescriptorTag: { SI::NetworkNameDescriptor *nnd = (SI::NetworkNameDescriptor *)d; #ifdef USE_PROVIDERCHARSET nnd->name.getText(nits[numNits].name, MAXNETWORKNAME, NULL); #else nnd->name.getText(nits[numNits].name, MAXNETWORKNAME); #endif } break; default: ; } delete d; } nits[numNits].networkId = nit.getNetworkId(); nits[numNits].hasTransponder = false; //printf("NIT[%d] %5d '%s'\n", numNits, nits[numNits].networkId, nits[numNits].name); ThisNIT = numNits; numNits++; } } } else if (networkId != nit.getNetworkId()) return; // ignore all other NITs else if (!sectionSyncer.Sync(nit.getVersionNumber(), nit.getSectionNumber(), nit.getLastSectionNumber())) return; if (!Channels.Lock(true, 10)) return; SI::NIT::TransportStream ts; for (SI::Loop::Iterator it; nit.transportStreamLoop.getNext(ts, it); ) { SI::Descriptor *d; SI::Loop::Iterator it2; SI::FrequencyListDescriptor *fld = (SI::FrequencyListDescriptor *)ts.transportStreamDescriptors.getNext(it2, SI::FrequencyListDescriptorTag); int NumFrequencies = fld ? fld->frequencies.getCount() + 1 : 1; int Frequencies[NumFrequencies]; if (fld) { int ct = fld->getCodingType(); if (ct > 0) { int n = 1; for (SI::Loop::Iterator it3; fld->frequencies.hasNext(it3); ) { int f = fld->frequencies.getNext(it3); switch (ct) { case 1: f = BCD2INT(f) / 100; break; case 2: f = BCD2INT(f) / 10; break; case 3: f = f * 10; break; default: ; } Frequencies[n++] = f; } } else NumFrequencies = 1; } delete fld; for (SI::Loop::Iterator it2; (d = ts.transportStreamDescriptors.getNext(it2)); ) { switch (d->getDescriptorTag()) { case SI::SatelliteDeliverySystemDescriptorTag: { SI::SatelliteDeliverySystemDescriptor *sd = (SI::SatelliteDeliverySystemDescriptor *)d; cDvbTransponderParameters dtp; int Source = cSource::FromData(cSource::stSat, BCD2INT(sd->getOrbitalPosition()), sd->getWestEastFlag()); int Frequency = Frequencies[0] = BCD2INT(sd->getFrequency()) / 100; static char Polarizations[] = { 'H', 'V', 'L', 'R' }; dtp.SetPolarization(Polarizations[sd->getPolarization()]); static int CodeRates[] = { FEC_NONE, FEC_1_2, FEC_2_3, FEC_3_4, FEC_5_6, FEC_7_8, FEC_8_9, FEC_3_5, FEC_4_5, FEC_9_10, FEC_AUTO, FEC_AUTO, FEC_AUTO, FEC_AUTO, FEC_AUTO, FEC_NONE }; dtp.SetCoderateH(CodeRates[sd->getFecInner()]); static int Modulations[] = { QAM_AUTO, QPSK, PSK_8, QAM_16 }; dtp.SetModulation(Modulations[sd->getModulationType()]); dtp.SetSystem(sd->getModulationSystem() ? SYS_DVBS2 : SYS_DVBS); static int RollOffs[] = { ROLLOFF_35, ROLLOFF_25, ROLLOFF_20, ROLLOFF_AUTO }; dtp.SetRollOff(sd->getModulationSystem() ? RollOffs[sd->getRollOff()] : ROLLOFF_AUTO); int SymbolRate = BCD2INT(sd->getSymbolRate()) / 10; if (ThisNIT >= 0) { for (int n = 0; n < NumFrequencies; n++) { if (ISTRANSPONDER(cChannel::Transponder(Frequencies[n], dtp.Polarization()), Transponder())) { nits[ThisNIT].hasTransponder = true; //printf("has transponder %d\n", Transponder()); break; } } break; } if (Setup.UpdateChannels >= 5) { bool found = false; bool forceTransponderUpdate = false; for (cChannel *Channel = Channels.First(); Channel; Channel = Channels.Next(Channel)) { if (!Channel->GroupSep() && Channel->Source() == Source && Channel->Nid() == ts.getOriginalNetworkId() && Channel->Tid() == ts.getTransportStreamId()) { int transponder = Channel->Transponder(); found = true; if (!ISTRANSPONDER(cChannel::Transponder(Frequency, dtp.Polarization()), transponder)) { for (int n = 0; n < NumFrequencies; n++) { if (ISTRANSPONDER(cChannel::Transponder(Frequencies[n], dtp.Polarization()), transponder)) { Frequency = Frequencies[n]; break; } } } if (ISTRANSPONDER(cChannel::Transponder(Frequency, dtp.Polarization()), Transponder())) // only modify channels if we're actually receiving this transponder Channel->SetTransponderData(Source, Frequency, SymbolRate, dtp.ToString('S')); else if (Channel->Srate() != SymbolRate || strcmp(Channel->Parameters(), dtp.ToString('S'))) forceTransponderUpdate = true; // get us receiving this transponder } } if (!found || forceTransponderUpdate) { for (int n = 0; n < NumFrequencies; n++) { cChannel *Channel = new cChannel; Channel->SetId(ts.getOriginalNetworkId(), ts.getTransportStreamId(), 0, 0); if (Channel->SetTransponderData(Source, Frequencies[n], SymbolRate, dtp.ToString('S'))) EITScanner.AddTransponder(Channel); else delete Channel; } } } } break; case SI::CableDeliverySystemDescriptorTag: { SI::CableDeliverySystemDescriptor *sd = (SI::CableDeliverySystemDescriptor *)d; cDvbTransponderParameters dtp; int Source = cSource::FromData(cSource::stCable); int Frequency = Frequencies[0] = BCD2INT(sd->getFrequency()) / 10; //XXX FEC_outer??? static int CodeRates[] = { FEC_NONE, FEC_1_2, FEC_2_3, FEC_3_4, FEC_5_6, FEC_7_8, FEC_8_9, FEC_3_5, FEC_4_5, FEC_9_10, FEC_AUTO, FEC_AUTO, FEC_AUTO, FEC_AUTO, FEC_AUTO, FEC_NONE }; dtp.SetCoderateH(CodeRates[sd->getFecInner()]); static int Modulations[] = { QPSK, QAM_16, QAM_32, QAM_64, QAM_128, QAM_256, QAM_AUTO }; dtp.SetModulation(Modulations[min(sd->getModulation(), 6)]); int SymbolRate = BCD2INT(sd->getSymbolRate()) / 10; if (ThisNIT >= 0) { for (int n = 0; n < NumFrequencies; n++) { if (ISTRANSPONDER(Frequencies[n] / 1000, Transponder())) { nits[ThisNIT].hasTransponder = true; //printf("has transponder %d\n", Transponder()); break; } } break; } if (Setup.UpdateChannels >= 5) { bool found = false; bool forceTransponderUpdate = false; for (cChannel *Channel = Channels.First(); Channel; Channel = Channels.Next(Channel)) { if (!Channel->GroupSep() && Channel->Source() == Source && Channel->Nid() == ts.getOriginalNetworkId() && Channel->Tid() == ts.getTransportStreamId()) { int transponder = Channel->Transponder(); found = true; if (!ISTRANSPONDER(Frequency / 1000, transponder)) { for (int n = 0; n < NumFrequencies; n++) { if (ISTRANSPONDER(Frequencies[n] / 1000, transponder)) { Frequency = Frequencies[n]; break; } } } if (ISTRANSPONDER(Frequency / 1000, Transponder())) // only modify channels if we're actually receiving this transponder Channel->SetTransponderData(Source, Frequency, SymbolRate, dtp.ToString('C')); else if (Channel->Srate() != SymbolRate || strcmp(Channel->Parameters(), dtp.ToString('C'))) forceTransponderUpdate = true; // get us receiving this transponder } } if (!found || forceTransponderUpdate) { for (int n = 0; n < NumFrequencies; n++) { cChannel *Channel = new cChannel; Channel->SetId(ts.getOriginalNetworkId(), ts.getTransportStreamId(), 0, 0); if (Channel->SetTransponderData(Source, Frequencies[n], SymbolRate, dtp.ToString('C'))) EITScanner.AddTransponder(Channel); else delete Channel; } } } } break; case SI::TerrestrialDeliverySystemDescriptorTag: { SI::TerrestrialDeliverySystemDescriptor *sd = (SI::TerrestrialDeliverySystemDescriptor *)d; cDvbTransponderParameters dtp; int Source = cSource::FromData(cSource::stTerr); int Frequency = Frequencies[0] = sd->getFrequency() * 10; static int Bandwidths[] = { 8000000, 7000000, 6000000, 0, 0, 0, 0, 0 }; dtp.SetBandwidth(Bandwidths[sd->getBandwidth()]); static int Constellations[] = { QPSK, QAM_16, QAM_64, QAM_AUTO }; dtp.SetModulation(Constellations[sd->getConstellation()]); static int Hierarchies[] = { HIERARCHY_NONE, HIERARCHY_1, HIERARCHY_2, HIERARCHY_4, HIERARCHY_AUTO, HIERARCHY_AUTO, HIERARCHY_AUTO, HIERARCHY_AUTO }; dtp.SetHierarchy(Hierarchies[sd->getHierarchy()]); static int CodeRates[] = { FEC_1_2, FEC_2_3, FEC_3_4, FEC_5_6, FEC_7_8, FEC_AUTO, FEC_AUTO, FEC_AUTO }; dtp.SetCoderateH(CodeRates[sd->getCodeRateHP()]); dtp.SetCoderateL(CodeRates[sd->getCodeRateLP()]); static int GuardIntervals[] = { GUARD_INTERVAL_1_32, GUARD_INTERVAL_1_16, GUARD_INTERVAL_1_8, GUARD_INTERVAL_1_4 }; dtp.SetGuard(GuardIntervals[sd->getGuardInterval()]); static int TransmissionModes[] = { TRANSMISSION_MODE_2K, TRANSMISSION_MODE_8K, TRANSMISSION_MODE_AUTO, TRANSMISSION_MODE_AUTO }; dtp.SetTransmission(TransmissionModes[sd->getTransmissionMode()]); if (ThisNIT >= 0) { for (int n = 0; n < NumFrequencies; n++) { if (ISTRANSPONDER(Frequencies[n] / 1000000, Transponder())) { nits[ThisNIT].hasTransponder = true; //printf("has transponder %d\n", Transponder()); break; } } break; } if (Setup.UpdateChannels >= 5) { bool found = false; bool forceTransponderUpdate = false; for (cChannel *Channel = Channels.First(); Channel; Channel = Channels.Next(Channel)) { if (!Channel->GroupSep() && Channel->Source() == Source && Channel->Nid() == ts.getOriginalNetworkId() && Channel->Tid() == ts.getTransportStreamId()) { int transponder = Channel->Transponder(); found = true; if (!ISTRANSPONDER(Frequency / 1000000, transponder)) { for (int n = 0; n < NumFrequencies; n++) { if (ISTRANSPONDER(Frequencies[n] / 1000000, transponder)) { Frequency = Frequencies[n]; break; } } } if (ISTRANSPONDER(Frequency / 1000000, Transponder())) // only modify channels if we're actually receiving this transponder Channel->SetTransponderData(Source, Frequency, 0, dtp.ToString('T')); else if (strcmp(Channel->Parameters(), dtp.ToString('T'))) forceTransponderUpdate = true; // get us receiving this transponder } } if (!found || forceTransponderUpdate) { for (int n = 0; n < NumFrequencies; n++) { cChannel *Channel = new cChannel; Channel->SetId(ts.getOriginalNetworkId(), ts.getTransportStreamId(), 0, 0); if (Channel->SetTransponderData(Source, Frequencies[n], 0, dtp.ToString('T'))) EITScanner.AddTransponder(Channel); else delete Channel; } } } } break; default: ; } delete d; } } Channels.Unlock(); }
/*********************************************************************** module : [8583协议] function : [把buf中数据按定义好的格式解包到ISO_MSG变量m中] return : [-1:异常 其他:buf的长度] comment : [全局普通函数] machine : [无] language : [CHN] keyword : [内部有MALLOC操作,用完需要函数iso8583_free进行释放] date : [11/08/10] author : [chen-zhengkai] ************************************************************************/ int iso8583_unpack(ISO_MSG *m, const char *buf) { const char* start = buf; int flds, i; char fmt[8]; memset(fmt, 0, sizeof(fmt)); //0域的操作 if (m->fld[0].buf != NULL || s_isodef[0].fmt != FMT_FIXED) { //异常处理 MY_TRACE("flds = %d", 0); return -1; } m->fld[0].len = s_isodef[0].len; memset(m->fld[0].buf, 0x00, NUM); if (s_iCompress) { buf += BCD2ASC((char*)m->fld[0].buf, (unsigned char*)buf, m->fld[0].len, s_isodef[0].fmt); } else { memcpy(m->fld[0].buf, buf, m->fld[0].len); buf += m->fld[0].len; } //操作1域,位图域 #if ISO_FLDS==128 if(buf[0] & 0x80) { //128位版 flds = 128; } else { flds = 64; } #else if( buf[0] & 0x80 ) { //128位版 MY_TRACE("flds = %d", 1); return -1; } flds = 64; #endif m->fld[1].len = flds/8; //64位8字节,128位16字节 memset(m->fld[1].buf, 0x00, NUM); memcpy(m->fld[1].buf, buf, m->fld[1].len); buf += m->fld[1].len; //偏移 //2--64(128)域操作 for (i = 2; i <= flds; i++) { if (BITGET(m->fld[1].buf, i)) { //第i字段不为零 //长度处理 if ( s_isodef[i].fmt) { //不定长 if ( s_iCompress ) { //需解压 buf += BCD2INT(&(m->fld[i].len), (unsigned char*)buf, s_isodef[i].fmt, 0); } else { sprintf(fmt, "%%0%dd", s_isodef[i].fmt); //格式化成 %0?d sscanf(buf, fmt, &(m->fld[i].len)); //把buf内容格式化成整数存入len buf += s_isodef[i].fmt; //偏移 } if (m->fld[i].len > s_isodef[i].len) { //异常处理 MY_TRACE("flds = %d", i); return -1; } } else { //定长 m->fld[i].len = s_isodef[i].len; } //内容处理 memset(m->fld[i].buf, 0x00, NUM); switch (s_isodef[i].typ) { case TYP_BCD: if (s_iCompress) { buf += BCD2ASC((char*)m->fld[i].buf, (unsigned char*)buf, m->fld[i].len, s_isodef[i].fmt); break; } case TYP_ASC: case TYP_BIN: memcpy(m->fld[i].buf, buf, m->fld[i].len); buf += m->fld[i].len; break; default: MY_TRACE("flds = %d", i); return -1; } } } return (buf-start); //返回长度 }
int Bank_Query(TRUSERID *handle,ST_PACK *rPack,int *pRetCode,char *szMsg) { int ret=0; int amt=0; double amt1=0.0; char temp[256]=""; ST_CPACK aPack; ST_PACK *out_pack = &(aPack.pack); ResetNormalCPack(&aPack,0,1); SetCol(handle,0); SetCol(handle,F_LVOL1,F_DAMT0,0); MSG8583 zgyh_req,zgyh_ans; memset(&zgyh_req,0x20,sizeof zgyh_req); memset(&zgyh_ans,0x20,sizeof zgyh_ans); ISO_MSG iso_zgyh_req,iso_zgyh_ans; iso8583_init(&iso_zgyh_req); iso8583_init(&iso_zgyh_ans); char zgyh_sbuf[2048]=""; char zgyh_abuf[2048]=""; char buf[2048]=""; char bitmap[16]={0x60,0x20,0x00,0x00,0x20,0xc0,0x10,0x04}; if(strlen(rPack->vsvarstr1)>0) bitmap[4]=0x30; //如果三磁道信息为空,三磁道的位图置空 ret=iso8583_set(&iso_zgyh_req, 0, (unsigned char*)BANK_ZGYH_TRADE_CODE_QUERY_REQ, 4); if(ret<=0) { writelog(LOG_ERR,"iso8583_set error"); return E_TRANS_UNKNOW_ERROR; } ret=iso8583_set(&iso_zgyh_req, 1, (unsigned char*)bitmap,8); if(ret<=0) { writelog(LOG_ERR,"iso8583_set error"); return E_TRANS_UNKNOW_ERROR; } //写银行卡号 memset(buf,0x00,sizeof buf); sprintf(buf,"%02d",strlen(rPack->scust_limit2)); sprintf(buf+2,"%s",rPack->scust_limit2); ret=iso8583_set(&iso_zgyh_req, 2, (unsigned char*)rPack->scust_limit2,strlen(rPack->scust_limit2)); if(ret<=0) { writelog(LOG_ERR,"iso8583_set error,rPack->scust_limit2=[%s]",rPack->scust_limit2); return E_TRANS_UNKNOW_ERROR; } //写银行处理代码-000000 3 处理代号 n6 ME ME (BCD)000000 ret=iso8583_set(&iso_zgyh_req, 3, (unsigned char*)BANK_ZGYH_EXEC_CODE_QUERY_REQ, 6); if(ret<=0) { writelog(LOG_ERR,"iso8583_set error"); return E_TRANS_UNKNOW_ERROR; } //写交易参考号-流水号-取交易参考号的后六位- 11 系统跟踪号 n6 ME ME (BCD) memset(buf,0x00,sizeof buf); sprintf(buf,"%s",rPack->sholder_ac_no+8); ret=iso8583_set(&iso_zgyh_req,11,(unsigned char*)buf,6); if(ret<=0) { writelog(LOG_ERR,"iso8583_set error"); return E_TRANS_UNKNOW_ERROR; } //写二磁道数据- 35 第二磁道数据 LLVAR z..37 C2 (BCD) ret=iso8583_set(&iso_zgyh_req,35,(unsigned char*)rPack->vsvarstr0,strlen(rPack->vsvarstr0)); if(ret<=0) { writelog(LOG_ERR,"iso8583_set error,Second track data=[%s]",rPack->vsvarstr0); return E_TRANS_UNKNOW_ERROR; } //写三磁道数据- 36 第三磁道数据 LLLVAR z..104 C2 (BCD) if(strlen(rPack->vsvarstr1)>0) { ret=iso8583_set(&iso_zgyh_req,36,(unsigned char*)rPack->vsvarstr1,strlen(rPack->vsvarstr1)); if(ret<=0) { writelog(LOG_ERR,"iso8583_set error,Second track data=[%s]",rPack->vsvarstr1); return E_TRANS_UNKNOW_ERROR; } } //写终端号- 41 POS终端号 ans8 ME ME (ASCII) ret=iso8583_set(&iso_zgyh_req,41,(unsigned char*)rPack->sorder2,8); if(ret<=0) { writelog(LOG_ERR,"iso8583_set error"); return E_TRANS_UNKNOW_ERROR; } //写商户号- 42 商户号 ans15 M (ASCII) memset(buf,0,sizeof buf); sprintf(buf,"%s",BANK_ZGYH_MERCH_NO); ret=iso8583_set(&iso_zgyh_req,42,(unsigned char*)buf,15); if(ret<=0) { writelog(LOG_ERR,"iso8583_set error"); return E_TRANS_UNKNOW_ERROR; } //写银行卡个人密码- 52 个人密码信息包 BIN b64 C3 ANSI X9.8标准Format 01 ret=iso8583_set(&iso_zgyh_req,52,(unsigned char*)rPack->sbank_pwd,8); if(ret<=0) { writelog(LOG_ERR,"iso8583_set error"); return E_TRANS_UNKNOW_ERROR; } //写交易参考号- 62 发票号 LLLVAR ans999 M (ASCII) memset(buf,0x00,sizeof buf); sprintf(buf,"%s",rPack->sholder_ac_no+8); ret=iso8583_set(&iso_zgyh_req,62,(unsigned char*)buf,6); if(ret<=0) { writelog(LOG_ERR,"iso8583_set error"); return E_TRANS_UNKNOW_ERROR; } ret=iso8583_pack(&iso_zgyh_req, zgyh_sbuf); if(ret<=0) { writelog(LOG_ERR,"Pack8583 error,errcode=[%d]",ret); return E_TRANS_UNKNOW_ERROR; } //memset(temp,0x00,sizeof temp); //des2src(temp,rPack->scust_auth); //ret=send_to_and_recv_from_bank((char *)zgyh_sbuf,ret,(char*)zgyh_abuf,200,(char*)temp,rPack->lvol0,rPack->lvol1); if(ret) { writelog(LOG_ERR,"send_to_and_recv_from_bank error,bank_id=[%d],errcode=[%d]",BANK_GSYH,ret); return E_TRANS_BANK_NOANSWER; } ret=iso8583_unpack(&iso_zgyh_ans, zgyh_abuf); if(ret<0) { writelog(LOG_ERR,"UnPack8583 error,errcode=[%d]",ret); return E_TRANS_UNKNOW_ERROR; } if(0!=strncmp((char *)iso_zgyh_ans.fld[39].buf,"00",2)) { writelog(LOG_ERR,"Receive data return code error,error code= [%2.2s] ",iso_zgyh_ans.fld[39].buf); memcpy(temp,iso_zgyh_ans.fld[39].buf,2); temp[2]=0; switch(atoi(temp)) { case 41: //银行卡挂失 //sprintf(pNode->RetCode,"%d",E_TRANS_BANKCARD_LOST); return E_TRANS_BANKCARD_LOST; case 36: //银行卡状态错误 //sprintf(pNode->RetCode,"%d",E_TRANS_BANKACC_STATERR); return E_TRANS_BANKACC_STATERR; case 51: //银行卡金额不足 //sprintf(pNode->RetCode,"%d",E_TRANS_BANKACC_NOMONEY); return E_TRANS_BANKACC_NOMONEY; case 55: //银行密码错误 //sprintf(pNode->RetCode,"%d",E_TRANS_BANKCARD_PWDERR); return E_TRANS_BANKCARD_PWDERR; case 96: //银行处理超时 //sprintf(pNode->RetCode,"%d",E_TRANS_BANK_NODECIDE); return E_TRANS_BANK_NOANSWER; case 22: //其他错误 //sprintf(pNode->RetCode,"%d",E_TRANS_BANKCARD_PWDERR); return E_TRANS_UNKNOW_ERROR; default: //其他未知错误 //sprintf(pNode->RetCode,"%d",E_TRANS_UNKNOW_ERROR); return E_TRANS_UNKNOW_ERROR; } } memset(temp,0x00,sizeof temp); iso8583_get(&iso_zgyh_ans, 4, (unsigned char*)temp, 12); BCD2INT(&amt, (unsigned char*)temp, 12, 0); out_pack->damt0=amt/100.0; out_pack->lvol0=1; PutRow(handle,out_pack,pRetCode,szMsg); return 0; }
/* * Using the definition d, unpack the content of buf into the ISO * message struct m. * Returns 0. FIXME: Should be something different. */ int iso8583_unpack(ISO_MSG *m, const char *buf) { const char *start = buf; int flds, i; char fmt[8]; memset(fmt, 0, sizeof(fmt)); /* Field 0 is mandatory and fixed length. */ if (m->fld[0].buf != NULL || s_isodef[0].fmt != FMT_FIXED) { MY_TRACE("flds = %d", 0); return -1; } m->fld[0].len = s_isodef[0].len; m->fld[0].buf = (unsigned char *) malloc((m->fld[0].len) * sizeof(char)); if(s_iCompress) { buf += BCD2ASC((char*)m->fld[0].buf,(const unsigned char*) buf, m->fld[0].len, s_isodef[0].fmt); } else { memcpy(m->fld[0].buf, buf, m->fld[0].len); buf += m->fld[0].len; } /* * First bit in the bitmap (field 1) defines if the message is * extended or not. * 0: not exteded - i.e. only (some of) the fields 0 to 64 are * used * 1: extended - i.e. (some of) the fields 0 to 128 are used * I.e. if one or more of the fields 65 to 128 is used, the * bit is 1. */ #if ISO_FLDS==128 if(buf[0] & 0x80) { flds = 128; } else { flds = 64; } #else /*ISO_FLDS==128*/ if(buf[0] & 0x80) { MY_TRACE("flds = %d", 1); return -1; } flds = 64; #endif /*ISO_FLDS==128*/ m->fld[1].len = flds/8; m->fld[1].buf = (unsigned char *) calloc((m->fld[1].len), sizeof(char)); memcpy(m->fld[1].buf, buf, m->fld[1].len); buf += m->fld[1].len; for (i = 2; i <= flds; i++) { if (MY_BITGET(m->fld[1].buf, i)) { /* i'th bit != 0 */ if ( s_isodef[i].fmt) { /* Variable length */ if(s_iCompress) { buf += BCD2INT(&(m->fld[i].len),(const unsigned char*) buf, s_isodef[i].fmt, 0); } else { sprintf(fmt, "%%0%dd", s_isodef[i].fmt); sscanf(buf, fmt, &(m->fld[i].len)); buf += s_isodef[i].fmt; } if (m->fld[i].len > s_isodef[i].len) { MY_TRACE("flds = %d", i); return -1; } } else { m->fld[i].len = s_isodef[i].len; } m->fld[i].buf = (unsigned char *) malloc((m->fld[i].len) * sizeof(char)); switch (s_isodef[i].typ) { case TYP_BCD: /* Fallthrough */ if(s_iCompress) { buf += BCD2ASC((char*)m->fld[i].buf,(const unsigned char*) buf, m->fld[i].len, s_isodef[i].fmt); break; } case TYP_ASC: case TYP_BIN: memcpy(m->fld[i].buf, buf, m->fld[i].len); buf += m->fld[i].len; break; default: MY_TRACE("flds = %d", i); return -1; break; } } } return (buf-start); }