// 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_PROXY_RESOLUTION_PAC_FILE_DATA_H_
#define NET_PROXY_RESOLUTION_PAC_FILE_DATA_H_

#include "base/memory/ref_counted.h"
#include "base/strings/string16.h"
#include "net/base/net_export.h"
#include "url/gurl.h"

namespace net {

// Reference-counted wrapper for passing around a PAC script specification.
// The PAC script can be either specified via a URL, a deferred URL for
// auto-detect, or the actual javascript program text.
//
// This is thread-safe so it can be used by multi-threaded implementations of
// ProxyResolver to share the data between threads.
class NET_EXPORT_PRIVATE PacFileData
    : public base::RefCountedThreadSafe<PacFileData> {
 public:
  enum Type {
    TYPE_SCRIPT_CONTENTS,
    TYPE_SCRIPT_URL,
    TYPE_AUTO_DETECT,
  };

  // Creates a script data given the UTF8 bytes of the content.
  static scoped_refptr<PacFileData> FromUTF8(const std::string& utf8);

  // Creates a script data given the UTF16 bytes of the content.
  static scoped_refptr<PacFileData> FromUTF16(const base::string16& utf16);

  // Creates a script data given a URL to the PAC script.
  static scoped_refptr<PacFileData> FromURL(const GURL& url);

  // Creates a script data for using an automatically detected PAC URL.
  static scoped_refptr<PacFileData> ForAutoDetect();

  Type type() const { return type_; }

  // Returns the contents of the script as UTF16.
  // (only valid for type() == TYPE_SCRIPT_CONTENTS).
  const base::string16& utf16() const;

  // Returns the URL of the script.
  // (only valid for type() == TYPE_SCRIPT_URL).
  const GURL& url() const;

  // Returns true if |this| matches |other|.
  bool Equals(const PacFileData* other) const;

 private:
  friend class base::RefCountedThreadSafe<PacFileData>;
  PacFileData(Type type, const GURL& url, const base::string16& utf16);
  virtual ~PacFileData();

  const Type type_;
  const GURL url_;
  const base::string16 utf16_;
};

}  // namespace net

#endif  // NET_PROXY_RESOLUTION_PAC_FILE_DATA_H_
