19 #ifndef INCLUDE_RCF_FILETRANSFERSERVICE_HPP
20 #define INCLUDE_RCF_FILETRANSFERSERVICE_HPP
26 #include <RCF/FileStream.hpp>
27 #include <RCF/RcfSession.hpp>
28 #include <RCF/Service.hpp>
30 #include <SF/vector.hpp>
33 #include <boost/filesystem/path.hpp>
39 RCF_EXPORT
void serialize(SF::Archive &ar, boost::filesystem::path &p);
45 #if RCF_FEATURE_BOOST_SERIALIZATION==1
47 #include <boost/config.hpp>
48 #include <boost/version.hpp>
50 #if BOOST_VERSION <= 104300
51 #define BOOST_FS_NAMESPACE filesystem
52 #elif BOOST_VERSION <= 104500
53 #define BOOST_FS_NAMESPACE filesystem2
55 #define BOOST_FS_NAMESPACE filesystem3
58 namespace boost {
namespace BOOST_FS_NAMESPACE {
60 template<
typename Archive>
61 void serialize(Archive & ar, boost::BOOST_FS_NAMESPACE::path & p,
const unsigned int)
63 typedef typename Archive::is_saving IsSaving;
64 const bool isSaving = IsSaving::value;
68 std::string s = p.string();
81 #undef BOOST_FS_NAMESPACE
87 std::string nativeString(
const boost::filesystem::path & p);
89 class FileTransferService;
92 class FileDownloadInfo;
94 class RCF_EXPORT BandwidthQuota : boost::noncopyable
98 BandwidthQuota(boost::uint32_t quotaBps);
100 void setQuota(boost::uint32_t quotaBps);
101 boost::uint32_t calculateLineSpeedLimit();
105 friend class FileUploadInfo;
106 friend class FileDownloadInfo;
108 void addUpload(FileUploadInfo * pUpload);
109 void removeUpload(FileUploadInfo * pUpload);
110 void addDownload(FileDownloadInfo * pDownload);
111 void removeDownload(FileDownloadInfo * pDownload);
116 boost::uint32_t mQuotaBps;
118 std::set<FileDownloadInfo *> mDownloadsInProgress;
119 std::set<FileUploadInfo *> mUploadsInProgress;
122 typedef boost::shared_ptr<BandwidthQuota> BandwidthQuotaPtr;
125 class FileUploadInfo;
126 class FileDownloadInfo;
128 typedef boost::shared_ptr<FileUploadInfo> FileUploadInfoPtr;
129 typedef boost::shared_ptr<FileDownloadInfo> FileDownloadInfoPtr;
131 typedef boost::function1<bool, const FileUploadInfo &> UploadAccessCallback;
132 typedef boost::function1<bool, const FileDownloadInfo &> DownloadAccessCallback;
134 typedef boost::shared_ptr< std::ifstream > IfstreamPtr;
135 typedef boost::shared_ptr< std::ofstream > OfstreamPtr;
138 typedef boost::shared_ptr<FileIoRequest> FileIoRequestPtr;
140 class FileUploadInfo : boost::noncopyable
143 FileUploadInfo(BandwidthQuotaPtr quotaPtr);
146 FileManifest mManifest;
147 boost::filesystem::path mUploadPath;
149 OfstreamPtr mFileStream;
150 boost::filesystem::path mFileStreamPath;
151 FileIoRequestPtr mWriteOp;
155 boost::uint32_t mTimeStampMs;
156 boost::uint32_t mCurrentFile;
157 boost::uint64_t mCurrentPos;
158 boost::uint32_t mSessionLocalId;
159 std::string mUploadId;
161 BandwidthQuotaPtr mQuotaPtr;
164 class FileDownloadInfo : boost::noncopyable
167 FileDownloadInfo(BandwidthQuotaPtr quotaPtr);
170 boost::filesystem::path mDownloadPath;
171 FileManifest mManifest;
173 IfstreamPtr mFileStream;
174 boost::filesystem::path mFileStreamPath;
175 FileIoRequestPtr mReadOp;
176 ByteBuffer mReadBuffer;
177 ByteBuffer mSendBuffer;
178 ByteBuffer mSendBufferRemaining;
180 boost::uint32_t mCurrentFile;
181 boost::uint64_t mCurrentPos;
184 Timer mTransferWindowTimer;
185 boost::uint32_t mTransferWindowBytesSoFar;
186 boost::uint32_t mTransferWindowBytesTotal;
190 boost::uint32_t mSessionLocalId;
192 BandwidthQuotaPtr mQuotaPtr;
195 typedef boost::shared_ptr<FileUploadInfo> FileUploadInfoPtr;
196 typedef boost::shared_ptr<FileDownloadInfo> FileDownloadInfoPtr;
199 class FileTransferRequest;
201 class RCF_EXPORT FileTransferService :
public I_Service
204 FileTransferService();
206 typedef boost::function<void(RcfSession&, FileDownloadInfo &)> OnFileDownloadProgress;
207 typedef boost::function<void(RcfSession&, FileUploadInfo &)> OnFileUploadProgress;
209 typedef boost::function1<BandwidthQuotaPtr, RcfSession &> BandwidthQuotaCallback;
210 typedef BandwidthQuotaCallback UploadQuotaCallback;
211 typedef BandwidthQuotaCallback DownloadQuotaCallback;
214 void setTransferWindowS(boost::uint32_t transferWindowS);
215 boost::uint32_t getTransferWindowS();
221 const FileManifest & manifest,
222 const std::vector<FileChunk> & chunks,
223 FileChunk & startPos,
224 boost::uint32_t & maxMessageLength,
225 std::string & uploadId,
226 boost::uint32_t & bps,
227 boost::uint32_t sessionLocalId);
230 const std::vector<FileChunk> & chunks,
231 boost::uint32_t & bps);
234 FileManifest & manifest,
235 const FileTransferRequest & request,
236 std::vector<FileChunk> & chunks,
237 boost::uint32_t & maxMessageLength,
238 boost::uint32_t & bps,
239 boost::uint32_t sessionLocalId);
242 const FileChunk & startPos);
245 const FileTransferRequest & request,
246 std::vector<FileChunk> & chunks,
247 boost::uint32_t & adviseWaitMs,
248 boost::uint32_t & bps);
254 std::string addUpload(
const boost::filesystem::path & uploadPath);
255 void removeUpload(
const std::string & uploadId);
256 boost::filesystem::path findUpload(
const std::string & uploadId);
258 void processZeroSizeEntries(RCF::FileUploadInfo & uploadInfo);
259 void checkForUploadCompletion(FileUploadInfoPtr uploadInfoPtr);
263 boost::filesystem::path> UploadsInProgress;
265 Mutex mUploadsInProgressMutex;
266 UploadsInProgress mUploadsInProgress;
268 void onServerStart(RcfServer & server);
269 void onServerStop(RcfServer & server);
271 boost::filesystem::path mUploadDirectory;
273 OnFileDownloadProgress mOnFileDownloadProgress;
274 OnFileUploadProgress mOnFileUploadProgress;
276 boost::uint32_t mTransferWindowS;
278 BandwidthQuotaPtr mUploadQuota;
279 BandwidthQuotaPtr mDownloadQuota;
281 BandwidthQuotaCallback mUploadQuotaCallback;
282 BandwidthQuotaCallback mDownloadQuotaCallback;
285 typedef boost::shared_ptr<FileTransferService> FileTransferServicePtr;
289 #endif // ! INCLUDE_RCF_FILETRANSFERSERVICE_HPP