⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sgxbarcode.cpp

📁 一个基于BREW上的WEB service程序,通过扫描图书的条形码,登陆WEB站点,利用SOAP-RPC来查询图书信息.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/**
***     Class Name                     : SGXBarCode
***     Version                        : 1.0.0
***
***     Author                         : Sophia Cradle Incorporated
***     Platform                       : x86, ARM
***     OS                             : BREW 2.1, BREW 3.1
***     Target SophiaFramework Version : 3.0
***     Compiler                       : Visual C++ 6.0, Visual C++ .NET 2003,
***                                      RVCTB 1.2
**/

/*
 === 僶乕偺 2 抣壔偵偮偄偰 ===
   崟 -> true
   敀 -> false
 =============================
*/

#include "SGXBarCode.hpp"

#define DEFAULT_HEIGHT      5   // 撉傒庢傝偵巊梡偡傞夋憸偺廲曽岦偺僒僀僘偺婛掕抣
#define BAR_LENGTH_ERROR    4   // 僶乕偺挿偝偺岆嵎偺嫋梕
#define BARLENGTH_JAN8      67
#define BARLENGTH_JAN13     95

SGXBarCode::SGXBarCode(Void) : _barcodeType(BARCODE_JAN13), _barBitSize(0), _barBit(null), _height(DEFAULT_HEIGHT), _grayscale(null)
{
}

SGXBarCode::SGXBarCode(SGXBarCode::BarCodeEnum barcodeType) : _barcodeType(barcodeType), _barBitSize(0), _barBit(null), _height(DEFAULT_HEIGHT), _grayscale(null)
{
}

SGXBarCode::SGXBarCode(SGXBarCodeConstRef ob) : _barBitSize(0), _barBit(null), _height(DEFAULT_HEIGHT), _grayscale(null)
{
    Copy(ob);
}

SGXBarCode::~SGXBarCode(Void)
{
    Clear();
}

SGXBarCodeConstRef SGXBarCode::operator =(SGXBarCodeConstRef ob)
{
    Copy(ob);
    return *this;
}

Void SGXBarCode::Clear(Void)
{
    if (_barBit) {
        delete [] _barBit;
    }
    _barBit = null;
    _barBitSize = 0;
    if (_grayscale) {
        delete [] _grayscale;
    }
    _grayscale = null;
}

Void SGXBarCode::Copy(SGXBarCodeConstRef ob) static_throws
{
    Clear();
    _barcodeType = ob._barcodeType;
    _result = ob._result;
    static_throw(SFERR_NO_ERROR);
}

Void SGXBarCode::SetType(BarCodeEnum barcodeType)
{
    _barcodeType = barcodeType;
}

SGXBarCode::BarCodeEnum SGXBarCode::GetType(Void) const
{
    return _barcodeType;
}

// 撉傒庢傞夋憸偺廲曽岦偺戝偒偝傪愝掕
Void SGXBarCode::SetHeight(UInt16 height)
{
    _height = height;
}

// 撉傒庢傞夋憸偺廲曽岦偺戝偒偝傪庢摼
UInt16 SGXBarCode::GetHeight(Void) const
{
    return _height;
}

