1 /////////////////////////////////////////////////////////////////////////////
2 // Name:        wx/ipcbase.h
3 // Purpose:     Base classes for IPC
4 // Author:      Julian Smart
5 // Modified by:
6 // Created:     4/1/98
7 // Copyright:   (c) Julian Smart
8 // Licence:     wxWindows licence
9 /////////////////////////////////////////////////////////////////////////////
10 
11 #ifndef _WX_IPCBASEH__
12 #define _WX_IPCBASEH__
13 
14 #include "wx/defs.h"
15 #include "wx/object.h"
16 #include "wx/string.h"
17 
18 enum wxIPCFormat
19 {
20   wxIPC_INVALID =          0,
21   wxIPC_TEXT =             1,  /* CF_TEXT */
22   wxIPC_BITMAP =           2,  /* CF_BITMAP */
23   wxIPC_METAFILE =         3,  /* CF_METAFILEPICT */
24   wxIPC_SYLK =             4,
25   wxIPC_DIF =              5,
26   wxIPC_TIFF =             6,
27   wxIPC_OEMTEXT =          7,  /* CF_OEMTEXT */
28   wxIPC_DIB =              8,  /* CF_DIB */
29   wxIPC_PALETTE =          9,
30   wxIPC_PENDATA =          10,
31   wxIPC_RIFF =             11,
32   wxIPC_WAVE =             12,
33   wxIPC_UTF16TEXT =        13, /* CF_UNICODE */
34   wxIPC_ENHMETAFILE =      14,
35   wxIPC_FILENAME =         15, /* CF_HDROP */
36   wxIPC_LOCALE =           16,
37   wxIPC_UTF8TEXT =         17,
38   wxIPC_UTF32TEXT =        18,
39 #if SIZEOF_WCHAR_T == 2
40   wxIPC_UNICODETEXT = wxIPC_UTF16TEXT,
41 #elif SIZEOF_WCHAR_T == 4
42   wxIPC_UNICODETEXT = wxIPC_UTF32TEXT,
43 #else
44 #  error "Unknown wchar_t size"
45 #endif
46   wxIPC_PRIVATE =          20
47 };
48 
49 class WXDLLIMPEXP_FWD_BASE wxServerBase;
50 class WXDLLIMPEXP_FWD_BASE wxClientBase;
51 
52 class WXDLLIMPEXP_BASE wxConnectionBase: public wxObject
53 {
54 public:
55   wxConnectionBase(void *buffer, size_t size); // use external buffer
56   wxConnectionBase(); // use internal, adaptive buffer
57   wxConnectionBase(const wxConnectionBase& copy);
58   virtual ~wxConnectionBase();
59 
SetConnected(bool c)60   void SetConnected( bool c ) { m_connected = c; }
GetConnected()61   bool GetConnected() { return m_connected; }
62 
63   // Calls that CLIENT can make
64   bool Execute(const void *data, size_t size, wxIPCFormat fmt = wxIPC_PRIVATE)
65       { return DoExecute(data, size, fmt); }
66   bool Execute(const char *s, size_t size = wxNO_LEN)
67       { return DoExecute(s, size == wxNO_LEN ? strlen(s) + 1
68                                              : size, wxIPC_TEXT); }
69   bool Execute(const wchar_t *ws, size_t size = wxNO_LEN)
70       { return DoExecute(ws, size == wxNO_LEN ? (wcslen(ws) + 1)*sizeof(wchar_t)
71                                               : size, wxIPC_UNICODETEXT); }
Execute(const wxString & s)72   bool Execute(const wxString& s)
73   {
74       const wxScopedCharBuffer buf = s.utf8_str();
75       return DoExecute(buf, strlen(buf) + 1, wxIPC_UTF8TEXT);
76   }
Execute(const wxCStrData & cs)77   bool Execute(const wxCStrData& cs)
78       { return Execute(cs.AsString()); }
79 
80   virtual const void *Request(const wxString& item,
81                               size_t *size = NULL,
82                               wxIPCFormat format = wxIPC_TEXT) = 0;
83 
84   bool Poke(const wxString& item, const void *data, size_t size,
85             wxIPCFormat fmt = wxIPC_PRIVATE)
86       { return DoPoke(item, data, size, fmt); }
87   bool Poke(const wxString& item, const char *s, size_t size = wxNO_LEN)
88       { return DoPoke(item, s, size == wxNO_LEN ? strlen(s) + 1
89                                                 : size, wxIPC_TEXT); }
90   bool Poke(const wxString& item, const wchar_t *ws, size_t size = wxNO_LEN)
91       { return DoPoke(item, ws,
92                       size == wxNO_LEN ? (wcslen(ws) + 1)*sizeof(wchar_t)
93                                        : size, wxIPC_UNICODETEXT); }
Poke(const wxString & item,const wxString s)94   bool Poke(const wxString& item, const wxString s)
95   {
96       const wxScopedCharBuffer buf = s.utf8_str();
97       return DoPoke(item, buf,  strlen(buf) + 1, wxIPC_UTF8TEXT);
98   }
Poke(const wxString & item,const wxCStrData & cs)99   bool Poke(const wxString& item, const wxCStrData& cs)
100       { return Poke(item, cs.AsString()); }
101 
102   virtual bool StartAdvise(const wxString& item) = 0;
103   virtual bool StopAdvise(const wxString& item) = 0;
104 
105   // Calls that SERVER can make
106   bool Advise(const wxString& item, const void *data, size_t size,
107               wxIPCFormat fmt = wxIPC_PRIVATE)
108       { return DoAdvise(item, data, size, fmt); }
109   bool Advise(const wxString& item, const char *s, size_t size = wxNO_LEN)
110       { return DoAdvise(item, s, size == wxNO_LEN ? strlen(s) + 1
111                                                   : size, wxIPC_TEXT); }
112   bool Advise(const wxString& item, const wchar_t *ws, size_t size = wxNO_LEN)
113       { return DoAdvise(item, ws,
114                         size == wxNO_LEN ? (wcslen(ws) + 1)*sizeof(wchar_t)
115                                          : size, wxIPC_UNICODETEXT); }
Advise(const wxString & item,const wxString s)116   bool Advise(const wxString& item, const wxString s)
117   {
118       const wxScopedCharBuffer buf = s.utf8_str();
119       return DoAdvise(item, buf,  strlen(buf) + 1, wxIPC_UTF8TEXT);
120   }
Advise(const wxString & item,const wxCStrData & cs)121   bool Advise(const wxString& item, const wxCStrData& cs)
122       { return Advise(item, cs.AsString()); }
123 
124   // Calls that both can make
125   virtual bool Disconnect() = 0;
126 
127 
128   // Callbacks to SERVER - override at will
OnExec(const wxString & WXUNUSED (topic),const wxString & WXUNUSED (data))129   virtual bool OnExec(const wxString& WXUNUSED(topic),
130                       const wxString& WXUNUSED(data))
131   {
132       wxFAIL_MSG( "This method shouldn't be called, if it is, it probably "
133                   "means that you didn't update your old code overriding "
134                   "OnExecute() to use the new parameter types (\"const void *\" "
135                   "instead of \"wxChar *\" and \"size_t\" instead of \"int\"), "
136                   "you must do it or your code wouldn't be executed at all!" );
137       return false;
138   }
139 
140   // deprecated function kept for backwards compatibility: usually you will
141   // want to override OnExec() above instead which receives its data in a more
142   // convenient format
OnExecute(const wxString & topic,const void * data,size_t size,wxIPCFormat format)143   virtual bool OnExecute(const wxString& topic,
144                          const void *data,
145                          size_t size,
146                          wxIPCFormat format)
147       { return OnExec(topic, GetTextFromData(data, size, format)); }
148 
OnRequest(const wxString & WXUNUSED (topic),const wxString & WXUNUSED (item),size_t * size,wxIPCFormat WXUNUSED (format))149   virtual const void *OnRequest(const wxString& WXUNUSED(topic),
150                                 const wxString& WXUNUSED(item),
151                                 size_t *size,
152                                 wxIPCFormat WXUNUSED(format))
153       { *size = 0; return NULL; }
154 
OnPoke(const wxString & WXUNUSED (topic),const wxString & WXUNUSED (item),const void * WXUNUSED (data),size_t WXUNUSED (size),wxIPCFormat WXUNUSED (format))155   virtual bool OnPoke(const wxString& WXUNUSED(topic),
156                       const wxString& WXUNUSED(item),
157                       const void *WXUNUSED(data),
158                       size_t WXUNUSED(size),
159                       wxIPCFormat WXUNUSED(format))
160       { return false; }
161 
OnStartAdvise(const wxString & WXUNUSED (topic),const wxString & WXUNUSED (item))162   virtual bool OnStartAdvise(const wxString& WXUNUSED(topic),
163                              const wxString& WXUNUSED(item))
164       { return false; }
165 
OnStopAdvise(const wxString & WXUNUSED (topic),const wxString & WXUNUSED (item))166   virtual bool OnStopAdvise(const wxString& WXUNUSED(topic),
167                             const wxString& WXUNUSED(item))
168       { return false; }
169 
170   // Callbacks to CLIENT - override at will
OnAdvise(const wxString & WXUNUSED (topic),const wxString & WXUNUSED (item),const void * WXUNUSED (data),size_t WXUNUSED (size),wxIPCFormat WXUNUSED (format))171   virtual bool OnAdvise(const wxString& WXUNUSED(topic),
172                         const wxString& WXUNUSED(item),
173                         const void *WXUNUSED(data),
174                         size_t WXUNUSED(size),
175                         wxIPCFormat WXUNUSED(format))
176       { return false; }
177 
178   // Callbacks to BOTH
OnDisconnect()179   virtual bool OnDisconnect() { delete this; return true; }
180 
181 
182   // return true if this is one of the formats used for textual data
183   // transmission
IsTextFormat(wxIPCFormat format)184   static bool IsTextFormat(wxIPCFormat format)
185   {
186       return format == wxIPC_TEXT ||
187              format == wxIPC_UTF8TEXT ||
188              format == wxIPC_UTF16TEXT ||
189              format == wxIPC_UTF32TEXT;
190   }
191 
192   // converts from the data and format into a wxString automatically
193   //
194   // this function accepts data in all of wxIPC_TEXT, wxIPC_UNICODETEXT, and
195   // wxIPC_UTF8TEXT formats but asserts if the format is anything else (i.e.
196   // such that IsTextFormat(format) doesn't return true)
197   //
198   // notice that the size parameter here contains the total size of the data,
199   // including the terminating '\0' or L'\0'
200   static
201   wxString GetTextFromData(const void *data, size_t size, wxIPCFormat format);
202 
203 
204   // return a buffer at least this size, reallocating buffer if needed
205   // returns NULL if using an inadequate user buffer which can't be resized
206   void *GetBufferAtLeast(size_t bytes);
207 
208 protected:
209   virtual bool DoExecute(const void *data, size_t size, wxIPCFormat format) = 0;
210   virtual bool DoPoke(const wxString& item, const void *data, size_t size,
211                       wxIPCFormat format) = 0;
212   virtual bool DoAdvise(const wxString& item, const void *data, size_t size,
213                         wxIPCFormat format) = 0;
214 
215 
216 private:
217   char         *m_buffer;
218   size_t        m_buffersize;
219   bool          m_deletebufferwhendone;
220 
221 protected:
222   bool          m_connected;
223 
224   wxDECLARE_NO_ASSIGN_CLASS(wxConnectionBase);
225   DECLARE_CLASS(wxConnectionBase)
226 };
227 
228 
229 class WXDLLIMPEXP_BASE wxServerBase : public wxObject
230 {
231 public:
wxServerBase()232   wxServerBase() { }
~wxServerBase()233   virtual ~wxServerBase() { }
234 
235   // Returns false on error (e.g. port number is already in use)
236   virtual bool Create(const wxString& serverName) = 0;
237 
238   // Callbacks to SERVER - override at will
239   virtual wxConnectionBase *OnAcceptConnection(const wxString& topic) = 0;
240 
241   DECLARE_CLASS(wxServerBase)
242 };
243 
244 class WXDLLIMPEXP_BASE wxClientBase : public wxObject
245 {
246 public:
wxClientBase()247   wxClientBase() { }
~wxClientBase()248   virtual ~wxClientBase() { }
249 
250   virtual bool ValidHost(const wxString& host) = 0;
251 
252   // Call this to make a connection. Returns NULL if cannot.
253   virtual wxConnectionBase *MakeConnection(const wxString& host,
254                                            const wxString& server,
255                                            const wxString& topic) = 0;
256 
257   // Callbacks to CLIENT - override at will
258   virtual wxConnectionBase *OnMakeConnection() = 0;
259 
260   DECLARE_CLASS(wxClientBase)
261 };
262 
263 #endif // _WX_IPCBASEH__
264