// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.


class _FilterImpl extends NativeFieldWrapperClass1 implements _Filter {
  void process(List<int> data, int start, int end) native "Filter_Process";

  List<int> processed({bool flush: true, bool end: false})
      native "Filter_Processed";

  void end() native "Filter_End";
}

class _ZLibInflateFilter extends _FilterImpl {
  _ZLibInflateFilter(int windowBits, List<int> dictionary, bool raw) {
    _init(windowBits, dictionary, raw);
  }
  void _init(int windowBits, List<int> dictionary, bool raw)
      native "Filter_CreateZLibInflate";
}

class _ZLibDeflateFilter extends _FilterImpl {
  _ZLibDeflateFilter(bool gzip, int level, int windowBits, int memLevel,
                     int strategy, List<int> dictionary, bool raw) {
    _init(gzip, level, windowBits, memLevel, strategy, dictionary, raw);
  }
  void _init(bool gzip, int level, int windowBits, int memLevel,
             int strategy, List<int> dictionary, bool raw)
      native "Filter_CreateZLibDeflate";
}

patch class _Filter {
  /* patch */ static _Filter newZLibDeflateFilter(bool gzip, int level,
                                                  int windowBits, int memLevel,
                                                  int strategy,
                                                  List<int> dictionary,
                                                  bool raw) =>
      new _ZLibDeflateFilter(gzip, level, windowBits, memLevel, strategy,
                             dictionary, raw);
  /* patch */ static _Filter newZLibInflateFilter(int windowBits,
                                                  List<int> dictionary,
                                                  bool raw) =>
      new _ZLibInflateFilter(windowBits, dictionary, raw);
}
