Home | History | Annotate | Download | only in pdf
      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.
      4 
      5 #ifndef PDF_DOCUMENT_LOADER_H_
      6 #define PDF_DOCUMENT_LOADER_H_
      7 
      8 #include <list>
      9 #include <string>
     10 #include <vector>
     11 
     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"
     16 
     17 #define kDefaultRequestSize 32768u
     18 
     19 namespace chrome_pdf {
     20 
     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;
     39   };
     40 
     41   explicit DocumentLoader(Client* client);
     42   virtual ~DocumentLoader();
     43 
     44   bool Init(const pp::URLLoader& loader,
     45             const std::string& url,
     46             const std::string& headers);
     47 
     48   // Data access interface. Return true is sucessful.
     49   bool GetBlock(uint32 position, uint32 size, void* buf) const;
     50 
     51   // Data availability interface. Return true data avaialble.
     52   bool IsDataAvailable(uint32 position, uint32 size) const;
     53 
     54   // Data availability interface. Return true data avaialble.
     55   void RequestData(uint32 position, uint32 size);
     56 
     57   bool IsDocumentComplete() const;
     58   uint32 document_size() const { return document_size_; }
     59 
     60   // Return number of bytes available.
     61   uint32 GetAvailableData() const;
     62 
     63   // Clear pending requests from the queue.
     64   void ClearPendingRequests();
     65 
     66   bool is_partial_document() { return partial_document_; }
     67 
     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);
     75 
     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);
     83 
     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);
     87 
     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;
    100 
    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_;
    120 };
    121 
    122 }  // namespace chrome_pdf
    123 
    124 #endif  // PDF_DOCUMENT_LOADER_H_
    125