From a43c00c56944ca69dcf319cd85754dc0fb1f2260 Mon Sep 17 00:00:00 2001 From: sirius-m Date: Thu, 4 Feb 2010 15:31:46 +0000 Subject: [PATCH] Added some basic IPC functionality using wxServer, wxClient and wxConnection. Added the -blockamount command line option for an example of usage. --- headers.h | 3 +++ ipc.cpp | 33 +++++++++++++++++++++++++++++++++ ipc.h | 28 ++++++++++++++++++++++++++++ makefile | 4 +++- makefile.unix.wx2.8 | 5 +++-- makefile.unix.wx2.9 | 7 ++++--- ui.cpp | 29 +++++++++++++++++++++++++++-- 7 files changed, 101 insertions(+), 8 deletions(-) create mode 100644 ipc.cpp create mode 100644 ipc.h diff --git a/headers.h b/headers.h index 45be4b65..fb5e3ecc 100644 --- a/headers.h +++ b/headers.h @@ -24,6 +24,8 @@ #include #include #include +#include +#include #include #include #include @@ -102,6 +104,7 @@ using namespace boost; #include "market.h" #include "uibase.h" #include "ui.h" +#include "ipc.h" #include "xpm/addressbook16.xpm" #include "xpm/addressbook20.xpm" diff --git a/ipc.cpp b/ipc.cpp new file mode 100644 index 00000000..86e57674 --- /dev/null +++ b/ipc.cpp @@ -0,0 +1,33 @@ +/* + * Inter-process calling functionality + */ + +#include "headers.h" + +wxConnectionBase * CServer::OnAcceptConnection (const wxString &topic) { + return new CServerConnection; +} + +wxConnectionBase * CClient::OnMakeConnection () { + return new CClientConnection; +} + +// For request based handling +const void * CServerConnection::OnRequest (const wxString &topic, const wxString &item, size_t *size, wxIPCFormat format) { + const char * output; + + if (item == "blockamount") { + stringstream stream; + stream << nBestHeight + 1; + output = stream.str().c_str(); + } + else + output = "Unknown identifier"; + + return output; +} + +// For event based handling +bool CClientConnection::OnAdvise (const wxString &topic, const wxString &item, const void *data, size_t size, wxIPCFormat format) { + return false; +} \ No newline at end of file diff --git a/ipc.h b/ipc.h new file mode 100644 index 00000000..777d31b2 --- /dev/null +++ b/ipc.h @@ -0,0 +1,28 @@ +#ifndef _IPC_H +#define _IPC_H + +class CServer : public wxServer { +public: + wxConnectionBase * OnAcceptConnection (const wxString &topic); +}; + +class CClient : public wxClient { +public: + wxConnectionBase * OnMakeConnection (); +}; + +class CServerConnection : public wxConnection { +public: + const void * OnRequest (const wxString &topic, const wxString &item, size_t *size, wxIPCFormat format); +}; + +class CClientConnection : public wxConnection { +public: + CClientConnection() : wxConnection() {} + ~CClientConnection() {} + + bool OnAdvise (const wxString &topic, const wxString &item, const void *data, size_t size, wxIPCFormat format); +}; + +#endif /* _IPC_H */ + diff --git a/makefile b/makefile index 0dd62210..efdfc7ae 100644 --- a/makefile +++ b/makefile @@ -67,10 +67,12 @@ obj/irc.o: irc.cpp $(HEADERS) obj/ui_res.o: ui.rc rc/bitcoin.ico rc/check.ico rc/send16.bmp rc/send16mask.bmp rc/send16masknoshadow.bmp rc/send20.bmp rc/send20mask.bmp rc/addressbook16.bmp rc/addressbook16mask.bmp rc/addressbook20.bmp rc/addressbook20mask.bmp windres $(WXDEFS) $(INCLUDEPATHS) -o $@ -i $< +obj/ipc.o: ipc.cpp $(HEADERS) + g++ -c $(CFLAGS) -o $@ $< OBJS=obj/util.o obj/script.o obj/db.o obj/net.o obj/main.o obj/market.o \ - obj/ui.o obj/uibase.o obj/sha.o obj/irc.o obj/ui_res.o + obj/ui.o obj/uibase.o obj/sha.o obj/irc.o obj/ui_res.o obj/ipc.o bitcoin.exe: headers.h.gch $(OBJS) -kill /f bitcoin.exe diff --git a/makefile.unix.wx2.8 b/makefile.unix.wx2.8 index b9826d6c..899ce295 100644 --- a/makefile.unix.wx2.8 +++ b/makefile.unix.wx2.8 @@ -75,11 +75,12 @@ obj/sha.o: sha.cpp sha.h obj/irc.o: irc.cpp $(HEADERS) g++ -c $(CFLAGS) -o $@ $< - +obj/ipc.o: ipc.cpp $(HEADERS) + g++ -c $(CFLAGS) -o $@ $< OBJS=obj/util.o obj/script.o obj/db.o obj/net.o obj/main.o obj/market.o \ - obj/ui.o obj/uibase.o obj/sha.o obj/irc.o + obj/ui.o obj/uibase.o obj/sha.o obj/irc.o obj/ipc.o bitcoin: headers.h.gch $(OBJS) g++ $(CFLAGS) -o $@ $(LIBPATHS) $(OBJS) $(LIBS) diff --git a/makefile.unix.wx2.9 b/makefile.unix.wx2.9 index 81dcbd70..d2c4eb5e 100644 --- a/makefile.unix.wx2.9 +++ b/makefile.unix.wx2.9 @@ -31,7 +31,7 @@ LIBS= \ -l wx_gtk2u$(D)-2.9 \ -Wl,-Bdynamic \ -l crypto \ - -l gtk-x11-2.0 -l gthread-2.0 -l SM + -l gtk-x11-2.0 -l gthread-2.0 -l SM \ WXDEFS=-D__WXGTK__ -DNOPCH CFLAGS=-O0 -Wno-invalid-offsetof -Wformat $(DEBUGFLAGS) $(WXDEFS) $(INCLUDEPATHS) @@ -75,11 +75,12 @@ obj/sha.o: sha.cpp sha.h obj/irc.o: irc.cpp $(HEADERS) g++ -c $(CFLAGS) -o $@ $< - +obj/ipc.o: ipc.cpp $(HEADERS) + g++ -c $(CFLAGS) -o $@ $< OBJS=obj/util.o obj/script.o obj/db.o obj/net.o obj/main.o obj/market.o \ - obj/ui.o obj/uibase.o obj/sha.o obj/irc.o + obj/ui.o obj/uibase.o obj/sha.o obj/irc.o obj/ipc.o bitcoin: headers.h.gch $(OBJS) g++ $(CFLAGS) -o $@ $(LIBPATHS) $(OBJS) $(LIBS) diff --git a/ui.cpp b/ui.cpp index 5d93ad22..1f221703 100644 --- a/ui.cpp +++ b/ui.cpp @@ -21,6 +21,7 @@ DEFINE_EVENT_TYPE(wxEVT_REPLY3) CMainFrame* pframeMain = NULL; CMyTaskBarIcon* ptaskbaricon = NULL; +CServer* pserver = NULL; map mapAddressBook; bool fRandSendTest = false; void RandSend(); @@ -384,6 +385,8 @@ CMainFrame::~CMainFrame() pframeMain = NULL; delete ptaskbaricon; ptaskbaricon = NULL; + delete pserver; + pserver = NULL; } void ExitTimeout(void* parg) @@ -1687,8 +1690,8 @@ CAboutDialog::CAboutDialog(wxWindow* parent) : CAboutDialogBase(parent) #if !wxUSE_UNICODE // Workaround until upgrade to wxWidgets supporting UTF-8 wxString str = m_staticTextMain->GetLabel(); - if (str.Find('Â') != wxNOT_FOUND) - str.Remove(str.Find('Â'), 1); + if (str.Find('�') != wxNOT_FOUND) + str.Remove(str.Find('�'), 1); m_staticTextMain->SetLabel(str); #endif #ifndef __WXMSW__ @@ -3548,6 +3551,26 @@ bool CMyApp::OnInit2() return false; } + if (mapArgs.count("-blockamount")) { + CClient client; + wxString hostname = "localhost"; + wxString server = GetDataDir() + "service"; + CClientConnection * pconnection = (CClientConnection *)client.MakeConnection(hostname, server, "ipc test"); + string output = ""; + if (pconnection) { + char * pbuffer = (char *)pconnection->Request("blockamount"); + while (*pbuffer != '\n') { + output += *pbuffer; + pbuffer++; + } + } + else { + output = "Cannot access Bitcoin. Are you sure the program is running?\n"; + } + fprintf(stderr, "%s", output.c_str()); + return false; + } + if (mapArgs.count("-datadir")) strlcpy(pszSetDataDir, mapArgs["-datadir"].c_str(), sizeof(pszSetDataDir)); @@ -3755,6 +3778,8 @@ bool CMyApp::OnInit2() if (fFirstRun) SetStartOnSystemStartup(true); + pserver = new CServer; + pserver->Create(GetDataDir() + "service"); // // Tests