/* Copyright (C) 2004 Dominik Seichter This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "barkode.h" #include "barkodeengine.h" #include "gnubarcode.h" #include "pixmapbarcode.h" #include "purepostscript.h" #include "tbarcode2.h" #include "tokenprovider.h" #ifdef _ENABLE_NATIVE_GNU_BARCODE # include #else #define BARCODE_DEFAULT_FLAGS 0x00000000 #define BARCODE_ENCODING_MASK 0x000000ff /* 256 possibilites... */ #define BARCODE_NO_ASCII 0x00000100 /* avoid text in output */ #define BARCODE_NO_CHECKSUM 0x00000200 /* avoid checksum in output */ #define BARCODE_OUTPUT_MASK 0x000ff000 /* 256 output types */ #define BARCODE_OUT_EPS 0x00001000 #define BARCODE_OUT_PS 0x00002000 #define BARCODE_OUT_PCL 0x00004000 /* by Andrea Scopece */ /* PCL_III 0x00008000 */ #define BARCODE_OUT_PCL_III 0x0000C000 #define BARCODE_OUT_NOHEADERS 0x00100000 /* no header nor footer */ // include our own defines from barcode.h enum { BARCODE_ANY = 0, /* choose best-fit */ BARCODE_EAN, BARCODE_UPC, /* upc == 12-digit ean */ BARCODE_ISBN, /* isbn numbers (still EAN13) */ BARCODE_39, /* code 39 */ BARCODE_128, /* code 128 (a,b,c: autoselection) */ BARCODE_128C, /* code 128 (compact form for digits) */ BARCODE_128B, /* code 128, full printable ascii */ BARCODE_I25, /* interleaved 2 of 5 (only digits) */ BARCODE_128RAW, /* Raw code 128 (by Leonid A. Broukhis) */ BARCODE_CBR, /* Codabar (by Leonid A. Broukhis) */ BARCODE_MSI, /* MSI (by Leonid A. Broukhis) */ BARCODE_PLS, /* Plessey (by Leonid A. Broukhis) */ BARCODE_93 /* code 93 (by Nathan D. Holmes) */ }; #endif // _ENABLE_NATIVE_GNU_BARCODE #include #include #include #include #include #include #include #include TQValueList Barkode::s_info; TQStringList* Barkode::s_encoding = NULL; bool Barkode::s_haveGnuBarcode = false; bool Barkode::s_havePdfEncode = false; bool Barkode::s_haveTBarcode = false; bool Barkode::s_haveTBarcode2 = false; bool Barkode::s_havePurePostscript = false; Barkode::Barkode() { initInfo(); m_engine = NULL; m_token = NULL; defaults(); } Barkode::Barkode( const Barkode & barkode ) { initInfo(); m_engine = NULL; m_token = NULL; *this = barkode; } Barkode::~Barkode() { if( m_engine ) delete m_engine; } void Barkode::setTokenProvider( TokenProvider* token ) { m_token = token; } void Barkode::defaults() { m_valid = false; m_text_visible = true; m_background = TQt::white; m_foreground = TQt::black; m_textcolor = TQt::black; m_quietzone = 0; m_bar_height = 80; m_fontsize = 12; m_rotation = 0; m_scaling = 1.0; m_cut = 1.0; m_datamatrix_size = 0; m_type = "code39"; m_value = "KBARCODE"; m_database_mode = "static"; m_index = 0; m_sequence = false; m_esequence = NUM; m_sequence_start = 1; m_sequence_step = 1; updateEngine(); BarkodeEngineOptions* options = m_engine ? m_engine->options() : NULL; if( options ) options->defaults(); } void Barkode::setData( const Barkode & barkode ) { this->m_valid = barkode.m_valid; this->m_text_visible = barkode.m_text_visible; this->m_background = barkode.m_background; this->m_foreground = barkode.m_foreground; this->m_textcolor = barkode.m_textcolor; this->m_quietzone = barkode.m_quietzone; this->m_bar_height = barkode.m_bar_height; this->m_fontsize = barkode.m_fontsize; this->m_rotation = barkode.m_rotation; this->m_scaling = barkode.m_scaling; this->m_cut = barkode.m_cut; this->m_type = barkode.m_type; this->m_value = barkode.m_value; this->m_database_mode = barkode.m_database_mode; this->m_index = barkode.m_index; this->m_sequence = barkode.m_sequence; this->m_esequence = barkode.m_esequence; this->m_sequence_start = barkode.m_sequence_start; this->m_sequence_step = barkode.m_sequence_step; updateEngine(); *m_engine = *(barkode.engine()); this->m_datamatrix_size = barkode.m_datamatrix_size; } void Barkode::operator=( const Barkode & barkode ) { setData( barkode ); } bool Barkode::operator==( const Barkode & barkode ) const { bool b = true; #warning "operator== is incomplete" // colors b = ( this->m_background == barkode.m_background && this->m_foreground == barkode.m_foreground ) && b; // sizes b = ( this->m_quietzone == barkode.m_quietzone && this->m_bar_height == barkode.m_bar_height && this->m_fontsize == barkode.m_fontsize ) && b; // values b = ( this->m_type == barkode.m_type && this->m_value == barkode.m_value ) && b; return b; } const TQPicture Barkode::picture() { TQPicture pic; TQPainter painter( &pic ); painter.fillRect( 0, 0, size().width(), size().height(), m_background ); // sub classes do the real drawing drawBarcode( painter ); return pic; } void Barkode::drawInvalid( TQPainter & painter, int x, int y ) { TQRect rect( x, y, size().width(), size().height() ); painter.save(); painter.fillRect( rect, TQt::white ); painter.setPen( TQPen( TQt::red, 2 ) ); painter.drawRect( rect ); painter.drawLine( x, y, x + size().width(), y + size().height() ); painter.drawLine( x, y + size().height(), x + size().width(), y ); painter.restore(); } const TQSize Barkode::size() const { return m_engine ? m_engine->size() : TQSize( 0, 0 ); } const TQPixmap Barkode::pixmap( double scalex, double scaley ) { TQPixmap pixmap( (int)(size().width() * scalex), (int)(size().height() * scaley) ); if( !pixmap.isNull() ) { TQPainter painter( &pixmap ); painter.scale( scalex, scaley ); painter.fillRect( 0, 0, size().width(), size().height(), m_background ); drawBarcode( painter ); } return pixmap; } const TQString Barkode::parsedValue() { TQString text = m_token ? m_token->parse( m_value ) : m_value; if( !sequenceEnabled() ) return text; if( m_value.contains( '#' ) <= 0 ) return text; int pos = 0, counter = 1; pos = text.find("#", pos); pos++; while( text[pos] == '#' ) { text.remove(pos, 1); counter++; } pos = text.find("#", 0); TQString temp; if( sequenceMode() == NUM ) { int v = sequenceStart() + m_index*sequenceStep(); temp.sprintf("%0*i", counter, v ); } else { for( int i = 0; i < counter; i++ ) temp.append( "A" ); unsigned int z = 0; for( int p = temp.length(); p >= 0; p--, z++ ) { if( sequenceMode() == ALPHA ) { int v = 'A' + m_index*sequenceStep(); v -= z*('Z'-'A'); if( v <= 'Z' ) { temp[p] = TQChar(v); break; } else if( v > 'Z' ) v = 'Z'; temp[p] = TQChar(v); } else if( sequenceMode() == ALPHANUM ) { tqDebug("NOT IMPLEMENTED"); /* char array[36]; for( unsigned int i = 'A'; i <= 'Z'; i++ ) array[i-'A'] = i; for( unsigned int i = '0'; i <= '9'; i++ ) array['Z'-'A'+i-'0'] = i; int z = m_index*barcode.sequence.step; if( z < sizeof(array) ) temp[] int v = array[ ]*/ } } } text.replace( pos, 1, temp); return text; } EEngine Barkode::engineForType( const TQString & type ) { EEngine engine = NONE; for( unsigned int i=0;iengine() ) { // switch to another engine delete m_engine; m_engine = NULL; } if( !m_engine ) { if( engine == GNU_BARCODE ) #ifdef _ENABLE_NATIVE_GNU_BARCODE m_engine = new GnuBarcode(); #else m_engine = new PixmapBarcode(); #endif // _ENABLE_NATIVE_GNU_BARCODE else if( engine == TBARCODE ) m_engine = new PixmapBarcode(); else if( engine == TBARCODE2 ) m_engine = new TBarcode2(); else if( engine == PDF417 ) m_engine = new PixmapBarcode(); else if( engine == PURE_POSTSCRIPT ) m_engine = new PurePostscriptBarcode(); else m_engine = new EmptyEngine(); m_engine->setBarkode( this ); } } void Barkode::drawBarcode( TQPainter & painter, int x, int y ) { if( m_engine ) m_engine->drawBarcode( painter, x, y ); } void Barkode::update( const TQPaintDevice* device ) { if( m_engine ) m_engine->update( device ); } //////////////////////////////////////////////////////////// // Get attributes // //////////////////////////////////////////////////////////// bool Barkode::isValid() const { return m_valid; } const TQColor & Barkode::background() const { return m_background; } const TQColor & Barkode::foreground() const { return m_foreground; } const TQColor & Barkode::textColor() const { return m_textcolor; } const unsigned int Barkode::fontsize() const { return m_fontsize; } const unsigned int Barkode::quietZone() const { return m_quietzone; } const unsigned int Barkode::barHeight() const { return m_bar_height; } const TQString & Barkode::type() const { return m_type; } const TQString & Barkode::value() const { return m_value; } const unsigned int Barkode::index() const { return m_index; } const bool Barkode::sequenceEnabled() const { return m_sequence; } const ESequence Barkode::sequenceMode() const { return m_esequence; } const int Barkode::sequenceStart() const { return m_sequence_start; } const int Barkode::sequenceStep() const { return m_sequence_step; } const TQString & Barkode::databaseMode() const { return m_database_mode; } const bool Barkode::textVisible() const { return m_text_visible; } const int Barkode::rotation() const { return m_rotation; } const double Barkode::scaling() const { return m_scaling; } const double Barkode::cut() const { return m_cut; } const int Barkode::datamatrixSize() const { return m_datamatrix_size; } //////////////////////////////////////////////////////////// // Set attributes // //////////////////////////////////////////////////////////// void Barkode::setBackground( const TQColor & c ) { m_background = c; } void Barkode::setForeground( const TQColor & c ) { m_foreground = c; } void Barkode::setTextColor( const TQColor & c ) { m_textcolor = c; } void Barkode::setFontsize( unsigned int f ) { m_fontsize = f; } void Barkode::setQuietZone( const unsigned int q ) { m_quietzone = q; } void Barkode::setBarHeight( unsigned int h ) { m_bar_height = h; } void Barkode::setType( const TQString & type ) { m_type = type.lower(); updateEngine(); } void Barkode::setValue( const TQString & value ) { m_value = value; } void Barkode::setIndex( const unsigned int i ) { m_index = i; } void Barkode::setSequenceEnabled( bool b ) { m_sequence = b; } void Barkode::setSequenceMode( ESequence e ) { m_esequence = e; } void Barkode::setSequenceStart( int s ) { m_sequence_start = s; } void Barkode::setSequenceStep( int s ) { m_sequence_step = s; } void Barkode::setDatabaseMode( const TQString & mode ) { m_database_mode = mode; } void Barkode::setTextVisible( const bool b ) { m_text_visible = b; } void Barkode::setRotation( const int r ) { m_rotation = r; } void Barkode::setScaling( const double d ) { m_scaling = d; } void Barkode::setCut( const double c ) { m_cut = c; } void Barkode::setDatamatrixSize( int s ) { m_datamatrix_size = s; } //////////////////////////////////////////////////////////// // Fill the s_info structure //////////////////////////////////////////////////////////// bool Barkode::hasFeature( const TQString & type, unsigned int feature ) { for( unsigned int i = 0; i < s_info.count(); i++ ) if( s_info[i].xml == type ) return (s_info[i].features & feature) == feature; return false; } int Barkode::internalType( const TQString & type ) { for( unsigned int i = 0; i < s_info.count(); i++ ) if( s_info[i].xml == type ) return s_info[i].internal; return false; } const TQStringList* Barkode::encodingTypes() { if( !s_encoding ) { s_encoding = new TQStringList; for( unsigned int i = 0; i < s_info.count(); i++ ) s_encoding->append( s_info[i].name ); //s_encoding->sort(); } return s_encoding; } const char* Barkode::typeFromName( const TQString & name ) { for( unsigned int i = 0; i < s_info.count(); i++ ) if( s_info[i].name == name ) return s_info[i].xml; return NULL; } const char* Barkode::nameFromType( const TQString & type ) { for( unsigned int i = 0; i < s_info.count(); i++ ) if( s_info[i].xml == type ) return s_info[i].name; return NULL; } TQString* Barkode::validatorFromType( const TQString & type ) { for( unsigned int i = 0; i < s_info.count(); i++ ) if( s_info[i].xml == type ) return &(s_info[i].validator); return NULL; } TQString* Barkode::validatorNotFromType( const TQString & type ) { for( unsigned int i = 0; i < s_info.count(); i++ ) if( s_info[i].xml == type ) return &(s_info[i].validatorNot); return NULL; } tBarcodeInfo Barkode::createInfo( const char* xml, const TQString & name, const EEngine engine, const unsigned int features, const int internal ) { tBarcodeInfo info; TQString strengine; switch( engine ) { case GNU_BARCODE: strengine = i18n(" [GNU Barcode]"); break; case PDF417: strengine = i18n(" [PDF 417]"); break; case TBARCODE: strengine = i18n(" [TBarcode]"); break; case TBARCODE2: strengine = i18n(" [TBarcode2]"); break; case PURE_POSTSCRIPT: strengine = i18n(" [Barcode Writer in Pure Postscript]"); break; case NONE: default: // does not need to be translated as it should not visible anytime ever strengine = " [NONE]"; break; } info.xml = xml; info.name = name + strengine; info.engine = engine; info.features = features; info.internal = internal; return info; } void Barkode::initInfo() { if( s_info.count() ) return; PurePostscriptBarcode::init(); s_haveGnuBarcode = !TDEStandardDirs::findExe( "barcode" ).isNull(); s_havePdfEncode = !TDEStandardDirs::findExe( "pdf417_enc" ).isNull(); s_haveTBarcode = false; //!TDEStandardDirs::findExe( "tbarcodeclient" ).isNull(); // TODO: do not yet enable TBarcode2 support s_haveTBarcode2 = !TDEStandardDirs::findExe( "tbarcode" ).isNull(); s_havePurePostscript = !TDEStandardDirs::findExe( "gs" ).isNull() && PurePostscriptBarcode::hasPurePostscriptBarcode(); if( s_haveGnuBarcode ) { s_info.append( createInfo( "128raw", i18n("Raw code 128"), GNU_BARCODE, 0, BARCODE_128RAW ) ); s_info.append( createInfo( "cbr", i18n("Codabar"), GNU_BARCODE, 0, BARCODE_CBR ) ); s_info.append( createInfo( "cbr -c", i18n("Codabar (no checksum)"), GNU_BARCODE, 0, BARCODE_CBR ) ); s_info.append( createInfo( "code128", i18n("Code 128 (a,b,c: autoselection)"), GNU_BARCODE, 0, BARCODE_128 ) ); s_info.append( createInfo( "code128b", i18n("Code 128B, full printable ascii"), GNU_BARCODE, 0, BARCODE_128B ) ); s_info.append( createInfo( "code128c", i18n("Code 128C (compact form digits)"), GNU_BARCODE, 0, BARCODE_128C ) ); s_info.append( createInfo( "code39 -c", i18n("Code 39 (no checksum)"), GNU_BARCODE, 0, BARCODE_39 | BARCODE_NO_CHECKSUM ) ); s_info.append( createInfo( "code39", i18n("Code 39"), GNU_BARCODE, 0, BARCODE_39 ) ); s_info.append( createInfo( "code93", i18n("Code 93"), GNU_BARCODE, 0, BARCODE_93 ) ); s_info.append( createInfo( "ean", i18n("EAN (EAN 8 or EAN 13)"), GNU_BARCODE, 0, BARCODE_EAN ) ); s_info.append( createInfo( "i25 -c", i18n("interleaved 2 of 5 (only digits, no checksum)"), GNU_BARCODE, 0, BARCODE_I25 | BARCODE_NO_CHECKSUM ) ); s_info.append( createInfo( "i25", i18n("interleaved 2 of 5 (only digits)"), GNU_BARCODE, 0, BARCODE_I25 ) ); s_info.append( createInfo( "isbn", i18n("ISBN (still EAN13)"), GNU_BARCODE, NOCUT, BARCODE_ISBN ) ); s_info.append( createInfo( "msi", i18n("MSI"), GNU_BARCODE, 0, BARCODE_MSI ) ); s_info.append( createInfo( "pls", i18n("Plessey"), GNU_BARCODE, 0, BARCODE_PLS ) ); s_info.append( createInfo( "upc", i18n("UPC (12-digit EAN; UPCA and UPCB)"), GNU_BARCODE, 0, BARCODE_UPC ) ); } if( s_havePdfEncode ) { s_info.append( createInfo( "pdf417", i18n("pdf 417 2D Barcode"), PDF417, BARCODE2D | PDF417BARCODE ) ); } if( s_havePurePostscript ) { // add a leading "ps_" so that they do not conflict with GNU Barcode types PurePostscriptBarcode::initInfo( &s_info ); /* s_info.append( createInfo( "ps_auspost", i18n("Australian Post"), PURE_POSTSCRIPT, PUREADV | COLORED | NOCUT ) ); s_info.append( createInfo( "ps_code11", i18n("Code 11"), PURE_POSTSCRIPT, PUREADV | COLORED ) ); s_info.append( createInfo( "ps_code128", i18n("Code 128"), PURE_POSTSCRIPT, PUREADV | COLORED ) ); s_info.append( createInfo( "ps_code2of5", i18n("Code 2 of 5"), PURE_POSTSCRIPT, PUREADV | COLORED ) ); s_info.append( createInfo( "ps_code39", i18n("Code 39"), PURE_POSTSCRIPT, PUREADV | COLORED | MODULOALLCHECK ) ); s_info.append( createInfo( "ps_code93", i18n("Code 93"), PURE_POSTSCRIPT, PUREADV | COLORED ) ); s_info.append( createInfo( "ps_ean13", i18n("EAN 13"), PURE_POSTSCRIPT, PUREADV | COLORED ) ); s_info.append( createInfo( "ps_ean2", i18n("EAN 2"), PURE_POSTSCRIPT, PUREADV | COLORED | NOCUT ) ); s_info.append( createInfo( "ps_ean5", i18n("EAN 5"), PURE_POSTSCRIPT, PUREADV | COLORED | NOCUT ) ); s_info.append( createInfo( "ps_ean8", i18n("EAN 8"), PURE_POSTSCRIPT, PUREADV | COLORED ) ); s_info.append( createInfo( "ps_interleaved2of5", i18n("Interleaved 2 of 5"), PURE_POSTSCRIPT, PUREADV | COLORED | MODULOALLCHECK ) ); s_info.append( createInfo( "ps_isbn", i18n("ISBN"), PURE_POSTSCRIPT, PUREADV | COLORED ) ); s_info.append( createInfo( "ps_kix", i18n("Kix (Dutch Postal)"), PURE_POSTSCRIPT, PUREADV | COLORED | NOCUT ) ); s_info.append( createInfo( "ps_msi", i18n("MSI"), PURE_POSTSCRIPT, PUREADV | COLORED | MODULOALLCHECK ) ); s_info.append( createInfo( "ps_plessey", i18n("Plessey"), PURE_POSTSCRIPT, PUREADV | COLORED ) ); s_info.append( createInfo( "ps_postnet", i18n("Postnet"), PURE_POSTSCRIPT, PUREADV | COLORED | NOCUT ) ); s_info.append( createInfo( "ps_rationalizedCodabar", i18n("Rationalized Codabar"), PURE_POSTSCRIPT, PUREADV | COLORED | MODULOALLCHECK ) ); s_info.append( createInfo( "ps_royalmail", i18n("Royal Mail"), PURE_POSTSCRIPT, PUREADV | COLORED | NOCUT ) ); s_info.append( createInfo( "ps_symbol", i18n("Symbol"), PURE_POSTSCRIPT, PUREADV | COLORED ) ); s_info.append( createInfo( "ps_upca", i18n("UPCA"), PURE_POSTSCRIPT, PUREADV | COLORED ) ); s_info.append( createInfo( "ps_upce", i18n("UPCE"), PURE_POSTSCRIPT, PUREADV | COLORED ) ); */ } if( s_haveTBarcode ) { s_info.append( createInfo( "b1", "Code 11", TBARCODE, TBARCODEADV | MODULO10CHECK ) ); s_info.append( createInfo( "b2", "Code 2 of 5 (Standard)", TBARCODE, TBARCODEADV | MODULO10CHECK ) ); s_info.append( createInfo( "b3", "Interleaved 2 of 5 Standard", TBARCODE, TBARCODEADV ) ); s_info.append( createInfo( "b4", "Code 2 of 5 IATA", TBARCODE, TBARCODEADV | MODULO10CHECK ) ); s_info.append( createInfo( "b5", "Code 2 of 5 Matrix", TBARCODE, TBARCODEADV | MODULO10CHECK ) ); s_info.append( createInfo( "b6", "Code 2 of 5 Data Logic", TBARCODE, TBARCODEADV | MODULO10CHECK ) ); s_info.append( createInfo( "b7", "Code 2 of 5 Industrial", TBARCODE, TBARCODEADV | MODULO10CHECK ) ); s_info.append( createInfo( "b8", "Code 3 of 9 (Code 39)", TBARCODE, TBARCODEADV | MODULOALLCHECK ) ); s_info.append( createInfo( "b9", "Code 3 of 9 (Code 39) ASCII", TBARCODE, TBARCODEADV | MODULOALLCHECK ) ); s_info.append( createInfo( "b10", "EAN8", TBARCODE, TBARCODEADV | EAN8CHECK | MODULO10CHECK ) ); s_info.append( createInfo( "b11", "EAN8 - 2 digits add on", TBARCODE, NOCUT | TBARCODEADV | EAN8CHECK | MODULO10CHECK ) ); s_info.append( createInfo( "b12", "EAN8 - 5 digits add on", TBARCODE, NOCUT | TBARCODEADV | EAN8CHECK | MODULO10CHECK ) ); s_info.append( createInfo( "b13", "EAN13", TBARCODE, TBARCODEADV | EAN13CHECK | MODULO10CHECK ) ); s_info.append( createInfo( "b14", "EAN13 - 2 digits add on", TBARCODE, NOCUT | TBARCODEADV | EAN13CHECK | MODULO10CHECK ) ); s_info.append( createInfo( "b15", "EAN13 - 5 digits add on", TBARCODE, NOCUT | TBARCODEADV | EAN13CHECK | MODULO10CHECK ) ); s_info.append( createInfo( "b16", "EAN128 (supports AIS)", TBARCODE, TBARCODEADV | MODULOALLCHECK ) ); s_info.append( createInfo( "b17", "UPC 12 Digits", TBARCODE, TBARCODEADV | MODULOALLCHECK ) ); s_info.append( createInfo( "b18", "CodaBar (2 width)", TBARCODE, TBARCODEADV | MODULO10CHECK ) ); s_info.append( createInfo( "b19", "CodaBar (18 widths)", TBARCODE, TBARCODEADV ) ); s_info.append( createInfo( "b20", "Code128", TBARCODE, TBARCODEADV ) ); s_info.append( createInfo( "b21", "Deutsche Post Leitcode", TBARCODE, TBARCODEADV ) ); s_info.append( createInfo( "b22", "Deutsche Post Identcode", TBARCODE, TBARCODEADV ) ); s_info.append( createInfo( "b25", "Code 93", TBARCODE, TBARCODEADV ) ); s_info.append( createInfo( "b26", "Identical to eBC_UPCA", TBARCODE, TBARCODEADV ) ); s_info.append( createInfo( "b33", "UCC128 (= EAN128)", TBARCODE, TBARCODEADV ) ); s_info.append( createInfo( "b34", "UPC A", TBARCODE, TBARCODEADV | TBARCODEADV | UPCACHECK ) ); s_info.append( createInfo( "b35", "UPC A - 2 digit add on", TBARCODE, TBARCODEADV | UPCACHECK ) ); s_info.append( createInfo( "b36", "UPC A - 5 digit add on", TBARCODE, TBARCODEADV | UPCACHECK ) ); s_info.append( createInfo( "b37", "UPC E", TBARCODE, TBARCODEADV | UPCECHECK ) ); s_info.append( createInfo( "b38", "UPC E - 2 digit add on", TBARCODE, TBARCODEADV | UPCECHECK ) ); s_info.append( createInfo( "b39", "UPC E - 5 digit add on", TBARCODE, TBARCODEADV | UPCECHECK ) ); s_info.append( createInfo( "b40", "PostNet ZIP (5d.)", TBARCODE, NOCUT | TBARCODEADV | POSTNETCHECK ) ); s_info.append( createInfo( "b41", "PostNet ZIP (5d.+CD)", TBARCODE, NOCUT | TBARCODEADV | POSTNETCHECK ) ); s_info.append( createInfo( "b42", "PostNet ZIP (8d.)", TBARCODE, NOCUT | TBARCODEADV | POSTNETCHECK ) ); s_info.append( createInfo( "b43", "PostNet ZIP+4 (5d.+4d.+CD)", TBARCODE, NOCUT | TBARCODEADV | POSTNETCHECK ) ); s_info.append( createInfo( "b44", "PostNet DPBC (5d.+4d.+2d.)", TBARCODE, NOCUT | TBARCODEADV | POSTNETCHECK ) ); s_info.append( createInfo( "b45", "PostNet DPBC (5d.+4d.+2d.+CD)", TBARCODE, NOCUT | TBARCODEADV | POSTNETCHECK ) ); s_info.append( createInfo( "b46", "Plessey Code", TBARCODE, TBARCODEADV ) ); s_info.append( createInfo( "b47", "MSI Code", TBARCODE, TBARCODEADV | MODULO10CHECK ) ); s_info.append( createInfo( "b50", "LOGMARS", TBARCODE, TBARCODEADV | MODULOALLCHECK ) ); s_info.append( createInfo( "b55", "PDF417 - 2D bar code", TBARCODE, BARCODE2D | PDF417BARCODE ) ); s_info.append( createInfo( "b56", "PDF417 Truncated - 2D bar code", TBARCODE, BARCODE2D | PDF417BARCODE ) ); s_info.append( createInfo( "b57", "MaxiCode - 2D-bar code (Postscript only)", TBARCODE, BARCODE2D ) ); s_info.append( createInfo( "b58", "QR-Code", TBARCODE, BARCODE2D ) ); s_info.append( createInfo( "b59", "Code128 (CharSet A)", TBARCODE, TBARCODEADV | CODE128CHECK | MODULOALLCHECK ) ); s_info.append( createInfo( "b60", "Code128 (CharSet B)", TBARCODE, TBARCODEADV | CODE128CHECK | MODULOALLCHECK ) ); s_info.append( createInfo( "b61", "Code128 (CharSet C)", TBARCODE, TBARCODEADV | CODE128CHECK | MODULOALLCHECK ) ); s_info.append( createInfo( "b62", "Code 93 Ascii", TBARCODE, TBARCODEADV | MODULOALLCHECK ) ); s_info.append( createInfo( "b63", "Australian Post Standard Customer", TBARCODE, NOCUT | TBARCODEADV ) ); s_info.append( createInfo( "b64", "Australian Post Customer 2", TBARCODE, NOCUT | TBARCODEADV ) ); s_info.append( createInfo( "b65", "Australian Post Customer 3", TBARCODE, NOCUT | TBARCODEADV ) ); s_info.append( createInfo( "b66", "Australian Post Reply Paid", TBARCODE, NOCUT | TBARCODEADV ) ); s_info.append( createInfo( "b67", "Australian Post Routing", TBARCODE, NOCUT | TBARCODEADV ) ); s_info.append( createInfo( "b68", "Australian Post Redirection", TBARCODE, NOCUT | TBARCODEADV ) ); s_info.append( createInfo( "b69", "ISBN Code (=EAN13P5)", TBARCODE, TBARCODEADV ) ); s_info.append( createInfo( "b70", "Royal Mail 4 State (RM4SCC)", TBARCODE, NOCUT | TBARCODEADV ) ); s_info.append( createInfo( "b71", "Data Matrix", TBARCODE, DATAMATRIX | BARCODE2D | NOSCALE ) ); } if( s_haveTBarcode2 ) { s_info.append( createInfo( "1", "Code 11", TBARCODE2, TBARCODEADV | MODULO10CHECK ) ); s_info.append( createInfo( "2", "Code 2 of 5 (Standard)", TBARCODE2, TBARCODEADV | MODULO10CHECK ) ); s_info.append( createInfo( "3", "Interleaved 2 of 5 Standard", TBARCODE2, TBARCODEADV ) ); s_info.append( createInfo( "4", "Code 2 of 5 IATA", TBARCODE2, TBARCODEADV | MODULO10CHECK ) ); s_info.append( createInfo( "5", "Code 2 of 5 Matrix", TBARCODE2, TBARCODEADV | MODULO10CHECK ) ); s_info.append( createInfo( "6", "Code 2 of 5 Data Logic", TBARCODE2, TBARCODEADV | MODULO10CHECK ) ); s_info.append( createInfo( "7", "Code 2 of 5 Industrial", TBARCODE2, TBARCODEADV | MODULO10CHECK ) ); s_info.append( createInfo( "8", "Code 3 of 9 (Code 39)", TBARCODE2, TBARCODEADV | MODULOALLCHECK ) ); s_info.append( createInfo( "9", "Code 3 of 9 (Code 39) ASCII", TBARCODE2, TBARCODEADV | MODULOALLCHECK ) ); s_info.append( createInfo( "10", "EAN8", TBARCODE2, TBARCODEADV | EAN8CHECK | MODULO10CHECK ) ); s_info.append( createInfo( "11", "EAN8 - 2 digits add on", TBARCODE2, NOCUT | TBARCODEADV | EAN8CHECK | MODULO10CHECK ) ); s_info.append( createInfo( "12", "EAN8 - 5 digits add on", TBARCODE2, NOCUT | TBARCODEADV | EAN8CHECK | MODULO10CHECK ) ); s_info.append( createInfo( "13", "EAN13", TBARCODE2, TBARCODEADV | EAN13CHECK | MODULO10CHECK ) ); s_info.append( createInfo( "14", "EAN13 - 2 digits add on", TBARCODE2, NOCUT | TBARCODEADV | EAN13CHECK | MODULO10CHECK ) ); s_info.append( createInfo( "15", "EAN13 - 5 digits add on", TBARCODE2, NOCUT | TBARCODEADV | EAN13CHECK | MODULO10CHECK ) ); s_info.append( createInfo( "16", "EAN128", TBARCODE2, TBARCODEADV | MODULOALLCHECK ) ); s_info.append( createInfo( "17", "UPC 12 Digits", TBARCODE2, TBARCODEADV | MODULOALLCHECK ) ); s_info.append( createInfo( "18", "CodaBar (2 width)", TBARCODE2, TBARCODEADV | MODULO10CHECK ) ); //s_info.append( createInfo( "19", "CodaBar (18 widths)", TBARCODE2, TBARCODEADV ) ); s_info.append( createInfo( "20", "Code128", TBARCODE2, TBARCODEADV ) ); s_info.append( createInfo( "21", "Deutsche Post Leitcode", TBARCODE2, TBARCODEADV ) ); s_info.append( createInfo( "22", "Deutsche Post Identcode", TBARCODE2, TBARCODEADV ) ); //s_info.append( createInfo( "23", "Code 16K", TBARCODE2, TBARCODEADV ) ); //s_info.append( createInfo( "24", "Code 49", TBARCODE2, TBARCODEADV ) ); s_info.append( createInfo( "25", "Code 93", TBARCODE2, TBARCODEADV ) ); s_info.append( createInfo( "26", "UPC 25 (Identical to UPCA)", TBARCODE2, TBARCODEADV ) ); //s_info.append( createInfo( "27", "UPCD1", TBARCODE2, TBARCODEADV ) ); s_info.append( createInfo( "28", "Flattermarken", TBARCODE2, TBARCODEADV ) ); s_info.append( createInfo( "29", "RSS-14", TBARCODE2, TBARCODEADV ) ); s_info.append( createInfo( "30", "RSS Limited", TBARCODE2, TBARCODEADV ) ); s_info.append( createInfo( "31", "RSS Expanded", TBARCODE2, TBARCODEADV ) ); s_info.append( createInfo( "32", "Telepen Alpha", TBARCODE2, TBARCODEADV ) ); s_info.append( createInfo( "33", "UCC128 (= EAN128)", TBARCODE2, TBARCODEADV ) ); s_info.append( createInfo( "34", "UPC A", TBARCODE2, TBARCODEADV | TBARCODEADV | UPCACHECK ) ); s_info.append( createInfo( "35", "UPC A - 2 digit add on", TBARCODE2, TBARCODEADV | UPCACHECK ) ); s_info.append( createInfo( "36", "UPC A - 5 digit add on", TBARCODE2, TBARCODEADV | UPCACHECK ) ); s_info.append( createInfo( "37", "UPC E", TBARCODE2, TBARCODEADV | UPCECHECK ) ); s_info.append( createInfo( "38", "UPC E - 2 digit add on", TBARCODE2, TBARCODEADV | UPCECHECK ) ); s_info.append( createInfo( "39", "UPC E - 5 digit add on", TBARCODE2, TBARCODEADV | UPCECHECK ) ); s_info.append( createInfo( "40", "PostNet5", TBARCODE2, NOCUT | TBARCODEADV | POSTNETCHECK ) ); s_info.append( createInfo( "41", "PostNet6 (5+CD)", TBARCODE2, NOCUT | TBARCODEADV | POSTNETCHECK ) ); s_info.append( createInfo( "42", "PostNet9 (5+4)", TBARCODE2, NOCUT | TBARCODEADV | POSTNETCHECK ) ); s_info.append( createInfo( "43", "PostNet10 (5+4+CD)", TBARCODE2, NOCUT | TBARCODEADV | POSTNETCHECK ) ); s_info.append( createInfo( "44", "PostNet11 (5+4+2)", TBARCODE2, NOCUT | TBARCODEADV | POSTNETCHECK ) ); s_info.append( createInfo( "45", "PostNet12 (5+4+2+CD)", TBARCODE2, NOCUT | TBARCODEADV | POSTNETCHECK ) ); s_info.append( createInfo( "46", "Plessey Code", TBARCODE2, TBARCODEADV ) ); s_info.append( createInfo( "47", "MSI Code", TBARCODE2, TBARCODEADV | MODULO10CHECK ) ); s_info.append( createInfo( "48", "SSCC18", TBARCODE2, TBARCODEADV ) ); //s_info.append( createInfo( "49", "FIM", TBARCODE2, TBARCODEADV ) ); s_info.append( createInfo( "50", "LOGMARS", TBARCODE2, TBARCODEADV | MODULOALLCHECK ) ); s_info.append( createInfo( "51", "Pharmacode One-Track", TBARCODE2, TBARCODEADV ) ); s_info.append( createInfo( "52", "Pharmacentralnumber", TBARCODE2, TBARCODEADV ) ); s_info.append( createInfo( "53", "Pharmacode Two-Track", TBARCODE2, TBARCODEADV ) ); //s_info.append( createInfo( "54", "General Parcel", TBARCODE2, TBARCODEADV ) ); s_info.append( createInfo( "55", "PDF417 - 2D bar code", TBARCODE2, BARCODE2D | PDF417BARCODE ) ); s_info.append( createInfo( "56", "PDF417 Truncated - 2D bar code", TBARCODE2, BARCODE2D | PDF417BARCODE ) ); s_info.append( createInfo( "57", "MaxiCode - 2D-bar code (Postscript only)", TBARCODE2, BARCODE2D ) ); s_info.append( createInfo( "58", "QR-Code", TBARCODE2, BARCODE2D ) ); s_info.append( createInfo( "59", "Code128 (CharSet A)", TBARCODE2, TBARCODEADV | CODE128CHECK | MODULOALLCHECK ) ); s_info.append( createInfo( "60", "Code128 (CharSet B)", TBARCODE2, TBARCODEADV | CODE128CHECK | MODULOALLCHECK ) ); s_info.append( createInfo( "61", "Code128 (CharSet C)", TBARCODE2, TBARCODEADV | CODE128CHECK | MODULOALLCHECK ) ); s_info.append( createInfo( "62", "Code 93 Ascii", TBARCODE2, TBARCODEADV | MODULOALLCHECK ) ); s_info.append( createInfo( "63", "Australian Post Standard Customer", TBARCODE2, NOCUT | TBARCODEADV ) ); s_info.append( createInfo( "64", "Australian Post Customer 2", TBARCODE2, NOCUT | TBARCODEADV ) ); s_info.append( createInfo( "65", "Australian Post Customer 3", TBARCODE2, NOCUT | TBARCODEADV ) ); s_info.append( createInfo( "66", "Australian Post Reply Paid", TBARCODE2, NOCUT | TBARCODEADV ) ); s_info.append( createInfo( "67", "Australian Post Routing", TBARCODE2, NOCUT | TBARCODEADV ) ); s_info.append( createInfo( "68", "Australian Post Redirection", TBARCODE2, NOCUT | TBARCODEADV ) ); s_info.append( createInfo( "69", "ISBN Code (=EAN13P5)", TBARCODE2, TBARCODEADV ) ); s_info.append( createInfo( "70", "Royal Mail 4 State (RM4SCC)", TBARCODE2, NOCUT | TBARCODEADV ) ); s_info.append( createInfo( "71", "Data Matrix", TBARCODE2, DATAMATRIX | BARCODE2D | NOSCALE ) ); s_info.append( createInfo( "72", "EAN-14", TBARCODE2, TBARCODEADV ) ); //s_info.append( createInfo( "73", "Codablock-E", TBARCODE2, TBARCODEADV ) ); s_info.append( createInfo( "74", "Codablock-F", TBARCODE2, TBARCODEADV ) ); s_info.append( createInfo( "75", "NVE-18", TBARCODE2, TBARCODEADV ) ); s_info.append( createInfo( "76", "Japanese Postal Code", TBARCODE2, TBARCODEADV ) ); s_info.append( createInfo( "77", "Korean Postal", TBARCODE2, TBARCODEADV ) ); s_info.append( createInfo( "78", "RSS-14 Truncated", TBARCODE2, BARCODE2D ) ); s_info.append( createInfo( "79", "RSS-14 Stacked", TBARCODE2, BARCODE2D ) ); s_info.append( createInfo( "80", "RSS-14 Stacked Omnidirektional", TBARCODE2, BARCODE2D ) ); s_info.append( createInfo( "81", "RSS Expanded Stacked", TBARCODE2, BARCODE2D ) ); s_info.append( createInfo( "82", "Planet 12 digits", TBARCODE2, TBARCODEADV ) ); s_info.append( createInfo( "83", "Planet 14 digits", TBARCODE2, TBARCODEADV ) ); s_info.append( createInfo( "84", "MicroPDF417", TBARCODE2, BARCODE2D ) ); } Barkode::initValidators(); } void Barkode::initValidators() { TQString path; const char* rules = "/usr/share/libpostscriptbarcode/rules.xml"; if( TQFile::exists( rules ) ) path = rules; else path = locate( "data", "kbarcode/rules.xml" ); TQFile xml( path ); TQDomDocument doc; TQDomElement root; TQDomNode n; TQString id; TQString* regular; TQString* regularNot; if( !xml.open( IO_ReadOnly ) ) { tqDebug( "Cannot read validation rules from %s\n", path.latin1() ); return; } doc.setContent( &xml ); root = doc.documentElement(); n = root.firstChild(); while( !n.isNull() ) { TQDomElement e = n.toElement(); if( !e.isNull() && e.tagName() == "encoder" ) { id = e.attribute( "id" ); id.prepend( "ps_" ); regular = Barkode::validatorFromType( id ); regularNot = Barkode::validatorNotFromType( id ); TQDomNode child = e.firstChild(); while( !child.isNull() ) { TQDomElement e = child.toElement(); TQString pattern = TQString(); if( child.firstChild().isCDATASection() ) { pattern = child.firstChild().toCDATASection().data().stripWhiteSpace(); } if( !e.isNull() && e.tagName() == "pattern" ) { TQString sense = e.attribute( "sense", "true" ); if( sense == "true" ) *regular = pattern; else *regularNot = pattern; } child = child.nextSibling(); } } n = n.nextSibling(); } xml.close(); }