tbx  0.7.6
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  int _your_ref;
89  bool _safe;
90  SaverSaveToFileHandler *_save_to_file_handler;
91  SaverFillBufferHandler *_fill_buffer_handler;
92  SaverSaveCompletedHandler *_completed_handler;
93  SaverFinishedHandler *_finished_handler;
94 
95  SaverImpl();
96  void add_ref() {_ref_count++;}
97  void release() {if (--_ref_count == 0) delete this;}
98  void start();
99  void send_data_load(const std::string &file_name);
100  void transfer_data(void *buffer, int size);
101  void finished(bool saved);
102 
103  } *_impl;
104 
105  Saver(SaverImpl *impl);
106  friend class SaverImpl;
107 public:
108  Saver();
109  Saver(const Saver &other);
110 
111  Saver &operator=(const Saver &other);
112 
119  bool operator==(const Saver &other) const {return _impl == other._impl;}
126  bool operator!=(const Saver &other) const {return _impl != other._impl;}
127 
128  void save(const PointerInfo &where, const std::string &leaf_name, int file_type, int file_size);
129  void save_for_data_request(const WimpMessage &data_req, const std::string &leaf_name, int file_type, int file_size);
130 
134  std::string leaf_name() const {return _impl->_leaf_name;}
135 
139  int file_type() const {return _impl->_file_type;}
140 
144  int file_size() const {return _impl->_file_size;}
145 
151  bool safe() const {return _impl->_safe;}
152 
153 
154 //TODO: See if this is needed: void set_data_address(void *data, int size);
155  void buffer_filled(void *buffer, int size);
156  void file_save_completed(bool successful, std::string file_name);
157 
163  void set_finished_handler(SaverFinishedHandler *handler) {_impl->_finished_handler = handler;}
169  void set_save_completed_handler(SaverSaveCompletedHandler *handler) {_impl->_completed_handler = handler;}
170 
176  void set_save_to_file_handler(SaverSaveToFileHandler *handler) {_impl->_save_to_file_handler = handler;}
177 
183  void set_fill_buffer_handler(SaverFillBufferHandler *handler) {_impl->_fill_buffer_handler = handler;}
184 
185 };
186 
191 {
192  Saver _saver;
193  bool _save_done;
194 public:
201  SaverFinishedEvent(Saver &saver, bool saved) : _saver(saver), _save_done(saved) {}
202 
206  const Saver &saver() const {return _saver;}
207 
211  bool save_done() const {return _save_done;}
212 };
213 
218 {
219 public:
220  virtual ~SaverFinishedHandler() {};
221 
227  virtual void saver_finished(const SaverFinishedEvent &finished) = 0;
228 };
229 
235 {
236  Saver _saver;
237  bool _safe;
238  std::string _file_name;
239 public:
247  SaverSaveCompletedEvent(const Saver &saver, bool safe, const std::string &file_name) :
248  _saver(saver), _safe(safe), _file_name(file_name)
249  {}
250 
254  bool safe() const {return _safe;}
255 
259  const std::string file_name() const {return _file_name;}
260 };
261 
266 {
267 public:
268  virtual ~SaverSaveCompletedHandler() {}
275 };
276 
282 {
283 public:
284  virtual ~SaverSaveToFileHandler() {}
285 
295  virtual void saver_save_to_file(Saver saver, std::string file_name) = 0;
296 };
297 
303 {
304 public:
305  virtual ~SaverFillBufferHandler() {}
306 
324  virtual void saver_fill_buffer(Saver saver, int size, void *buffer, int already_transmitted) = 0;
325 };
326 
327 }
328 
329 #endif /* TBX_SAVER_H_ */
tbx::SaverFinishedHandler
Listener for when the save as dialogue box has been closed.
Definition: saver.h:218
tbx
A library for creating RISC OS toolbox applications.
Definition: abouttobeshownlistener.cc:35
tbx::SaverSaveCompletedEvent::SaverSaveCompletedEvent
SaverSaveCompletedEvent(const Saver &saver, bool safe, const std::string &file_name)
Construct save completed event.
Definition: saver.h:247
tbx::SaverSaveCompletedEvent::safe
bool safe() const
Check if the save was to a safe location (e.g.
Definition: saver.h:254
tbx::Saver::operator==
bool operator==(const Saver &other) const
Check if two savers are the same underlying save operation.
Definition: saver.h:119
tbx::SaverFinishedHandler::saver_finished
virtual void saver_finished(const SaverFinishedEvent &finished)=0
Called when the saver has finished.
tbx::SaverFinishedEvent::SaverFinishedEvent
SaverFinishedEvent(Saver &saver, bool saved)
Construct event from a Saver.
Definition: saver.h:201
tbx::Saver::set_finished_handler
void set_finished_handler(SaverFinishedHandler *handler)
Handler called when the save operation has completed.
Definition: saver.h:163
tbx::SaverFinishedEvent::saver
const Saver & saver() const
Return Saver for save that has completed.
Definition: saver.h:206
tbx::SaverSaveCompletedHandler
Listener for when a save has been completed.
Definition: saver.h:266
tbx::SaverFillBufferHandler::saver_fill_buffer
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.
tbx::Saver::file_type
int file_type() const
Get the file type from the save.
Definition: saver.h:139
tbx::WimpRecordedMessageListener
Listener to handle WimpRecordedMessages (event code 18)
Definition: wimpmessagelistener.h:270
tbx::SaverSaveCompletedHandler::saver_save_completed
virtual void saver_save_completed(SaverSaveCompletedEvent &event)=0
Called when a save has been successful.
tbx::WimpMessage
Wimp message information.
Definition: wimpmessagelistener.h:37
tbx::Saver::save
void save(const PointerInfo &where, const std::string &leaf_name, int file_type, int file_size)
Start the save.
Definition: saver.cc:99
tbx::SaverFillBufferHandler
Handler for SaverFillBuffer handler.
Definition: saver.h:303
tbx::Saver::buffer_filled
void buffer_filled(void *buffer, int size)
Call in a RAM transfer when another buffer has been made available.
Definition: saver.cc:141
tbx::Saver::operator!=
bool operator!=(const Saver &other) const
Check if two savers are not the same underlying save operation.
Definition: saver.h:126
tbx::Saver::set_fill_buffer_handler
void set_fill_buffer_handler(SaverFillBufferHandler *handler)
Handler called to fill the buffers for a RAM transfer.
Definition: saver.h:183
tbx::Saver::save_for_data_request
void save_for_data_request(const WimpMessage &data_req, const std::string &leaf_name, int file_type, int file_size)
Start save in response to a DataRequest message.
Definition: saver.cc:117
tbx::SaverSaveCompletedEvent::file_name
const std::string file_name() const
Full file name of file location if save was safe.
Definition: saver.h:259
tbx::WimpUserMessageListener
Listener to handle WimpUserMessages (event code 17)
Definition: wimpmessagelistener.h:253
tbx::Saver::operator=
Saver & operator=(const Saver &other)
Assign this saver from another.
Definition: saver.cc:81
tbx::Saver::set_save_completed_handler
void set_save_completed_handler(SaverSaveCompletedHandler *handler)
Handler called if the save completed successfully.
Definition: saver.h:169
tbx::Saver::file_size
int file_size() const
Get the file size from the SaveAs object.
Definition: saver.h:144
tbx::WimpMessageEvent
Wimp message received event.
Definition: wimpmessagelistener.h:210
tbx::Saver::leaf_name
std::string leaf_name() const
Get the proposed leaf name for the file to be saved.
Definition: saver.h:134
tbx::PointerInfo
Class to store and fetch information about the WIMP mouse pointer.
Definition: pointerinfo.h:44
tbx::SaverSaveCompletedEvent
Event for SaverSaveCompletedHandler.
Definition: saver.h:235
tbx::SaverFinishedEvent
Event information for when saver dialogue has been completed.
Definition: saver.h:191
tbx::SaverFinishedEvent::save_done
bool save_done() const
save_done true if the save was successful
Definition: saver.h:211
tbx::SaverSaveToFileHandler::saver_save_to_file
virtual void saver_save_to_file(Saver saver, std::string file_name)=0
Request to save the file to the specified location.
tbx::Saver::safe
bool safe() const
Check if the save is to a safe locations.
Definition: saver.h:151
tbx::WimpAcknowledgeMessageListener
Listener to handle WimpAcnowledgeMessages (event code 19)
Definition: wimpmessagelistener.h:290
tbx::Saver::file_save_completed
void file_save_completed(bool successful, std::string file_name)
Call this after saving a file in the SaveAsSaveToFileListener.
Definition: saver.cc:152
tbx::Saver::Saver
Saver()
Constructor for an uninitialised save operation.
Definition: saver.cc:46
tbx::SaverSaveToFileHandler
Handler to save data to a file.
Definition: saver.h:282
tbx::Saver
Class to give the same interface to saving to an external application as the SaveAs dialogue.
Definition: saver.h:61
tbx::Saver::set_save_to_file_handler
void set_save_to_file_handler(SaverSaveToFileHandler *handler)
Handler called to save to a file.
Definition: saver.h:176