// Copyright 2014 PDFium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

#ifndef XFA_FXBARCODE_QRCODE_BC_QRDECODEDBITSTREAMPARSER_H_
#define XFA_FXBARCODE_QRCODE_BC_QRDECODEDBITSTREAMPARSER_H_

class CBC_CommonDecoderResult;
class CBC_QRCoderErrorCorrectionLevel;
class CBC_CommonBitSource;
class CBC_QRCoderVersion;
class CBC_CommonCharacterSetECI;
class CBC_QRDecodedBitStreamParser {
 private:
  static const FX_CHAR ALPHANUMERIC_CHARS[45];
  static const FX_CHAR* UTF_8;
  CBC_QRDecodedBitStreamParser();

 public:
  virtual ~CBC_QRDecodedBitStreamParser();
  static CBC_CommonDecoderResult* Decode(
      CFX_ByteArray* bytes,
      CBC_QRCoderVersion* version,
      CBC_QRCoderErrorCorrectionLevel* ecLevel,
      int32_t byteModeDecode,
      int32_t& e);

  static const CFX_ByteString GuessEncoding(CFX_ByteArray* bytes);
  static int32_t ParseECIValue(CBC_CommonBitSource* bits, int32_t& e);
  static void DecodeGBKSegment(CBC_CommonBitSource* bits,
                               CFX_ByteString& result,
                               int32_t count,
                               int32_t& e);
  static void DecodeKanjiSegment(CBC_CommonBitSource* bits,
                                 CFX_ByteString& result,
                                 int32_t count,
                                 int32_t& e);
  static void DecodeNumericSegment(CBC_CommonBitSource* bits,
                                   CFX_ByteString& result,
                                   int32_t count,
                                   int32_t& e);
  static void DecodeAlphanumericSegment(CBC_CommonBitSource* bits,
                                        CFX_ByteString& result,
                                        int32_t count,
                                        FX_BOOL fac1InEffect,
                                        int32_t& e);
  static void DecodeByteSegment(
      CBC_CommonBitSource* bits,
      CFX_ByteString& result,
      int32_t count,
      CBC_CommonCharacterSetECI* currentCharacterSetECI,
      CFX_Int32Array* byteSegments,
      int32_t byteModeDecode,
      int32_t& e);
};

#endif  // XFA_FXBARCODE_QRCODE_BC_QRDECODEDBITSTREAMPARSER_H_
