// Copyright (c) 2010 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 PPAPI_CPP_URL_LOADER_H_ #define PPAPI_CPP_URL_LOADER_H_ #include "ppapi/c/pp_stdint.h" #include "ppapi/cpp/resource.h" namespace pp { class CompletionCallback; class Instance; class URLRequestInfo; class URLResponseInfo; // URLLoader provides an API to download URLs. // // EXAMPLE USAGE: // // class MyHandler { // public: // MyHandler(Instance* instance) // : factory_(this), // loader_(instance), // did_open_(false) { // } // void ProcessURL(const char* url) { // CompletionCallback* cc = NewCallback(); // int32_t rv = loader_.Open(MakeRequest(url), cc); // if (rv != PP_Error_WouldBlock) // cc->Run(rv); // } // private: // CompletionCallback* NewCallback() { // return factory_.NewCallback(&MyHandler::DidCompleteIO); // } // URLRequestInfo MakeRequest(const char* url) { // URLRequestInfo request; // request.SetURL(url); // request.SetMethod("GET"); // request.SetFollowRedirects(true); // return request; // } // void DidCompleteIO(int32_t result) { // if (result > 0) { // // buf_ now contains 'result' number of bytes from the URL. // ProcessBytes(buf_, result); // ReadMore(); // } else if (result == PP_OK && !did_open_) { // // Headers are available, and we can start reading the body. // did_open_ = true; // ProcessResponseInfo(loader_.GetResponseInfo()); // ReadMore(); // } else { // // Done reading (possibly with an error given by 'result'). // } // } // void ReadMore() { // CompletionCallback* cc = NewCallback(); // int32_t rv = fio_.Read(offset_, buf_, sizeof(buf_), cc); // if (rv != PP_Error_WouldBlock) // cc->Run(rv); // } // void ProcessResponseInfo(const URLResponseInfo& response_info) { // // Read response headers, etc. // } // void ProcessBytes(const char* bytes, int32_t length) { // // Do work ... // } // pp::CompletionCallbackFactory factory_; // pp::URLLoader loader_; // char buf_[4096]; // bool did_open_; // }; // class URLLoader : public Resource { public: // Creates an is_null() URLLoader object. URLLoader() {} // TODO(brettw) remove this when NaCl is updated to use the new version // that takes a pointer. explicit URLLoader(const Instance& instance); explicit URLLoader(PP_Resource resource); explicit URLLoader(Instance* instance); URLLoader(const URLLoader& other); // PPB_URLLoader methods: int32_t Open(const URLRequestInfo& request_info, const CompletionCallback& cc); int32_t FollowRedirect(const CompletionCallback& cc); bool GetUploadProgress(int64_t* bytes_sent, int64_t* total_bytes_to_be_sent) const; bool GetDownloadProgress(int64_t* bytes_received, int64_t* total_bytes_to_be_received) const; URLResponseInfo GetResponseInfo() const; int32_t ReadResponseBody(void* buffer, int32_t bytes_to_read, const CompletionCallback& cc); int32_t FinishStreamingToFile(const CompletionCallback& cc); void Close(); }; } // namespace pp #endif // PPAPI_CPP_URL_LOADER_H_