ipcbase.h 9.4 KB

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