Roll src/third_party/WebKit 7353389:d137e14 (svn 184391:184401)
[chromium-blink-merge.git] / pdf / document_loader.h
blobc09dba2ddda443b763e27ec3753428c88b1aabb4
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #ifndef PDF_DOCUMENT_LOADER_H_
6 #define PDF_DOCUMENT_LOADER_H_
8 #include <list>
9 #include <string>
10 #include <vector>
12 #include "base/basictypes.h"
13 #include "pdf/chunk_stream.h"
14 #include "ppapi/cpp/url_loader.h"
15 #include "ppapi/utility/completion_callback_factory.h"
17 #define kDefaultRequestSize 32768u
19 namespace chrome_pdf {
21 class DocumentLoader {
22 public:
23 class Client {
24 public:
25 // Gets the pp::Instance object.
26 virtual pp::Instance* GetPluginInstance() = 0;
27 // Creates new URLLoader based on client settings.
28 virtual pp::URLLoader CreateURLLoader() = 0;
29 // Notification called when partial information about document is available.
30 // Only called for urls that returns full content size and supports byte
31 // range requests.
32 virtual void OnPartialDocumentLoaded() = 0;
33 // Notification called when all outstanding pending requests are complete.
34 virtual void OnPendingRequestComplete() = 0;
35 // Notification called when new data is available.
36 virtual void OnNewDataAvailable() = 0;
37 // Notification called when document is fully loaded.
38 virtual void OnDocumentComplete() = 0;
41 explicit DocumentLoader(Client* client);
42 virtual ~DocumentLoader();
44 bool Init(const pp::URLLoader& loader,
45 const std::string& url,
46 const std::string& headers);
48 // Data access interface. Return true is sucessful.
49 bool GetBlock(uint32 position, uint32 size, void* buf) const;
51 // Data availability interface. Return true data avaialble.
52 bool IsDataAvailable(uint32 position, uint32 size) const;
54 // Data availability interface. Return true data avaialble.
55 void RequestData(uint32 position, uint32 size);
57 bool IsDocumentComplete() const;
58 uint32 document_size() const { return document_size_; }
60 // Return number of bytes available.
61 uint32 GetAvailableData() const;
63 // Clear pending requests from the queue.
64 void ClearPendingRequests();
66 bool is_partial_document() { return partial_document_; }
68 private:
69 // Called by the completion callback of the document's URLLoader.
70 void DidOpen(int32_t result);
71 // Call to read data from the document's URLLoader.
72 void ReadMore();
73 // Called by the completion callback of the document's URLLoader.
74 void DidRead(int32_t result);
76 // If the headers have a byte-range response, writes the start and end
77 // positions and returns true if at least the start position was parsed.
78 // The end position will be set to 0 if it was not found or parsed from the
79 // response.
80 // Returns false if not even a start position could be parsed.
81 static bool GetByteRange(const std::string& headers, uint32* start,
82 uint32* end);
84 // If the headers have a multi-part response, returns the boundary name.
85 // Otherwise returns an empty string.
86 static std::string GetMultiPartBoundary(const std::string& headers);
88 // Called when we detect that partial document load is possible.
89 void LoadPartialDocument();
90 // Called when we have to load full document.
91 void LoadFullDocument();
92 // Download pending requests.
93 void DownloadPendingRequests();
94 // Called when we complete server request and read all data from it.
95 void ReadComplete();
96 // Creates request to download size byte of data data starting from position.
97 pp::URLRequestInfo GetRequest(uint32 position, uint32 size) const;
98 // Returns current request size in bytes.
99 uint32 GetRequestSize() const;
101 Client* client_;
102 std::string url_;
103 pp::URLLoader loader_;
104 pp::CompletionCallbackFactory<DocumentLoader> loader_factory_;
105 ChunkStream chunk_stream_;
106 bool partial_document_;
107 bool request_pending_;
108 typedef std::list<std::pair<size_t, size_t> > PendingRequests;
109 PendingRequests pending_requests_;
110 char buffer_[kDefaultRequestSize];
111 uint32 current_pos_;
112 uint32 current_chunk_size_;
113 uint32 current_chunk_read_;
114 uint32 document_size_;
115 bool header_request_;
116 bool is_multipart_;
117 std::string multipart_boundary_;
118 uint32 requests_count_;
119 std::list<std::vector<unsigned char> > chunk_buffer_;
122 } // namespace chrome_pdf
124 #endif // PDF_DOCUMENT_LOADER_H_