| Index: native_client_sdk/src/tests/nacl_io_test/fake_ppapi/fake_pepper_interface_url_loader.cc
|
| diff --git a/native_client_sdk/src/tests/nacl_io_test/fake_ppapi/fake_pepper_interface_url_loader.cc b/native_client_sdk/src/tests/nacl_io_test/fake_ppapi/fake_pepper_interface_url_loader.cc
|
| index 9b6ea45fc6b3b3bb7ee1427dcd14817e2fbd647d..9aadeaa3c7d61bae8ba5b6f3c4fd50a1fd73d828 100644
|
| --- a/native_client_sdk/src/tests/nacl_io_test/fake_ppapi/fake_pepper_interface_url_loader.cc
|
| +++ b/native_client_sdk/src/tests/nacl_io_test/fake_ppapi/fake_pepper_interface_url_loader.cc
|
| @@ -14,39 +14,8 @@
|
|
|
| #include "nacl_io/osinttypes.h"
|
|
|
| -namespace {
|
| -
|
| -bool GetHeaderValue(const std::string& headers,
|
| - const std::string& key,
|
| - std::string* out_value) {
|
| - out_value->clear();
|
| -
|
| - size_t offset = 0;
|
| - while (offset != std::string::npos) {
|
| - // Find the next colon; this separates the key from the value.
|
| - size_t colon = headers.find(':', offset);
|
| - if (colon == std::string::npos)
|
| - return false;
|
| -
|
| - // Find the newline; this separates the value from the next header.
|
| - size_t newline = headers.find('\n', offset);
|
| - if (strncasecmp(key.c_str(), &headers.data()[offset], key.size()) != 0) {
|
| - // Key doesn't match, skip to next header.
|
| - offset = newline;
|
| - continue;
|
| - }
|
| -
|
| - // Key matches, extract value. First, skip leading spaces.
|
| - size_t nonspace = headers.find_first_not_of(' ', colon + 1);
|
| - if (nonspace == std::string::npos)
|
| - return false;
|
| -
|
| - out_value->assign(headers, nonspace, newline - nonspace);
|
| - return true;
|
| - }
|
| -
|
| - return false;
|
| -}
|
| +#include "fake_ppapi/fake_filesystem.h"
|
| +#include "fake_ppapi/fake_util.h"
|
|
|
| class FakeInstanceResource : public FakeResource {
|
| public:
|
| @@ -82,44 +51,6 @@ class FakeURLLoaderResource : public FakeResource {
|
| off_t read_end;
|
| };
|
|
|
| -class FakeURLRequestInfoResource : public FakeResource {
|
| - public:
|
| - FakeURLRequestInfoResource() {}
|
| - static const char* classname() { return "FakeURLRequestInfoResource"; }
|
| -
|
| - std::string url;
|
| - std::string method;
|
| - std::string headers;
|
| -};
|
| -
|
| -class FakeURLResponseInfoResource : public FakeResource {
|
| - public:
|
| - FakeURLResponseInfoResource() : status_code(0) {}
|
| - static const char* classname() { return "FakeURLResponseInfoResource"; }
|
| -
|
| - int status_code;
|
| - std::string url;
|
| - std::string headers;
|
| -};
|
| -
|
| -// Helper function to call the completion callback if it is defined (an
|
| -// asynchronous call), or return the result directly if it isn't (a synchronous
|
| -// call).
|
| -//
|
| -// Use like this:
|
| -// if (<some error condition>)
|
| -// return RunCompletionCallback(callback, PP_ERROR_FUBAR);
|
| -//
|
| -// /* Everything worked OK */
|
| -// return RunCompletionCallback(callback, PP_OK);
|
| -int32_t RunCompletionCallback(PP_CompletionCallback* callback, int32_t result) {
|
| - if (callback->func) {
|
| - PP_RunCompletionCallback(callback, result);
|
| - return PP_OK_COMPLETIONPENDING;
|
| - }
|
| - return result;
|
| -}
|
| -
|
| void HandleContentLength(FakeURLLoaderResource* loader,
|
| FakeURLResponseInfoResource* response,
|
| FakeURLLoaderEntity* entity) {
|
| @@ -154,7 +85,7 @@ void HandlePartial(FakeURLLoaderResource* loader,
|
| }
|
|
|
| off_t content_length = entity->size();
|
| - if (lo > content_length) {
|
| + if (lo >= content_length) {
|
| // Trying to start reading past the end of the entity is
|
| // unsatisfiable.
|
| response->status_code = 416; // Request range not satisfiable.
|
| @@ -185,19 +116,15 @@ void HandlePartial(FakeURLLoaderResource* loader,
|
| response->status_code = 206; // Partial content
|
| }
|
|
|
| -} // namespace
|
| -
|
| FakeURLLoaderEntity::FakeURLLoaderEntity(const std::string& body)
|
| - : body_(body), size_(body_.size()), repeat_(false) {
|
| -}
|
| + : body_(body), size_(body_.size()), repeat_(false) {}
|
|
|
| // Rather than specifying the entire file, specify a string to repeat, and the
|
| // full length. This lets us test extremely large files without having to store
|
| // them in memory.
|
| FakeURLLoaderEntity::FakeURLLoaderEntity(const std::string& to_repeat,
|
| off_t size)
|
| - : body_(to_repeat), size_(size), repeat_(true) {
|
| -}
|
| + : body_(to_repeat), size_(size), repeat_(true) {}
|
|
|
| size_t FakeURLLoaderEntity::Read(void* buffer, size_t count, off_t offset) {
|
| off_t max_read_count =
|
| @@ -242,8 +169,7 @@ FakeURLLoaderServer::FakeURLLoaderServer()
|
| : max_read_size_(0),
|
| send_content_length_(false),
|
| allow_partial_(false),
|
| - allow_head_(true) {
|
| -}
|
| + allow_head_(true) {}
|
|
|
| void FakeURLLoaderServer::Clear() {
|
| entity_map_.clear();
|
| @@ -324,8 +250,7 @@ int FakeURLLoaderServer::GetError(const std::string& url) {
|
|
|
| FakeURLLoaderInterface::FakeURLLoaderInterface(
|
| FakeCoreInterface* core_interface)
|
| - : core_interface_(core_interface) {
|
| -}
|
| + : core_interface_(core_interface) {}
|
|
|
| PP_Resource FakeURLLoaderInterface::Create(PP_Instance instance) {
|
| FakeInstanceResource* instance_resource =
|
| @@ -339,8 +264,7 @@ PP_Resource FakeURLLoaderInterface::Create(PP_Instance instance) {
|
| new FakeURLLoaderServer(*instance_resource->server_template);
|
|
|
| return CREATE_RESOURCE(core_interface_->resource_manager(),
|
| - FakeURLLoaderResource,
|
| - loader_resource);
|
| + FakeURLLoaderResource, loader_resource);
|
| }
|
|
|
| int32_t FakeURLLoaderInterface::Open(PP_Resource loader,
|
| @@ -362,8 +286,7 @@ int32_t FakeURLLoaderInterface::Open(PP_Resource loader,
|
| new FakeURLResponseInfoResource;
|
| loader_resource->response =
|
| CREATE_RESOURCE(core_interface_->resource_manager(),
|
| - FakeURLResponseInfoResource,
|
| - response_resource);
|
| + FakeURLResponseInfoResource, response_resource);
|
|
|
| loader_resource->entity = NULL;
|
| loader_resource->read_offset = 0;
|
| @@ -447,6 +370,12 @@ int32_t FakeURLLoaderInterface::ReadResponseBody(
|
| return RunCompletionCallback(&callback, bytes_read);
|
| }
|
|
|
| +int32_t FakeURLLoaderInterface::FinishStreamingToFile(
|
| + PP_Resource loader,
|
| + PP_CompletionCallback callback) {
|
| + return PP_ERROR_NOTSUPPORTED;
|
| +}
|
| +
|
| void FakeURLLoaderInterface::Close(PP_Resource loader) {
|
| FakeURLLoaderResource* loader_resource =
|
| core_interface_->resource_manager()->Get<FakeURLLoaderResource>(loader);
|
| @@ -464,15 +393,9 @@ void FakeURLLoaderInterface::Close(PP_Resource loader) {
|
| FakeURLRequestInfoInterface::FakeURLRequestInfoInterface(
|
| FakeCoreInterface* core_interface,
|
| FakeVarInterface* var_interface)
|
| - : core_interface_(core_interface), var_interface_(var_interface) {
|
| -}
|
| + : core_interface_(core_interface), var_interface_(var_interface) {}
|
|
|
| PP_Resource FakeURLRequestInfoInterface::Create(PP_Instance instance) {
|
| - FakeInstanceResource* instance_resource =
|
| - core_interface_->resource_manager()->Get<FakeInstanceResource>(instance);
|
| - if (instance_resource == NULL)
|
| - return PP_ERROR_BADRESOURCE;
|
| -
|
| return CREATE_RESOURCE(core_interface_->resource_manager(),
|
| FakeURLRequestInfoResource,
|
| new FakeURLRequestInfoResource);
|
| @@ -539,6 +462,12 @@ PP_Bool FakeURLRequestInfoInterface::SetProperty(PP_Resource request,
|
| // Throw the value away for now. TODO(binji): add tests for this.
|
| return PP_TRUE;
|
| }
|
| + case PP_URLREQUESTPROPERTY_STREAMTOFILE: {
|
| + if (value.type != PP_VARTYPE_BOOL)
|
| + return PP_FALSE;
|
| + // Throw the value away for now. TODO: add tests for this.
|
| + return PP_TRUE;
|
| + }
|
| default:
|
| EXPECT_TRUE(false) << "Unimplemented property " << property
|
| << " in "
|
| @@ -547,10 +476,37 @@ PP_Bool FakeURLRequestInfoInterface::SetProperty(PP_Resource request,
|
| }
|
| }
|
|
|
| +PP_Bool FakeURLRequestInfoInterface::AppendDataToBody(PP_Resource request,
|
| + const void* data,
|
| + uint32_t len) {
|
| + FakeURLRequestInfoResource* request_resource =
|
| + core_interface_->resource_manager()->Get<FakeURLRequestInfoResource>(
|
| + request);
|
| + if (request_resource == NULL)
|
| + return PP_FALSE;
|
| +
|
| + request_resource->body = std::string((char*)data, len);
|
| +
|
| + return PP_TRUE;
|
| +}
|
| +
|
| FakeURLResponseInfoInterface::FakeURLResponseInfoInterface(
|
| FakeCoreInterface* core_interface,
|
| - FakeVarInterface* var_interface)
|
| - : core_interface_(core_interface), var_interface_(var_interface) {
|
| + FakeVarInterface* var_interface,
|
| + FakeFileRefInterface* file_ref_interface)
|
| + : core_interface_(core_interface),
|
| + var_interface_(var_interface),
|
| + file_ref_interface_(file_ref_interface) {
|
| + FakeFileSystemResource* file_system_resource = new FakeFileSystemResource;
|
| + file_system_resource->filesystem = new FakeFilesystem();
|
| +
|
| + filesystem_resource_ =
|
| + CREATE_RESOURCE(core_interface_->resource_manager(),
|
| + FakeFileSystemResource, file_system_resource);
|
| +}
|
| +
|
| +FakeURLResponseInfoInterface::~FakeURLResponseInfoInterface() {
|
| + core_interface_->ReleaseResource(filesystem_resource_);
|
| }
|
|
|
| PP_Var FakeURLResponseInfoInterface::GetProperty(
|
| @@ -581,17 +537,52 @@ PP_Var FakeURLResponseInfoInterface::GetProperty(
|
| }
|
| }
|
|
|
| +PP_Resource FakeURLResponseInfoInterface::GetBodyAsFileRef(
|
| + PP_Resource response) {
|
| + FakeURLResponseInfoResource* response_resource =
|
| + core_interface_->resource_manager()->Get<FakeURLResponseInfoResource>(
|
| + response);
|
| + if (response_resource == NULL)
|
| + return PP_ERROR_BADRESOURCE;
|
| +
|
| + FakeFileSystemResource* file_system_resource =
|
| + core_interface_->resource_manager()->Get<FakeFileSystemResource>(
|
| + filesystem_resource_);
|
| +
|
| + if (file_system_resource == NULL)
|
| + return PP_ERROR_BADRESOURCE;
|
| +
|
| + char path_buffer[1024];
|
| + int char_written = snprintf(path_buffer, sizeof(path_buffer), "%u", response);
|
| +
|
| + if (char_written < 0 || char_written >= (signed int) sizeof(path_buffer)) {
|
| + return PP_ERROR_FAILED;
|
| + }
|
| +
|
| + FakeNode* fake_node;
|
| + if (!file_system_resource->filesystem->AddFile(
|
| + path_buffer, response_resource->body, &fake_node)) {
|
| + return PP_ERROR_FAILED;
|
| + }
|
| +
|
| + file_system_resource->opened = true;
|
| +
|
| + return file_ref_interface_->Create(filesystem_resource_, path_buffer);
|
| +}
|
| +
|
| FakePepperInterfaceURLLoader::FakePepperInterfaceURLLoader()
|
| : core_interface_(&resource_manager_),
|
| var_interface_(&var_manager_),
|
| + file_ref_interface_(&core_interface_, &var_interface_),
|
| url_loader_interface_(&core_interface_),
|
| url_request_info_interface_(&core_interface_, &var_interface_),
|
| - url_response_info_interface_(&core_interface_, &var_interface_) {
|
| + url_response_info_interface_(&core_interface_,
|
| + &var_interface_,
|
| + &file_ref_interface_) {
|
| FakeInstanceResource* instance_resource = new FakeInstanceResource;
|
| instance_resource->server_template = &server_template_;
|
| instance_ = CREATE_RESOURCE(core_interface_.resource_manager(),
|
| - FakeInstanceResource,
|
| - instance_resource);
|
| + FakeInstanceResource, instance_resource);
|
| }
|
|
|
| FakePepperInterfaceURLLoader::~FakePepperInterfaceURLLoader() {
|
| @@ -606,6 +597,10 @@ nacl_io::VarInterface* FakePepperInterfaceURLLoader::GetVarInterface() {
|
| return &var_interface_;
|
| }
|
|
|
| +nacl_io::FileRefInterface* FakePepperInterfaceURLLoader::GetFileRefInterface() {
|
| + return &file_ref_interface_;
|
| +}
|
| +
|
| nacl_io::URLLoaderInterface*
|
| FakePepperInterfaceURLLoader::GetURLLoaderInterface() {
|
| return &url_loader_interface_;
|
|
|