Vegastrike 0.5.1 rc1  1.0
Original sources for Vegastrike Evolved
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
vsnet_dloadmgr.h
Go to the documentation of this file.
1 #ifndef VSNET_DLOADMGR_H
2 #define VSNET_DLOADMGR_H
3 
4 #include <config.h>
5 
6 #include <string>
7 #include <map>
8 #include <vector>
9 #include <list>
10 #include <queue>
11 #include <iostream>
12 #include <fstream>
13 
14 #include "boost/shared_ptr.hpp"
15 #include "boost/shared_array.hpp"
16 
17 #include "vsnet_dloadenum.h"
18 #include "vsnet_headers.h"
19 #include "vsnet_debug.h"
20 #include "vsnet_thread.h"
21 #include "vsnet_socket.h"
22 #include "vsnet_socketset.h"
23 
24 //class VSFileSystem::VSFile; Not needed?
25 
26 using std::map;
27 using std::string;
28 
29 class NetBuffer;
30 
31 namespace VsnetDownload
32 {
33 namespace Client
34 {
35 class Manager;
36 
37 /*------------------------------------------------------------*
38 * forward declaration VsnetDownload::Client::Item
39 *------------------------------------------------------------*/
40 
41 class Item;
42 
43 /*------------------------------------------------------------*
44 * declaration VsnetDownload::Client::Manager
45 *------------------------------------------------------------*/
46 
53 class Manager
54 {
55 public: Manager( SocketSet &set, const char **local_search_paths );
56  Manager( SocketSet &set );
57 
58  void addItem( Item *item );
59  void addItems( std::list< Item* > &items );
60 
66 
69  void lower_check_queues();
70 
71 private:
73  void private_eval_resolve_response( SOCKETALT sock, NetBuffer &buffer );
74  void private_eval_download_error( SOCKETALT sock, NetBuffer &respbuffer );
75  void private_eval_download( SOCKETALT sock, NetBuffer &buffer, Subcommand sc );
76 
79  void private_lower_poll();
80 
84  bool private_lower_test_access( Item *i );
85 
86 private:
87  typedef std::list< Item* > ItemList;
88  typedef std::map< SOCKETALT, ItemList, SOCKETALT::CompareLt >ItemListMap;
89  typedef std::map< string, Item* > ItemMap;
90  typedef std::map< SOCKETALT, ItemMap, SOCKETALT::CompareLt > ItemMapMap;
91  typedef std::map< SOCKETALT, Item*, SOCKETALT::CompareLt > ItemSockMap;
92 
93  typedef std::pair< string, Item* > ItemPair;
94  typedef std::pair< SOCKETALT, Item* > ItemSockPair;
95 
96  typedef ItemList::iterator ItemList_I;
97  typedef ItemListMap::iterator ItemListMap_I;
98  typedef ItemMap::iterator ItemMap_I;
99  typedef ItemMapMap::iterator ItemMapMap_I;
100  typedef ItemSockMap::iterator ItemSockMap_I;
101 
102 private:
103  SocketSet &_set;
104  std::vector< std::string >_local_search_paths;
105 
106  VSMutex _pending_mx;
107  std::queue< Item* >_pending;
108  ItemMapMap _asked;
109  ItemSockMap _currentItems;
110 };
111 }; //namespace Client
112 
113 namespace Server
114 {
116 {
117 public: DownloadItem( SOCKETALT sock, bool error, const std::string &file );
118  virtual ~DownloadItem();
119 
120  SOCKETALT getSock() const;
121  bool error() const;
122  std::string file() const;
123 
124  virtual size_t offset() const = 0;
125  virtual size_t remainingSize() const = 0;
126  virtual void copyFromFile( unsigned char *buf, size_t sz ) = 0;
127 
128 private:
129  SOCKETALT _sock;
130  bool _error;
131  const std::string _file;
132 
133  DownloadItem();
134  DownloadItem( const DownloadItem& );
135  DownloadItem& operator=( const DownloadItem& );
136 };
137 
139 {
140 public: DownloadItemFile( SOCKETALT sock, const std::string &failed_file );
141  DownloadItemFile( SOCKETALT sock, const std::string &file, VSFileSystem::VSFile *f, size_t sz );
142  virtual ~DownloadItemFile();
143 
144  virtual size_t offset() const;
145  virtual size_t remainingSize() const;
146  virtual void copyFromFile( unsigned char *buf, size_t sz );
147 
148 private:
149  VSFileSystem::VSFile *_handle;
150  size_t _size;
151  size_t _offset;
152 };
153 
155 {
156 public: DownloadItemBuf( SOCKETALT sock, const std::string &file, const char *buf, size_t sz );
157  virtual ~DownloadItemBuf();
158 
159  virtual size_t offset() const;
160  virtual size_t remainingSize() const;
161  virtual void copyFromFile( unsigned char *buf, size_t sz );
162 
163 private:
164  char *_buf;
165  size_t _size;
166  size_t _offset;
167 };
168 
177 class Manager
178 {
179 public: Manager( SocketSet &set, const char **local_search_paths );
180  Manager( SocketSet &set );
181 
186  void addCmdDownload( SOCKETALT sock, NetBuffer &buffer );
187 
193  void cleanDownload( SOCKETALT s );
194 
197  void lower_check_queues();
198 
199 private:
200  typedef boost::shared_ptr< DownloadItem > DownloadItemPtr;
201  typedef std::queue< DownloadItemPtr > ItemQueue;
202  typedef boost::shared_ptr< ItemQueue > ItemQueuePtr;
203  typedef std::map< SOCKETALT, ItemQueuePtr, SOCKETALT::CompareLt >ItemMap;
204  typedef std::pair< SOCKETALT, ItemQueuePtr > ItemMapPair;
205  typedef ItemMap::iterator ItemMap_I;
206 
207 private:
208  bool private_test_access( const std::string &s, VSFileSystem::VSFileType );
209  VSFileSystem::VSFile * private_access( std::string &file, VSFileSystem::VSFileType );
210  size_t private_file_size( const std::string &file );
211  bool private_lower_try_push_queue( SOCKETALT sock, ItemQueuePtr q );
212 
213 private:
214  LOCALCONST_DECL( int, _packetWorkahead, 5 )
215 
216  SocketSet&_set;
217  std::vector< std::string >_local_search_paths;
218 
219  VSMutex _download_mx;
220  ItemQueue _download;
221 
222  ItemMap _lower_download;
223 };
224 }; //namespace Server
225 }; //namespace VsnetDownload
226 
227 #endif /* VSNET_DLOADMGR_H */
228