// JAN-13 傪張棟偡傞
Void SGXBarCode::ProcessJAN13(Void) static_throws
{
    UInt08 code[13], c;
    UInt08 parity(0);
    SInt16 i;
    UInt32 odd(0), even(0), checkDigit;
    BarTypeEnum barType;
    
    if (_barBitSize != BARLENGTH_JAN13) {
        static_throw(ERR_INVALID_BARCODE);
        return;
    }
    if (!(_barBit[0] && !_barBit[1] && _barBit[2] && !_barBit[45] && _barBit[46] && !_barBit[47] && _barBit[48] && !_barBit[49] && _barBit[92] && !_barBit[93] && _barBit[94])) {
        static_throw(ERR_INVALID_BARCODE);
        return;
    }

    // 嵍敿暘傪張棟
    for (i = 0; i < 6; ) {
        if (!ReadJANBar(_barBit + 3 + 7 * i, &c, &barType) || (barType != BARTYPE_JAN_LO && barType != BARTYPE_JAN_LE)) {
            static_throw(ERR_INVALID_BARCODE);
            return;
        }
        code[++i] = c;
        parity <<= 1;
        parity |= ((barType == BARTYPE_JAN_LE) ? 1 : 0);
    }
    switch (parity) {
        case 0x00:
            code[0] = 0;
            break;
        case 0x0B:
            code[0] = 1;
            break;
        case 0x0D:
            code[0] = 2;
            break;
        case 0x0E:
            code[0] = 3;
            break;
        case 0x13:
            code[0] = 4;
            break;
        case 0x19:
            code[0] = 5;
            break;
        case 0x1C:
            code[0] = 6;
            break;
        case 0x15:
            code[0] = 7;
            break;
        case 0x16:
            code[0] = 8;
            break;
        case 0x1A:
            code[0] = 9;
            break;
        default:
            static_throw(ERR_INVALID_BARCODE);
            return;
    }

    // 塃敿暘傪張棟
    for (i = 0; i < 6; ++i) {
        if (!ReadJANBar(_barBit + 50 + 7 * i, &c, &barType) || barType != BARTYPE_JAN_RE) {
            static_throw(ERR_INVALID_BARCODE);
            return;
        }
        code[i + 7] = c;
    }

    // 寢壥傪暥帤楍偵曄姺
    for (i = 0; i < 13; ++i) {
        _result += '0' + code[i];
    }
    
    // 僨乕僞偺惍崌惈傪僠僃僢僋 (儌僕儏儔僗10 / 僂僃僀僩 3)
    for (i = 0; i < 12; i += 2) {
        odd += code[i + 1];
        even += code[i];
    }
    checkDigit = 10 - ((3 * odd + even) % 10);
    if (code[12] != static_cast<UInt08>(checkDigit)) {
        static_throw(ERR_MISMATCH);
    }
}

Void SGXBarCode::ProcessJAN8(Void) static_throws
{
    UInt08 code[8], c;
    SInt16 i;
    UInt32 odd(0), even(0), checkDigit;
    BarTypeEnum barType;
    
    if (_barBitSize != BARLENGTH_JAN8) {
        static_throw(ERR_INVALID_BARCODE);
        return;
    }
    if (!(_barBit[0] && !_barBit[1] && _barBit[2] && !_barBit[31] && _barBit[32] && !_barBit[33] && _barBit[34] && !_barBit[35] && _barBit[64] && !_barBit[65] && _barBit[66])) {
        static_throw(ERR_INVALID_BARCODE);
        return;
    }

    // 嵍敿暘傪張棟
    for (i = 0; i < 4; ++i) {
        if (!ReadJANBar(_barBit + 3 + 7 * i, &c, &barType) || barType != BARTYPE_JAN_LO) {
            static_throw(ERR_INVALID_BARCODE);
            return;
        }
        code[i] = c;
    }

    // 塃敿暘傪張棟
    for (i = 0; i < 4; ++i) {
        if (!ReadJANBar(_barBit + 36 + 7 * i, &c, &barType) || barType != BARTYPE_JAN_RE) {
            static_throw(ERR_INVALID_BARCODE);
            return;
        }
        code[i + 4] = c;
    }

    // 寢壥傪暥帤楍偵曄姺
    for (i = 0; i < 8; ++i) {
        _result += '0' + code[i];
    }

    // 僨乕僞偺惍崌惈傪僠僃僢僋 (儌僕儏儔僗10 / 僂僃僀僩 3)
    odd = code[0];
    for (i = 1; i < 7; i += 2) {
        odd += code[i + 1];
        even += code[i];
    }
    checkDigit = 10 - ((3 * odd + even) % 10);
    if (code[7] != static_cast<UInt08>(checkDigit)) {
        static_throw(ERR_MISMATCH);
    }

}

