| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263 |
- /////////////////////////////////////////////////////////////////////////////
- // Name: wx/ipcbase.h
- // Purpose: Base classes for IPC
- // Author: Julian Smart
- // Modified by:
- // Created: 4/1/98
- // Copyright: (c) Julian Smart
- // Licence: wxWindows licence
- /////////////////////////////////////////////////////////////////////////////
- #ifndef _WX_IPCBASEH__
- #define _WX_IPCBASEH__
- #include "wx/defs.h"
- #include "wx/object.h"
- #include "wx/string.h"
- enum wxIPCFormat
- {
- wxIPC_INVALID = 0,
- wxIPC_TEXT = 1, /* CF_TEXT */
- wxIPC_BITMAP = 2, /* CF_BITMAP */
- wxIPC_METAFILE = 3, /* CF_METAFILEPICT */
- wxIPC_SYLK = 4,
- wxIPC_DIF = 5,
- wxIPC_TIFF = 6,
- wxIPC_OEMTEXT = 7, /* CF_OEMTEXT */
- wxIPC_DIB = 8, /* CF_DIB */
- wxIPC_PALETTE = 9,
- wxIPC_PENDATA = 10,
- wxIPC_RIFF = 11,
- wxIPC_WAVE = 12,
- wxIPC_UTF16TEXT = 13, /* CF_UNICODE */
- wxIPC_ENHMETAFILE = 14,
- wxIPC_FILENAME = 15, /* CF_HDROP */
- wxIPC_LOCALE = 16,
- wxIPC_UTF8TEXT = 17,
- wxIPC_UTF32TEXT = 18,
- #if SIZEOF_WCHAR_T == 2
- wxIPC_UNICODETEXT = wxIPC_UTF16TEXT,
- #elif SIZEOF_WCHAR_T == 4
- wxIPC_UNICODETEXT = wxIPC_UTF32TEXT,
- #else
- # error "Unknown wchar_t size"
- #endif
- wxIPC_PRIVATE = 20
- };
- class WXDLLIMPEXP_FWD_BASE wxServerBase;
- class WXDLLIMPEXP_FWD_BASE wxClientBase;
- class WXDLLIMPEXP_BASE wxConnectionBase: public wxObject
- {
- public:
- wxConnectionBase(void *buffer, size_t size); // use external buffer
- wxConnectionBase(); // use internal, adaptive buffer
- wxConnectionBase(const wxConnectionBase& copy);
- virtual ~wxConnectionBase();
- void SetConnected( bool c ) { m_connected = c; }
- bool GetConnected() { return m_connected; }
- // Calls that CLIENT can make
- bool Execute(const void *data, size_t size, wxIPCFormat fmt = wxIPC_PRIVATE)
- { return DoExecute(data, size, fmt); }
- bool Execute(const char *s, size_t size = wxNO_LEN)
- { return DoExecute(s, size == wxNO_LEN ? strlen(s) + 1
- : size, wxIPC_TEXT); }
- bool Execute(const wchar_t *ws, size_t size = wxNO_LEN)
- { return DoExecute(ws, size == wxNO_LEN ? (wcslen(ws) + 1)*sizeof(wchar_t)
- : size, wxIPC_UNICODETEXT); }
- bool Execute(const wxString& s)
- {
- const wxScopedCharBuffer buf = s.utf8_str();
- return DoExecute(buf, strlen(buf) + 1, wxIPC_UTF8TEXT);
- }
- bool Execute(const wxCStrData& cs)
- { return Execute(cs.AsString()); }
- virtual const void *Request(const wxString& item,
- size_t *size = NULL,
- wxIPCFormat format = wxIPC_TEXT) = 0;
- bool Poke(const wxString& item, const void *data, size_t size,
- wxIPCFormat fmt = wxIPC_PRIVATE)
- { return DoPoke(item, data, size, fmt); }
- bool Poke(const wxString& item, const char *s, size_t size = wxNO_LEN)
- { return DoPoke(item, s, size == wxNO_LEN ? strlen(s) + 1
- : size, wxIPC_TEXT); }
- bool Poke(const wxString& item, const wchar_t *ws, size_t size = wxNO_LEN)
- { return DoPoke(item, ws,
- size == wxNO_LEN ? (wcslen(ws) + 1)*sizeof(wchar_t)
- : size, wxIPC_UNICODETEXT); }
- bool Poke(const wxString& item, const wxString s)
- {
- const wxScopedCharBuffer buf = s.utf8_str();
- return DoPoke(item, buf, strlen(buf) + 1, wxIPC_UTF8TEXT);
- }
- bool Poke(const wxString& item, const wxCStrData& cs)
- { return Poke(item, cs.AsString()); }
- virtual bool StartAdvise(const wxString& item) = 0;
- virtual bool StopAdvise(const wxString& item) = 0;
- // Calls that SERVER can make
- bool Advise(const wxString& item, const void *data, size_t size,
- wxIPCFormat fmt = wxIPC_PRIVATE)
- { return DoAdvise(item, data, size, fmt); }
- bool Advise(const wxString& item, const char *s, size_t size = wxNO_LEN)
- { return DoAdvise(item, s, size == wxNO_LEN ? strlen(s) + 1
- : size, wxIPC_TEXT); }
- bool Advise(const wxString& item, const wchar_t *ws, size_t size = wxNO_LEN)
- { return DoAdvise(item, ws,
- size == wxNO_LEN ? (wcslen(ws) + 1)*sizeof(wchar_t)
- : size, wxIPC_UNICODETEXT); }
- bool Advise(const wxString& item, const wxString s)
- {
- const wxScopedCharBuffer buf = s.utf8_str();
- return DoAdvise(item, buf, strlen(buf) + 1, wxIPC_UTF8TEXT);
- }
- bool Advise(const wxString& item, const wxCStrData& cs)
- { return Advise(item, cs.AsString()); }
- // Calls that both can make
- virtual bool Disconnect() = 0;
- // Callbacks to SERVER - override at will
- virtual bool OnExec(const wxString& WXUNUSED(topic),
- const wxString& WXUNUSED(data))
- {
- wxFAIL_MSG( "This method shouldn't be called, if it is, it probably "
- "means that you didn't update your old code overriding "
- "OnExecute() to use the new parameter types (\"const void *\" "
- "instead of \"wxChar *\" and \"size_t\" instead of \"int\"), "
- "you must do it or your code wouldn't be executed at all!" );
- return false;
- }
- // deprecated function kept for backwards compatibility: usually you will
- // want to override OnExec() above instead which receives its data in a more
- // convenient format
- virtual bool OnExecute(const wxString& topic,
- const void *data,
- size_t size,
- wxIPCFormat format)
- { return OnExec(topic, GetTextFromData(data, size, format)); }
- virtual const void *OnRequest(const wxString& WXUNUSED(topic),
- const wxString& WXUNUSED(item),
- size_t *size,
- wxIPCFormat WXUNUSED(format))
- { *size = 0; return NULL; }
- virtual bool OnPoke(const wxString& WXUNUSED(topic),
- const wxString& WXUNUSED(item),
- const void *WXUNUSED(data),
- size_t WXUNUSED(size),
- wxIPCFormat WXUNUSED(format))
- { return false; }
- virtual bool OnStartAdvise(const wxString& WXUNUSED(topic),
- const wxString& WXUNUSED(item))
- { return false; }
- virtual bool OnStopAdvise(const wxString& WXUNUSED(topic),
- const wxString& WXUNUSED(item))
- { return false; }
- // Callbacks to CLIENT - override at will
- virtual bool OnAdvise(const wxString& WXUNUSED(topic),
- const wxString& WXUNUSED(item),
- const void *WXUNUSED(data),
- size_t WXUNUSED(size),
- wxIPCFormat WXUNUSED(format))
- { return false; }
- // Callbacks to BOTH
- virtual bool OnDisconnect() { delete this; return true; }
- // return true if this is one of the formats used for textual data
- // transmission
- static bool IsTextFormat(wxIPCFormat format)
- {
- return format == wxIPC_TEXT ||
- format == wxIPC_UTF8TEXT ||
- format == wxIPC_UTF16TEXT ||
- format == wxIPC_UTF32TEXT;
- }
- // converts from the data and format into a wxString automatically
- //
- // this function accepts data in all of wxIPC_TEXT, wxIPC_UNICODETEXT, and
- // wxIPC_UTF8TEXT formats but asserts if the format is anything else (i.e.
- // such that IsTextFormat(format) doesn't return true)
- //
- // notice that the size parameter here contains the total size of the data,
- // including the terminating '\0' or L'\0'
- static
- wxString GetTextFromData(const void *data, size_t size, wxIPCFormat format);
- // return a buffer at least this size, reallocating buffer if needed
- // returns NULL if using an inadequate user buffer which can't be resized
- void *GetBufferAtLeast(size_t bytes);
- protected:
- virtual bool DoExecute(const void *data, size_t size, wxIPCFormat format) = 0;
- virtual bool DoPoke(const wxString& item, const void *data, size_t size,
- wxIPCFormat format) = 0;
- virtual bool DoAdvise(const wxString& item, const void *data, size_t size,
- wxIPCFormat format) = 0;
- private:
- char *m_buffer;
- size_t m_buffersize;
- bool m_deletebufferwhendone;
- protected:
- bool m_connected;
- wxDECLARE_NO_ASSIGN_CLASS(wxConnectionBase);
- DECLARE_CLASS(wxConnectionBase)
- };
- class WXDLLIMPEXP_BASE wxServerBase : public wxObject
- {
- public:
- wxServerBase() { }
- virtual ~wxServerBase() { }
- // Returns false on error (e.g. port number is already in use)
- virtual bool Create(const wxString& serverName) = 0;
- // Callbacks to SERVER - override at will
- virtual wxConnectionBase *OnAcceptConnection(const wxString& topic) = 0;
- DECLARE_CLASS(wxServerBase)
- };
- class WXDLLIMPEXP_BASE wxClientBase : public wxObject
- {
- public:
- wxClientBase() { }
- virtual ~wxClientBase() { }
- virtual bool ValidHost(const wxString& host) = 0;
- // Call this to make a connection. Returns NULL if cannot.
- virtual wxConnectionBase *MakeConnection(const wxString& host,
- const wxString& server,
- const wxString& topic) = 0;
- // Callbacks to CLIENT - override at will
- virtual wxConnectionBase *OnMakeConnection() = 0;
- DECLARE_CLASS(wxClientBase)
- };
- #endif // _WX_IPCBASEH__
|