📄 formatporuke.cpp
字号:
(*s_iter).DajPozicijuKomponente( IDkomponente, nPozicija, nDuzina ) )
izlaz = true;
return izlaz;
}
// Pomocna procedura ( poziva se u 'DeformatPoruku' ). Vraca duzinu komponente u ulaznom stringu,
// a u 'cDeformatiranaKomponenta' vraca taj deo ulaznog stringa u 'deformatiranom' obliku.
unsigned int KSpisakFormata::DeformatKomponentu( string& cDeformatiranaKomponenta, KString cUlazniString, unsigned int nPozUlStr,
UIFormat formatKomponente, unsigned int nDuzinaKomponente ){
KString cUlazniStr( cUlazniString );
unsigned int nDuzinaUlStr = cUlazniString.size();
unsigned int nDuzinaFormatKomp = 0;
unsigned int i, j;
string cBCDcifra = "";
cDeformatiranaKomponenta.erase();
// Odradi konverziju stringa u niz bajtova, na osnovu datog formata
switch ( formatKomponente ) {
case FS_BCD_ASCII:
// Konvertuj svaku grupu ASCII znakova koja predstavlja jednu BCD cifru u jedan bajt
// ( svaki podstring "00" - "FF" konvertuje u 1 bajt; podstring izdvaja u 'znak' )
for ( i=nPozUlStr, j=0; i<nDuzinaUlStr && j<nDuzinaKomponente; j++ ){
cBCDcifra.erase();
// Prihvata i 'jednocifrene' znakove ( ali iza njih mora razmak )
while ( cUlazniStr[i] != ' ' && cBCDcifra.size() < 2 ) {
cBCDcifra += cUlazniStr.cString[i];
i++;
}
// Preskoci razmake izmedju dve grupe BCD cifara
i = cUlazniStr.PreskociRazmake( i );
cDeformatiranaKomponenta += KKorisno::Instance()->BCDuBajt( cBCDcifra );
}
nDuzinaFormatKomp = i - nPozUlStr;
break;
case FS_BAJT:
// deformatirani string se dobija kao kopija odgovarajuceg dela ulaznog stringa
nDuzinaFormatKomp = nDuzinaKomponente;
cDeformatiranaKomponenta += cUlazniString.cString.substr( nPozUlStr, nDuzinaFormatKomp );
break;
}
return nDuzinaFormatKomp;
}
// Od formatiranog stringa pravi 'obican niz bajtova'
string KSpisakFormata::DeformatPoruku( KString cUlazniString, KFormatPoruke& format ){
// KString cUlazniStr( cUlazniString );
string cIzlazniString;
string cDeformatiranaKomponenta;
unsigned int duzinaKomponente;
unsigned int pozUlStr = 0; // pozicija u ulaznom ('formatiranom') stringu
TOpisPoruke opisFormata;
format.DajOpis( opisFormata );
if ( FormatDefault( format ) ) {
// kod 'default' formata postoji samo jedna komponenta(SADRZAJ)
// i ne uzimaju se u obzir polja 'pozicija' i 'duzina' u opisu, vec se uzima ceo string i formatira po opisu te komponente
TOpisPoruke::iterator o_iter = opisFormata.begin();
TOpisPoruke::iterator o_iterEnd = opisFormata.end();
if ( o_iter!=o_iterEnd ){ // trebalo bi da postoji jedna komponenta !!
duzinaKomponente = cUlazniString.size();
pozUlStr += DeformatKomponentu( cDeformatiranaKomponenta, cUlazniString, pozUlStr,
FS_BCD_ASCII, duzinaKomponente );
cIzlazniString += cDeformatiranaKomponenta;
}
}
else {
TOpisPoruke::iterator o_iter = opisFormata.begin();
TOpisPoruke::iterator o_iterEnd = opisFormata.end();
while( o_iter!=o_iterEnd ){ // obidji sve komponente formata
duzinaKomponente = o_iter->duzina;
pozUlStr += DeformatKomponentu( cDeformatiranaKomponenta, cUlazniString, pozUlStr,
FS_BCD_ASCII, duzinaKomponente );
// Preskoci razmake izmedju dve komponente
pozUlStr = cUlazniString.PreskociRazmake( pozUlStr );
cIzlazniString += cDeformatiranaKomponenta;
o_iter++;
}
}
return cIzlazniString;
}
string KSpisakFormata::DeformatPoruku( KString cUlazniString, IDFormataPoruke formatID ){
// Vraca format poruke u promenljivu 'format'. Ako ne nadje, vraca false.
KFormatPoruke format;
// Ako dati format ne postoji koristi DEFAULT format.
if ( !DajFormatPoruke( formatID, format ) ) DajDefaultFormat( format );
return DeformatPoruku( cUlazniString, format );
}
// Od 'obicnog niza bajtova' pravi 'formatirani string'.
string KSpisakFormata::FormatPoruku( string cUlazniString, KFormatPoruke& format ){
string cIzlazniString;
TOpisPoruke opisFormata;
format.DajOpis( opisFormata );
if ( FormatDefault( format ) ) {
// kod 'default' formata postoji samo jedna komponenta(SADRZAJ) i ne uzimaju se u obzir
// polja 'pozicija' i 'duzina' u opisu, vec se uzima ceo string i formatira po opisu te komponente
TOpisPoruke::iterator o_iter = opisFormata.begin();
TOpisPoruke::iterator o_iterEnd = opisFormata.end();
if ( o_iter!=o_iterEnd ) // trebalo bi da postoji jedna komponenta !!
cIzlazniString += KKorisno::Instance()->FormatString( cUlazniString, FS_BCD_ASCII );
}
else {
// Prodji kroz sve komponente poruke i konvertuj u odgovarajuci format za prikaz
TOpisPoruke::iterator o_iter = opisFormata.begin();
TOpisPoruke::iterator o_iterEnd = opisFormata.end();
string cFormatiranaKomponenta;
while( o_iter != o_iterEnd ){
unsigned int nDuzinaUlaznogStringa = cUlazniString.size();
// Funkcija 'substr' baca 'out_of_range' exception ako je pozicija substringa
// veca od duzine stringa, pa zato imamo sledeci if :
if ( o_iter->pozicija <= nDuzinaUlaznogStringa ) {
cFormatiranaKomponenta = KKorisno::Instance()->FormatString(
cUlazniString.substr( o_iter->pozicija, o_iter->duzina ),
FS_BCD_ASCII );
if ( cFormatiranaKomponenta.size() > 0 ){
// Ubaci razmak izmadju komponenata
if ( cIzlazniString.size() > 0 ) cIzlazniString += " ";
cIzlazniString += cFormatiranaKomponenta;
}
}
o_iter++;
}
}
return cIzlazniString;
}
// Od 'obicnog niza bajtova' pravi 'formatirani string'.
string KSpisakFormata::FormatPoruku( string cUlazniString, IDFormataPoruke formatID ){
KFormatPoruke format;
// Ako dati format ne postoji koristi DEFAULT format.
if ( !DajFormatPoruke( formatID, format ) ) DajDefaultFormat( format );
return FormatPoruku( cUlazniString, format );
}
// Pomocna procedura : ispisuje spisak formata
void KSpisakFormata::OdstampajSpisakTxt( void ){
cout << "Spisak formata poruka :" << endl;
TTabelaFormata::iterator s_iter = Tabela.begin();
TTabelaFormata::iterator s_iterEnd = Tabela.end();
while( s_iter!=s_iterEnd ){
cout << "Format : " << s_iter->DajID() << endl;
TOpisPoruke opis;
s_iter->DajOpis( opis );
TOpisPoruke::iterator o_iter = opis.begin();
TOpisPoruke::iterator o_iterEnd = opis.end();
while( o_iter!=o_iterEnd ){
cout << " " << o_iter->IDkomponente << ", "
<< o_iter->pozicija << ", "
<< o_iter->duzina
<< endl;
o_iter++;
}
s_iter++;
}
}
// Vraca iterator koji ukazuje na element spiska formata sa datim ID-om ili NULL ako ga ne nadje.
TTabelaFormata::iterator KSpisakFormata::DajIterator( IDFormataPoruke formatID ){
TTabelaFormata::iterator s_iter = Tabela.begin();
TTabelaFormata::iterator s_iterEnd = Tabela.end();
while( s_iter!=s_iterEnd && s_iter->DajID()!=formatID ) s_iter++;
if ( s_iter==s_iterEnd ) s_iter = NULL;
return s_iter;
}
// Postavlja velicinu i poziciju date komponente ( ovo zato sto sadrzaj moze da bude promenljiv )
void KSpisakFormata::PostaviPozicijuIDuzinu( IDFormataPoruke formatID, IDKomponentePoruke IDkomponente,
unsigned int nPozicija, unsigned int nDuzina ){
TTabelaFormata::iterator s_iter = DajIterator( formatID );
s_iter->PostaviPozicijuKomponente( IDkomponente, nPozicija, nDuzina );
}
//********************************* KSpisakFormata << END >> *************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -