なんとな~くしあわせ?の日記

「そしてそれゆえ、知識そのものが力である」 (Nam et ipsa scientia potestas est.) 〜 フランシス・ベーコン

wxWidgetsを使ったGUI版HTTPクライアント

ようやくGUI版HTTPクライアントが完成した。本当はこの前使ったReadHtmlを組み込んで使うつもりだったんだけど、wxWidgetsにWinInetを組み入れるとエラーが出てどうにもならんかった(※まあマルチプラットフォームとは言えどもUNIX中心に開発された言語だからかも)。で、実際そんなことをする必要はなくて、もともとwxURLとかいうクラスがあるんで割と簡単にHTTPを使った通信ができるようだ。そこはかとなくJavaに近いような…。それにしてもクソみたいに読みにくいコード&エラー処理がない…なのでまたコメントなどを書き足したい。

/*
 * Main.cpp
 *
 *  Created on: 2011/06/26
 *      Author: Nantonaku-Shiawase
 */

#include "Main.h"
#include "WxBrowserFrame.h"

IMPLEMENT_APP(MyApp)

bool MyApp::OnInit()
{
	WxBrowserFrame *wxbrowserframe = new WxBrowserFrame(wxT("WxBrowserFrame"));
	wxbrowserframe->Show(true);

 return true;
}
/*
 * Main.h
 *
 *  Created on: 2011/06/26
 *      Author: Nantonaku-Shiawase
 */

#ifndef MAIN_H_
#define MAIN_H_

#include <wx/wx.h>

class MyApp : public wxApp
{
  public:
    virtual bool OnInit();
};


#endif /* MAIN_H_ */
/*
 * WxBrowserFrame.cpp
 *
 *  Created on: 2011/06/26
 *      Author: Nantonaku-Shiawase
 */

#include "iostream"
#include "WxBrowserFrame.h"

using namespace std;

WxBrowserFrame::WxBrowserFrame(const wxString& title) :
	wxFrame(NULL, -1, title, wxPoint(-1, -1), wxSize(640, 480)) {

	wxPanel *panel = new wxPanel(this, -1);

	wxBoxSizer *vbox = new wxBoxSizer(wxVERTICAL);

	//hbox1 説明ラベルとURL入力欄
	wxBoxSizer *hbox1 = new wxBoxSizer(wxHORIZONTAL);
	wxStaticText *st1 =
			new wxStaticText(panel, wxID_ANY, wxT("Input URL Here"));

	hbox1->Add(st1, 0, wxRIGHT, 8);

	//外部からアクセスできるようにprotectedで宣言
	m_tc = new wxTextCtrl(panel, wxID_ANY);
	hbox1->Add(m_tc, 1);
	vbox->Add(hbox1, 0, wxEXPAND | wxLEFT | wxRIGHT | wxTOP, 10);

	vbox->Add(-1, 10);

	//hbox2 ラベル部分
	wxBoxSizer *hbox2 = new wxBoxSizer(wxHORIZONTAL);
	wxStaticText *st2 = new wxStaticText(panel, wxID_ANY, wxT("HTML Sources"));

	hbox2->Add(st2, 0);
	vbox->Add(hbox2, 0, wxLEFT | wxTOP, 10);

	vbox->Add(-1, 10);

	//hbox3 HTML文表示部分
	wxBoxSizer *hbox3 = new wxBoxSizer(wxHORIZONTAL);
	//外部からアクセスできるようにprotectedで宣言
	m_tc2 = new wxTextCtrl(panel, wxID_ANY, wxT(""), wxPoint(-1, -1),
			wxSize(-1, -1), wxTE_MULTILINE);

	hbox3->Add(m_tc2, 1, wxEXPAND);
	vbox->Add(hbox3, 1, wxLEFT | wxRIGHT | wxEXPAND, 10);

	vbox->Add(-1, 25);

	//hbox 5 ボタン配置部分
	wxBoxSizer *hbox5 = new wxBoxSizer(wxHORIZONTAL);
	//ボタン1はOK HTTPクライアントを起動させる
	wxButton *btn1 = new wxButton(panel, wxID_GETHTTP, wxT("Ok"));
	hbox5->Add(btn1, 0);
	//ボタン2はクローズ アプリケーションを終了させる
	wxButton *btn2 = new wxButton(panel, wxID_EXIT, wxT("Close"));
	hbox5->Add(btn2, 0, wxLEFT | wxBOTTOM, 5);
	vbox->Add(hbox5, 0, wxALIGN_RIGHT | wxRIGHT, 10);

	panel->SetSizer(vbox);

	Centre();
}

void WxBrowserFrame::OnButtonQuit(wxCommandEvent& WXUNUSED(event)) {
	Close(true);
}

void WxBrowserFrame::OnButtonGetHttp(wxCommandEvent& WXUNUSED(event)) {
	wxString inputURL = m_tc->GetValue();
	wxURL url(inputURL);
	wxInputStream* readHtml = url.GetInputStream();

	wxTextInputStream in(*readHtml);
	wxString HTTPtext;
	while (readHtml->CanRead()) {
		HTTPtext += in.ReadLine();
	}
	delete readHtml;

	m_tc2->SetValue(HTTPtext);
}

BEGIN_EVENT_TABLE(WxBrowserFrame, wxFrame)
//ボタン1はOK HTTPクライアントを起動させる
EVT_BUTTON(wxID_EXIT, WxBrowserFrame::OnButtonQuit)
//ボタン2はクローズ アプリケーションを終了させる
EVT_BUTTON(wxID_GETHTTP, WxBrowserFrame::OnButtonGetHttp)
END_EVENT_TABLE()
/*
 * WxBrowserFrame.h
 *
 *  Created on: 2011/06/26
 *      Author: Nantonaku-Shiawase
 */

#ifndef WXBROWSERFRAME_H_
#define WXBROWSERFRAME_H_

#include <wx/wx.h>
#include <wx/url.h>
#include <wx/stream.h>
#include <wx/txtstrm.h>

// control ids
enum
{
	wxID_GETHTTP
};

class WxBrowserFrame : public wxFrame
{
public:
	WxBrowserFrame(const wxString& title);

	void OnButtonQuit(wxCommandEvent& event);

	void OnButtonGetHttp(wxCommandEvent& event);

protected:
	//URL入力用文字列
	wxTextCtrl *m_tc;

	//HTTP文出力用文字列
	wxTextCtrl *m_tc2;

private:
    DECLARE_EVENT_TABLE()
};


#endif /* WXBROWSERFRAME_H_ */
# Makefile
CC = gcc
CXX = $(shell wx-config --cxx)
TARGET = WxBrowser
OBJECTS = Main.o WxBrowserFrame.o
#
all : $(TARGET)
$(TARGET) : $(OBJECTS)
		$(CXX) $(OBJECTS) -o $(TARGET) `wx-config --cxxflags --libs`
WxBrowserFrame.o : WxBrowserFrame.h
		$(CXX) -c WxBrowserFrame.cpp `wx-config --cxxflags --libs` 
Main.o : Main.h WxBrowserFrame.h
		$(CXX) -c Main.cpp `wx-config --cxxflags --libs`
.PHONY: clean
clean:
	rm -f *.o