#deinfe STRMIN (256)
char *gsProxyServer; // プロキシサーバ
char *gsProxyPort; // プロキシポート
char *gsProxyUser; // プロキシ認証ユーザ名
char *gsProxyPassword; // プロキシ認証パスワード
// インターネットに接続
// 返り値
UCHAR GetFromInternet(char *sUrl)
{
HWND hWnd;
HINTERNET hInternet;
HINTERNET hHttpRequest;
BYTE bBuffer[STRMIN];
HANDLE hFile;
SYSTEMTIME sLastWriteTime;
FILETIME fLastWriteTime;
DWORD dwRead, dwCode, dwSize, dwTotal, dwLength;
BYTE *bRet = NULL;
BOOL bGetFileTime
char sStr[1024], sFileName[1024];
int i;
static BOOL bProxyCheck = FALSE;
// WININET初期化
if ( gsProxyServer != NULL ) {
if ( gsProxyPort != NULL ) {
sprintf(sStr, "%s:%s", gsProxyServer, gsProxyPort);
}
else {
sprintf(sStr, "%s", gsProxyServer);
}
hInternet = InternetOpen(
NAME,
INTERNET_OPEN_TYPE_PROXY,
sStr,
NULL,
0);
}
else {
hInternet = InternetOpen(
NAME,
INTERNET_OPEN_TYPE_PRECONFIG,
NULL,
NULL,
0);
}
if ( hInternet == NULL ) {
Error("インターネットに接続できません");
return 1;
}
// URLを開く
hHttpRequest = InternetOpenUrl(hInternet,
sUrl,
NULL,
0,
INTERNET_FLAG_RELOAD,
0);
// プロキシユーザ認証チェック
if ( bProxyCheck == FALSE ) {
HttpSendRequest(hHttpRequest, NULL, 0, NULL, 0);
dwSize = sizeof(DWORD);
HttpQueryInfo(hHttpRequest,
HTTP_QUERY_STATUS_CODE | HTTP_QUERY_FLAG_NUMBER,
&dwCode, &dwSize, NULL);
if ( dwCode == HTTP_STATUS_PROXY_AUTH_REQ ) {
// プロキシユーザ設定あり
if ( gsProxyUserName != NULL && gsProxyPassword != NULL ) {
strcpy(sStr, gsProxyUserName);
if ( InternetSetOption(hHttpRequest,
INTERNET_OPTION_PROXY_USERNAME,
(LPVOID)sStr, lstrlen(sStr)) == TRUE ) {
strcpy(sStr, gsProxyPassword);
if ( sStr[0] != '\0' &&
InternetSetOption(hHttpRequest,
INTERNET_OPTION_PROXY_PASSWORD,
(LPVOID)sStr, lstrlen(sStr)) == TRUE ) {
HttpSendRequest(hHttpRequest, NULL, 0, NULL, 0);
bProxyCheck = TRUE;
}
}
}
// プロキシユーザ認証入力ウィンドウ
else if ( InternetErrorDlg(GetDesktopWindow(),
hHttpRequest,
ERROR_INTERNET_INCORRECT_PASSWORD,
FLAGS_ERROR_UI_FILTER_FOR_ERRORS |
FLAGS_ERROR_UI_FLAGS_GENERATE_DATA |
FLAGS_ERROR_UI_FLAGS_CHANGE_OPTIONS,
NULL) == ERROR_INTERNET_FORCE_RETRY ) {
HttpSendRequest(hHttpRequest, NULL, 0, NULL, 0);
bProxyCheck = TRUE;
}
else {
InternetCloseHandle(hHttpRequest);
return 0xff;
}
}
}
// コンテンツの長さを取得
if ( gbForceUpdate == FALSE ) {
HttpSendRequest(hHttpRequest, NULL, 0, NULL, 0);
dwSize = sizeof(long);
HttpQueryInfo(
hHttpRequest,
HTTP_QUERY_CONTENT_LENGTH | HTTP_QUERY_FLAG_NUMBER,
&dwLength,
&dwSize,
NULL);
}
else {
dwLength = 0;
}
// コンテンツ時刻
if ( gbForceUpdate == FALSE ) {
bGetFileTime = FALSE;
dwSize = sizeof(SYSTEMTIME);
HttpQueryInfo(
hHttpRequest,
HTTP_QUERY_LAST_MODIFIED | HTTP_QUERY_FLAG_SYSTEMTIME,
&sLastWriteTime,
&dwSize,
NULL);
if ( dwSize > 0 ) {
SystemTimeToFileTime(&sLastWriteTime, &fLastWriteTime);
bGetFileTime = TRUE;
}
}
// ダウンロード
dwTotal = 0;
while ( TRUE ){
if ( TRUE != InternetReadFile(hHttpRequest, bBuffer, STRMIN, &dwRead) ) {
Error("インターネットからのファイルの読み込みに失敗しました");
InternetCloseHandle(hHttpRequest);
InternetCloseHandle(hInternet);
if ( bRet != NULL ) {
free(bRet);
}
return 1;
}
// すべてのデータを読み込んだとき
if ( dwRead == 0 ) break;
// 読み込んだデータを追加
if ( bRet == NULL ) {
if ( ( bRet = (BYTE *)malloc(sizeof(BYTE)*(dwTotal+dwRead)) )
== NULL ) {
InternetCloseHandle(hHttpRequest);
return 0;
}
for ( i = 0 ; (unsigned)i < dwRead ; i++ ) {
*(bRet+i) = bBuffer[i];
}
}
else {
if ( ( bRet = (BYTE *)realloc(bRet, sizeof(BYTE)*(dwTotal+dwRead)) )
== NULL ) {
InternetCloseHandle(hHttpRequest);
return 0;
}
for ( i = 0 ; (unsigned)i < dwRead ; i++ ) {
*(bRet+dwTotal+i) = bBuffer[i];
}
}
dwTotal += dwRead;
}
// 保存用ファイル名取得
strcpy(sFileName, sUrl);
for ( i = strlen(sUrl) - 1 ; i >= 0 ; i-- ) {
if ( *(sUrl+i) == '/' ) {
strcpy(sFileName, sUrl+i+1);
break;
}
}
// 保存ファイル書き込み
hFile = CreateFile(sFileName, // ファイル名
GENERIC_WRITE, // アクセスモード
FILE_SHARE_READ, // 共有モード
NULL, // セキュリティ記述子
CREATE_ALWAYS, // 作成方法
FILE_ATTRIBUTE_NORMAL, // ファイル属性
NULL // テンプレートファイル
);
if ( hFile != INVALID_HANDLE_VALUE ) {
WriteFile(hFile, // ファイルのハンドル
bRet, // データバッファ
dwTotal, // 書き込み対象のバイト数
&dwSize, // 書き込んだバイト数
NULL // オーバーラップ構造体のバッファ
);
if ( bGetFileTime ) {
SetFileTime(hFile, &fLastWriteTime, &fLastWriteTime, &fLastWriteTime);
}
CloseHandle(hFile);
}
else {
InternetCloseHandle(hHttpRequest);
return 0;
}
InternetCloseHandle(hHttpRequest);
InternetCloseHandle(hInternet);
if ( bRet != NULL ) free(bRet);
return 4;
}
|