content: // 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.
  
  part of dart.convert;
  
  /**
   * Open-ended Encoding enum.
   */
  abstract class Encoding extends Codec<String, List<int>> {
    const Encoding();
  
    Future<String> decodeStream(Stream<List<int>> byteStream) {
      return byteStream
        .transform(decoder)
        .fold(new StringBuffer(), (buffer, string) => buffer..write(string))
        .then((buffer) => buffer.toString());
    }
  
    /**
     * Name of the encoding.
     *
     * If the encoding is standardized, this is the lower-case version of one of
     * the IANA official names for the character set (see
     * http://www.iana.org/assignments/character-sets/character-sets.xml)
     */
    String get name;
  
    // All aliases (in lowercase) of supported encoding from
    // http://www.iana.org/assignments/character-sets/character-sets.xml.
    static Map<String, Encoding> _nameToEncoding = <String, Encoding> {
      // ISO_8859-1:1987.
      "iso_8859-1:1987": LATIN1,
      "iso-ir-100": LATIN1,
      "iso_8859-1": LATIN1,
      "iso-8859-1": LATIN1,
      "latin1": LATIN1,
      "l1": LATIN1,
      "ibm819": LATIN1,
      "cp819": LATIN1,
      "csisolatin1": LATIN1,
  
      // US-ASCII.
      "iso-ir-6": ASCII,
      "ansi_x3.4-1968": ASCII,
      "ansi_x3.4-1986": ASCII,
      "iso_646.irv:1991": ASCII,
      "iso646-us": ASCII,
      "us-ascii": ASCII,
      "us": ASCII,
      "ibm367": ASCII,
      "cp367": ASCII,
      "csascii": ASCII,
      "ascii": ASCII,  // This is not in the IANA official names.
  
      // UTF-8.
      "csutf8": UTF8,
      "utf-8": UTF8
    };
  
    /**
    * Gets an [Encoding] object from the name of the character set
    * name. The names used are the IANA official names for the
    * character set (see
    * http://www.iana.org/assignments/character-sets/character-sets.xml).
    *
    * The [name] passed is case insensitive.
    *
    * If character set is not supported [:null:] is returned.
    */
    static Encoding getByName(String name) {
        if (name == null) return null;
        name = name.toLowerCase();
        return _nameToEncoding[name];
    }
  }
  