// JAN-8 / JAN-13 偺僶乕偺僷僞乕儞傪悢帤偵曄姺
Bool SGXBarCode::ReadJANBar(BoolConstPtr bar, UInt08Ptr pVal, SGXBarCode::BarTypeEnum *pBarType)
{
    Bool result(true);
    UInt08 pattern(0);
    SInt16 i;

    for (i = 0; i < 7; ++i) {
        pattern <<= 1;
        pattern |= (bar[i] ? 1 : 0);
    }
    switch (pattern) {
        case 0x0D:
            *pVal = 0;
            *pBarType = BARTYPE_JAN_LO;
            break;
        case 0x19:
            *pVal = 1;
            *pBarType = BARTYPE_JAN_LO;
            break;
        case 0x13:
            *pVal = 2;
            *pBarType = BARTYPE_JAN_LO;
            break;
        case 0x3D:
            *pVal = 3;
            *pBarType = BARTYPE_JAN_LO;
            break;
        case 0x23:
            *pVal = 4;
            *pBarType = BARTYPE_JAN_LO;
            break;
        case 0x31:
            *pVal = 5;
            *pBarType = BARTYPE_JAN_LO;
            break;
        case 0x2F:
            *pVal = 6;
            *pBarType = BARTYPE_JAN_LO;
            break;
        case 0x3B:
            *pVal = 7;
            *pBarType = BARTYPE_JAN_LO;
            break;
        case 0x37:
            *pVal = 8;
            *pBarType = BARTYPE_JAN_LO;
            break;
        case 0x0B:
            *pVal = 9;
            *pBarType = BARTYPE_JAN_LO;
            break;
        case 0x27:
            *pVal = 0;
            *pBarType = BARTYPE_JAN_LE;
            break;
        case 0x33:
            *pVal = 1;
            *pBarType = BARTYPE_JAN_LE;
            break;
        case 0x1B:
            *pVal = 2;
            *pBarType = BARTYPE_JAN_LE;
            break;
        case 0x21:
            *pVal = 3;
            *pBarType = BARTYPE_JAN_LE;
            break;
        case 0x1D:
            *pVal = 4;
            *pBarType = BARTYPE_JAN_LE;
            break;
        case 0x39:
            *pVal = 5;
            *pBarType = BARTYPE_JAN_LE;
            break;
        case 0x05:
            *pVal = 6;
            *pBarType = BARTYPE_JAN_LE;
            break;
        case 0x11:
            *pVal = 7;
            *pBarType = BARTYPE_JAN_LE;
            break;
        case 0x09:
            *pVal = 8;
            *pBarType = BARTYPE_JAN_LE;
            break;
        case 0x17:
            *pVal = 9;
            *pBarType = BARTYPE_JAN_LE;
            break;
        case 0x72:
            *pVal = 0;
            *pBarType = BARTYPE_JAN_RE;
            break;
        case 0x66:
            *pVal = 1;
            *pBarType = BARTYPE_JAN_RE;
            break;
        case 0x6C:
            *pVal = 2;
            *pBarType = BARTYPE_JAN_RE;
            break;
        case 0x42:
            *pVal = 3;
            *pBarType = BARTYPE_JAN_RE;
            break;
        case 0x5C:
            *pVal = 4;
            *pBarType = BARTYPE_JAN_RE;
            break;
        case 0x4E:
            *pVal = 5;
            *pBarType = BARTYPE_JAN_RE;
            break;
        case 0x50:
            *pVal = 6;
            *pBarType = BARTYPE_JAN_RE;
            break;
        case 0x44:
            *pVal = 7;
            *pBarType = BARTYPE_JAN_RE;
            break;
        case 0x48:
            *pVal = 8;
            *pBarType = BARTYPE_JAN_RE;
            break;
        case 0x74:
            *pVal = 9;
            *pBarType = BARTYPE_JAN_RE;
            break;
        default:
            result = false;
    }
    return result;
}

SFXAnsiStringConstRef SGXBarCode::Read(SFBBitmapSmpConstRef bitmap) static_throws
{
    AEEBitmapInfo info;
    bitmap->GetInfo(&info);
    return Read(bitmap, static_cast<UInt16>(info.cy / 2));
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -