Index: pdf/document_loader.h |
=================================================================== |
--- pdf/document_loader.h (revision 0) |
+++ pdf/document_loader.h (revision 0) |
@@ -0,0 +1,126 @@ |
+// 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 PDF_DOCUMENT_LOADER_H_ |
+#define PDF_DOCUMENT_LOADER_H_ |
+ |
+#include <list> |
+#include <map> |
+#include <string> |
+#include <vector> |
+ |
+#include "base/basictypes.h" |
+#include "pdf/chunk_stream.h" |
+#include "ppapi/cpp/url_loader.h" |
+#include "ppapi/utility/completion_callback_factory.h" |
+ |
+#define kDefaultRequestSize 32768u |
+ |
+namespace chrome_pdf { |
+ |
+class DocumentLoader { |
+ public: |
+ class Client { |
+ public: |
+ // Gets the pp::Instance object. |
+ virtual pp::Instance* GetPluginInstance() = 0; |
+ // Creates new URLLoader based on client settings. |
+ virtual pp::URLLoader CreateURLLoader() = 0; |
+ // Notification called when partial information about document is available. |
+ // Only called for urls that returns full content size and supports byte |
+ // range requests. |
+ virtual void OnPartialDocumentLoaded() = 0; |
+ // Notification called when all outstanding pending requests are complete. |
+ virtual void OnPendingRequestComplete() = 0; |
+ // Notification called when new data is available. |
+ virtual void OnNewDataAvailable() = 0; |
+ // Notification called when document is fully loaded. |
+ virtual void OnDocumentComplete() = 0; |
+ }; |
+ |
+ explicit DocumentLoader(Client* client); |
+ virtual ~DocumentLoader(); |
+ |
+ bool Init(const pp::URLLoader& loader, |
+ const std::string& url, |
+ const std::string& headers); |
+ |
+ // Data access interface. Return true is sucessful. |
+ bool GetBlock(uint32 position, uint32 size, void* buf) const; |
+ |
+ // Data availability interface. Return true data avaialble. |
+ bool IsDataAvailable(uint32 position, uint32 size) const; |
+ |
+ // Data availability interface. Return true data avaialble. |
+ void RequestData(uint32 position, uint32 size); |
+ |
+ bool IsDocumentComplete() const; |
+ uint32 document_size() const { return document_size_; } |
+ |
+ // Return number of bytes available. |
+ uint32 GetAvailableData() const; |
+ |
+ // Clear pending requests from the queue. |
+ void ClearPendingRequests(); |
+ |
+ bool is_partial_document() { return partial_document_; } |
+ |
+ private: |
+ // Called by the completion callback of the document's URLLoader. |
+ void DidOpen(int32_t result); |
+ // Call to read data from the document's URLLoader. |
+ void ReadMore(); |
+ // Called by the completion callback of the document's URLLoader. |
+ void DidRead(int32_t result); |
+ |
+ // If the headers have a byte-range response, writes the start and end |
+ // positions and returns true if at least the start position was parsed. |
+ // The end position will be set to 0 if it was not found or parsed from the |
+ // response. |
+ // Returns false if not even a start position could be parsed. |
+ static bool GetByteRange(const std::string& headers, uint32* start, |
+ uint32* end); |
+ |
+ // If the headers have a multi-part response, returns the boundary name. |
+ // Otherwise returns an empty string. |
+ static std::string GetMultiPartBoundary(const std::string& headers); |
+ |
+ // Called when we detect that partial document load is possible. |
+ void LoadPartialDocument(); |
+ // Called when we have to load full document. |
+ void LoadFullDocument(); |
+ // Download pending requests. |
+ void DownloadPendingRequests(); |
+ // Called when we complete server request and read all data from it. |
+ void ReadComplete(); |
+ // Creates request to download size byte of data data starting from position. |
+ pp::URLRequestInfo GetRequest(uint32 position, uint32 size) const; |
+ // Returns current request size in bytes. |
+ uint32 GetRequestSize() const; |
+ |
+ Client* client_; |
+ std::string url_; |
+ pp::URLLoader loader_; |
+ pp::CompletionCallbackFactory<DocumentLoader> loader_factory_; |
+ ChunkStream chunk_stream_; |
+ bool partial_document_; |
+ bool request_pending_; |
+ typedef std::list<std::pair<size_t, size_t> > PendingRequests; |
+ PendingRequests pending_requests_; |
+ char buffer_[kDefaultRequestSize]; |
+ uint32 current_pos_; |
+ uint32 current_chunk_size_; |
+ uint32 current_chunk_read_; |
+ uint32 document_size_; |
+ bool header_request_; |
+ bool is_multipart_; |
+ std::string multipart_boundary_; |
+ uint32 requests_count_; |
+ std::map<uint32, uint32> chunk_size_table_; |
+ std::list<std::vector<unsigned char> > chunk_buffer_; |
+}; |
+ |
+} // namespace chrome_pdf |
+ |
+#endif // PDF_DOCUMENT_LOADER_H_ |
Property changes on: pdf\document_loader.h |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |