xref: /haiku/src/apps/diskprobe/DataEditor.h (revision e85413ad6cca690cadd97dd407455e1de24600ba)
1 /*
2  * Copyright 2004-2018, Axel Dörfler, axeld@pinc-software.de.
3  * All rights reserved. Distributed under the terms of the MIT license.
4  */
5 #ifndef DATA_EDITOR_H
6 #define DATA_EDITOR_H
7 
8 
9 #include <File.h>
10 #include <Entry.h>
11 #include <Locker.h>
12 #include <ObjectList.h>
13 
14 
15 class BHandler;
16 class BLooper;
17 class BMessage;
18 class BMessenger;
19 
20 class DataChange;
21 class StateWatcher;
22 
23 
24 class DataEditor : public BLocker {
25 public:
26 								DataEditor();
27 								DataEditor(entry_ref& ref,
28 									const char* attribute = NULL);
29 								DataEditor(BEntry& entry,
30 									const char* attribute = NULL);
31 								DataEditor(const DataEditor& editor);
32 	virtual						~DataEditor();
33 
34 			status_t			SetTo(const char* path,
35 									const char* attribute = NULL);
36 			status_t			SetTo(entry_ref &ref,
37 									const char* attribute = NULL);
38 			status_t			SetTo(BEntry &entry,
39 									const char* attribute = NULL);
40 
41 			status_t			Save();
42 
IsReadOnly()43 			bool				IsReadOnly() const { return fIsReadOnly; }
IsDevice()44 			bool				IsDevice() const { return fIsDevice; }
IsAttribute()45 			bool				IsAttribute() const
46 									{ return fAttribute != NULL; }
IsModified()47 			bool				IsModified() const
48 									{ return fLastChange != fFirstChange; }
49 
Attribute()50 			const char*			Attribute() const { return fAttribute; }
Type()51 			type_code			Type() const { return fType; }
52 
53 			status_t			InitCheck();
54 
55 			status_t			Replace(off_t offset, const uint8* data,
56 									size_t length);
57 			status_t			Remove(off_t offset, off_t length);
58 			status_t			Insert(off_t offset, const uint8* data,
59 									size_t length);
60 
61 			status_t			MoveBy(int32 bytes);
62 			status_t			MoveTo(off_t offset);
63 
64 			status_t			Undo();
65 			status_t			Redo();
66 
67 			bool				CanUndo() const;
68 			bool				CanRedo() const;
69 
70 			status_t			SetFileSize(off_t size);
FileSize()71 			off_t				FileSize() const { return fSize; }
72 
73 			status_t			SetViewOffset(off_t offset);
ViewOffset()74 			off_t				ViewOffset() const { return fViewOffset; }
75 
76 			status_t			SetViewSize(size_t size);
ViewSize()77 			size_t				ViewSize() const { return fViewSize; }
78 
79 			status_t			SetBlockSize(size_t size);
BlockSize()80 			size_t				BlockSize() const { return fBlockSize; }
81 
82 			status_t			UpdateIfNeeded(bool* _updated = NULL);
83 			status_t			ForceUpdate();
84 			status_t			GetViewBuffer(const uint8** _buffer);
85 
86 			status_t			StartWatching(BMessenger target);
87 			status_t			StartWatching(BHandler* handler,
88 									BLooper* looper = NULL);
89 			void				StopWatching(BMessenger target);
90 			void				StopWatching(BHandler* handler,
91 									BLooper* looper = NULL);
92 
93 			off_t				Find(off_t startPosition, const uint8* data,
94 									size_t dataSize, bool caseInsensitive,
95 									bool cyclic, BMessenger progressMessenger,
96 									volatile bool* stop = NULL);
97 
File()98 			BFile&				File() { return fFile; }
AttributeRef()99 			const entry_ref&	AttributeRef() const { return fAttributeRef; }
Ref()100 			const entry_ref&	Ref() const { return fRef; }
101 
102 private:
103 	friend class StateWatcher;
104 
105 			status_t			SetViewOffset(off_t offset, bool sendNotices);
106 			status_t			SetViewSize(size_t size, bool sendNotices);
107 			void				SendNotices(uint32 what,
108 									BMessage* message = NULL);
109 			void				SendNotices(DataChange* change);
110 			status_t			Update();
111 			void				AddChange(DataChange* change);
112 			void				ApplyChanges();
113 			void				RemoveRedos();
114 
115 private:
116 			BObjectList<BMessenger> fObservers;
117 
118 			entry_ref			fRef;
119 			entry_ref			fAttributeRef;
120 			BFile				fFile;
121 			const char*			fAttribute;
122 			type_code			fType;
123 			bool				fIsDevice;
124 			bool				fIsReadOnly;
125 			off_t				fRealSize;
126 			off_t				fSize;
127 
128 			BObjectList<DataChange>	fChanges;
129 			DataChange*			fFirstChange;
130 			DataChange*			fLastChange;
131 			int32				fChangesFromSaved;
132 
133 			uint8*				fView;
134 			off_t				fRealViewOffset;
135 			off_t				fViewOffset;
136 			size_t				fRealViewSize;
137 			size_t				fViewSize;
138 			bool				fNeedsUpdate;
139 
140 			size_t				fBlockSize;
141 };
142 
143 
144 static const uint32 kMsgDataEditorStateChange = 'deSC';
145 static const uint32 kMsgDataEditorUpdate = 'deUp';
146 static const uint32 kMsgDataEditorParameterChange = 'dePC';
147 
148 static const uint32 kMsgDataEditorFindProgress = 'deFP';
149 
150 
151 #endif	/* DATA_EDITOR_H */
152