/*==LICENSE==*

CyanWorlds.com Engine - MMOG client, server and tools
Copyright (C) 2011  Cyan Worlds, Inc.

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>.

You can contact Cyan Worlds, Inc. by email legal@cyan.com
 or by snail mail at:
      Cyan Worlds, Inc.
      14617 N Newport Hwy
      Mead, WA   99021

*==LICENSE==*/
#include "plFileGrabber.h"

/* Not needed currently - if we want it again we'll have to reimplement HTTP comm
plHttpFileGrabber::plHttpFileGrabber()
{
	fRequestMgr.SetHostname("");
}

bool plHttpFileGrabber::FileToStream(const char* path, hsStream* stream)
{
	std::string pathStr(path);
	bool retVal = fRequestMgr.GetFileToStream(path, stream);
	stream->SetPosition(0);

	return retVal;
}

void plHttpFileGrabber::SetServer(const char* server)
{
	std::string serverPath(server);

	fRequestMgr.SetHostname(serverPath);
}

void plHttpFileGrabber::MakeProperPath(char* path)
{
	char* slash = NULL;
	do {
		slash = strchr(path, '\\');
		if (slash)
			*slash = '/';
	} while(slash != NULL);
}

void plHttpFileGrabber::SetUsernamePassword(const std::string& username, const std::string& password)
{
	fRequestMgr.SetUsername(username);
	fRequestMgr.SetPassword(password);
}

bool plHttpFileGrabber::IsServerAvailable(const char* serverName)
{
	bool retVal = false;

	HINTERNET hInternet = InternetOpen("Parable Patcher",INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0);
	if (hInternet)
	{
		HINTERNET hHttp = InternetConnect(hInternet,serverName,8080,fUserName.c_str(),fPassword.c_str(),INTERNET_SERVICE_HTTP,0,0);
		if (hHttp)
		{
			HINTERNET hRequest = HttpOpenRequest(hHttp, "GET", "/Current/Current.txt", NULL, NULL, NULL, INTERNET_FLAG_NO_CACHE_WRITE | INTERNET_FLAG_KEEP_CONNECTION, 0);
			if (hRequest)
			{
				DWORD dwCode;
				DWORD dwSize = sizeof(dwCode);
				HttpSendRequest(hRequest, NULL, 0, NULL, 0);
				HttpQueryInfo(hRequest, HTTP_QUERY_STATUS_CODE | HTTP_QUERY_FLAG_NUMBER, &dwCode, &dwSize, NULL);
				if (dwCode >= 200 && dwCode < 300)
				{
					retVal = true;
				}

				InternetCloseHandle(hRequest);
			}

			InternetCloseHandle(hHttp);
		}
		InternetCloseHandle(hInternet);
	}

	return retVal;
}
*/

plNetShareFileGrabber::plNetShareFileGrabber()
{
}

#define BUFFER_SIZE 1024*1024
bool plNetShareFileGrabber::FileToStream(const char* path, hsStream* stream)
{
	hsUNIXStream fileStream;
	std::string filePath = fServerName + path;
	
	if (fileStream.Open(filePath.c_str()))
	{
		char* buffer = new char[BUFFER_SIZE];
		UInt32 streamSize = fileStream.GetSizeLeft();
		while (streamSize > (BUFFER_SIZE))
		{
			fileStream.Read(BUFFER_SIZE, buffer);
			stream->Write(BUFFER_SIZE, buffer);

			streamSize = fileStream.GetSizeLeft();
		}

		if (streamSize > 0)
		{
			fileStream.Read(streamSize, buffer);
			stream->Write(streamSize, buffer);
		}

		stream->Rewind();

		fileStream.Close();
		delete [] buffer;

		return true;
	}

	return false;
}

void plNetShareFileGrabber::SetServer(const char* server)
{
	fServerName = "\\\\";
	fServerName += server;
}

void plNetShareFileGrabber::MakeProperPath(char* path)
{
	char* slash = NULL;
	do {
		slash = strchr(path, '/');
		if (slash)
			*slash = '\\';
	} while(slash != NULL);
}

bool plNetShareFileGrabber::IsServerAvailable(const char* serverName, const char* currentDir)
{
	bool retVal = false;

	char serverPath[MAX_PATH];
	sprintf(serverPath, "\\\\%s\\%s\\Current.txt", serverName, currentDir);

	hsUNIXStream si;
	if (si.Open(serverPath, "rb"))
	{
		retVal = true;
		si.Close();
	}

	return retVal;
}