Merge XFA to PDFium master at 4dc95e7 on 10/28/2014
[pdfium.git] / xfa / src / fxbarcode / src / BC_X12Encoder.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_HighLevelEncoder.h"\r
15 #include "include/BC_C40Encoder.h"\r
16 #include "include/BC_X12Encoder.h"\r
17 CBC_X12Encoder::CBC_X12Encoder()\r
18 {\r
19 }\r
20 CBC_X12Encoder::~CBC_X12Encoder()\r
21 {\r
22 }\r
23 FX_INT32 CBC_X12Encoder::getEncodingMode()\r
24 {\r
25     return X12_ENCODATION;\r
26 }\r
27 void CBC_X12Encoder::Encode(CBC_EncoderContext &context, FX_INT32 &e)\r
28 {\r
29     CFX_WideString buffer;\r
30     while (context.hasMoreCharacters()) {\r
31         FX_WCHAR c = context.getCurrentChar();\r
32         context.m_pos++;\r
33         encodeChar(c, buffer, e);\r
34         if (e != BCExceptionNO) {\r
35             return;\r
36         }\r
37         FX_INT32 count = buffer.GetLength();\r
38         if ((count % 3) == 0) {\r
39             writeNextTriplet(context, buffer);\r
40             FX_INT32 newMode = CBC_HighLevelEncoder::lookAheadTest(context.m_msg, context.m_pos, getEncodingMode());\r
41             if (newMode != getEncodingMode()) {\r
42                 context.signalEncoderChange(newMode);\r
43                 break;\r
44             }\r
45         }\r
46     }\r
47     handleEOD(context, buffer, e);\r
48 }\r
49 void CBC_X12Encoder::handleEOD(CBC_EncoderContext &context, CFX_WideString &buffer, FX_INT32 &e)\r
50 {\r
51     context.updateSymbolInfo(e);\r
52     if (e != BCExceptionNO) {\r
53         return;\r
54     }\r
55     FX_INT32 available = context.m_symbolInfo->m_dataCapacity - context.getCodewordCount();\r
56     FX_INT32 count = buffer.GetLength();\r
57     if (count == 2) {\r
58         context.writeCodeword(CBC_HighLevelEncoder::X12_UNLATCH);\r
59         context.m_pos -= 2;\r
60         context.signalEncoderChange(ASCII_ENCODATION);\r
61     } else if (count == 1) {\r
62         context.m_pos--;\r
63         if (available > 1) {\r
64             context.writeCodeword(CBC_HighLevelEncoder::X12_UNLATCH);\r
65         }\r
66         context.signalEncoderChange(ASCII_ENCODATION);\r
67     }\r
68 }\r
69 FX_INT32 CBC_X12Encoder::encodeChar(FX_WCHAR c, CFX_WideString &sb, FX_INT32 &e)\r
70 {\r
71     if (c == '\r') {\r
72         sb += (FX_WCHAR)'\0';\r
73     } else if (c == '*') {\r
74         sb += (FX_WCHAR)'\1';\r
75     } else if (c == '>') {\r
76         sb += (FX_WCHAR)'\2';\r
77     } else if (c == ' ') {\r
78         sb += (FX_WCHAR)'\3';\r
79     } else if (c >= '0' && c <= '9') {\r
80         sb += (FX_WCHAR) (c - 48 + 4);\r
81     } else if (c >= 'A' && c <= 'Z') {\r
82         sb += (FX_WCHAR) (c - 65 + 14);\r
83     } else {\r
84         CBC_HighLevelEncoder::illegalCharacter(c, e);\r
85         BC_EXCEPTION_CHECK_ReturnValue(e, -1);\r
86     }\r
87     return 1;\r
88 }\r