aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsirius-m <sirius-m@1a98c847-1fd6-4fd8-948a-caf3550aa51b>2010-02-04 15:31:46 +0000
committersirius-m <sirius-m@1a98c847-1fd6-4fd8-948a-caf3550aa51b>2010-02-04 15:31:46 +0000
commita43c00c56944ca69dcf319cd85754dc0fb1f2260 (patch)
tree17f221a28133394f5a0cd0931ceadf0eaa463cb4
parent2939cab06d65548abdaeb1ff218550eb47b93362 (diff)
Added some basic IPC functionality using wxServer, wxClient and wxConnection.
Added the -blockamount command line option for an example of usage.
-rw-r--r--headers.h3
-rw-r--r--ipc.cpp33
-rw-r--r--ipc.h28
-rw-r--r--makefile4
-rw-r--r--makefile.unix.wx2.85
-rw-r--r--makefile.unix.wx2.97
-rw-r--r--ui.cpp29
7 files changed, 101 insertions, 8 deletions
diff --git a/headers.h b/headers.h
index 45be4b65d1..fb5e3eccc3 100644
--- a/headers.h
+++ b/headers.h
@@ -24,6 +24,8 @@
#include <wx/taskbar.h>
#include <wx/stdpaths.h>
#include <wx/utils.h>
+#include <wx/ipc.h>
+#include <wx/ipcbase.h>
#include <openssl/ecdsa.h>
#include <openssl/evp.h>
#include <openssl/rand.h>
@@ -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 0000000000..86e57674e2
--- /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 0000000000..777d31b2b7
--- /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 0dd622106e..efdfc7aeeb 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 b9826d6ccb..899ce29543 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 81dcbd70e9..d2c4eb5ea1 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 5d93ad227f..1f22170302 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<string, string> 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