//	VirtualDub - Video processing and capture application
//	Copyright (C) 1998-2001 Avery Lee
//
//	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., 675 Mass Ave, Cambridge, MA 02139, USA.

#include <windows.h>
#include <vfw.h>

#include "resource.h"
#include "auxdlg.h"
#include "oshelper.h"

#include "IAmpDecoder.h"

#include "gui.h"

extern "C" unsigned long version_num;
extern "C" char version_time[];

extern HINSTANCE g_hInst;

// 11/11/2002, Cyrius : Some stuff to have a resizable window :)
// Removed static because window also used for showing OGM Information
/*static*/ struct ReposItem ShowTextCtlPosData[]={
	{ IDC_CHANGES		, REPOS_SIZERIGHT | REPOS_SIZEDOWN },
	{ IDOK				, REPOS_MOVERIGHT | REPOS_MOVEDOWN },
	{ 0 }
};

POINT ShowTextCtlPos[2];

BOOL APIENTRY ShowTextDlgProc( HWND hDlg, UINT message, UINT wParam, LONG lParam) {
	HRSRC hRSRC;
	//
	static RECT rInitial;

    switch (message)
    {
        case WM_INITDIALOG:
			GetWindowRect(hDlg, &rInitial);
			if (hRSRC = FindResource(NULL, (LPSTR)lParam, "STUFF")) {
				HGLOBAL hGlobal;
				if (hGlobal = LoadResource(NULL, hRSRC)) {
					LPVOID lpData;

					if (lpData = LockResource(hGlobal)) {
						char *s = (char *)lpData;
						char *ttl = new char[256];

						while(*s!='\r') ++s;
						if (ttl) {
							memcpy(ttl, (char *)lpData, s - (char *)lpData);
							ttl[s-(char*)lpData]=0;
							SendMessage(hDlg, WM_SETTEXT, 0, (LPARAM)ttl);
							delete ttl;
						}
						s+=2;
						// SendMessage(GetDlgItem(hDlg, IDC_CHANGES), WM_SETFONT, (WPARAM)GetStockObject(ANSI_FIXED_FONT), MAKELPARAM(TRUE, 0));
						SendMessage(GetDlgItem(hDlg, IDC_CHANGES), WM_SETFONT, (WPARAM)GetStockObject(SYSTEM_FIXED_FONT), MAKELPARAM(TRUE, 0));
						SendMessage(GetDlgItem(hDlg, IDC_CHANGES), WM_SETTEXT, 0, (LPARAM)s);
						FreeResource(hGlobal);
						//
						SendMessage(hDlg, WM_SETICON, (WPARAM)ICON_SMALL, (LPARAM)LoadIcon(g_hInst, MAKEINTRESOURCE(IDI_VIRTUALDUB)));
						guiReposInit(hDlg, ShowTextCtlPosData, ShowTextCtlPos);
						return TRUE;
					}
					FreeResource(hGlobal);
				}
			}
            return FALSE;

        case WM_COMMAND:
            if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) 
            {
                EndDialog(hDlg, TRUE);  
                return TRUE;
            }
            break;

		case WM_GETMINMAXINFO:
			{
				LPMINMAXINFO lpmmi = (LPMINMAXINFO)lParam;

				lpmmi->ptMinTrackSize.x = rInitial.right - rInitial.left;
				lpmmi->ptMinTrackSize.y = rInitial.bottom - rInitial.top;
			}
			return TRUE;

		case WM_SIZE:
			guiReposResize(hDlg, ShowTextCtlPosData, ShowTextCtlPos);
			return TRUE;
    }
    return FALSE;
}

BOOL APIENTRY WelcomeDlgProc( HWND hDlg, UINT message, UINT wParam, LONG lParam)
{
    switch (message)
    {
        case WM_COMMAND:
			switch(LOWORD(wParam)) {
			case IDOK: case IDCANCEL:
                EndDialog(hDlg, TRUE);  
                return TRUE;
			case IDC_HELP2:
				HelpShowHelp(hDlg);
				return TRUE;
            }
            break;
    }
    return FALSE;
}

void Welcome() {
	DWORD dwSeenIt;

	if (!QueryConfigDword(NULL, "SeenWelcome", &dwSeenIt) || !dwSeenIt) {
		DialogBox(g_hInst, MAKEINTRESOURCE(IDD_WELCOME), NULL, WelcomeDlgProc);

		SetConfigDword(NULL, "SeenWelcome", 1);
	}
}

