#include "sh5rki.h"

#include <stdio.h>
#include <conio.h>
#include <locale.h>



static BOOL CheckResult(BOOL bResult)
{
	if (bResult) {
		printf(" OK\n");
		return TRUE;
	}
	else {
		printf(" error:\n");

		// Выводится информация об ошибке
		DWORD dwErr, dwWin32Err;
		LPCSTR pszModule = ShrGetErrorInfo(&dwErr, &dwWin32Err);
		printf("   module = %s, error = %d, Win32 error = %d;\n", pszModule, dwErr, dwWin32Err);
		// Выводится текст ошибки
		printf("   text(A): %s\n", ShrGetErrorTextA());
		wprintf(L"   text(W): %s\n", ShrGetErrorTextW());
		printf("\n");

		return FALSE;
	}
}


void main()
{
	extern void TestINet();
	TestINet();
	return;

	/*
	AddDllDirectory(L"D:\\Sh\\sh5rki_test\\Debug\\B\\sdbcli.dll");

	// SetDllDirectoryA(".\\A\\testdll_1.dll");
	// HINSTANCE hLib1 = LoadLibraryA(".\\A\\testdll_1.dll");
	//SetDllDirectoryA(".\\B\\testdll_2.dll");
	// HINSTANCE hLib2 = LoadLibraryA(".\\B\\testdll_2.dll");


	// SetDllDirectoryA(".\\B\\testdll_2.dll");
	// SetDefaultDllDirectories(LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR); //
	// HINSTANCE hLib1 = LoadLibraryExA("D:\\Sh\\sh5rki_test\\Debug\\A\\testdll_1.dll", NULL, LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR);
	// SetCurrentDirectoryA("D:\\Sh\\sh5rki_test\\Debug\\B");
	// HINSTANCE hLib2 = LoadLibraryExA("D:\\Sh\\sh5rki_test\\Debug\\B\\testdll_2.dll", NULL, LOAD_LIBRARY_SEARCH_USER_DIRS);
	// HINSTANCE hLib2 = LoadLibraryA(".\\B\\testdll_2.dll");


	AddDllDirectory(L"D:\\Sh\\sh5rki_test\\Debug\\B");
	// HINSTANCE hLib2 = LoadLibraryA(".\\B\\testdll_2.dll");
	HINSTANCE hLib2 = LoadLibraryExA("D:\\Sh\\sh5rki_test\\Debug\\B\\testdll_2.dll", NULL, LOAD_LIBRARY_SEARCH_USER_DIRS);


	_getch();
	return;
	*/
	/*
	typedef void (WINAPI *PTestProc)();

	PTestProc pProc1 = PTestProc(GetProcAddress(hLib1, "TestProc1"));
	PTestProc pProc2 = PTestProc(GetProcAddress(hLib2, "TestProc1"));

	pProc1();
	pProc2();
	*/

	// Будем печатать доп. символы
	CPINFOEX cpi;
	GetCPInfoEx(CP_THREAD_ACP, 0, &cpi);
	char CodePage[32];
	wsprintfA(CodePage, ".%d", cpi.CodePage);
	setlocale(LC_ALL, CodePage);

	// Выводим версию:
	DWORD dwVer = ShrGetVer();
	printf("Sh5rki.dll version: %d.%d\n", HIWORD(dwVer), LOWORD(dwVer));

	// Инициализируем sh5rki.dll
	printf("ShrInit():");
	if (CheckResult(ShrInit())) {

		// Соединякмся с БД:
		printf("ShrLogin():");
		ShrLoginStruct Ls;
		Ls.dwProtocolId  = sdbProtTcpip;
		Ls.pszServerName = "127.0.0.1";
		Ls.dwPort        = 0;
		Ls.pszUserName   = "Admin"; // "Babay";
		Ls.pszPassword   = "";
		if (CheckResult(ShrLogin(&Ls))) {

			// Запрос предполагаемой цены
			printf("\nShrEstimatedCost():");
			EstimatedCostRec Recs[3]; // Recs[0].Guid = ..., Recs[1].Guid = ..., ...
			FillMemory(&Recs[0].Guid, sizeof(GUID), 1);
			FillMemory(&Recs[1].Guid, sizeof(GUID), 2);
			FillMemory(&Recs[2].Guid, sizeof(GUID), 5);
			if (CheckResult(ShrEstimatedCost(WORD(-1), 0, 88080384, sizeof(Recs) / sizeof(Recs[0]), Recs))) {
				for (DWORD i = 0; i < sizeof(Recs) / sizeof(Recs[0]); i++)
					printf("Recs[%d].ErrСode = %d\n", i, Recs[i].ErrСode);
			}

			// Запрос списка складов
			printf("\nShrGetDepartListA():");
			PCDepartListRec pDptRec;
			if (CheckResult(ShrGetDepartListA(&pDptRec))) {
				__try {
					if (pDptRec) {
						PCDepartListRec p = pDptRec;
						for (;;) {
							printf("Rid = %X, Name = %s\n", p->dwRid, p->NameA);
							p = p->pNext;
							if (!p)
								break;
						}
					}
				}
				__finally {
					ShrFreeDepartList(pDptRec);
				}
			}


			// Логаут
			ShrLogout();
		}
	}

	_getch();
}





