#pragma once
//===========================================================================//
// File:	 Remote.h														 //
// Project:  gosGml															 //
// Contents:																 //
//---------------------------------------------------------------------------//
// Date      Who    Modification                                             //
// 9/15/00   DP     Created													 //
//---------------------------------------------------------------------------//
// Copyright (C) 2000 Microsoft Corp.						                 //
// All Rights reserved worldwide                                             //
// This unpublished sourcecode is PROPRIETARY and CONFIDENTIAL               //
//===========================================================================//

//URL, ID, NotifyFunction
//Request, Cancel, GetStatus

#define NotifyNone			0	//no notifications sent.
#define NotifySuperLight	1	//notify on completion or failure
#define NotifyLight			2	//details deemed important
#define NotifyFull			3	//every detail

#define RemoteInitError		1
#define RemoteComplete		2

/*
HTTP_STATUS_CONTINUE 100 The request can be continued. 
HTTP_STATUS_SWITCH_PROTOCOLS 101 The server has switched protocols in an upgrade header. 
HTTP_STATUS_OK 200 The request completed successfully. 
HTTP_STATUS_CREATED 201 The request has been fulfilled and resulted in the creation of a new resource. 
HTTP_STATUS_ACCEPTED 202 The request has been accepted for processing, but the processing has not been completed. 
HTTP_STATUS_PARTIAL 203 The returned meta information in the entity-header is not the definitive set available from the origin server. 
HTTP_STATUS_NO_CONTENT 204 The server has fulfilled the request, but there is no new information to send back. 
HTTP_STATUS_RESET_CONTENT 205 The request has been completed, and the client program should reset the document view that caused the request to be sent to allow the user to easily initiate another input action. 
HTTP_STATUS_PARTIAL_CONTENT 206 The server has fulfilled the partial GET request for the resource. 
HTTP_STATUS_AMBIGUOUS 300 The server couldn't decide what to return. 
HTTP_STATUS_MOVED 301 The requested resource has been assigned to a new permanent URI (Uniform Resource Identifier), and any future references to this resource should be done using one of the returned URIs. 
HTTP_STATUS_REDIRECT 302 The requested resource resides temporarily under a different URI (Uniform Resource Identifier). 
HTTP_STATUS_REDIRECT_METHOD 303 The response to the request can be found under a different URI (Uniform Resource Identifier) and should be retrieved using a GET method on that resource. 
HTTP_STATUS_NOT_MODIFIED 304 The requested resource has not been modified. 
HTTP_STATUS_USE_PROXY 305 The requested resource must be accessed through the proxy given by the location field. 
HTTP_STATUS_REDIRECT_KEEP_VERB 307 The redirected request keeps the same verb. HTTP/1.1 behavior. 
HTTP_STATUS_BAD_REQUEST 400 The request could not be processed by the server due to invalid syntax. 
HTTP_STATUS_DENIED 401 The requested resource requires user authentication. 
HTTP_STATUS_PAYMENT_REQ 402 Not currently implemented in the HTTP protocol. 
HTTP_STATUS_FORBIDDEN 403 The server understood the request, but is refusing to fulfill it. 
HTTP_STATUS_NOT_FOUND 404 The server has not found anything matching the requested URI (Uniform Resource Identifier). 
HTTP_STATUS_BAD_METHOD 405 The method used is not allowed. 
HTTP_STATUS_NONE_ACCEPTABLE 406 No responses acceptable to the client were found. 
HTTP_STATUS_PROXY_AUTH_REQ 407 Proxy authentication required. 
HTTP_STATUS_REQUEST_TIMEOUT 408 The server timed out waiting for the request. 
HTTP_STATUS_CONFLICT 409 The request could not be completed due to a conflict with the current state of the resource. The user should resubmit with more information. 
HTTP_STATUS_GONE 410 The requested resource is no longer available at the server, and no forwarding address is known. 
HTTP_STATUS_LENGTH_REQUIRED 411 The server refuses to accept the request without a defined content length. 
HTTP_STATUS_PRECOND_FAILED 412 The precondition given in one or more of the request header fields evaluated to false when it was tested on the server. 
HTTP_STATUS_REQUEST_TOO_LARGE 413 The server is refusing to process a request because the request entity is larger than the server is willing or able to process. 
HTTP_STATUS_URI_TOO_LONG 414 The server is refusing to service the request because the request URI (Uniform Resource Identifier) is longer than the server is willing to interpret. 
HTTP_STATUS_UNSUPPORTED_MEDIA 415 The server is refusing to service the request because the entity of the request is in a format not supported by the requested resource for the requested method. 
HTTP_STATUS_RETRY_WITH 449 The request should be retried after doing the appropriate action. 
HTTP_STATUS_SERVER_ERROR 500 The server encountered an unexpected condition that prevented it from fulfilling the request. 
HTTP_STATUS_NOT_SUPPORTED 501 The server does not support the functionality required to fulfill the request. 
HTTP_STATUS_BAD_GATEWAY 502 The server, while acting as a gateway or proxy, received an invalid response from the upstream server it accessed in attempting to fulfill the request. 
HTTP_STATUS_SERVICE_UNAVAIL 503 The service is temporarily overloaded. 
HTTP_STATUS_GATEWAY_TIMEOUT 504 The request was timed out waiting for a gateway. 
HTTP_STATUS_VERSION_NOT_SUP 505 The server does not support, or refuses to support, the HTTP protocol version that was used in the request message. 

*/


typedef RemoteNF(int ID, int status); //remote notify function


class RemoteM //Remote Master
{
	public:
		RemoteM(bool Nothing, int maxSimCon = 15, int maxConPerServer = 8, bool reUseRemoteCon = true);
		~RemoteM();
		void NTE(); //New Thread Entry
		int GetFile(char* URL, RemoteNF* x=0, int NotifyLevel=NotifyFull);//return ID
		bool CancelGet(int ID); //cancel the get. may fail if get is complete.
		int GetStatus(int ID); //return status code

		//the below functions are not for general interface use.

		void NotifyOfStatusChange(int ID, int Status);
		HINTERNET Icon;
	private:
		void OpLoop();
		RemoteM();
		HANDLE ThreadH;
		unsigned long ThreadID;
		int MaxSimCon, MaxConPerServer, InitState;
		bool ReUseRemoteCon;
		Hash<DWORD, DWORD>* RemoteHash;
};

class Remote
{
	public:
		Remote(char* uRL, int notifyLevel, RemoteM* master);
		~Remote();
		void CBF(HINTERNET hInternet, DWORD dwContext, DWORD dwInternetStatus, LPVOID lpvStatusInformation, DWORD dwStatusInformationLength);
	private:
		void CBF();
		RemoteM* Master;
		int NotifyLevel;
		char* URL;
		int Status;
		unsigned long NumBytes,NumBytes2;
		char* buff;
		int UID;
};