// 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.

#include "ppapi/proxy/url_response_info_resource.h"

#include "ppapi/proxy/file_ref_resource.h"
#include "ppapi/shared_impl/var.h"
#include "ppapi/thunk/enter.h"
#include "ppapi/thunk/resource_creation_api.h"

namespace ppapi {
namespace proxy {

namespace {

bool IsRedirect(int32_t status) {
  return status >= 300 && status <= 399;
}

}  // namespace

URLResponseInfoResource::URLResponseInfoResource(
    Connection connection,
    PP_Instance instance,
    const URLResponseInfoData& data,
    PP_Resource file_ref_resource)
    : PluginResource(connection, instance),
      data_(data),
      body_as_file_ref_(ScopedPPResource::PassRef(), file_ref_resource) {
}

URLResponseInfoResource::~URLResponseInfoResource() {
}

thunk::PPB_URLResponseInfo_API*
URLResponseInfoResource::AsPPB_URLResponseInfo_API() {
  return this;
}

PP_Var URLResponseInfoResource::GetProperty(PP_URLResponseProperty property) {
  switch (property) {
    case PP_URLRESPONSEPROPERTY_URL:
      return StringVar::StringToPPVar(data_.url);
    case PP_URLRESPONSEPROPERTY_REDIRECTURL:
      if (IsRedirect(data_.status_code))
        return StringVar::StringToPPVar(data_.redirect_url);
      break;
    case PP_URLRESPONSEPROPERTY_REDIRECTMETHOD:
      if (IsRedirect(data_.status_code))
        return StringVar::StringToPPVar(data_.status_text);
      break;
    case PP_URLRESPONSEPROPERTY_STATUSCODE:
      return PP_MakeInt32(data_.status_code);
    case PP_URLRESPONSEPROPERTY_STATUSLINE:
      return StringVar::StringToPPVar(data_.status_text);
    case PP_URLRESPONSEPROPERTY_HEADERS:
      return StringVar::StringToPPVar(data_.headers);
  }
  // The default is to return an undefined PP_Var.
  return PP_MakeUndefined();
}

PP_Resource URLResponseInfoResource::GetBodyAsFileRef() {
  if (!body_as_file_ref_.get())
    return 0;
  PpapiGlobals::Get()->GetResourceTracker()->AddRefResource(
      body_as_file_ref_.get());
  return body_as_file_ref_.get();
}

}  // namespace proxy
}  // namespace ppapi
