1 // Copyright 2013 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 LIBRARIES_NACL_IO_HTTPFS_HTTP_FS_NODE_H_ 6 #define LIBRARIES_NACL_IO_HTTPFS_HTTP_FS_NODE_H_ 7 8 #include <map> 9 #include <string> 10 #include <vector> 11 12 #include "nacl_io/error.h" 13 #include "nacl_io/node.h" 14 #include "nacl_io/pepper_interface.h" 15 16 namespace nacl_io { 17 18 typedef std::map<std::string, std::string> StringMap_t; 19 20 class HttpFsNode : public Node { 21 public: 22 virtual Error FSync(); 23 virtual Error GetDents(size_t offs, 24 struct dirent* pdir, 25 size_t count, 26 int* out_bytes); 27 virtual Error GetStat(struct stat* stat); 28 virtual Error Read(const HandleAttr& attr, 29 void* buf, 30 size_t count, 31 int* out_bytes); 32 virtual Error FTruncate(off_t size); 33 virtual Error Write(const HandleAttr& attr, 34 const void* buf, 35 size_t count, 36 int* out_bytes); 37 virtual Error GetSize(off_t* out_size); 38 39 void SetCachedSize(off_t size); 40 void SetMode(int mode); 41 42 protected: 43 HttpFsNode(Filesystem* filesystem, 44 const std::string& url, 45 bool cache_content); 46 47 private: 48 Error GetStat_Locked(struct stat* stat); 49 Error OpenUrl(const char* method, 50 StringMap_t* request_headers, 51 ScopedResource* out_loader, 52 ScopedResource* out_request, 53 ScopedResource* out_response, 54 int32_t* out_statuscode, 55 StringMap_t* out_response_headers); 56 57 Error DownloadToCache(); 58 Error ReadPartialFromCache(const HandleAttr& attr, 59 void* buf, 60 int count, 61 int* out_bytes); 62 Error DownloadPartial(const HandleAttr& attr, 63 void* buf, 64 off_t count, 65 int* out_bytes); 66 67 Error DownloadToTemp(off_t* out_bytes); 68 69 // Read as much as possible from |loader|, using |buffer_| as a scratch area. 70 Error ReadEntireResponseToTemp(const ScopedResource& loader, 71 off_t* out_bytes); 72 // Read as much as possible from |loader|, storing the result in 73 // |cached_data_|. 74 Error ReadEntireResponseToCache(const ScopedResource& loader, int* out_bytes); 75 76 // Read up to |count| bytes from |loader|, using |buffer_| as a scratch area. 77 Error ReadResponseToTemp(const ScopedResource& loader, 78 int count, 79 int* out_bytes); 80 81 // Read up to |count| bytes from |loader|, and store the result in |buf|, 82 // which is assumed to have |count| bytes free. 83 Error ReadResponseToBuffer(const ScopedResource& loader, 84 void* buf, 85 int count, 86 int* out_bytes); 87 88 std::string url_; 89 std::vector<char> buffer_; 90 91 bool cache_content_; 92 bool has_cached_size_; 93 std::vector<char> cached_data_; 94 95 friend class HttpFs; 96 }; 97 98 } // namespace nacl_io 99 100 #endif // LIBRARIES_NACL_IO_HTTPFS_HTTP_FS_NODE_H_ 101