/*
Version information plugin for Miranda IM

Copyright � 2002-2006 Luca Santarelli, Cristian Libotean

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 2
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, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
*/

#include "common.h"

#define PLUGIN_UNCERTAIN_MARK "?"

#define RJUST 70

CPlugin::CPlugin() {
	pluginID = UUID_NULL;
}

CPlugin::CPlugin(LPCTSTR eFileName, LPCTSTR eShortName, MUUID pluginID, LPCTSTR eUnicodeInfo, DWORD eVersion, LPCTSTR eTimestamp, LPCTSTR eLinkedModules) {
	lpzFileName = eFileName;
	lpzShortName = eShortName;
	lpzUnicodeInfo = eUnicodeInfo;
	lpzTimestamp = eTimestamp;
	lpzLinkedModules = eLinkedModules;

	int v1, v2, v3, v4;

	DWORD unused, verInfoSize = GetFileVersionInfoSize(eFileName, &unused);
	if (verInfoSize != 0) {
		UINT blockSize;
		VS_FIXEDFILEINFO* fi;
		void* pVerInfo = mir_alloc(verInfoSize);
		GetFileVersionInfo(eFileName, 0, verInfoSize, pVerInfo);
		VerQueryValue(pVerInfo, _T("\\"), (LPVOID*)&fi, &blockSize);
		v1 = HIWORD(fi->dwProductVersionMS), v2 = LOWORD(fi->dwProductVersionMS),
		v3 = HIWORD(fi->dwProductVersionLS), v4 = LOWORD(fi->dwProductVersionLS);
		mir_free(pVerInfo);
	}
	else {
		DWORD ver = eVersion;
		v1 = HIBYTE(HIWORD(ver)), v2 = LOBYTE(HIWORD(ver)), v3 = HIBYTE(LOWORD(ver)), v4 = LOBYTE(LOWORD(ver));
	}

	TCHAR aux[128];
	mir_sntprintf(aux, SIZEOF(aux), _T("%d.%d.%d.%d"),	v1, v2, v3, v4);
	lpzVersion = aux;
	
	this->pluginID = pluginID;
};

CPlugin::CPlugin(const CPlugin& other) {
	lpzFileName  = other.lpzFileName;
	lpzShortName = other.lpzShortName;
	lpzUnicodeInfo = other.lpzUnicodeInfo;
	lpzVersion   = other.lpzVersion;
	lpzTimestamp = other.lpzTimestamp;
	lpzLinkedModules = other.lpzLinkedModules;
	pluginID = other.pluginID;
}

CPlugin::~CPlugin()
{
}

void CPlugin::SetErrorMessage(LPCTSTR error)
{
	lpzLinkedModules = error;
}

bool CPlugin::operator<(CPlugin &anotherPlugin)
{
	std::tstring anotherFileName = anotherPlugin.getFileName();

	TCHAR szThis[MAX_PATH]; lstrcpy(szThis, lpzFileName.c_str());
	TCHAR szThat[MAX_PATH]; lstrcpy(szThat, anotherFileName.c_str());

	if (lstrcmpi(szThis, szThat) < 0)
		return TRUE;
	else
		return FALSE;
}

bool CPlugin::operator>(CPlugin &anotherPlugin)
{
	return !((*this) < anotherPlugin);
}
bool CPlugin::operator==(CPlugin &anotherPlugin)
{
	return !((*this) < anotherPlugin || (*this) > anotherPlugin);
}

std::tstring CPlugin::getFileName()
{
	return this->lpzFileName;
}

std::tstring CPlugin::getInformations(DWORD flags, TCHAR *szHighlightHeader, TCHAR *szHighlightFooter)
{
	std::tstring lpzInformations;
	if (flags & VISF_SHOWUUID)
	{
		TCHAR aux[128];
		UUIDToString(pluginID, aux, SIZEOF(aux));
		lpzInformations = aux;
	}
	else lpzInformations = _T(" ");

	lpzInformations += std::tstring(_T(" ") + lpzFileName + _T(" v.") + szHighlightHeader + lpzVersion + szHighlightFooter + _T(" [") + lpzTimestamp + _T("] - ") + lpzShortName);
	if (lpzUnicodeInfo.size() > 0)
	{
		TCHAR *lwr = _tcslwr(_tcsdup(lpzShortName.c_str()));
		if ( !_tcsstr(lwr, _T("unicode")) && !_tcsstr(lwr, _T("2in1")))
			lpzInformations.append( _T(" |") + lpzUnicodeInfo + _T("|"));

		free(lwr);
	}
	//lpzInformations.append("\t");
	//lpzInformations.append(lpzPluginID);
	lpzInformations.append( _T("\r\n"));
	
	if (lpzLinkedModules.size() > 0)
		{
			lpzInformations.append(lpzLinkedModules);
			lpzInformations.append( _T("\r\n"));
		}
//	std::string lpzInformations = std::string(lpzFileName + " - " + lpzShortName + " [" + lpzTimestamp + " � " + lpzVersion +"]\r\n");
	return lpzInformations;
};