Better looking toolbar styles (especially on Windows)
[qemu-gui.git] / socket.cpp
blobd203fb014695b31f3c9f6bdc97314225c6af236a
1 #include <wx/socket.h>
2 #include <wx/log.h>
3 #include "socket.h"
4 #include "events.h"
6 DEFINE_EVENT_TYPE(EVT_SOCKET_INPUT)
7 DEFINE_EVENT_TYPE(EVT_SOCKET_WRITE)
8 DEFINE_EVENT_TYPE(EVT_SOCKET_LOST)
10 BEGIN_EVENT_TABLE(MonitorSocket, wxEvtHandler)
11 EVT_SOCKET(wxID_ANY, MonitorSocket::OnSocketEvent)
12 END_EVENT_TABLE()
14 MonitorSocket::MonitorSocket() : wxEvtHandler(){
17 bool MonitorSocket::Connect(const wxString& host, const unsigned int port){
18 wxIPV4address address;
19 address.Hostname(host);
20 address.Service(port);
21 socket = new wxSocketClient();
22 socket->SetEventHandler(*this, wxID_ANY);
23 socket->SetFlags(wxSOCKET_NOWAIT);
24 socket->SetNotify(wxSOCKET_CONNECTION_FLAG |
25 wxSOCKET_INPUT_FLAG |
26 wxSOCKET_LOST_FLAG);
27 socket->Notify(true);
28 bool state = socket->Connect(address,true /* wait and block */);
29 if(!state)
30 socket->Close();
31 return state;
34 void MonitorSocket::Disconnect(){
35 socket->Destroy();
38 void MonitorSocket::OnSocketEvent(wxSocketEvent& event){
39 switch(event.GetSocketEvent()){
40 case wxSOCKET_INPUT: {
41 wxString buffer;
43 while(socket->IsData()){
44 buffer.Append(Read());
47 if(buffer.IsEmpty())
48 return;
50 data.Append(buffer);
51 wxCommandEvent event(EVT_SOCKET_INPUT,wxID_ANY);
52 event.SetEventObject(this);
53 event.SetString(buffer);
54 SendEvent(event);
55 break;
57 case wxSOCKET_LOST:
58 break;
59 case wxSOCKET_CONNECTION:
60 break;
64 void MonitorSocket::Write(const wxString& cmd, bool block){
65 if(block)
66 data.Clear();
67 printf("Write()\n");
68 //wxString tmp = cmd + wxT("\r\n");
69 wxString tmp = cmd + wxT("\n");
70 socket->Write(tmp.fn_str(),tmp.Len());
72 wxCommandEvent event(EVT_SOCKET_WRITE,wxID_ANY);
73 event.SetEventObject(this);
74 event.SetString(cmd);
75 SendEvent(event);
78 wxString MonitorSocket::Read(){
79 char buf[1024];
80 socket->Read(buf, 1024);
81 buf[socket->LastCount()] = '\0';
83 wxString buffer(buf, wxConvUTF8);
84 int found = 0;
85 do {
86 found = buffer.Find(wxT("[K"));
87 if(found > 0)
88 buffer.Remove(0,found + 2);
89 } while (found > 0);
90 //buffer.Replace(wxT("\r\n"),wxT(""));
91 buffer.Trim().Trim(false);
92 return buffer;
95 wxString MonitorSocket::ReadAll(){
96 int found;
97 do {
98 socket->WaitForRead(0,250);
99 } while((found = data.Find(wxT("(qemu)"))) < 0);
101 wxString tmp = data.Left(found);
102 // skip "(qemu)"
103 data.Remove(0,found + 6);
104 return tmp.Trim();
108 void MonitorSocket::AddEventHandler(wxEvtHandler *handler){
109 evtHandlers.Add(handler);
112 void MonitorSocket::SendEvent(wxCommandEvent& event){
113 for(int i = 0; i < evtHandlers.GetCount(); i++){
114 evtHandlers.Item(i)->ProcessEvent(event);