text: // Copyright (c) 2012 The Chromium Authors. All rights reserved.
  // Use of this source code is governed by a BSD-style license that can be
  // found in the LICENSE file.
  
  #ifndef NET_HTTP_HTTP_CONTENT_DISPOSITION_H_
  #define NET_HTTP_HTTP_CONTENT_DISPOSITION_H_
  
  #include <string>
  
  #include "base/macros.h"
  #include "net/base/net_export.h"
  
  namespace net {
  
  class NET_EXPORT HttpContentDisposition {
   public:
    enum Type {
      INLINE,
      ATTACHMENT,
    };
  
    // Properties of the Content-Disposition header. These flags are used to
    // report download metrics in UMA. This enum isn't directly used in UMA but
    // mapped to another one for binary compatiblity; ie. changes are OK.
    enum ParseResultFlags {
      INVALID                      = 0,
  
      // A valid disposition-type is present.
      HAS_DISPOSITION_TYPE         = 1 << 0,
  
      // The disposition-type is not 'inline' or 'attachment'.
      HAS_UNKNOWN_DISPOSITION_TYPE = 1 << 1,
  
      // Has a valid non-empty 'filename' attribute.
      HAS_FILENAME                 = 1 << 2,
  
      // Has a valid non-empty 'filename*' attribute.
      HAS_EXT_FILENAME             = 1 << 3,
  
      // The following fields are properties of the 'filename' attribute:
  
      // Quoted-string contains non-ASCII characters.
      HAS_NON_ASCII_STRINGS        = 1 << 4,
  
      // Quoted-string contains percent-encoding.
      HAS_PERCENT_ENCODED_STRINGS  = 1 << 5,
  
      // Quoted-string contains RFC 2047 encoded words.
      HAS_RFC2047_ENCODED_STRINGS  = 1 << 6
    };
  
    HttpContentDisposition(const std::string& header,
                           const std::string& referrer_charset);
    ~HttpContentDisposition();
  
    bool is_attachment() const { return type() == ATTACHMENT; }
  
    Type type() const { return type_; }
    const std::string& filename() const { return filename_; }
  
    // A combination of ParseResultFlags values.
    int parse_result_flags() const { return parse_result_flags_; }
  
   private:
    void Parse(const std::string& header, const std::string& referrer_charset);
    std::string::const_iterator ConsumeDispositionType(
        std::string::const_iterator begin, std::string::const_iterator end);
  
    Type type_;
    std::string filename_;
    int parse_result_flags_;
  
    DISALLOW_COPY_AND_ASSIGN(HttpContentDisposition);
  };
  
  }  // namespace net
  
  #endif  // NET_HTTP_HTTP_CONTENT_DISPOSITION_H_
  