Merge XFA to PDFium master at 4dc95e7 on 10/28/2014
[pdfium.git] / xfa / src / fxbarcode / src / BC_EncoderContext.cpp
1 // Copyright 2014 PDFium Authors. All rights reserved.\r
2 // Use of this source code is governed by a BSD-style license that can be\r
3 // found in the LICENSE file.\r
4 \r
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\r
6 \r
7 #include "barcode.h"\r
8 #include "include/BC_Encoder.h"\r
9 #include "include/BC_CommonBitMatrix.h"\r
10 #include "include/BC_Dimension.h"\r
11 #include "include/BC_SymbolShapeHint.h"\r
12 #include "include/BC_SymbolInfo.h"\r
13 #include "include/BC_EncoderContext.h"\r
14 #include "include/BC_UtilCodingConvert.h"\r
15 CBC_EncoderContext::CBC_EncoderContext(const CFX_WideString msg, CFX_WideString ecLevel, FX_INT32 &e)\r
16 {\r
17     CFX_ByteString dststr;\r
18     CBC_UtilCodingConvert::UnicodeToUTF8(msg, dststr);\r
19     CFX_WideString sb;\r
20     FX_INT32 c = dststr.GetLength();\r
21     for (FX_INT32 i = 0; i < c; i++) {\r
22         FX_WCHAR ch =  (FX_WCHAR)(dststr.GetAt(i) & 0xff);\r
23         if (ch == '?' && dststr.GetAt(i) != '?') {\r
24             e = BCExceptionCharactersOutsideISO88591Encoding;\r
25         }\r
26         sb += ch;\r
27     }\r
28     m_msg = sb;\r
29     m_shape = FORCE_NONE;\r
30     m_newEncoding = -1;\r
31     m_pos = 0;\r
32     m_symbolInfo = NULL;\r
33     m_skipAtEnd = 0;\r
34     m_maxSize = NULL;\r
35     m_minSize = NULL;\r
36 }\r
37 CBC_EncoderContext::~CBC_EncoderContext()\r
38 {\r
39 }\r
40 void CBC_EncoderContext::setSymbolShape(SymbolShapeHint shape)\r
41 {\r
42     m_shape = shape;\r
43 }\r
44 void CBC_EncoderContext::setSizeConstraints(CBC_Dimension* minSize, CBC_Dimension* maxSize)\r
45 {\r
46     m_maxSize = maxSize;\r
47     m_minSize = minSize;\r
48 }\r
49 CFX_WideString CBC_EncoderContext::getMessage()\r
50 {\r
51     return m_msg;\r
52 }\r
53 void CBC_EncoderContext::setSkipAtEnd(FX_INT32 count)\r
54 {\r
55     m_skipAtEnd = count;\r
56 }\r
57 FX_WCHAR CBC_EncoderContext::getCurrentChar()\r
58 {\r
59     return m_msg.GetAt(m_pos);\r
60 }\r
61 FX_WCHAR CBC_EncoderContext::getCurrent()\r
62 {\r
63     return m_msg.GetAt(m_pos);\r
64 }\r
65 void CBC_EncoderContext::writeCodewords(CFX_WideString codewords)\r
66 {\r
67     m_codewords += codewords;\r
68 }\r
69 void CBC_EncoderContext::writeCodeword(FX_WCHAR codeword)\r
70 {\r
71     m_codewords += codeword;\r
72 }\r
73 FX_INT32 CBC_EncoderContext::getCodewordCount()\r
74 {\r
75     return m_codewords.GetLength();\r
76 }\r
77 void CBC_EncoderContext::signalEncoderChange(FX_INT32 encoding)\r
78 {\r
79     m_newEncoding = encoding;\r
80 }\r
81 void CBC_EncoderContext::resetEncoderSignal()\r
82 {\r
83     m_newEncoding = -1;\r
84 }\r
85 FX_BOOL CBC_EncoderContext::hasMoreCharacters()\r
86 {\r
87     return m_pos < getTotalMessageCharCount();\r
88 }\r
89 FX_INT32 CBC_EncoderContext::getRemainingCharacters()\r
90 {\r
91     return getTotalMessageCharCount() - m_pos;\r
92 }\r
93 void CBC_EncoderContext::updateSymbolInfo(FX_INT32 &e)\r
94 {\r
95     updateSymbolInfo(getCodewordCount(), e);\r
96 }\r
97 void CBC_EncoderContext::updateSymbolInfo(FX_INT32 len, FX_INT32 &e)\r
98 {\r
99     if (m_symbolInfo == NULL || len > m_symbolInfo->m_dataCapacity) {\r
100         m_symbolInfo = CBC_SymbolInfo::lookup(len, m_shape, m_minSize, m_maxSize, true, e);\r
101         BC_EXCEPTION_CHECK_ReturnVoid(e);\r
102     }\r
103 }\r
104 void CBC_EncoderContext::resetSymbolInfo()\r
105 {\r
106     m_shape = FORCE_NONE;\r
107 }\r
108 FX_INT32 CBC_EncoderContext::getTotalMessageCharCount()\r
109 {\r
110     return m_msg.GetLength() - m_skipAtEnd;\r
111 }\r