// Copyright (c) 2009 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.

#include "chrome_frame/plugin_url_request.h"

#include "chrome/test/automation/automation_messages.h"
#include "chrome_frame/np_browser_functions.h"

PluginUrlRequest::PluginUrlRequest()
    : delegate_(NULL),
      remote_request_id_(-1),
      post_data_len_(0),
      enable_frame_busting_(false),
      resource_type_(ResourceType::MAIN_FRAME),
      load_flags_(0) {
}

PluginUrlRequest::~PluginUrlRequest() {
}

bool PluginUrlRequest::Initialize(PluginUrlRequestDelegate* delegate,
    int remote_request_id, const std::string& url, const std::string& method,
    const std::string& referrer, const std::string& extra_headers,
    net::UploadData* upload_data, ResourceType::Type resource_type,
    bool enable_frame_busting, int load_flags) {
  delegate_ = delegate;
  remote_request_id_ = remote_request_id;
  url_ = url;
  method_ = method;
  referrer_ = referrer;
  extra_headers_ = extra_headers;
  resource_type_ = resource_type;
  load_flags_ = load_flags;

  if (upload_data) {
    // We store a pointer to UrlmonUploadDataStream and not net::UploadData
    // since UrlmonUploadDataStream implements thread safe ref counting and
    // UploadData does not.
    CComObject<UrlmonUploadDataStream>* upload_stream = NULL;
    HRESULT hr = CComObject<UrlmonUploadDataStream>::CreateInstance(
        &upload_stream);
    if (FAILED(hr)) {
      NOTREACHED();
    } else {
      post_data_len_ = upload_data->GetContentLength();
      upload_stream->AddRef();
      upload_stream->Initialize(upload_data);
      upload_data_.Attach(upload_stream);
    }
  }

  enable_frame_busting_ = enable_frame_busting;

  return true;
}
