プログラミング工房 > HSP > サンプルアプリケーション > downloader > 

main.hsp

#packopt name    "downloader"
#packopt runtime "hsp3c.hrt"
#packopt hide    1

#include "hspinet.as"
#include "h_mydef.hsp"		// よく使う定数など
#include "gm_beep.hsp"		// 標準の警告音を鳴らす
#include "m_cmdline_parser.hsp"	// コマンドライン文字列処理

#const WIN_WID	160		// ウィンドウ横幅
#const WIN_HEI	40		// ウィンドウ縦幅
#const OBJ_HEI	20		// メッセージ表示領域とボタンの縦幅

/* URLを取得してディレクトリパスとファイル名に切り分け */
url	= getarg(0, TRUE)			// 1つめのコマンドライン引数
url_dir	= getpath(url, GETPATH_DIR)		// ファイル名手前まで
url_name	= getpath(url, GETPATH_REMDIR)	// ファイル名

/* ファイルを保存する場所を取得 */
save_dir	= getarg(1, TRUE)			// 2つめのコマンドライン引数
if save_dir="" {				// 指定されていなければ
	save_dir = MYDIR			// 起動ディレクトリに
}

/* ウィンドウ作成・表示 */
screen	0, WIN_WID, WIN_HEI, screen_palette, 0, 0
font	"", 12
title	url_name + " - " + NAME_APP
pos	0, OBJ_HEI * 1
objsize	WIN_WID, OBJ_HEI
button	"中止", *Cancel
gsel	0, 1
wait	1

/* Wininet.dllの初期化 */
netinit
if stat {						// 失敗
	msg	=  "Wininet.dllの初期化" + ERR_MES_2
	msg	+= NAME_APP + ERR_MES_1
	dialog	msg, DLG_TYPE_ALERT, DLG_TITLE_3
	goto *Quit
}

/* ファイルがある場所を指定 */
neturl	url_dir

/* ファイルを保存するパスを指定 */
save_path		= save_dir + "\\" + url_name	// この変数は後でまた使う
netdlname		save_path

/* 進行状況の計算に使うためにファイルサイズを取得 */
netfileinfo	header, url_name			// HTTPヘッダが得られる
if stat {						// 失敗
	msg	=  "ファイル情報の取得" + ERR_MES_2
	msg	+= NAME_APP + ERR_MES_1
	dialog	msg, DLG_TYPE_ALERT, DLG_TITLE_3
	goto *Quit
}
notesel	header
repeat	notemax
	noteget	linestr, cnt					// 1行ずつ処理
	linestr	= getpath(linestr, GETPATH_LOWCASE)			// すべて小文字に
	if instr(linestr, 0, "content-length: ")=0 {			// Content-Lengthヘッダを探して
		getstr file_size, linestr, strlen("content-length: ")	// フィールド文字列を取得
	}
loop
file_size = int(file_size)		// 整数に

/* ダウンロード実行 */
size_sum		= 0		// 保存済みファイルサイズ
netrequest	url_name		// ファイル名を指定してダウンロード開始
*eloop
	await	50
	netexec	status		// 最小単位のダウンロード処理を実行
	if status>0 {				// 受信終了
		goto *Quit
	}
	if status<0 {				// エラー発生
		msg	=  "受信処理" + ERR_MES_2
		msg	+= "ダウンロードを中止し" + NAME_APP + ERR_MES_1
		dialog	msg, DLG_TYPE_ALERT, DLG_TITLE_3
		goto	*Cancel
	}
	if status=0 {				// 受信中
		/*
		  経過取得(HSP 3.1b7ではnetsize命令が動作しないので、
		  仕方なくダウンロード済みデータのサイズから進行状況を計算)
		*/
		exist	save_path
		if strsize>0 {
			size_sum	= strsize
		}
		percent     = (0.0 + size_sum) / file_size * 100		// 少数点以下も利用するため実数で
		str_percent = strf("%0.1f", percent) + "%"			// 少数点以下1桁の%表示用文字列
		str_mb      = strf("%0.1f", (0.0+size_sum)/1024/1024) + "MB"	// 少数点以下1桁のMB表示用文字列

		/* 経過表示 */
		color	255, 255, 255
		boxf	0, 0, WIN_WID, OBJ_HEI			// メッセージ表示領域を白く塗りつぶし
		pos	10, 4
		color	0, 0, 0
		mes	"受信中 / " + str_percent + " / " + str_mb	// 黒字で進行状況を表示
		title	url_name + " [" + str_percent + "] - " + NAME_APP
	}
	goto *eloop	// ダウンロードが終わるか中止されるまで繰り返し

*Cancel
	netterm
	msg	=  "ダウンロードを中止しました。\n"
	msg	+= "\"" + save_path + "\"は手作業で削除する必要があります。"
	dialog	msg, DLG_TYPE_STD, DLG_TITLE_2
	end
*Quit
	bell		// 完了の合図
	end