Use new vnc syntax (with a colon).
[qemu-gui.git] / socket.cpp
blobae34e132d3200473fc7953e69292e0553b6021d7
1 #include <wx/socket.h>
2 #include <wx/log.h>
3 #include "socket.h"
4 #include "events.h"
6 #if defined(__WXMSW__)
7 #define EOL wxT("\r\n \r\n")
8 #else
9 #define EOL wxT("\n")
10 #endif
12 DEFINE_EVENT_TYPE(EVT_SOCKET_INPUT)
13 DEFINE_EVENT_TYPE(EVT_SOCKET_WRITE)
14 DEFINE_EVENT_TYPE(EVT_SOCKET_LOST)
16 BEGIN_EVENT_TABLE(MonitorSocket, wxEvtHandler)
17 EVT_SOCKET(wxID_ANY, MonitorSocket::OnSocketEvent)
18 END_EVENT_TABLE()
20 MonitorSocket::MonitorSocket() : wxEvtHandler(){
23 bool MonitorSocket::Connect(const wxString& host, const unsigned int port){
24 wxIPV4address address;
25 address.Hostname(host);
26 address.Service(port);
27 socket = new wxSocketClient();
28 socket->SetEventHandler(*this, wxID_ANY);
29 socket->SetFlags(wxSOCKET_NOWAIT);
30 socket->SetNotify(wxSOCKET_CONNECTION_FLAG |
31 wxSOCKET_INPUT_FLAG |
32 wxSOCKET_LOST_FLAG);
33 socket->Notify(true);
34 bool state = socket->Connect(address,true /* wait and block */);
35 if(!state)
36 socket->Close();
37 return state;
40 void MonitorSocket::Disconnect(){
41 socket->Destroy();
44 void MonitorSocket::OnSocketEvent(wxSocketEvent& event){
45 switch(event.GetSocketEvent()){
46 case wxSOCKET_INPUT: {
47 wxString buffer;
49 while(socket->IsData()){
50 buffer.Append(Read());
53 if(buffer.IsEmpty())
54 return;
56 data.Append(buffer);
57 wxCommandEvent event(EVT_SOCKET_INPUT,wxID_ANY);
58 event.SetEventObject(this);
59 event.SetString(buffer);
60 SendEvent(event);
61 break;
63 case wxSOCKET_LOST:
64 break;
65 case wxSOCKET_CONNECTION:
66 break;
70 void MonitorSocket::Write(const wxString& cmd, bool block){
71 if(block)
72 data.Clear();
74 wxString tmp = cmd + EOL;
75 socket->Write(tmp.fn_str(),tmp.Len());
77 wxCommandEvent event(EVT_SOCKET_WRITE,wxID_ANY);
78 event.SetEventObject(this);
79 event.SetString(cmd);
80 SendEvent(event);
83 wxString MonitorSocket::Read(){
84 char buf[1024];
85 socket->Read(buf, 1024);
86 buf[socket->LastCount()] = '\0';
88 wxString buffer(buf, wxConvUTF8);
89 int found = 0;
90 do {
91 found = buffer.Find(wxT("[K"));
92 if(found > 0)
93 buffer.Remove(0,found + 2);
94 } while (found > 0);
95 //buffer.Replace(wxT("\r\n"),wxT(""));
96 buffer.Trim().Trim(false);
97 return buffer;
100 wxString MonitorSocket::ReadAll(){
101 int found;
102 do {
103 socket->WaitForRead(0,250);
104 } while((found = data.Find(wxT("(qemu)"))) < 0);
106 wxString tmp = data.Left(found);
107 // skip "(qemu)"
108 data.Remove(0,found + 6);
109 return tmp.Trim();
113 void MonitorSocket::AddEventHandler(wxEvtHandler *handler){
114 evtHandlers.Add(handler);
117 void MonitorSocket::SendEvent(wxCommandEvent& event){
118 for(int i = 0; i < evtHandlers.GetCount(); i++){
119 evtHandlers.Item(i)->ProcessEvent(event);