tbx  0.7.3
saver.h
1 /*
2  * tbx RISC OS toolbox library
3  *
4  * Copyright (C) 2010 Alan Buckley All Rights Reserved.
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining a
7  * copy of this software and associated documentation files (the "Software"),
8  * to deal in the Software without restriction, including without limitation
9  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10  * and/or sell copies of the Software, and to permit persons to whom the
11  * Software is furnished to do so, subject to the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be included
14  * in all copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22  * THE SOFTWARE.
23  */
24 
25 /*
26  * saver.h
27  *
28  * Created on: 08-Apr-2009
29  * Author: alanb
30  */
31 
32 #ifndef TBX_SAVER_H_
33 #define TBX_SAVER_H_
34 
35 #include "pointerinfo.h"
36 #include "wimpmessagelistener.h"
37 #include <string>
38 
39 namespace tbx {
40 
41 // Handler classes used by Saver
42 class SaverSaveToFileHandler;
43 class SaverFillBufferHandler;
44 class SaverSaveCompletedHandler;
45 class SaverFinishedHandler;
46 
60 class Saver
61 {
62  // Reference counted structure so Saver does not need to be saved
63  class SaverImpl :
67  {
68  int _ref_count;
69  int _reply_to;
70  int _my_ref;
71  int _msg_ref;
72  char *_source_buffer;
73  char *_dest_buffer;
74  int _dest_size;
75  int _transmitted;
76 
77  virtual ~SaverImpl() {}
78 
79  virtual void user_message(WimpMessageEvent &event);
80  virtual void recorded_message(WimpMessageEvent &event, int reply_to);
81  virtual void acknowledge_message(WimpMessageEvent &event);
82 
83  public:
84  PointerInfo _where;
85  std::string _leaf_name;
86  int _file_type;
87  int _file_size;
88  bool _safe;
89  SaverSaveToFileHandler *_save_to_file_handler;
90  SaverFillBufferHandler *_fill_buffer_handler;
91  SaverSaveCompletedHandler *_completed_handler;
92  SaverFinishedHandler *_finished_handler;
93 
94  SaverImpl();
95  void add_ref() {_ref_count++;}
96  void release() {if (--_ref_count == 0) delete this;}
97  void start();
98  void send_data_load(const std::string &file_name);
99  void transfer_data(void *buffer, int size);
100  void finished(bool saved);
101 
102  } *_impl;
103 
104  Saver(SaverImpl *impl);
105  friend class SaverImpl;
106 public:
107  Saver();
108  Saver(const Saver &other);
109 
110  Saver &operator=(const Saver &other);
111 
118  bool operator==(const Saver &other) const {return _impl == other._impl;}
125  bool operator!=(const Saver &other) const {return _impl != other._impl;}
126 
127  void save(const PointerInfo &where, const std::string &file_name, int file_type, int file_size);
128 
132  std::string leaf_name() const {return _impl->_leaf_name;}
133 
137  int file_type() const {return _impl->_file_type;}
138 
142  int file_size() const {return _impl->_file_size;}
143 
149  bool safe() const {return _impl->_safe;}
150 
151 
152 //TODO: See if this is needed: void set_data_address(void *data, int size);
153  void buffer_filled(void *buffer, int size);
154  void file_save_completed(bool successful, std::string file_name);
155 
161  void set_finished_handler(SaverFinishedHandler *handler) {_impl->_finished_handler = handler;}
167  void set_save_completed_handler(SaverSaveCompletedHandler *handler) {_impl->_completed_handler = handler;}
168 
174  void set_save_to_file_handler(SaverSaveToFileHandler *handler) {_impl->_save_to_file_handler = handler;}
175 
181  void set_fill_buffer_handler(SaverFillBufferHandler *handler) {_impl->_fill_buffer_handler = handler;}
182 
183 };
184 
189 {
190  Saver _saver;
191  bool _save_done;
192 public:
199  SaverFinishedEvent(Saver &saver, bool saved) : _saver(saver), _save_done(saved) {}
200 
204  const Saver &saver() const {return _saver;}
205 
209  bool save_done() const {return _save_done;}
210 };
211 
216 {
217 public:
218  virtual ~SaverFinishedHandler() {};
219 
225  virtual void saver_finished(const SaverFinishedEvent &finished) = 0;
226 };
227 
233 {
234  Saver _saver;
235  bool _safe;
236  std::string _file_name;
237 public:
245  SaverSaveCompletedEvent(const Saver &saver, bool safe, const std::string &file_name) :
246  _saver(saver), _safe(safe), _file_name(file_name)
247  {}
248 
252  bool safe() const {return _safe;}
253 
257  const std::string file_name() const {return _file_name;}
258 };
259 
264 {
265 public:
266  virtual ~SaverSaveCompletedHandler() {}
272  virtual void saver_save_completed(SaverSaveCompletedEvent &event) = 0;
273 };
274 
280 {
281 public:
282  virtual ~SaverSaveToFileHandler() {}
283 
293  virtual void saver_save_to_file(Saver saver, std::string file_name) = 0;
294 };
295 
301 {
302 public:
303  virtual ~SaverFillBufferHandler() {}
304 
322  virtual void saver_fill_buffer(Saver saver, int size, void *buffer, int already_transmitted) = 0;
323 };
324 
325 }
326 
327 #endif /* TBX_SAVER_H_ */
Class to store and fetch information about the WIMP mouse pointer.
Definition: pointerinfo.h:43
void buffer_filled(void *buffer, int size)
Call in a RAM transfer when another buffer has been made available.
Definition: saver.cc:115
virtual void saver_finished(const SaverFinishedEvent &finished)=0
Called when the saver has finished.
Event information for when saver dialogue has been completed.
Definition: saver.h:188
Saver()
Constructor for an uninitialised save operation.
Definition: saver.cc:46
int file_type() const
Get the file type from the save.
Definition: saver.h:137
Saver & operator=(const Saver &other)
Assign this saver from another.
Definition: saver.cc:81
Handler for SaverFillBuffer handler.
Definition: saver.h:300
SaverSaveCompletedEvent(const Saver &saver, bool safe, const std::string &file_name)
Construct save completed event.
Definition: saver.h:245
int file_size() const
Get the file size from the SaveAs object.
Definition: saver.h:142
virtual void saver_fill_buffer(Saver saver, int size, void *buffer, int already_transmitted)=0
Called when the buffer need to be refilled for a RAM transfer (type 3) save.
Class to give the same interface to saving to an external application as the SaveAs dialogue...
Definition: saver.h:60
Listener to handle WimpRecordedMessages (event code 18)
Definition: wimpmessagelistener.h:269
void set_save_to_file_handler(SaverSaveToFileHandler *handler)
Handler called to save to a file.
Definition: saver.h:174
std::string leaf_name() const
Get the proposed leaf name for the file to be saved.
Definition: saver.h:132
void set_fill_buffer_handler(SaverFillBufferHandler *handler)
Handler called to fill the buffers for a RAM transfer.
Definition: saver.h:181
Wimp message received event.
Definition: wimpmessagelistener.h:209
Listener to handle WimpAcnowledgeMessages (event code 19)
Definition: wimpmessagelistener.h:289
Handler to save data to a file.
Definition: saver.h:279
void file_save_completed(bool successful, std::string file_name)
Call this after saving a file in the SaveAsSaveToFileListener.
Definition: saver.cc:126
SaverFinishedEvent(Saver &saver, bool saved)
Construct event from a Saver.
Definition: saver.h:199
Listener to handle WimpUserMessages (event code 17)
Definition: wimpmessagelistener.h:252
bool safe() const
Check if the save was to a safe location (e.g.
Definition: saver.h:252
void set_save_completed_handler(SaverSaveCompletedHandler *handler)
Handler called if the save completed successfully.
Definition: saver.h:167
Event for SaverSaveCompletedHandler.
Definition: saver.h:232
bool safe() const
Check if the save is to a safe locations.
Definition: saver.h:149
bool save_done() const
save_done true if the save was successful
Definition: saver.h:209
bool operator==(const Saver &other) const
Check if two savers are the same underlying save operation.
Definition: saver.h:118
bool operator!=(const Saver &other) const
Check if two savers are not the same underlying save operation.
Definition: saver.h:125
const Saver & saver() const
Return Saver for save that has completed.
Definition: saver.h:204
void save(const PointerInfo &where, const std::string &file_name, int file_type, int file_size)
Start the save.
Definition: saver.cc:98
Listener for when a save has been completed.
Definition: saver.h:263
virtual void saver_save_to_file(Saver saver, std::string file_name)=0
Request to save the file to the specified location.
const std::string file_name() const
Full file name of file location if save was safe.
Definition: saver.h:257
Listener for when the save as dialogue box has been closed.
Definition: saver.h:215
void set_finished_handler(SaverFinishedHandler *handler)
Handler called when the save operation has completed.
Definition: saver.h:161
virtual void saver_save_completed(SaverSaveCompletedEvent &event)=0
Called when a save has been successful.