static const char g_szDivXWarning[]=
	"\"DivX\" codec を検知しました。\0"
	"あなたのシステム内に一つ以上の\"DivX\"ドライバーを検知しました。"
	"以下のドライバーは正規のドライバーを不正にクラックしたものです。"
	"\r\n"
	"* DivX low motion/fast motion: Microsoft MPEG-4 V3 video\r\n"
	"* DivX audio: Microsoft Windows Media Audio\r\n"
	"* \"Radium\" MP3: Fraunhofer-IIS MPEG layer III audio\r\n"
	"\r\n"
	"クラックされたドライバーは、クラッシュやオリジナルドライバーへの干渉"
	"などの深刻な問題を引き起こすことが解っています。"
	"これらのドライバーがロードされた場合、VirtualDubの安全な動作を保証する"
	"ことは出来ません。"
	"これらのドライバーの使用に伴って生じたクラッシュダンプ情報を作者に"
	"送信することはやめてください。\r\n"
	"\r\n"
	"この警告は一度だけ表示されます。VirtualDub は今後 DivX をロードしても警告を"
	"出しません。"
	;

static const char g_szAPWarning[]=
	"\"AngelPotion Definitive\" codec を検知しました。\0"
	"あなたのシステム内に\"AngelPotion Definitive\" codec を検知しました。"
	"このドライバーは以下のドライバーを不正にクラックしたものです。\r\n"
	"\r\n"
	"* Microsoft MPEG-4 V3 video\r\n"
	"\r\n"
	"AngelPotion codec は MS MPEG-4 V3 codec に非常に稚拙なクラックを行ったもので、"
	"以下を含む幾つかの深刻な競合を引き起こすことが知られています。\r\n"
	"* テンポラリドライブの過度の使用\r\n"
	"* 圧縮フォーマットやRGB伸張に対する間違ったレスポンス\r\n"
	"* 幾つかのアプリケーションのAVIファイル読み込みを妨げる\r\n"
	"* Windows Media Player の codec の自動ダウンロードを妨げる\r\n"
	"\r\n"
	"作者は、VirtualDub が AngelPotion をロードした際、たとえそれが使用されなかったとしても安定動作を保証する事は出来ません。"
	"AngelPotion がロードされたことを示す全てのクラッシュダンプは速やかに破棄してください。"
	"可能ならば AngelPotion のアンインストールを勧めます。\r\n"
	"\r\n"
	"この警告は一度だけ表示されます。VirtualDub は今後 AngelPotion をロードしても警告を"
	"出しません。"
	;

BOOL APIENTRY DivXWarningDlgProc( HWND hdlg, UINT message, UINT wParam, LONG lParam)
{
	const char *s;

    switch (message)
    {
		case WM_INITDIALOG:
			s = (const char *)lParam;
			SetWindowText(hdlg, s);
			while(*s++);
			SendDlgItemMessage(hdlg, IDC_WARNING, WM_SETTEXT, 0, (LPARAM)s);
			return TRUE;

        case WM_COMMAND:
			switch(LOWORD(wParam)) {
			case IDOK: case IDCANCEL:
                EndDialog(hdlg, TRUE);
                return TRUE;
            }
            break;
    }
    return FALSE;
}

static bool DetectDriver(const char *pszName) {
	char szDriverANSI[256];
	ICINFO info;

	for(int i=0; ICInfo(ICTYPE_VIDEO, i, &info); ++i) {
		if (WideCharToMultiByte(CP_ACP, 0, info.szDriver, -1, szDriverANSI, sizeof szDriverANSI, NULL, NULL)
			&& !stricmp(szDriverANSI, pszName))

			return true;
	}

	return false;
}

void DetectDivX() {
	DWORD dwSeenIt;

	if (!QueryConfigDword(NULL, "SeenDivXWarning", &dwSeenIt) || !dwSeenIt) {
		if (DetectDriver("divxc32.dll") || DetectDriver("divxc32f.dll")) {
			DialogBoxParam(g_hInst, MAKEINTRESOURCE(IDD_DIVX_WARNING), NULL, DivXWarningDlgProc, (LPARAM)g_szDivXWarning);

			SetConfigDword(NULL, "SeenDivXWarning", 1);
		}
	}
	if (!QueryConfigDword(NULL, "SeenAngelPotionWarning", &dwSeenIt) || !dwSeenIt) {
		if (DetectDriver("APmpg4v1.dll")) {

			DialogBoxParam(g_hInst, MAKEINTRESOURCE(IDD_DIVX_WARNING), NULL, DivXWarningDlgProc, (LPARAM)g_szAPWarning);

			SetConfigDword(NULL, "SeenAngelPotionWarning", 1);
		}
	}
}
