// 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_SRC_FXBARCODE_QRCODE_BC_QRDECODEDBITSTREAMPARSER_H_
#define XFA_SRC_FXBARCODE_QRCODE_BC_QRDECODEDBITSTREAMPARSER_H_

class CBC_CommonDecoderResult;
class CBC_QRCoderErrorCorrectionLevel;
class CBC_CommonBitSource;
class CBC_QRCoderVersion;
class CBC_CommonCharacterSetECI;
class CBC_QRDecodedBitStreamParser {
 private:
  const static 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_SRC_FXBARCODE_QRCODE_BC_QRDECODEDBITSTREAMPARSER_H_
