#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
|