19 #ifndef INCLUDE_RCF_FILESTREAM_HPP
20 #define INCLUDE_RCF_FILESTREAM_HPP
22 #include <RCF/Config.hpp>
24 #if RCF_FEATURE_FILETRANSFER==0
25 #error RCF_FEATURE_FILETRANSFER=1 must be defined
28 #include <RCF/ByteBuffer.hpp>
29 #include <RCF/Export.hpp>
31 #include <boost/enable_shared_from_this.hpp>
32 #include <boost/filesystem/path.hpp>
33 #include <boost/function.hpp>
35 #if RCF_FEATURE_BOOST_SERIALIZATION==1
36 #include <boost/serialization/vector.hpp>
37 #include <boost/serialization/shared_ptr.hpp>
49 typedef boost::shared_ptr<FileUploadInfo> FileUploadInfoPtr;
55 typedef boost::shared_ptr<FileStreamImpl> FileStreamImplPtr;
59 class RCF_EXPORT FileInfo
71 boost::filesystem::path mFilePath;
72 boost::uint64_t mFileStartPos;
73 boost::uint64_t mFileSize;
74 boost::uint32_t mFileCrc;
75 std::string mRenameFile;
76 boost::uint64_t mLastWriteTime;
79 void serialize(SF::Archive & ar);
82 #if RCF_FEATURE_BOOST_SERIALIZATION==1
83 template<
typename Archive>
84 void serialize(Archive & ar,
const unsigned int)
94 int runtimeVersion = getRuntimeVersionOfThisRemoteCall();
95 if (runtimeVersion >= 11)
104 class RCF_EXPORT FileManifest
107 typedef std::vector< FileInfo > Files;
110 boost::filesystem::path mManifestBase;
114 FileManifest(boost::filesystem::path pathToFiles);
116 boost::uint64_t getTotalByteSize()
const;
118 #if RCF_FEATURE_SF==1
119 void serialize(SF::Archive & ar);
122 #if RCF_FEATURE_BOOST_SERIALIZATION==1
123 template<
typename Archive>
124 void serialize(Archive & ar,
const unsigned int)
132 class RCF_EXPORT FileStreamImpl :
public boost::enable_shared_from_this<FileStreamImpl>
145 FileStreamImpl(
const std::string & filePath);
146 FileStreamImpl(
const FileManifest & manifest);
150 void serializeGeneric(
152 boost::function2<void, boost::uint32_t &, Direction &> serializeImpl);
154 #if RCF_FEATURE_SF==1
155 void serializeImplSf(SF::Archive & ar, boost::uint32_t & transferId, Direction & dir);
156 void serialize(SF::Archive & ar);
159 #if RCF_FEATURE_BOOST_SERIALIZATION==1
161 template<
typename Archive>
162 void serializeImplBser(Archive & ar, boost::uint32_t & transferId, Direction & dir)
164 ar & transferId & dir;
167 template<
typename Archive>
168 void serialize(Archive & ar,
const unsigned int)
170 typedef typename Archive::is_saving IsSaving;
171 const bool isSaving = IsSaving::value;
176 &FileStreamImpl::serializeImplBser<Archive>,
185 std::string mUploadId;
186 boost::filesystem::path mDownloadToPath;
187 FileManifest mManifest;
188 boost::uint32_t mTransferRateBps;
189 boost::uint32_t mSessionLocalId;
191 Direction mDirection;
194 class RCF_EXPORT FileStream
199 FileStream(FileStreamImplPtr implPtr);
200 FileStream(
const std::string & filePath);
201 FileStream(
const FileManifest & manifest);
206 FileStream & operator=(
const FileStream & rhs)
208 *mImplPtr = *rhs.mImplPtr;
213 std::string getLocalPath()
const;
214 FileManifest & getManifest()
const;
217 void setDownloadToPath(
const std::string & downloadToPath);
218 std::string getDownloadToPath()
const;
220 void setTransferRateBps(boost::uint32_t transferRateBps);
221 boost::uint32_t getTransferRateBps();
223 void upload(RCF::ClientStub & clientStub);
224 void download(RCF::ClientStub & clientStub);
226 FileStreamImplPtr mImplPtr;
228 #if RCF_FEATURE_SF==1
229 void serialize(SF::Archive & ar);
232 #if RCF_FEATURE_BOOST_SERIALIZATION==1
233 template<
typename Archive>
234 void serialize(Archive & ar,
const unsigned int)
242 class FileTransferProgress
246 FileTransferProgress() :
247 mBytesTotalToTransfer(0),
248 mBytesTransferredSoFar(0),
254 boost::uint64_t mBytesTotalToTransfer;
255 boost::uint64_t mBytesTransferredSoFar;
256 boost::uint32_t mServerLimitBps;
263 FileChunk() : mFileIndex(0), mOffset(0)
266 boost::uint32_t mFileIndex;
267 boost::uint64_t mOffset;
270 #if RCF_FEATURE_SF==1
271 void serialize(SF::Archive & ar);
274 #if RCF_FEATURE_BOOST_SERIALIZATION==1
275 template<
typename Archive>
276 void serialize(Archive & ar,
const unsigned int)
278 ar & mFileIndex & mOffset & mData;
284 class FileTransferRequest
287 FileTransferRequest() : mFile(0), mPos(0), mChunkSize(0)
290 boost::uint32_t mFile;
291 boost::uint64_t mPos;
292 boost::uint32_t mChunkSize;
294 #if RCF_FEATURE_SF==1
295 void serialize(SF::Archive & ar);
298 #if RCF_FEATURE_BOOST_SERIALIZATION==1
299 template<
typename Archive>
300 void serialize(Archive & ar,
const unsigned int)
302 ar & mFile & mPos & mChunkSize;
310 #endif // ! INCLUDE_RCF_FILESTREAM_HPP