14d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Copyright 2014 PDFium Authors. All rights reserved. 24d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Use of this source code is governed by a BSD-style license that can be 34d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// found in the LICENSE file. 44d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 54d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 64d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Original code is licensed as follows: 74d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann/* 84d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * Copyright 2006-2007 Jeremias Maerki. 94d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * 104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * Licensed under the Apache License, Version 2.0 (the "License"); 114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * you may not use this file except in compliance with the License. 124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * You may obtain a copy of the License at 134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * 144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * http://www.apache.org/licenses/LICENSE-2.0 154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * 164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * Unless required by applicable law or agreed to in writing, software 174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * distributed under the License is distributed on an "AS IS" BASIS, 184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * See the License for the specific language governing permissions and 204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * limitations under the License. 214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann */ 224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <limits> 244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <memory> 254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <vector> 264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxbarcode/BC_Dimension.h" 284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxbarcode/BC_UtilCodingConvert.h" 294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxbarcode/common/BC_CommonBitMatrix.h" 304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxbarcode/datamatrix/BC_ASCIIEncoder.h" 314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxbarcode/datamatrix/BC_Base256Encoder.h" 324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxbarcode/datamatrix/BC_C40Encoder.h" 334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxbarcode/datamatrix/BC_EdifactEncoder.h" 344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxbarcode/datamatrix/BC_Encoder.h" 354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxbarcode/datamatrix/BC_EncoderContext.h" 364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxbarcode/datamatrix/BC_HighLevelEncoder.h" 374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxbarcode/datamatrix/BC_SymbolInfo.h" 384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxbarcode/datamatrix/BC_SymbolShapeHint.h" 394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxbarcode/datamatrix/BC_TextEncoder.h" 404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxbarcode/datamatrix/BC_X12Encoder.h" 414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxbarcode/utils.h" 424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannFX_WCHAR CBC_HighLevelEncoder::LATCH_TO_C40 = 230; 444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannFX_WCHAR CBC_HighLevelEncoder::LATCH_TO_BASE256 = 231; 454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannFX_WCHAR CBC_HighLevelEncoder::UPPER_SHIFT = 235; 464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannFX_WCHAR CBC_HighLevelEncoder::LATCH_TO_ANSIX12 = 238; 474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannFX_WCHAR CBC_HighLevelEncoder::LATCH_TO_TEXT = 239; 484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannFX_WCHAR CBC_HighLevelEncoder::LATCH_TO_EDIFACT = 240; 494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannFX_WCHAR CBC_HighLevelEncoder::C40_UNLATCH = 254; 504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannFX_WCHAR CBC_HighLevelEncoder::X12_UNLATCH = 254; 514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannFX_WCHAR CBC_HighLevelEncoder::PAD = 129; 524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannFX_WCHAR CBC_HighLevelEncoder::MACRO_05 = 236; 534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannFX_WCHAR CBC_HighLevelEncoder::MACRO_06 = 237; 544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannconst wchar_t* CBC_HighLevelEncoder::MACRO_05_HEADER = L"[)>05"; 554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannconst wchar_t* CBC_HighLevelEncoder::MACRO_06_HEADER = L"[)>06"; 564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannconst wchar_t CBC_HighLevelEncoder::MACRO_TRAILER = 0x0004; 574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCBC_HighLevelEncoder::CBC_HighLevelEncoder() {} 594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCBC_HighLevelEncoder::~CBC_HighLevelEncoder() {} 604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 6133357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. MoltmannCFX_ArrayTemplate<uint8_t>& CBC_HighLevelEncoder::getBytesForMessage( 6233357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann CFX_WideString msg) { 634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_ByteString bytestr; 644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CBC_UtilCodingConvert::UnicodeToUTF8(msg, bytestr); 654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t i = 0; i < bytestr.GetLength(); i++) { 664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_bytearray.Add(bytestr.GetAt(i)); 674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return m_bytearray; 694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCFX_WideString CBC_HighLevelEncoder::encodeHighLevel(CFX_WideString msg, 714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_WideString ecLevel, 724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t& e) { 734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return encodeHighLevel(msg, ecLevel, FORCE_NONE, nullptr, nullptr, e); 744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCFX_WideString CBC_HighLevelEncoder::encodeHighLevel(CFX_WideString msg, 764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_WideString ecLevel, 774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann SymbolShapeHint shape, 784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CBC_Dimension* minSize, 794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CBC_Dimension* maxSize, 804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t& e) { 814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CBC_EncoderContext context(msg, ecLevel, e); 8233357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann if (e != BCExceptionNO) 8333357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann return CFX_WideString(); 844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann context.setSymbolShape(shape); 854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann context.setSizeConstraints(minSize, maxSize); 864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if ((msg.Mid(0, 6) == MACRO_05_HEADER) && 874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (msg.Mid(msg.GetLength() - 1, 1) == MACRO_TRAILER)) { 884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann context.writeCodeword(MACRO_05); 894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann context.setSkipAtEnd(2); 904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann context.m_pos += 6; 914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if ((msg.Mid(0, 6) == MACRO_06_HEADER) && 924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (msg.Mid(msg.GetLength() - 1, 1) == MACRO_TRAILER)) { 934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann context.writeCodeword(MACRO_06); 944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann context.setSkipAtEnd(2); 954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann context.m_pos += 6; 964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::vector<std::unique_ptr<CBC_Encoder>> encoders; 994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann encoders.push_back(std::unique_ptr<CBC_Encoder>(new CBC_ASCIIEncoder())); 1004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann encoders.push_back(std::unique_ptr<CBC_Encoder>(new CBC_C40Encoder())); 1014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann encoders.push_back(std::unique_ptr<CBC_Encoder>(new CBC_TextEncoder())); 1024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann encoders.push_back(std::unique_ptr<CBC_Encoder>(new CBC_X12Encoder())); 1034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann encoders.push_back(std::unique_ptr<CBC_Encoder>(new CBC_EdifactEncoder())); 1044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann encoders.push_back(std::unique_ptr<CBC_Encoder>(new CBC_Base256Encoder())); 1054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t encodingMode = ASCII_ENCODATION; 1064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (context.hasMoreCharacters()) { 1074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann encoders[encodingMode]->Encode(context, e); 1084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (e != BCExceptionNO) 1094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return L""; 1104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (context.m_newEncoding >= 0) { 1124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann encodingMode = context.m_newEncoding; 1134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann context.resetEncoderSignal(); 1144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t len = context.m_codewords.GetLength(); 1174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann context.updateSymbolInfo(e); 1184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (e != BCExceptionNO) 1194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return L""; 1204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t capacity = context.m_symbolInfo->m_dataCapacity; 1224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (len < capacity) { 1234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (encodingMode != ASCII_ENCODATION && 1244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann encodingMode != BASE256_ENCODATION) { 1254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann context.writeCodeword(0x00fe); 1264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_WideString codewords = context.m_codewords; 1294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (codewords.GetLength() < capacity) { 1304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann codewords += PAD; 1314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (codewords.GetLength() < capacity) { 1334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann codewords += (randomize253State(PAD, codewords.GetLength() + 1)); 1344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return codewords; 1364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 1374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannint32_t CBC_HighLevelEncoder::lookAheadTest(CFX_WideString msg, 1384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t startpos, 1394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t currentMode) { 1404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (startpos >= msg.GetLength()) { 1414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return currentMode; 1424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::vector<FX_FLOAT> charCounts; 1444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (currentMode == ASCII_ENCODATION) { 1454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann charCounts.push_back(0); 1464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann charCounts.push_back(1); 1474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann charCounts.push_back(1); 1484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann charCounts.push_back(1); 1494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann charCounts.push_back(1); 1504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann charCounts.push_back(1.25f); 1514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 1524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann charCounts.push_back(1); 1534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann charCounts.push_back(2); 1544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann charCounts.push_back(2); 1554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann charCounts.push_back(2); 1564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann charCounts.push_back(2); 1574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann charCounts.push_back(2.25f); 1584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann charCounts[currentMode] = 0; 1594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t charsProcessed = 0; 1614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (true) { 1624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if ((startpos + charsProcessed) == msg.GetLength()) { 1634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t min = std::numeric_limits<int32_t>::max(); 16433357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann CFX_ArrayTemplate<uint8_t> mins; 1654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann mins.SetSize(6); 16633357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann CFX_ArrayTemplate<int32_t> intCharCounts; 1674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann intCharCounts.SetSize(6); 1684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann min = findMinimums(charCounts, intCharCounts, min, mins); 1694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t minCount = getMinimumCount(mins); 1704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (intCharCounts[ASCII_ENCODATION] == min) { 1714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return ASCII_ENCODATION; 1724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (minCount == 1 && mins[BASE256_ENCODATION] > 0) { 1744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return BASE256_ENCODATION; 1754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (minCount == 1 && mins[EDIFACT_ENCODATION] > 0) { 1774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return EDIFACT_ENCODATION; 1784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (minCount == 1 && mins[TEXT_ENCODATION] > 0) { 1804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return TEXT_ENCODATION; 1814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (minCount == 1 && mins[X12_ENCODATION] > 0) { 1834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return X12_ENCODATION; 1844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return C40_ENCODATION; 1864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_WCHAR c = msg.GetAt(startpos + charsProcessed); 1884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann charsProcessed++; 1894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (isDigit(c)) { 1904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann charCounts[ASCII_ENCODATION] += 0.5; 1914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (isExtendedASCII(c)) { 1924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann charCounts[ASCII_ENCODATION] = 1934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (FX_FLOAT)ceil(charCounts[ASCII_ENCODATION]); 1944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann charCounts[ASCII_ENCODATION] += 2; 1954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 1964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann charCounts[ASCII_ENCODATION] = 1974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (FX_FLOAT)ceil(charCounts[ASCII_ENCODATION]); 1984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann charCounts[ASCII_ENCODATION]++; 1994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (isNativeC40(c)) { 2014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann charCounts[C40_ENCODATION] += 2.0f / 3.0f; 2024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (isExtendedASCII(c)) { 2034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann charCounts[C40_ENCODATION] += 8.0f / 3.0f; 2044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 2054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann charCounts[C40_ENCODATION] += 4.0f / 3.0f; 2064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (isNativeText(c)) { 2084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann charCounts[TEXT_ENCODATION] += 2.0f / 3.0f; 2094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (isExtendedASCII(c)) { 2104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann charCounts[TEXT_ENCODATION] += 8.0f / 3.0f; 2114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 2124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann charCounts[TEXT_ENCODATION] += 4.0f / 3.0f; 2134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (isNativeX12(c)) { 2154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann charCounts[X12_ENCODATION] += 2.0f / 3.0f; 2164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (isExtendedASCII(c)) { 2174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann charCounts[X12_ENCODATION] += 13.0f / 3.0f; 2184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 2194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann charCounts[X12_ENCODATION] += 10.0f / 3.0f; 2204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (isNativeEDIFACT(c)) { 2224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann charCounts[EDIFACT_ENCODATION] += 3.0f / 4.0f; 2234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (isExtendedASCII(c)) { 2244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann charCounts[EDIFACT_ENCODATION] += 17.0f / 4.0f; 2254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 2264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann charCounts[EDIFACT_ENCODATION] += 13.0f / 4.0f; 2274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (isSpecialB256(c)) { 2294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann charCounts[BASE256_ENCODATION] += 4; 2304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 2314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann charCounts[BASE256_ENCODATION]++; 2324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (charsProcessed >= 4) { 23433357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann CFX_ArrayTemplate<int32_t> intCharCounts; 2354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann intCharCounts.SetSize(6); 23633357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann CFX_ArrayTemplate<uint8_t> mins; 2374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann mins.SetSize(6); 2384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann findMinimums(charCounts, intCharCounts, 2394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::numeric_limits<int32_t>::max(), mins); 2404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t minCount = getMinimumCount(mins); 2414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (intCharCounts[ASCII_ENCODATION] < intCharCounts[BASE256_ENCODATION] && 2424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann intCharCounts[ASCII_ENCODATION] < intCharCounts[C40_ENCODATION] && 2434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann intCharCounts[ASCII_ENCODATION] < intCharCounts[TEXT_ENCODATION] && 2444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann intCharCounts[ASCII_ENCODATION] < intCharCounts[X12_ENCODATION] && 2454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann intCharCounts[ASCII_ENCODATION] < intCharCounts[EDIFACT_ENCODATION]) { 2464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return ASCII_ENCODATION; 2474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (intCharCounts[BASE256_ENCODATION] < intCharCounts[ASCII_ENCODATION] || 2494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (mins[C40_ENCODATION] + mins[TEXT_ENCODATION] + mins[X12_ENCODATION] + 2504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann mins[EDIFACT_ENCODATION]) == 0) { 2514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return BASE256_ENCODATION; 2524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (minCount == 1 && mins[EDIFACT_ENCODATION] > 0) { 2544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return EDIFACT_ENCODATION; 2554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (minCount == 1 && mins[TEXT_ENCODATION] > 0) { 2574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return TEXT_ENCODATION; 2584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (minCount == 1 && mins[X12_ENCODATION] > 0) { 2604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return X12_ENCODATION; 2614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (intCharCounts[C40_ENCODATION] + 1 < intCharCounts[ASCII_ENCODATION] && 2634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann intCharCounts[C40_ENCODATION] + 1 < 2644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann intCharCounts[BASE256_ENCODATION] && 2654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann intCharCounts[C40_ENCODATION] + 1 < 2664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann intCharCounts[EDIFACT_ENCODATION] && 2674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann intCharCounts[C40_ENCODATION] + 1 < intCharCounts[TEXT_ENCODATION]) { 2684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (intCharCounts[C40_ENCODATION] < intCharCounts[X12_ENCODATION]) { 2694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return C40_ENCODATION; 2704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (intCharCounts[C40_ENCODATION] == intCharCounts[X12_ENCODATION]) { 2724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t p = startpos + charsProcessed + 1; 2734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (p < msg.GetLength()) { 2744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_WCHAR tc = msg.GetAt(p); 2754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (isX12TermSep(tc)) { 2764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return X12_ENCODATION; 2774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!isNativeX12(tc)) { 2794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 2804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann p++; 2824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return C40_ENCODATION; 2844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 2894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CBC_HighLevelEncoder::isDigit(FX_WCHAR ch) { 2904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return ch >= '0' && ch <= '9'; 2914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 2924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CBC_HighLevelEncoder::isExtendedASCII(FX_WCHAR ch) { 2934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return ch >= 128 && ch <= 255; 2944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 2954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannint32_t CBC_HighLevelEncoder::determineConsecutiveDigitCount(CFX_WideString msg, 2964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t startpos) { 2974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t count = 0; 2984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t len = msg.GetLength(); 2994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t idx = startpos; 3004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (idx < len) { 3014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_WCHAR ch = msg.GetAt(idx); 3024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (isDigit(ch) && idx < len) { 3034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann count++; 3044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann idx++; 3054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (idx < len) { 3064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ch = msg.GetAt(idx); 3074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return count; 3114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 3124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CBC_HighLevelEncoder::illegalCharacter(FX_WCHAR c, int32_t& e) { 3134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann e = BCExceptionIllegalArgument; 3144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 3154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannFX_WCHAR CBC_HighLevelEncoder::randomize253State(FX_WCHAR ch, 3164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t codewordPosition) { 3174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t pseudoRandom = ((149 * codewordPosition) % 253) + 1; 3184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t tempVariable = ch + pseudoRandom; 3194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return tempVariable <= 254 ? (FX_WCHAR)tempVariable 3204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann : (FX_WCHAR)(tempVariable - 254); 3214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 32233357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmannint32_t CBC_HighLevelEncoder::findMinimums( 32333357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann std::vector<FX_FLOAT>& charCounts, 32433357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann CFX_ArrayTemplate<int32_t>& intCharCounts, 32533357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann int32_t min, 32633357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann CFX_ArrayTemplate<uint8_t>& mins) { 3274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t l = 0; l < mins.GetSize(); l++) { 3284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann mins[l] = (uint8_t)0; 3294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t i = 0; i < 6; i++) { 3314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann intCharCounts[i] = (int32_t)ceil(charCounts[i]); 3324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t current = intCharCounts[i]; 3334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (min > current) { 3344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann min = current; 3354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t j = 0; j < mins.GetSize(); j++) { 3364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann mins[j] = (uint8_t)0; 3374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (min == current) { 3404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann mins[i]++; 3414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return min; 3444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 34533357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmannint32_t CBC_HighLevelEncoder::getMinimumCount( 34633357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann CFX_ArrayTemplate<uint8_t>& mins) { 3474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t minCount = 0; 3484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t i = 0; i < 6; i++) { 3494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann minCount += mins[i]; 3504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return minCount; 3524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 3534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CBC_HighLevelEncoder::isNativeC40(FX_WCHAR ch) { 3544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return (ch == ' ') || (ch >= '0' && ch <= '9') || (ch >= 'A' && ch <= 'Z'); 3554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 3564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CBC_HighLevelEncoder::isNativeText(FX_WCHAR ch) { 3574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return (ch == ' ') || (ch >= '0' && ch <= '9') || (ch >= 'a' && ch <= 'z'); 3584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 3594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CBC_HighLevelEncoder::isNativeX12(FX_WCHAR ch) { 3604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return isX12TermSep(ch) || (ch == ' ') || (ch >= '0' && ch <= '9') || 3614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (ch >= 'A' && ch <= 'Z'); 3624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 3634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CBC_HighLevelEncoder::isX12TermSep(FX_WCHAR ch) { 3644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return (ch == '\r') || (ch == '*') || (ch == '>'); 3654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 3664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CBC_HighLevelEncoder::isNativeEDIFACT(FX_WCHAR ch) { 3674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return ch >= ' ' && ch <= '^'; 3684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 3694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CBC_HighLevelEncoder::isSpecialB256(FX_WCHAR ch) { 3704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 3714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 372