vfs: check userland buffers before reading them.
[haiku.git] / src / servers / package / FSTransaction.h
blob791edbae6345b118d9bf72943fd1cf7bd89577f5
1 /*
2 * Copyright 2013, Ingo Weinhold, ingo_weinhold@gmx.de.
3 * Distributed under the terms of the MIT License.
4 */
5 #ifndef FS_TRANSACTION_H
6 #define FS_TRANSACTION_H
9 #include <string>
10 #include <vector>
12 #include "FSUtils.h"
15 class FSTransaction {
16 public:
17 typedef FSUtils::Entry Entry;
19 class Operation;
20 class CreateOperation;
21 class RemoveOperation;
22 class MoveOperation;
24 public:
25 FSTransaction();
26 ~FSTransaction();
28 void RollBack();
30 int32 CreateEntry(const Entry& entry,
31 int32 modifiedOperation = -1);
32 int32 RemoveEntry(const Entry& entry,
33 const Entry& backupEntry,
34 int32 modifiedOperation = -1);
35 int32 MoveEntry(const Entry& fromEntry,
36 const Entry& toEntry,
37 int32 modifiedOperation = -1);
39 void RemoveOperationAt(int32 index);
41 private:
42 struct OperationInfo;
43 typedef std::vector<OperationInfo> OperationList;
45 private:
46 static std::string _GetPath(const Entry& entry);
48 private:
49 OperationList fOperations;
53 class FSTransaction::Operation {
54 public:
55 Operation(FSTransaction* transaction, int32 operation)
57 fTransaction(transaction),
58 fOperation(operation),
59 fIsFinished(false)
63 ~Operation()
65 if (fTransaction != NULL && fOperation >= 0 && !fIsFinished)
66 fTransaction->RemoveOperationAt(fOperation);
69 /*! Arms the operation rollback, i.e. rolling back the transaction will
70 revert this operation.
72 void Finished()
74 fIsFinished = true;
77 /*! Unregisters the operation rollback, i.e. rolling back the transaction
78 will not revert this operation.
80 void Unregister()
82 if (fTransaction != NULL && fOperation >= 0) {
83 fTransaction->RemoveOperationAt(fOperation);
84 fIsFinished = false;
85 fTransaction = NULL;
86 fOperation = -1;
90 private:
91 FSTransaction* fTransaction;
92 int32 fOperation;
93 bool fIsFinished;
97 class FSTransaction::CreateOperation : public FSTransaction::Operation {
98 public:
99 CreateOperation(FSTransaction* transaction, const Entry& entry,
100 int32 modifiedOperation = -1)
102 Operation(transaction,
103 transaction->CreateEntry(entry, modifiedOperation))
109 class FSTransaction::RemoveOperation : public FSTransaction::Operation {
110 public:
111 RemoveOperation(FSTransaction* transaction, const Entry& entry,
112 const Entry& backupEntry, int32 modifiedOperation = -1)
114 Operation(transaction,
115 transaction->RemoveEntry(entry, backupEntry, modifiedOperation))
121 class FSTransaction::MoveOperation : public FSTransaction::Operation {
122 public:
123 MoveOperation(FSTransaction* transaction, const Entry& fromEntry,
124 const Entry& toEntry, int32 modifiedOperation = -1)
126 Operation(transaction,
127 transaction->MoveEntry(fromEntry, toEntry, modifiedOperation))
133 #endif // FS_TRANSACTION_H