summaryrefslogtreecommitdiff
path: root/attache/Uploader.h
blob: 49722e6c6aa0bfe2bbd21de4860a647181e99502 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#pragma once

class UploadProgress;
class UploadSettings;
class UploadResults;

class Uploader
{
	UploadProgress *m_pProgress;
	UploadSettings *m_pSettings;
	UploadResults *m_pResults;

public:
	Uploader(UploadProgress *pProgress)
		: m_pProgress(pProgress), m_pSettings(NULL), m_pResults(NULL)
	{
	}

	HRESULT DoUpload(UploadSettings *pSettings, UploadResults *pResults);

private:
	TCHAR *GenerateMultipartBoundary();
	TCHAR *GenerateContentTypeHeader(const TCHAR *strBoundary);
	DWORD CalculateContentLength(const TCHAR *strBoundary, DWORD *pdwOverallBytesTotal);

	char *GenerateFieldHeader(const TCHAR *strBoundary, const TCHAR *lpszFieldName);
	DWORD CalculateContentLength(const TCHAR *strBoundary, const TCHAR *lpszFieldName, const TCHAR *lpszFieldValue);
	HRESULT UploadField(HINTERNET hRequest, const TCHAR *strBoundary, const TCHAR *lpszFieldName, const TCHAR *lpszFieldValue);
	const char *GenerateFieldTrailer();
	
	DWORD CalculateContentLength(const TCHAR *strBoundary, const TCHAR * lpszFieldName, const TCHAR * lpszPathName, const TCHAR * lpszContentType, DWORD *pdwOverallBytesTotal);
	char *GenerateFileHeader(const TCHAR * strBoundary, const TCHAR * lpszFieldName, const TCHAR * lpszPathName, const TCHAR * lpszContentType);
	HRESULT UploadFile(HINTERNET hRequest, const TCHAR * strBoundary, const TCHAR * lpszFieldName, const TCHAR * lpszPathName, const TCHAR * lpszContentType, DWORD *pdwOverallBytesSent, DWORD dwOverallBytesTotal);
	HRESULT UploadFileContent(HINTERNET hRequest, const TCHAR * lpszPathName, HANDLE hFile, DWORD *pdwOverallBytesSent, DWORD dwOverallBytesTotal);
	const char *GenerateFileTrailer();

	char *GenerateBodyTrailer(const TCHAR * strBoundary);

	HRESULT ReadStatusCode(HINTERNET hRequest, DWORD *pStatusCode);
	HRESULT ReadResponseHeaders(HINTERNET hRequest);
	HRESULT ReadResponseBody(HINTERNET hRequest);

private:
	static void CALLBACK StaticInternetStatusCallback(HINTERNET hInternet, DWORD_PTR dwContext, DWORD dwInternetStatus, LPVOID lpvStatusInformation, DWORD dwStatusInformationLength);
	void InternetStatusCallback(HINTERNET hInternet, DWORD dwInternetStatus, LPVOID lpvStatusInformation, DWORD dwStatusInformationLength);
};