#include "stdafx.h"
#include "HttpContent.h"
LPTSTR HttpContent::lpszDefaultAgent = TEXT("Arslanbar Client");
LPTSTR HttpContent::lpszDefaultServer = TEXT("zh.arslanbar.net");
INTERNET_PORT HttpContent::nDefaultPort = INTERNET_DEFAULT_HTTP_PORT;
HttpContent::HttpContent(void)
{
lpszAgent = lpszDefaultAgent;
lpszServer =lpszDefaultServer;
nPort = nDefaultPort;
lpData = NULL;
dwSize = 0;
}
HttpContent::~HttpContent(void)
{
Free();
}
/* This function can be called a few times to combine several resources into one block of memory */
void HttpContent::Download(bool bTerminate)
{
HINTERNET hInternet = InternetOpen(lpszAgent, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, NULL);
HINTERNET hConnect = InternetConnect(hInternet, lpszServer, nPort, NULL, NULL, INTERNET_SERVICE_HTTP, NULL, NULL);
HINTERNET hRequest = HttpOpenRequest(hConnect, NULL, lpszPage, NULL, NULL, NULL, NULL, NULL);
HttpSendRequest(hRequest, NULL, NULL, NULL, NULL);
DWORD dwAvailableSize;
DWORD dwRead = 0;
HANDLE hHeap = GetProcessHeap();
while (InternetQueryDataAvailable(hRequest, &dwAvailableSize, NULL, NULL), dwAvailableSize > 0)
{
if (lpData == NULL)
lpData = (LPBYTE)HeapAlloc(hHeap, NULL, dwAvailableSize + bTerminate);
else
lpData = (LPBYTE)HeapReAlloc(hHeap, NULL, lpData, dwSize + dwAvailableSize + bTerminate);
InternetReadFile(hRequest, lpData + dwSize, dwAvailableSize, &dwRead);
dwSize += dwAvailableSize;
}
if (bTerminate)
*(lpData + dwSize) = '\0'; // dwSize doesn't include the terminating NULL
InternetCloseHandle(hRequest);
InternetCloseHandle(hConnect);
InternetCloseHandle(hInternet);
}
/* Delete previously downloaded data */
bool HttpContent::Free(void)
{
if (lpData == NULL)
return false;
HeapFree(GetProcessHeap(), NULL, lpData);
lpData = NULL;
dwSize = 0;
return true;
}
LPBYTE HttpContent::GetData(void)
{
return lpData;
}
DWORD HttpContent::GetSize(void)
{
return dwSize;
}
/* Save the buffer to a file */
void HttpContent::Save(LPTSTR lpszFileName)
{
FILE *fp;
_tfopen_s(&fp, lpszFileName, TEXT("wb"));
if (lpData != NULL)
fwrite(lpData, dwSize, 1, fp);
fclose(fp);
}