1 // distribution boxbackup-0.11_trunk_2979 (svn version: 2979)
2 // Box Backup, http://www.boxbackup.org/
3 //
4 // Copyright (c) 2003-2010, Ben Summers and contributors.
5 // All rights reserved.
6 //
7 // Note that this project uses mixed licensing. Any file with this license
8 // attached, or where the code LICENSE-DUAL appears on the first line, falls
9 // under this license. See the file COPYING.txt for more information.
10 //
11 // This file is dual licensed. You may use and distribute it providing that you
12 // comply EITHER with the terms of the BSD license, OR the GPL license. It is
13 // not necessary to comply with both licenses, only one.
14 //
15 // The BSD license option follows:
16 //
17 // Redistribution and use in source and binary forms, with or without
18 // modification, are permitted provided that the following conditions are met:
19 //
20 // 1. Redistributions of source code must retain the above copyright
21 //    notice, this list of conditions and the following disclaimer.
22 //
23 // 2. Redistributions in binary form must reproduce the above copyright
24 //    notice, this list of conditions and the following disclaimer in the
25 //    documentation and/or other materials provided with the distribution.
26 //
27 // 3. Neither the name of the Box Backup nor the names of its contributors may
28 //    be used to endorse or promote products derived from this software without
29 //    specific prior written permission.
30 //
31 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
32 // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
33 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
34 // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
35 // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
36 // (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
37 // LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
38 // ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
39 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
40 // THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
41 //
42 // [http://en.wikipedia.org/wiki/BSD_licenses#3-clause_license_.28.22New_BSD_License.22.29]
43 //
44 // The GPL license option follows:
45 //
46 // This program is free software; you can redistribute it and/or
47 // modify it under the terms of the GNU General Public License
48 // as published by the Free Software Foundation; either version 2
49 // of the License, or (at your option) any later version.
50 //
51 // This program is distributed in the hope that it will be useful,
52 // but WITHOUT ANY WARRANTY; without even the implied warranty of
53 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
54 // GNU General Public License for more details.
55 //
56 // You should have received a copy of the GNU General Public License
57 // along with this program; if not, write to the Free Software
58 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
59 //
60 // [http://www.gnu.org/licenses/old-licenses/gpl-2.0.html#SEC4]
61 // --------------------------------------------------------------------------
62 //
63 // File
64 //		Name:    RaidFileWrite.h
65 //		Purpose: Writing RAID like files
66 //		Created: 2003/07/10
67 //
68 // --------------------------------------------------------------------------
69 
70 #ifndef RAIDFILEWRITE__H
71 #define RAIDFILEWRITE__H
72 
73 #include <string>
74 
75 #include "IOStream.h"
76 
77 class RaidFileDiscSet;
78 
79 // --------------------------------------------------------------------------
80 //
81 // Class
82 //		Name:    RaidFileWrite
83 //		Purpose: Writing RAID like files
84 //		Created: 2003/07/10
85 //
86 // --------------------------------------------------------------------------
87 class RaidFileWrite : public IOStream
88 {
89 public:
90 	RaidFileWrite(int SetNumber, const std::string &Filename);
91 	RaidFileWrite(int SetNumber, const std::string &Filename, int refcount);
92 	~RaidFileWrite();
93 private:
94 	RaidFileWrite(const RaidFileWrite &rToCopy);
95 
96 public:
97 	// IOStream interface
98 	virtual int Read(void *pBuffer, int NBytes, int Timeout = IOStream::TimeOutInfinite);	// will exception
99 	virtual void Write(const void *pBuffer, int NBytes);
100 	virtual pos_type GetPosition() const;
101 	virtual void Seek(pos_type Offset, int SeekType);
102 	virtual void Close();		// will discard the file! Use commit instead.
103 	virtual bool StreamDataLeft();
104 	virtual bool StreamClosed();
105 
106 	// Extra bits
107 	void Open(bool AllowOverwrite = false);
108 	void Commit(bool ConvertToRaidNow = false);
109 	void Discard();
110 	void TransformToRaidStorage();
111 	void Delete();
112 	pos_type GetFileSize();
113 	pos_type GetDiscUsageInBlocks();
114 
115 	static void CreateDirectory(int SetNumber, const std::string &rDirName, bool Recursive = false, int mode = 0777);
116 	static void CreateDirectory(const RaidFileDiscSet &rSet, const std::string &rDirName, bool Recursive = false, int mode = 0777);
117 
118 private:
119 
120 private:
121 	int mSetNumber;
122 	std::string mFilename;
123 	int mOSFileHandle;
124 	int mRefCount;
125 };
126 
127 #endif // RAIDFILEWRITE__H
128 
129