// Локализация 
// Для подмены загружаемых строк необходимо установить обработчики загрузки строк,
// вызвав методы domm.dll _SetLoadStrAHandlers и/или _SetLoadStrWHandlers:

#include "domm.h"
void SetLoadStrHandlers()
{
	// _SetLoadStrAHandlers(...);
	// _SetLoadStrWHandlers(...);
}

#include <Wininet.h>

static void CLoseINetHandle(HINTERNET hHandle)
{
	if (hHandle) {
		if (!InternetCloseHandle(hHandle)) {
			DWORD dwWin32Error = GetLastError();
			MessageBeep(MB_ICONERROR);
		}
	}
}


void TestINet()
{
	HINTERNET hInternet = NULL;
	HINTERNET hConnect = NULL;
	HINTERNET hRequest = NULL;
	
	DWORD dwErrorStep = 1;
	hInternet =	InternetOpenA(
				"Microsoft Internet Explorer",  // agent
				INTERNET_OPEN_TYPE_PRECONFIG,   // access
				NULL, NULL, 0);                 // defaults
	if (hInternet) {
		__try {
			dwErrorStep = 2;

			hConnect = InternetConnectA(hInternet, 
				"tracker.ucs.ru",  // "www.ucs.ru",
				INTERNET_DEFAULT_HTTP_PORT,
				"5113", "yejuwaq", // "anonymous", NULL, 
				INTERNET_SERVICE_HTTP, 0, 0);

			if (hConnect) {
				dwErrorStep = 3;
				hRequest = HttpOpenRequestA(hConnect,
					"GET", // NULL,  // NULL = “GET”
					"innndn.txt", // "/attachments/download/737629/2656XXX.xml", // "2656.xml", // "FileName.txt",
					NULL,
					NULL,
					NULL, // !!! Массив  строк. Он задаёт тип документов, который может принимать наша программа. NULL подразумевает указание одной строки «text/*», то есть приём любого текста
					INTERNET_FLAG_PRAGMA_NOCACHE | INTERNET_FLAG_RELOAD,
					0);
				if (hRequest) {
					dwErrorStep = 4;
					if (HttpSendRequest(hRequest, NULL, 0, NULL, 0)) {

						/*
						dwErrorStep = 5;

						DWORD dwDataSize;
						DWORD dwBufSIze = sizeof(dwDataSize);
						if (HttpQueryInfo(hRequest,
									HTTP_QUERY_CONTENT_LENGTH | HTTP_QUERY_FLAG_NUMBER,
									&dwDataSize, &dwBufSIze, NULL)) {
							MessageBeep(0);
							dwErrorStep = 0; // Успех
						}
						*/

						dwErrorStep = 6;
						DWORD dwSize = 0;
						if (InternetQueryDataAvailable(hRequest, &dwSize, 0, 0)) {

							dwErrorStep = 7;
							char Bufferp[1000];
							DWORD dwNumberOfBytesRead;
							if (InternetReadFile(hRequest, Bufferp, dwSize, &dwNumberOfBytesRead)) {
								MessageBeep(0);
								dwErrorStep = 0; // Успех
							}
						}
					}
				}
			}
		}
		__finally {
			if (dwErrorStep) {
				DWORD dwWin32Error = GetLastError();
				MessageBeep(MB_ICONERROR);
			}
			CLoseINetHandle(hRequest);
			CLoseINetHandle(hConnect);
			CLoseINetHandle(hInternet);
		}
	}
}


// InternetOpenUrl


// 12150       ERROR_HTTP_HEADER_NOT_FOUND          The requested header could not be located.
// 12007       ERROR_INTERNET_NAME_NOT_RESOLVED     The server name could not be resolved.
// 12005       ERROR_INTERNET_INVALID_URL           The URL is invalid.



void TestINet2()
{
	HINTERNET hInternet = NULL;
	HINTERNET hUrl = NULL;

	DWORD dwErrorStep = 1;
	hInternet = InternetOpenA(
		"Microsoft Internet Explorer",  // agent
		INTERNET_OPEN_TYPE_PRECONFIG,   // access
		NULL, NULL, 0);                 // defaults
	if (hInternet) {
		__try {
			dwErrorStep = 2;
			hUrl = InternetOpenUrlA(hInternet, "http://tracker.ucs.ru/attachments/download/737629/2656.xml", NULL, 0, INTERNET_FLAG_KEEP_CONNECTION, 0);

			if (hUrl) {
				dwErrorStep = 7;
				char Bufferp[1000];
				DWORD dwNumberOfBytesRead;
				if (InternetReadFile(hUrl, Bufferp, 1024, &dwNumberOfBytesRead)) {
					MessageBeep(0);
					dwErrorStep = 0; // Успех
				}
			}
		}
		__finally {
			if (dwErrorStep) {
				DWORD dwWin32Error = GetLastError();
				MessageBeep(MB_ICONERROR);
			}
			CLoseINetHandle(hUrl);
			CLoseINetHandle(hInternet);
		}
	}
}
