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

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

ちょっとしたHttpクライアント

昨日作ったクラスの雛形をもとにHTTPクライアントをクラス化(?)してみる。再利用できるといいんだけどなあ。
困ったことにvectorコンテナを返り値として返す方法が思いつかない(だからなぜかpublicのメンバ変数になっている)。調べればやり方はあるだろうのでまた更新する。
07/11追記:別にvectorコンテナを使う必要無かった。stringに詰め込めばいいのだ。といった感じでコードを書き直す。

/*
 * ReadHtml.cpp
 *
 *  Created on: 2011/07/06
 *      Author: Nantonaku-Shiawase
 */

#include "ReadHtml.h"
#include <iostream>
#include <stdio.h>
#include <windows.h>
#include <WinInet.h>

using namespace std;

// メンバ変数に値を設定するSet関数
void ReadHtml::SetUrl(string inputUrlStr)
{
	this->m_inputUrlStr = inputUrlStr;
}

// メンバ変数を返却するGet関数
string ReadHtml::GetUrl()
{
	return this->m_inputUrlStr;
}

//HTTPClientを起動するメソッド
int ReadHtml::StartHTTPClient()
{
	HINTERNET hInet, hUrl;
	char szBuf[128];
	DWORD dwRead , dwTotal = 0 ;

	//インターネット(WinInet)開始
	hInet = InternetOpen("readhtml",
		INTERNET_OPEN_TYPE_PRECONFIG,
		NULL,NULL,0);
	if (hInet == NULL) {
		perror("オープンエラー\n");
		return -2;
	}
	//HTTPセッションの開始、指定のURLオープン
	hUrl = InternetOpenUrl(hInet ,(LPCTSTR)this->m_inputUrlStr.c_str(),NULL,0,0,0);
	if (hUrl == NULL) {
		perror("URLオープンエラー\n");
		InternetCloseHandle(hInet);
		return -3;
	}

	//読み出すものがなくなるまで読み出す
	while(1){
	InternetReadFile(
		hUrl,szBuf,(DWORD)sizeof(szBuf) - 1 , &dwRead);
	szBuf[dwRead] = '\0';

	//読み出すものがなくなったのでループ脱出
	if (dwRead == 0)
		break;

	//必要バイト数の計算
	dwTotal += dwRead;

	//一時保存用文字列
	string tempBuf = szBuf;
	this->m_lpszSrc += tempBuf;
	}

	return 0;
}

string ReadHtml::GetHTTPString()
{
	return this->m_lpszSrc;
}


// コンストラクタの定義
ReadHtml::ReadHtml(){
}

// デストラクタの定義
ReadHtml::~ReadHtml(){
}
/*
 * ReadHtml.h
 *
 *  Created on: 2011/07/06
 *      Author: Nantonaku-Shiawase
 */

#ifndef READHTML_H_
#define READHTML_H_

#include <iostream>
#include <vector>
#include <string>

using namespace std;

class ReadHtml
{
public:
	//コンストラクタ
	ReadHtml();
	//デストラクタ
	~ReadHtml();
	//URLを設定するメソッド
	void SetUrl(string inputUrlStr);
	//クラス内部のURLに外からアクセスするメソッド
	string GetUrl();
	//HTTPClientを起動するメソッド
	int StartHTTPClient();
	//HTTP文を保持したコンテナに外からアクセスするメソッド
	string GetHTTPString();

private:
	//取得したHTML文を保持するメンバ変数
	string m_lpszSrc;
	//URLを保持するメンバ変数
	string m_inputUrlStr;
};

#endif /* READHTML_H_ */
/*
 * main.cpp
 *
 *  Created on: 2011/07/06
 *      Author: Nantonaku-Shiawase
 */

// main.cpp
#include "ReadHtml.h"
#include <iostream>

void func(char *inputArgv);

int main(int argc, char *argv[])
{
	if( argc != 2 )
		{
			cout << "コマンドライン引数の数が不正です" << endl;
			return 1;
		}

	func(argv[1]);
	return 0;
}

void func(char *inputArgv)
{
	ReadHtml rh;     // コンストラクタ

	string inputUrlStr = inputArgv;

    // Set関数…ReadHtmlクラス内のメンバ変数に値を設定
	rh.SetUrl( inputUrlStr );

	// HTTPクライアントを起動
	rh.StartHTTPClient();

    // Get関数…ReadHtmlクラス内のメンバ変数から値を取得
	cout << rh.GetHTTPString() << endl;

} // ここでデストラクタが呼び出されるらしい
# Makefile
CC = gcc
TARGET = ReadHtml
OBJECTS = main.o ReadHtml.o
LIBS = -lwininet
#
all : $(TARGET)
$(TARGET) : $(OBJECTS)
	$(CXX) $(OBJECTS) -o $(TARGET) $(LIBS)

ReadHtml.o : ReadHtml.h
	g++ -c ReadHtml.cpp $(LIBS)

main.o : ReadHtml.h
	g++ -c main.cpp $(LIBS)

.PHONY: clean
clean:
	rm -f *.o