mplayerc.cpp

00001 /* 
00002  *      Copyright (C) 2003-2005 Gabest
00003  *      http://www.gabest.org
00004  *
00005  *  This Program is free software; you can redistribute it and/or modify
00006  *  it under the terms of the GNU General Public License as published by
00007  *  the Free Software Foundation; either version 2, or (at your option)
00008  *  any later version.
00009  *   
00010  *  This Program is distributed in the hope that it will be useful,
00011  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00012  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
00013  *  GNU General Public License for more details.
00014  *   
00015  *  You should have received a copy of the GNU General Public License
00016  *  along with GNU Make; see the file COPYING.  If not, write to
00017  *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 
00018  *  http://www.gnu.org/copyleft/gpl.html
00019  *
00020  */
00021 
00022 // mplayerc.cpp : Defines the class behaviors for the application.
00023 //
00024 
00025 #include "stdafx.h"
00026 #include "mplayerc.h"
00027 #include <atlsync.h>
00028 #include <Tlhelp32.h>
00029 #include "MainFrm.h"
00030 #include "..\..\DSUtil\DSUtil.h"
00031 
00033 
00034 void CorrectComboListWidth(CComboBox& box, CFont* pWndFont)
00035 {
00036         int cnt = box.GetCount();
00037         if(cnt <= 0) return;
00038 
00039         CDC* pDC = box.GetDC();
00040         pDC->SelectObject(pWndFont);
00041 
00042         int maxw = box.GetDroppedWidth();
00043 
00044         for(int i = 0; i < cnt; i++)
00045         {
00046                 CString str;
00047                 box.GetLBText(i, str);
00048                 int w = pDC->GetTextExtent(str).cx + 22;
00049                 if(maxw < w) maxw = w;
00050         }
00051 
00052         box.ReleaseDC(pDC);
00053 
00054         box.SetDroppedWidth(maxw);
00055 }
00056 
00057 HICON LoadIcon(CString fn, bool fSmall)
00058 {
00059         if(fn.IsEmpty()) return(NULL);
00060 
00061         CString ext = fn.Left(fn.Find(_T("://"))+1).TrimRight(':');
00062         if(ext.IsEmpty() || !ext.CompareNoCase(_T("file")))
00063                 ext = _T(".") + fn.Mid(fn.ReverseFind('.')+1);
00064 
00065         CSize size(fSmall?16:32,fSmall?16:32);
00066 
00067         if(!ext.CompareNoCase(_T(".ifo")))
00068         {
00069                 if(HICON hIcon = (HICON)LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_DVD), IMAGE_ICON, size.cx, size.cy, 0))
00070                         return(hIcon);
00071         }
00072 
00073         if(!ext.CompareNoCase(_T(".cda")))
00074         {
00075                 if(HICON hIcon = (HICON)LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_AUDIOCD), IMAGE_ICON, size.cx, size.cy, 0))
00076                         return(hIcon);
00077         }
00078 
00079         do
00080         {
00081                 CRegKey key;
00082 
00083                 TCHAR buff[256];
00084                 ULONG len;
00085 
00086                 if(ERROR_SUCCESS != key.Open(HKEY_CLASSES_ROOT, ext + _T("\\DefaultIcon"), KEY_READ))
00087                 {
00088                         if(ERROR_SUCCESS != key.Open(HKEY_CLASSES_ROOT, ext, KEY_READ))
00089                                 break;
00090 
00091                         len = sizeof(buff);
00092                         memset(buff, 0, len);
00093                         if(ERROR_SUCCESS != key.QueryStringValue(NULL, buff, &len) || (ext = buff).Trim().IsEmpty())
00094                                 break;
00095 
00096                         if(ERROR_SUCCESS != key.Open(HKEY_CLASSES_ROOT, ext + _T("\\DefaultIcon"), KEY_READ))
00097                                 break;
00098                 }
00099 
00100                 CString icon;
00101 
00102                 len = sizeof(buff);
00103                 memset(buff, 0, len);
00104                 if(ERROR_SUCCESS != key.QueryStringValue(NULL, buff, &len) || (icon = buff).Trim().IsEmpty())
00105                         break;
00106 
00107                 int i = icon.ReverseFind(',');
00108                 if(i < 0) break;
00109                 
00110                 int id = 0;
00111                 if(_stscanf(icon.Mid(i+1), _T("%d"), &id) != 1)
00112                         break;
00113 
00114                 icon = icon.Left(i);
00115 
00116                 HICON hIcon = NULL;
00117                 UINT cnt = fSmall 
00118                         ? ExtractIconEx(icon, id, NULL, &hIcon, 1)
00119                         : ExtractIconEx(icon, id, &hIcon, NULL, 1);
00120                 if(hIcon) return hIcon;
00121         }
00122         while(0);
00123 
00124         return((HICON)LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_UNKNOWN), IMAGE_ICON, size.cx, size.cy, 0));
00125 }
00126 
00127 bool LoadType(CString fn, CString& type)
00128 {
00129         CRegKey key;
00130 
00131         TCHAR buff[256];
00132         ULONG len;
00133 
00134         if(fn.IsEmpty()) return(NULL);
00135 
00136         CString ext = fn.Left(fn.Find(_T("://"))+1).TrimRight(':');
00137         if(ext.IsEmpty() || !ext.CompareNoCase(_T("file")))
00138                 ext = _T(".") + fn.Mid(fn.ReverseFind('.')+1);
00139 
00140         if(ERROR_SUCCESS != key.Open(HKEY_CLASSES_ROOT, ext))
00141                 return(false);
00142 
00143         CString tmp = ext;
00144 
00145     while(ERROR_SUCCESS == key.Open(HKEY_CLASSES_ROOT, tmp))
00146         {
00147                 len = sizeof(buff);
00148                 memset(buff, 0, len);
00149                 if(ERROR_SUCCESS != key.QueryStringValue(NULL, buff, &len) || (tmp = buff).Trim().IsEmpty())
00150                         return(false);
00151         }
00152 
00153         type = tmp;
00154 
00155         return(true);
00156 }
00157 
00158 bool LoadResource(UINT resid, CStringA& str, LPCTSTR restype)
00159 {
00160         str.Empty();
00161         HRSRC hrsrc = FindResource(AfxGetResourceHandle(), MAKEINTRESOURCE(resid), restype);
00162         if(!hrsrc) return(false);
00163         HGLOBAL hGlobal = LoadResource(AfxGetResourceHandle(), hrsrc);
00164         if(!hGlobal) return(false);
00165         DWORD size = SizeofResource(AfxGetResourceHandle(), hrsrc);
00166         if(!size) return(false);
00167         memcpy(str.GetBufferSetLength(size), LockResource(hGlobal), size);
00168         return(true);
00169 }
00170 
00172 // CAboutDlg dialog used for App About
00173 
00174 class CAboutDlg : public CDialog
00175 {
00176 public:
00177         CAboutDlg();
00178 
00179 // Dialog Data
00180         //{{AFX_DATA(CAboutDlg)
00181         enum { IDD = IDD_ABOUTBOX };
00182         //}}AFX_DATA
00183 
00184         // ClassWizard generated virtual function overrides
00185         //{{AFX_VIRTUAL(CAboutDlg)
00186         protected:
00187         virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
00188         //}}AFX_VIRTUAL
00189 
00190 // Implementation
00191 protected:
00192         //{{AFX_MSG(CAboutDlg)
00193                 // No message handlers
00194         //}}AFX_MSG
00195         DECLARE_MESSAGE_MAP()
00196 public:
00197         CString m_appname;
00198         virtual BOOL OnInitDialog()
00199         {
00200 #ifdef UNICODE
00201                 UpdateData();
00202                 m_appname += _T(" (unicode build)");
00203                 UpdateData(FALSE);
00204 #endif
00205                 return TRUE;
00206         }
00207 };
00208 
00209 CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD), m_appname(_T(""))
00210 {
00211         //{{AFX_DATA_INIT(CAboutDlg)
00212         //}}AFX_DATA_INIT
00213 }
00214 
00215 void CAboutDlg::DoDataExchange(CDataExchange* pDX)
00216 {
00217         CDialog::DoDataExchange(pDX);
00218         //{{AFX_DATA_MAP(CAboutDlg)
00219         //}}AFX_DATA_MAP
00220         DDX_Text(pDX, IDC_STATIC1, m_appname);
00221 }
00222 
00223 BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
00224         //{{AFX_MSG_MAP(CAboutDlg)
00225                 // No message handlers
00226         //}}AFX_MSG_MAP
00227 END_MESSAGE_MAP()
00228 
00230 // CMPlayerCApp
00231 
00232 BEGIN_MESSAGE_MAP(CMPlayerCApp, CWinApp)
00233         //{{AFX_MSG_MAP(CMPlayerCApp)
00234         ON_COMMAND(ID_HELP_ABOUT, OnAppAbout)
00235         ON_COMMAND(ID_FILE_EXIT, OnFileExit)
00236         //}}AFX_MSG_MAP
00237         ON_COMMAND(ID_HELP_SHOWCOMMANDLINESWITCHES, OnHelpShowcommandlineswitches)
00238 END_MESSAGE_MAP()
00239 
00241 // CMPlayerCApp construction
00242 
00243 CMPlayerCApp::CMPlayerCApp()
00244 //      : m_hMutexOneInstance(NULL)
00245 {
00246 }
00247 
00248 void CMPlayerCApp::ShowCmdlnSwitches()
00249 {
00250         CString s;
00251 
00252         if(m_s.nCLSwitches&CLSW_UNRECOGNIZEDSWITCH)
00253         {
00254                 CList<CString> sl;
00255                 for(int i = 0; i < __argc; i++) sl.AddTail(__targv[i]);
00256                 s += "Unrecognized switch(es) found in command line string: \n\n" + Implode(sl, ' ') + "\n\n";
00257         }
00258 
00259         s +=
00260                 _T("Usage: mplayerc.exe \"pathname\" [switches]\n\n")
00261                 _T("\"pathname\"\tThe main file or directory to be loaded. (wildcards allowed)\n")
00262                 _T("/dub \"dubname\"\tLoad an additional audio file.\n")
00263                 _T("/sub \"subname\"\tLoad an additional subtitle file.\n")
00264                 _T("/filter \"filtername\"\tLoad DirectShow filters from a dynamic link library. (wildcards allowed)\n")
00265                 _T("/dvd\t\tRun in dvd mode, \"pathname\" means the dvd folder (optional).\n")
00266                 _T("/cd\t\tLoad all the tracks of an audio cd or (s)vcd, \"pathname\" means the drive path (optional).\n")
00267                 _T("/open\t\tOpen the file, don't automatically start playing.\n")
00268                 _T("/play\t\tStart playing the file as soon the player is launched.\n")
00269                 _T("/close\t\tClose the player after playback (only works when used with /play).\n")
00270                 _T("/shutdown\tShutdown the operating system after playback\n")
00271                 _T("/fullscreen\tStart in full-screen mode.\n")
00272                 _T("/minimized\tStart in minimized mode.\n")
00273                 _T("/new\t\tUse a new instance of the player.\n")
00274                 _T("/add\t\tAdd \"pathname\" to playlist, can be combined with /open and /play.\n")
00275                 _T("/regvid\t\tRegister video formats\n")
00276                 _T("/regaud\t\tRegister audio formats\n")
00277                 _T("/unregvid\t\tUnregister video formats\n")
00278                 _T("/unregaud\tUnregister audio formats\n")
00279                 _T("/start ms\t\tStart playing at \"ms\" (= milliseconds)\n")
00280                 _T("/fixedsize w,h\tSet fixed window size.\n")
00281                 _T("/help /h /?\tShow help about command line switches. (this message box)\n");
00282 
00283         AfxMessageBox(s);
00284 }
00285 
00287 // The one and only CMPlayerCApp object
00288 
00289 CMPlayerCApp theApp;
00290 
00291 HWND g_hWnd = NULL;
00292 
00293 bool CMPlayerCApp::StoreSettingsToIni()
00294 {
00295         CString ini = GetIniPath();
00296 /*
00297         FILE* f;
00298         if(!(f = _tfopen(ini, _T("r+"))) && !(f = _tfopen(ini, _T("w"))))
00299                 return StoreSettingsToRegistry();
00300         fclose(f);
00301 */
00302         if(m_pszRegistryKey) free((void*)m_pszRegistryKey);
00303         m_pszRegistryKey = NULL;
00304         if(m_pszProfileName) free((void*)m_pszProfileName);
00305         m_pszProfileName = _tcsdup(ini);
00306 
00307         return(true);
00308 }
00309 
00310 bool CMPlayerCApp::StoreSettingsToRegistry()
00311 {
00312         _tremove(GetIniPath());
00313 
00314         if(m_pszRegistryKey) free((void*)m_pszRegistryKey);
00315         m_pszRegistryKey = NULL;
00316 
00317         SetRegistryKey(_T("Gabest"));
00318 
00319         return(true);
00320 }
00321 
00322 CString CMPlayerCApp::GetIniPath()
00323 {
00324         CString path;
00325         GetModuleFileName(AfxGetInstanceHandle(), path.GetBuffer(MAX_PATH), MAX_PATH);
00326         path.ReleaseBuffer();
00327         path = path.Left(path.ReverseFind('.')+1) + _T("ini");
00328         return(path);
00329 }
00330 
00331 bool CMPlayerCApp::IsIniValid()
00332 {
00333         CFileStatus fs;
00334         return CFileGetStatus(GetIniPath(), fs) && fs.m_size > 0;
00335 }
00336 
00337 bool CMPlayerCApp::GetAppDataPath(CString& path)
00338 {
00339         path.Empty();
00340 
00341         CRegKey key;
00342         if(ERROR_SUCCESS == key.Open(HKEY_CURRENT_USER, _T("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders"), KEY_READ))
00343         {
00344                 ULONG len = MAX_PATH;
00345                 if(ERROR_SUCCESS == key.QueryStringValue(_T("AppData"), path.GetBuffer(MAX_PATH), &len))
00346                         path.ReleaseBufferSetLength(len);
00347         }
00348 
00349         if(path.IsEmpty())
00350                 return(false);
00351 
00352         CPath p;
00353         p.Combine(path, _T("Media Player Classic"));
00354         path = (LPCTSTR)p;
00355 
00356         return(true);
00357 }
00358 
00359 void CMPlayerCApp::PreProcessCommandLine()
00360 {
00361         m_cmdln.RemoveAll();
00362         for(int i = 1; i < __argc; i++)
00363         {
00364                 CString str = CString(__targv[i]).Trim(_T(" \""));
00365 
00366                 if(str[0] != '/' && str[0] != '-' && str.Find(_T(":")) < 0)
00367                 {
00368                         LPTSTR p = NULL;
00369                         CString str2;
00370                         str2.ReleaseBuffer(GetFullPathName(str, MAX_PATH, str2.GetBuffer(MAX_PATH), &p));
00371                         CFileStatus fs;
00372                         if(!str2.IsEmpty() && CFileGetStatus(str2, fs)) str = str2;
00373                 }
00374 
00375                 m_cmdln.AddTail(str);
00376         }
00377 }
00378 
00379 void CMPlayerCApp::SendCommandLine(HWND hWnd)
00380 {
00381         if(m_cmdln.IsEmpty())
00382                 return;
00383 
00384         int bufflen = sizeof(DWORD);
00385 
00386         POSITION pos = m_cmdln.GetHeadPosition();
00387         while(pos) bufflen += (m_cmdln.GetNext(pos).GetLength()+1)*sizeof(TCHAR);
00388 
00389         CAutoVectorPtr<BYTE> buff;
00390         if(!buff.Allocate(bufflen))
00391                 return;
00392 
00393         BYTE* p = buff;
00394 
00395         *(DWORD*)p = m_cmdln.GetCount(); 
00396         p += sizeof(DWORD);
00397 
00398         pos = m_cmdln.GetHeadPosition();
00399         while(pos)
00400         {
00401                 CString s = m_cmdln.GetNext(pos); 
00402                 int len = (s.GetLength()+1)*sizeof(TCHAR);
00403                 memcpy(p, s, len);
00404                 p += len;
00405         }
00406 
00407         COPYDATASTRUCT cds;
00408         cds.dwData = 0x6ABE51;
00409         cds.cbData = bufflen;
00410         cds.lpData = (void*)(BYTE*)buff;
00411         SendMessage(hWnd, WM_COPYDATA, (WPARAM)NULL, (LPARAM)&cds);
00412 }
00413 
00415 // CMPlayerCApp initialization
00416 
00417 #include "..\..\..\include\detours\detours.h"
00418 
00419 DETOUR_TRAMPOLINE(BOOL WINAPI Real_IsDebuggerPresent(), IsDebuggerPresent);
00420 BOOL WINAPI Mine_IsDebuggerPresent()
00421 {
00422         TRACE(_T("Oops, somebody was trying to be naughty! (called IsDebuggerPresent)\n")); 
00423         return FALSE;
00424 }
00425 
00426 DETOUR_TRAMPOLINE(LONG WINAPI Real_ChangeDisplaySettingsExA(LPCSTR lpszDeviceName, LPDEVMODEA lpDevMode, HWND hwnd, DWORD dwFlags, LPVOID lParam), ChangeDisplaySettingsExA);
00427 DETOUR_TRAMPOLINE(LONG WINAPI Real_ChangeDisplaySettingsExW(LPCWSTR lpszDeviceName, LPDEVMODEW lpDevMode, HWND hwnd, DWORD dwFlags, LPVOID lParam), ChangeDisplaySettingsExW);
00428 LONG WINAPI Mine_ChangeDisplaySettingsEx(LONG ret, DWORD dwFlags, LPVOID lParam)
00429 {
00430         if(dwFlags&CDS_VIDEOPARAMETERS)
00431         {
00432                 VIDEOPARAMETERS* vp = (VIDEOPARAMETERS*)lParam;
00433 
00434                 if(vp->Guid == GUIDFromCString(_T("{02C62061-1097-11d1-920F-00A024DF156E}"))
00435                 && (vp->dwFlags&VP_FLAGS_COPYPROTECT))
00436                 {
00437                         if(vp->dwCommand == VP_COMMAND_GET)
00438                         {
00439                                 if((vp->dwTVStandard&VP_TV_STANDARD_WIN_VGA)
00440                                 && vp->dwTVStandard != VP_TV_STANDARD_WIN_VGA)
00441                                 {
00442                                         TRACE(_T("Ooops, tv-out enabled? macrovision checks suck..."));
00443                                         vp->dwTVStandard = VP_TV_STANDARD_WIN_VGA;
00444                                 }
00445                         }
00446                         else if(vp->dwCommand == VP_COMMAND_SET)
00447                         {
00448                                 TRACE(_T("Ooops, as I already told ya, no need for any macrovision bs here"));
00449                                 return 0;
00450                         }
00451                 }
00452         }
00453 
00454         return ret;
00455 }
00456 LONG WINAPI Mine_ChangeDisplaySettingsExA(LPCSTR lpszDeviceName, LPDEVMODEA lpDevMode, HWND hwnd, DWORD dwFlags, LPVOID lParam)
00457 {
00458         return Mine_ChangeDisplaySettingsEx(
00459                 Real_ChangeDisplaySettingsExA(lpszDeviceName, lpDevMode, hwnd, dwFlags, lParam), 
00460                 dwFlags, 
00461                 lParam);
00462 }
00463 LONG WINAPI Mine_ChangeDisplaySettingsExW(LPCWSTR lpszDeviceName, LPDEVMODEW lpDevMode, HWND hwnd, DWORD dwFlags, LPVOID lParam)
00464 {
00465         return Mine_ChangeDisplaySettingsEx(
00466                 Real_ChangeDisplaySettingsExW(lpszDeviceName, lpDevMode, hwnd, dwFlags, lParam), 
00467                 dwFlags,
00468                 lParam);
00469 }
00470 
00471 DETOUR_TRAMPOLINE(HANDLE WINAPI Real_CreateFileA(LPCSTR p1, DWORD p2, DWORD p3, LPSECURITY_ATTRIBUTES p4, DWORD p5, DWORD p6, HANDLE p7), CreateFileA);
00472 DETOUR_TRAMPOLINE(HANDLE WINAPI Real_CreateFileW(LPCWSTR p1, DWORD p2, DWORD p3, LPSECURITY_ATTRIBUTES p4, DWORD p5, DWORD p6, HANDLE p7), CreateFileW);
00473 HANDLE WINAPI Mine_CreateFileA(LPCSTR p1, DWORD p2, DWORD p3, LPSECURITY_ATTRIBUTES p4, DWORD p5, DWORD p6, HANDLE p7)
00474 {
00475         CStringA fn(p1);
00476         fn.MakeLower();
00477         int i = fn.Find(".part");
00478         if(i > 0 && i == fn.GetLength() - 5)
00479                 p3 |= FILE_SHARE_WRITE;
00480 
00481         return Real_CreateFileA(p1, p2, p3, p4, p5, p6, p7);
00482 }
00483 HANDLE WINAPI Mine_CreateFileW(LPCWSTR p1, DWORD p2, DWORD p3, LPSECURITY_ATTRIBUTES p4, DWORD p5, DWORD p6, HANDLE p7)
00484 {
00485         CStringW fn(p1);
00486         fn.MakeLower();
00487         int i = fn.Find(L".part");
00488         if(i > 0 && i == fn.GetLength() - 5)
00489                 p3 |= FILE_SHARE_WRITE;
00490 
00491         return Real_CreateFileW(p1, p2, p3, p4, p5, p6, p7);
00492 }
00493 
00494 DETOUR_TRAMPOLINE(MMRESULT WINAPI Real_mixerSetControlDetails(HMIXEROBJ hmxobj, LPMIXERCONTROLDETAILS pmxcd, DWORD fdwDetails), mixerSetControlDetails);
00495 MMRESULT WINAPI Mine_mixerSetControlDetails(HMIXEROBJ hmxobj, LPMIXERCONTROLDETAILS pmxcd, DWORD fdwDetails)
00496 {
00497         if(fdwDetails == (MIXER_OBJECTF_HMIXER|MIXER_SETCONTROLDETAILSF_VALUE)) 
00498                 return MMSYSERR_NOERROR; // don't touch the mixer, kthx
00499         return Real_mixerSetControlDetails(hmxobj, pmxcd, fdwDetails);
00500 }
00501 
00502 BOOL CMPlayerCApp::InitInstance()
00503 {
00504         DetourFunctionWithTrampoline((PBYTE)Real_IsDebuggerPresent, (PBYTE)Mine_IsDebuggerPresent);
00505         DetourFunctionWithTrampoline((PBYTE)Real_ChangeDisplaySettingsExA, (PBYTE)Mine_ChangeDisplaySettingsExA);
00506         DetourFunctionWithTrampoline((PBYTE)Real_ChangeDisplaySettingsExW, (PBYTE)Mine_ChangeDisplaySettingsExW);
00507         DetourFunctionWithTrampoline((PBYTE)Real_CreateFileA, (PBYTE)Mine_CreateFileA);
00508         DetourFunctionWithTrampoline((PBYTE)Real_CreateFileW, (PBYTE)Mine_CreateFileW);
00509         DetourFunctionWithTrampoline((PBYTE)Real_mixerSetControlDetails, (PBYTE)Mine_mixerSetControlDetails);
00510         CFilterMapper2::Init();
00511 
00512         HRESULT hr;
00513     if(FAILED(hr = OleInitialize(0)))
00514         {
00515         AfxMessageBox(_T("OleInitialize failed!"));
00516                 return FALSE;
00517         }
00518 
00519     WNDCLASS wndcls;
00520     memset(&wndcls, 0, sizeof(WNDCLASS));
00521     wndcls.style = CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW;
00522     wndcls.lpfnWndProc = ::DefWindowProc; 
00523     wndcls.hInstance = AfxGetInstanceHandle();
00524     wndcls.hIcon = LoadIcon(IDR_MAINFRAME);
00525     wndcls.hCursor = LoadCursor(IDC_ARROW);
00526     wndcls.hbrBackground = 0;//(HBRUSH)(COLOR_WINDOW + 1); // no bkg brush, the view and the bars should always fill the whole client area
00527     wndcls.lpszMenuName = NULL;
00528     wndcls.lpszClassName = MPC_WND_CLASS_NAME;
00529 
00530         if(!AfxRegisterClass(&wndcls))
00531     {
00532                 AfxMessageBox(_T("MainFrm class registration failed!"));
00533                 return FALSE;
00534     }
00535 
00536         if(!AfxSocketInit(NULL))
00537         {
00538         AfxMessageBox(_T("AfxSocketInit failed!"));
00539                 return FALSE;
00540         }
00541 
00542         PreProcessCommandLine();
00543 
00544         if(IsIniValid()) StoreSettingsToIni();
00545         else StoreSettingsToRegistry();
00546 
00547         CString AppDataPath;
00548         if(GetAppDataPath(AppDataPath))
00549                 CreateDirectory(AppDataPath, NULL);
00550 
00551         m_s.ParseCommandLine(m_cmdln);
00552 
00553         if(m_s.nCLSwitches&(CLSW_HELP|CLSW_UNRECOGNIZEDSWITCH))
00554         {
00555                 ShowCmdlnSwitches();
00556                 return FALSE;
00557         }
00558 
00559         if((m_s.nCLSwitches&CLSW_CLOSE) && m_s.slFiles.IsEmpty())
00560         {
00561                 return FALSE;
00562         }
00563 
00564         m_s.UpdateData(false);
00565 
00566         if((m_s.nCLSwitches&CLSW_REGEXTVID) || (m_s.nCLSwitches&CLSW_UNREGEXTVID)
00567         || (m_s.nCLSwitches&CLSW_REGEXTAUD) || (m_s.nCLSwitches&CLSW_UNREGEXTAUD))
00568         {
00569                 CMediaFormats& mf = m_s.Formats;
00570 
00571                 for(int i = 0; i < mf.GetCount(); i++)
00572                 {
00573                         // HACK
00574                         if(!mf[i].GetLabel().CompareNoCase(_T("Image file"))) continue;
00575 
00576                         bool fAudioOnly = mf[i].IsAudioOnly();
00577 
00578                         int j = 0;
00579                         CString str = mf[i].GetExtsWithPeriod();
00580                         for(CString ext = str.Tokenize(_T(" "), j); !ext.IsEmpty(); ext = str.Tokenize(_T(" "), j))
00581                         {
00582                                 if((m_s.nCLSwitches&CLSW_REGEXTVID) && !fAudioOnly
00583                                 || (m_s.nCLSwitches&CLSW_REGEXTAUD) && fAudioOnly)
00584                                         CPPageFormats::RegisterExt(ext, true);
00585                                 
00586                                 if((m_s.nCLSwitches&CLSW_UNREGEXTVID) && !fAudioOnly
00587                                 || (m_s.nCLSwitches&CLSW_UNREGEXTAUD) && fAudioOnly)
00588                                         CPPageFormats::RegisterExt(ext, false);
00589                         }
00590                 }
00591 
00592                 return FALSE;
00593         }
00594 
00595         m_mutexOneInstance.Create(NULL, TRUE, MPC_WND_CLASS_NAME);
00596 
00597         if(GetLastError() == ERROR_ALREADY_EXISTS
00598         && (!(m_s.fAllowMultipleInst || (m_s.nCLSwitches&CLSW_NEW) || m_cmdln.IsEmpty())
00599                 || (m_s.nCLSwitches&CLSW_ADD)))
00600         {
00601                 if(HWND hWnd = ::FindWindow(MPC_WND_CLASS_NAME, NULL))
00602                 {
00603                         SetForegroundWindow(hWnd);
00604 
00605                         if(!(m_s.nCLSwitches&CLSW_MINIMIZED) && IsIconic(hWnd))
00606                                 ShowWindow(hWnd, SW_RESTORE);
00607 
00608                         SendCommandLine(hWnd);
00609 
00610                         return FALSE;
00611                 }
00612         }
00613 
00614         if(!__super::InitInstance())
00615         {
00616                 AfxMessageBox(_T("InitInstance failed!"));
00617                 return FALSE;
00618         }
00619 
00620         CRegKey key;
00621         if(ERROR_SUCCESS == key.Create(HKEY_LOCAL_MACHINE, _T("Software\\Gabest\\Media Player Classic")))
00622         {
00623                 CString path;
00624                 GetModuleFileName(AfxGetInstanceHandle(), path.GetBuffer(MAX_PATH), MAX_PATH);
00625                 path.ReleaseBuffer();
00626                 key.SetStringValue(_T("ExePath"), path);
00627         }
00628 
00629         AfxEnableControlContainer();
00630 
00631         CMainFrame* pFrame = new CMainFrame;
00632         m_pMainWnd = pFrame;
00633         pFrame->LoadFrame(IDR_MAINFRAME, WS_OVERLAPPEDWINDOW|FWS_ADDTOTITLE, NULL, NULL);
00634         pFrame->SetDefaultWindowRect();
00635         pFrame->SetIcon(AfxGetApp()->LoadIcon(IDR_MAINFRAME), TRUE);
00636         pFrame->DragAcceptFiles();
00637         pFrame->ShowWindow((m_s.nCLSwitches&CLSW_MINIMIZED)?SW_SHOWMINIMIZED:SW_SHOW);
00638         pFrame->UpdateWindow();
00639         pFrame->m_hAccelTable = m_s.hAccel;
00640 
00641         m_s.WinLircClient.SetHWND(m_pMainWnd->m_hWnd);
00642         if(m_s.fWinLirc) m_s.WinLircClient.Connect(m_s.WinLircAddr);
00643         m_s.UIceClient.SetHWND(m_pMainWnd->m_hWnd);
00644         if(m_s.fUIce) m_s.UIceClient.Connect(m_s.UIceAddr);
00645 
00646         SendCommandLine(m_pMainWnd->m_hWnd);
00647 
00648         pFrame->SetFocus();
00649 
00650         return TRUE;
00651 }
00652 
00653 int CMPlayerCApp::ExitInstance()
00654 {
00655         m_s.UpdateData(true);
00656 
00657     OleUninitialize();
00658 
00659         return CWinApp::ExitInstance();
00660 }
00661 
00663 // CMPlayerCApp message handlers
00664 // App command to run the dialog
00665 
00666 void CMPlayerCApp::OnAppAbout()
00667 {
00668         CAboutDlg aboutDlg;
00669         aboutDlg.DoModal();
00670 }
00671 
00672 void CMPlayerCApp::OnFileExit()
00673 {
00674         OnAppExit();
00675 }
00676 
00677 // CRemoteCtrlClient
00678 
00679 CRemoteCtrlClient::CRemoteCtrlClient() 
00680         : m_pWnd(NULL)
00681         , m_nStatus(DISCONNECTED)
00682 {
00683 }
00684 
00685 void CRemoteCtrlClient::SetHWND(HWND hWnd)
00686 {
00687         CAutoLock cAutoLock(&m_csLock);
00688 
00689         m_pWnd = CWnd::FromHandle(hWnd);
00690 }
00691 
00692 void CRemoteCtrlClient::Connect(CString addr)
00693 {
00694         CAutoLock cAutoLock(&m_csLock);
00695 
00696         if(m_nStatus == CONNECTING && m_addr == addr)
00697         {
00698                 TRACE(_T("CRemoteCtrlClient (Connect): already connecting to %s\n"), addr);
00699                 return;
00700         }
00701 
00702         if(m_nStatus == CONNECTED && m_addr == addr)
00703         {
00704                 TRACE(_T("CRemoteCtrlClient (Connect): already connected to %s\n"), addr);
00705                 return;
00706         }
00707 
00708         m_nStatus = CONNECTING;
00709 
00710         TRACE(_T("CRemoteCtrlClient (Connect): connecting to %s\n"), addr);
00711 
00712         Close();
00713 
00714         Create();
00715 
00716         CString ip = addr.Left(addr.Find(':')+1).TrimRight(':');
00717         int port = _tcstol(addr.Mid(addr.Find(':')+1), NULL, 10);
00718 
00719         __super::Connect(ip, port);
00720 
00721         m_addr = addr;
00722 }
00723 
00724 void CRemoteCtrlClient::OnConnect(int nErrorCode)
00725 {
00726         CAutoLock cAutoLock(&m_csLock);
00727 
00728         m_nStatus = (nErrorCode == 0 ? CONNECTED : DISCONNECTED);
00729 
00730         TRACE(_T("CRemoteCtrlClient (OnConnect): %d\n"), nErrorCode);
00731 }
00732 
00733 void CRemoteCtrlClient::OnClose(int nErrorCode)
00734 {
00735         CAutoLock cAutoLock(&m_csLock);
00736 
00737         if(m_hSocket != INVALID_SOCKET && m_nStatus == CONNECTED)
00738         {
00739                 TRACE(_T("CRemoteCtrlClient (OnClose): connection lost\n"));
00740         }
00741 
00742         m_nStatus = DISCONNECTED;
00743 
00744         TRACE(_T("CRemoteCtrlClient (OnClose): %d\n"), nErrorCode);
00745 }
00746 
00747 void CRemoteCtrlClient::OnReceive(int nErrorCode)
00748 {
00749         if(nErrorCode != 0 || !m_pWnd) return;
00750 
00751         CStringA str;
00752         int ret = Receive(str.GetBuffer(256), 255, 0);
00753         if(ret <= 0) return;
00754         str.ReleaseBuffer(ret);
00755 
00756         TRACE(_T("CRemoteCtrlClient (OnReceive): %s\n"), CString(str));
00757 
00758         OnCommand(str);
00759 
00760         __super::OnReceive(nErrorCode);
00761 }
00762 
00763 void CRemoteCtrlClient::ExecuteCommand(CStringA cmd, int repcnt)
00764 {
00765         cmd.Trim();
00766         if(cmd.IsEmpty()) return;
00767         cmd.Replace(' ', '_');
00768 
00769         AppSettings& s = AfxGetAppSettings();
00770 
00771         POSITION pos = s.wmcmds.GetHeadPosition();
00772         while(pos)
00773         {
00774                 wmcmd wc = s.wmcmds.GetNext(pos);
00775                 CStringA name = CString(wc.name);
00776                 name.Replace(' ', '_');
00777                 if((repcnt == 0 && wc.rmrepcnt == 0 || wc.rmrepcnt > 0 && (repcnt%wc.rmrepcnt) == 0)
00778                 && (!name.CompareNoCase(cmd) || !wc.rmcmd.CompareNoCase(cmd) || wc.cmd == (WORD)strtol(cmd, NULL, 10)))
00779                 {
00780                         CAutoLock cAutoLock(&m_csLock);
00781                         TRACE(_T("CRemoteCtrlClient (calling command): %s\n"), wc.name);
00782                         m_pWnd->SendMessage(WM_COMMAND, wc.cmd);
00783                         break;
00784                 }
00785         }
00786 }
00787 
00788 // CWinLircClient
00789 
00790 CWinLircClient::CWinLircClient()
00791 {
00792 }
00793 
00794 void CWinLircClient::OnCommand(CStringA str)
00795 {
00796         TRACE(_T("CWinLircClient (OnCommand): %s\n"), CString(str));
00797 
00798         int i = 0, j = 0, repcnt = 0;
00799         for(CStringA token = str.Tokenize(" ", i); 
00800                 !token.IsEmpty();
00801                 token = str.Tokenize(" ", i), j++)
00802         {
00803                 if(j == 1)
00804                         repcnt = strtol(token, NULL, 16);
00805                 else if(j == 2)
00806                         ExecuteCommand(token, repcnt);
00807         }
00808 }
00809 
00810 // CUIceClient
00811 
00812 CUIceClient::CUIceClient()
00813 {
00814 }
00815 
00816 void CUIceClient::OnCommand(CStringA str)
00817 {
00818         TRACE(_T("CUIceClient (OnCommand): %s\n"), CString(str));
00819 
00820         CStringA cmd;
00821         int i = 0, j = 0;
00822         for(CStringA token = str.Tokenize("|", i); 
00823                 !token.IsEmpty(); 
00824                 token = str.Tokenize("|", i), j++)
00825         {
00826                 if(j == 0)
00827                         cmd = token;
00828                 else if(j == 1)
00829                         ExecuteCommand(cmd, strtol(token, NULL, 16));
00830         }
00831 }
00832 
00833 // CMPlayerCApp::Settings
00834 
00835 CMPlayerCApp::Settings::Settings() 
00836         : fInitialized(false)
00837         , MRU(0, _T("Recent File List"), _T("File%d"), 20)
00838         , MRUDub(0, _T("Recent Dub List"), _T("Dub%d"), 20)
00839         , hAccel(NULL)
00840 {
00841 #define ADDCMD(cmd) wmcmds.AddTail(wmcmd##cmd)
00842         ADDCMD((ID_FILE_OPENMEDIA, 'O', FVIRTKEY|FCONTROL|FNOINVERT, _T("Open File")));
00843         ADDCMD((ID_FILE_OPENDVD, 'D', FVIRTKEY|FCONTROL|FNOINVERT, _T("Open DVD")));
00844         ADDCMD((ID_FILE_OPENDEVICE, 'V', FVIRTKEY|FCONTROL|FNOINVERT, _T("Open Device")));
00845         ADDCMD((ID_FILE_SAVEAS, 0, FVIRTKEY|FNOINVERT, _T("Save As")));
00846         ADDCMD((ID_FILE_SAVE_IMAGE, 0, FVIRTKEY|FNOINVERT, _T("Save Image")));
00847         ADDCMD((ID_FILE_SAVE_IMAGE_AUTO, VK_F5, FVIRTKEY|FNOINVERT, _T("Save Image (auto)")));
00848         ADDCMD((ID_FILE_LOADSUBTITLE, 'L', FVIRTKEY|FCONTROL|FNOINVERT, _T("Load Subtitle")));
00849         ADDCMD((ID_FILE_SAVESUBTITLES, 'S', FVIRTKEY|FCONTROL|FNOINVERT, _T("Save Subtitle")));
00850         ADDCMD((ID_FILE_CLOSEPLAYLIST, 'C', FVIRTKEY|FCONTROL|FNOINVERT, _T("Close")));
00851         ADDCMD((ID_FILE_PROPERTIES, VK_F10, FVIRTKEY|FSHIFT|FNOINVERT, _T("Properties")));
00852         ADDCMD((ID_FILE_EXIT, 'X', FVIRTKEY|FALT|FNOINVERT, _T("Exit")));
00853         ADDCMD((ID_PLAY_PLAYPAUSE, VK_SPACE, FVIRTKEY|FNOINVERT, _T("Play/Pause"), APPCOMMAND_MEDIA_PLAY_PAUSE, wmcmd::LDOWN));
00854         ADDCMD((ID_PLAY_PLAY, 0, FVIRTKEY|FNOINVERT, _T("Play")));
00855         ADDCMD((ID_PLAY_PAUSE, 0, FVIRTKEY|FNOINVERT, _T("Pause")));
00856         ADDCMD((ID_PLAY_STOP, VK_OEM_PERIOD, FVIRTKEY|FNOINVERT, _T("Stop"), APPCOMMAND_MEDIA_STOP));
00857         ADDCMD((ID_PLAY_FRAMESTEP, VK_RIGHT, FVIRTKEY|FNOINVERT, _T("Framestep")));
00858         ADDCMD((ID_PLAY_FRAMESTEPCANCEL, VK_LEFT, FVIRTKEY|FNOINVERT, _T("Framestep back")));
00859         ADDCMD((ID_PLAY_GOTO, 'G', FVIRTKEY|FCONTROL|FNOINVERT, _T("Go To")));
00860         ADDCMD((ID_PLAY_INCRATE, VK_UP, FVIRTKEY|FCONTROL|FNOINVERT, _T("Increase Rate")));
00861         ADDCMD((ID_PLAY_DECRATE, VK_DOWN, FVIRTKEY|FCONTROL|FNOINVERT, _T("Decrease Rate")));
00862         ADDCMD((ID_PLAY_RESETRATE, 'R', FVIRTKEY|FCONTROL|FNOINVERT, _T("Reset Rate")));
00863         ADDCMD((ID_PLAY_INCAUDDELAY, VK_ADD, FVIRTKEY|FNOINVERT, _T("Audio Delay +10ms")));
00864         ADDCMD((ID_PLAY_DECAUDDELAY, VK_SUBTRACT, FVIRTKEY|FNOINVERT, _T("Audio Delay -10ms")));
00865         ADDCMD((ID_PLAY_SEEKFORWARDSMALL, 0, FVIRTKEY|FNOINVERT, _T("Jump Forward (small)")));
00866         ADDCMD((ID_PLAY_SEEKBACKWARDSMALL, 0, FVIRTKEY|FNOINVERT, _T("Jump Backward (small)")));
00867         ADDCMD((ID_PLAY_SEEKFORWARDMED, VK_RIGHT, FVIRTKEY|FCONTROL|FNOINVERT, _T("Jump Forward (medium)")));
00868         ADDCMD((ID_PLAY_SEEKBACKWARDMED, VK_LEFT, FVIRTKEY|FCONTROL|FNOINVERT, _T("Jump Backward (medium)")));
00869         ADDCMD((ID_PLAY_SEEKFORWARDLARGE, 0, FVIRTKEY|FNOINVERT, _T("Jump Forward (large)")));
00870         ADDCMD((ID_PLAY_SEEKBACKWARDLARGE, 0, FVIRTKEY|FNOINVERT, _T("Jump Backward (large)")));
00871         ADDCMD((ID_PLAY_SEEKKEYFORWARD, VK_RIGHT, FVIRTKEY|FSHIFT|FNOINVERT, _T("Jump Forward (keyframe)")));
00872         ADDCMD((ID_PLAY_SEEKKEYBACKWARD, VK_LEFT, FVIRTKEY|FSHIFT|FNOINVERT, _T("Jump Backward (keyframe)")));
00873         ADDCMD((ID_NAVIGATE_SKIPFORWARD, VK_NEXT, FVIRTKEY|FNOINVERT, _T("Next"), APPCOMMAND_MEDIA_NEXTTRACK, wmcmd::X2DOWN));
00874         ADDCMD((ID_NAVIGATE_SKIPBACK, VK_PRIOR, FVIRTKEY|FNOINVERT, _T("Previous"), APPCOMMAND_MEDIA_PREVIOUSTRACK, wmcmd::X1DOWN));
00875         ADDCMD((ID_NAVIGATE_SKIPFORWARDPLITEM, VK_NEXT, FVIRTKEY|FCONTROL|FNOINVERT, _T("Next Playlist Item")));
00876         ADDCMD((ID_NAVIGATE_SKIPBACKPLITEM, VK_PRIOR, FVIRTKEY|FCONTROL|FNOINVERT, _T("Previous Playlist Item")));
00877         ADDCMD((ID_VIEW_CAPTIONMENU, '0', FVIRTKEY|FCONTROL|FNOINVERT, _T("Toggle Caption&Menu")));
00878         ADDCMD((ID_VIEW_SEEKER, '1', FVIRTKEY|FCONTROL|FNOINVERT, _T("Toggle Seeker")));
00879         ADDCMD((ID_VIEW_CONTROLS, '2', FVIRTKEY|FCONTROL|FNOINVERT, _T("Toggle Controls")));
00880         ADDCMD((ID_VIEW_INFORMATION, '3', FVIRTKEY|FCONTROL|FNOINVERT, _T("Toggle Information")));
00881         ADDCMD((ID_VIEW_STATISTICS, '4', FVIRTKEY|FCONTROL|FNOINVERT, _T("Toggle Statistics")));
00882         ADDCMD((ID_VIEW_STATUS, '5', FVIRTKEY|FCONTROL|FNOINVERT, _T("Toggle Status")));
00883         ADDCMD((ID_VIEW_SUBRESYNC, '6', FVIRTKEY|FCONTROL|FNOINVERT, _T("Toggle Subresync Bar")));
00884         ADDCMD((ID_VIEW_PLAYLIST, '7', FVIRTKEY|FCONTROL|FNOINVERT, _T("Toggle Playlist Bar")));
00885         ADDCMD((ID_VIEW_CAPTURE, '8', FVIRTKEY|FCONTROL|FNOINVERT, _T("Toggle Capture Bar")));
00886         ADDCMD((ID_VIEW_PRESETS_MINIMAL, '0', FVIRTKEY|FSHIFT|FCONTROL|FNOINVERT, _T("View Minimal")));
00887         ADDCMD((ID_VIEW_PRESETS_COMPACT, '1', FVIRTKEY|FSHIFT|FCONTROL|FNOINVERT, _T("View Compact")));
00888         ADDCMD((ID_VIEW_PRESETS_NORMAL, '2', FVIRTKEY|FSHIFT|FCONTROL|FNOINVERT, _T("View Normal")));
00889         ADDCMD((ID_VIEW_FULLSCREEN, VK_RETURN, FVIRTKEY|FALT|FNOINVERT, _T("Fullscreen"), 0, wmcmd::LDBLCLK));
00890         ADDCMD((ID_VIEW_FULLSCREEN_SECONDARY, VK_RETURN, FVIRTKEY|FCONTROL|FNOINVERT, _T("Fullscreen (w/o res.change)")));
00891         ADDCMD((ID_VIEW_ZOOM_50, '1', FVIRTKEY|FALT|FNOINVERT, _T("Zoom 50%")));
00892         ADDCMD((ID_VIEW_ZOOM_100, '2', FVIRTKEY|FALT|FNOINVERT, _T("Zoom 100%")));
00893         ADDCMD((ID_VIEW_ZOOM_200, '3', FVIRTKEY|FALT|FNOINVERT, _T("Zoom 200%")));
00894         ADDCMD((ID_VIEW_VF_HALF, 0, FVIRTKEY|FNOINVERT, _T("VidFrm Half")));
00895         ADDCMD((ID_VIEW_VF_NORMAL, 0, FVIRTKEY|FNOINVERT, _T("VidFrm Normal")));
00896         ADDCMD((ID_VIEW_VF_DOUBLE, 0, FVIRTKEY|FNOINVERT, _T("VidFrm Double")));
00897         ADDCMD((ID_VIEW_VF_STRETCH, 0, FVIRTKEY|FNOINVERT, _T("VidFrm Stretch")));
00898         ADDCMD((ID_VIEW_VF_FROMINSIDE, 0, FVIRTKEY|FNOINVERT, _T("VidFrm Inside")));
00899         ADDCMD((ID_VIEW_VF_FROMOUTSIDE, 0, FVIRTKEY|FNOINVERT, _T("VidFrm Outside")));
00900         ADDCMD((ID_ONTOP_ALWAYS, 'T', FVIRTKEY|FCONTROL|FNOINVERT, _T("Always On Top")));
00901         ADDCMD((ID_VIEW_RESET, VK_NUMPAD5, FVIRTKEY|FNOINVERT, _T("PnS Reset")));
00902         ADDCMD((ID_VIEW_INCSIZE, VK_NUMPAD9, FVIRTKEY|FNOINVERT, _T("PnS Inc Size")));
00903         ADDCMD((ID_VIEW_INCWIDTH, VK_NUMPAD6, FVIRTKEY|FNOINVERT, _T("PnS Inc Width")));
00904         ADDCMD((ID_VIEW_INCHEIGHT, VK_NUMPAD8, FVIRTKEY|FNOINVERT, _T("PnS Inc Height")));
00905         ADDCMD((ID_VIEW_DECSIZE, VK_NUMPAD1, FVIRTKEY|FNOINVERT, _T("PnS Dec Size")));
00906         ADDCMD((ID_VIEW_DECWIDTH, VK_NUMPAD4, FVIRTKEY|FNOINVERT, _T("PnS Dec Width")));
00907         ADDCMD((ID_VIEW_DECHEIGHT, VK_NUMPAD2, FVIRTKEY|FNOINVERT, _T("PnS Dec Height")));
00908         ADDCMD((ID_PANSCAN_CENTER, VK_NUMPAD5, FVIRTKEY|FCONTROL|FNOINVERT, _T("PnS Center")));
00909         ADDCMD((ID_PANSCAN_MOVELEFT, VK_NUMPAD4, FVIRTKEY|FCONTROL|FNOINVERT, _T("PnS Left")));
00910         ADDCMD((ID_PANSCAN_MOVERIGHT, VK_NUMPAD6, FVIRTKEY|FCONTROL|FNOINVERT, _T("PnS Right")));
00911         ADDCMD((ID_PANSCAN_MOVEUP, VK_NUMPAD8, FVIRTKEY|FCONTROL|FNOINVERT, _T("PnS Up")));
00912         ADDCMD((ID_PANSCAN_MOVEDOWN, VK_NUMPAD2, FVIRTKEY|FCONTROL|FNOINVERT, _T("PnS Down")));
00913         ADDCMD((ID_PANSCAN_MOVEUPLEFT, VK_NUMPAD7, FVIRTKEY|FCONTROL|FNOINVERT, _T("PnS Up/Left")));
00914         ADDCMD((ID_PANSCAN_MOVEUPRIGHT, VK_NUMPAD9, FVIRTKEY|FCONTROL|FNOINVERT, _T("PnS Up/Right")));
00915         ADDCMD((ID_PANSCAN_MOVEDOWNLEFT, VK_NUMPAD1, FVIRTKEY|FCONTROL|FNOINVERT, _T("PnS Down/Left")));
00916         ADDCMD((ID_PANSCAN_MOVEDOWNRIGHT, VK_NUMPAD3, FVIRTKEY|FCONTROL|FNOINVERT, _T("PnS Down/Right")));
00917         ADDCMD((ID_PANSCAN_ROTATEXP, VK_NUMPAD8, FVIRTKEY|FALT|FNOINVERT, _T("PnS Rotate X+")));
00918         ADDCMD((ID_PANSCAN_ROTATEXM, VK_NUMPAD2, FVIRTKEY|FALT|FNOINVERT, _T("PnS Rotate X-")));
00919         ADDCMD((ID_PANSCAN_ROTATEYP, VK_NUMPAD4, FVIRTKEY|FALT|FNOINVERT, _T("PnS Rotate Y+")));
00920         ADDCMD((ID_PANSCAN_ROTATEYM, VK_NUMPAD6, FVIRTKEY|FALT|FNOINVERT, _T("PnS Rotate Y-")));
00921         ADDCMD((ID_PANSCAN_ROTATEZP, VK_NUMPAD1, FVIRTKEY|FALT|FNOINVERT, _T("PnS Rotate Z+")));
00922         ADDCMD((ID_PANSCAN_ROTATEZM, VK_NUMPAD3, FVIRTKEY|FALT|FNOINVERT, _T("PnS Rotate Z-")));
00923         ADDCMD((ID_VOLUME_UP, VK_UP, FVIRTKEY|FNOINVERT, _T("Volume Up"), APPCOMMAND_VOLUME_UP, wmcmd::WUP));
00924         ADDCMD((ID_VOLUME_DOWN, VK_DOWN, FVIRTKEY|FNOINVERT, _T("Volume Down"), APPCOMMAND_VOLUME_DOWN, wmcmd::WDOWN));
00925         ADDCMD((ID_VOLUME_MUTE, 'M', FVIRTKEY|FCONTROL|FNOINVERT, _T("Volume Mute"), APPCOMMAND_VOLUME_MUTE));
00926         ADDCMD((ID_NAVIGATE_TITLEMENU, 0, FVIRTKEY|FNOINVERT, _T("DVD Title Menu")));
00927         ADDCMD((ID_NAVIGATE_ROOTMENU, 0, FVIRTKEY|FNOINVERT, _T("DVD Root Menu")));
00928         ADDCMD((ID_NAVIGATE_SUBPICTUREMENU, 0, FVIRTKEY|FNOINVERT, _T("DVD Subtitle Menu")));
00929         ADDCMD((ID_NAVIGATE_AUDIOMENU, 0, FVIRTKEY|FNOINVERT, _T("DVD Audio Menu")));
00930         ADDCMD((ID_NAVIGATE_ANGLEMENU, 0, FVIRTKEY|FNOINVERT, _T("DVD Angle Menu")));
00931         ADDCMD((ID_NAVIGATE_CHAPTERMENU, 0, FVIRTKEY|FNOINVERT, _T("DVD Chapter Menu")));
00932         ADDCMD((ID_NAVIGATE_MENU_LEFT, 0, FVIRTKEY|FNOINVERT, _T("DVD Menu Left")));
00933         ADDCMD((ID_NAVIGATE_MENU_RIGHT, 0, FVIRTKEY|FNOINVERT, _T("DVD Menu Right")));
00934         ADDCMD((ID_NAVIGATE_MENU_UP, 0, FVIRTKEY|FNOINVERT, _T("DVD Menu Up")));
00935         ADDCMD((ID_NAVIGATE_MENU_DOWN, 0, FVIRTKEY|FNOINVERT, _T("DVD Menu Down")));
00936         ADDCMD((ID_NAVIGATE_MENU_ACTIVATE, 0, FVIRTKEY|FNOINVERT, _T("DVD Menu Activate")));
00937         ADDCMD((ID_NAVIGATE_MENU_BACK, 0, FVIRTKEY|FNOINVERT, _T("DVD Menu Back")));
00938         ADDCMD((ID_NAVIGATE_MENU_LEAVE, 0, FVIRTKEY|FNOINVERT, _T("DVD Menu Leave")));
00939         ADDCMD((ID_BOSS, 'B', FVIRTKEY|FNOINVERT, _T("Boss key")));
00940         ADDCMD((ID_MENU_PLAYER_SHORT, 0, FVIRTKEY|FNOINVERT, _T("Player Menu (short)"), 0, wmcmd::RUP));
00941         ADDCMD((ID_MENU_PLAYER_LONG, 0, FVIRTKEY|FNOINVERT, _T("Player Menu (long)")));
00942         ADDCMD((ID_MENU_FILTERS, 0, FVIRTKEY|FNOINVERT, _T("Filters Menu")));
00943         ADDCMD((ID_VIEW_OPTIONS, 'O', FVIRTKEY|FNOINVERT, _T("Options")));
00944         ADDCMD((ID_STREAM_AUDIO_NEXT, 'A', FVIRTKEY|FNOINVERT, _T("Next Audio")));
00945         ADDCMD((ID_STREAM_AUDIO_PREV, 'A', FVIRTKEY|FSHIFT|FNOINVERT, _T("Prev Audio")));
00946         ADDCMD((ID_STREAM_SUB_NEXT, 'S', FVIRTKEY|FNOINVERT, _T("Next Subtitle")));
00947         ADDCMD((ID_STREAM_SUB_PREV, 'S', FVIRTKEY|FSHIFT|FNOINVERT, _T("Prev Subtitle")));
00948         ADDCMD((ID_STREAM_SUB_ONOFF, 'W', FVIRTKEY|FNOINVERT, _T("On/Off Subtitle")));
00949         ADDCMD((ID_SUBTITLES_SUBITEM_START+2, 0, FVIRTKEY|FNOINVERT, _T("Reload Subtitles")));
00950         ADDCMD((ID_OGM_AUDIO_NEXT, 0, FVIRTKEY|FNOINVERT, _T("Next Audio (OGM)")));
00951         ADDCMD((ID_OGM_AUDIO_PREV, 0, FVIRTKEY|FNOINVERT, _T("Prev Audio (OGM)")));
00952         ADDCMD((ID_OGM_SUB_NEXT, 0, FVIRTKEY|FNOINVERT, _T("Next Subtitle (OGM)")));
00953         ADDCMD((ID_OGM_SUB_PREV, 0, FVIRTKEY|FNOINVERT, _T("Prev Subtitle (OGM)")));
00954         ADDCMD((ID_DVD_ANGLE_NEXT, 0, FVIRTKEY|FNOINVERT, _T("Next Angle (DVD)")));
00955         ADDCMD((ID_DVD_ANGLE_PREV, 0, FVIRTKEY|FNOINVERT, _T("Prev Angle (DVD)")));
00956         ADDCMD((ID_DVD_AUDIO_NEXT, 0, FVIRTKEY|FNOINVERT, _T("Next Audio (DVD)")));
00957         ADDCMD((ID_DVD_AUDIO_PREV, 0, FVIRTKEY|FNOINVERT, _T("Prev Audio (DVD)")));
00958         ADDCMD((ID_DVD_SUB_NEXT, 0, FVIRTKEY|FNOINVERT, _T("Next Subtitle (DVD)")));
00959         ADDCMD((ID_DVD_SUB_PREV, 0, FVIRTKEY|FNOINVERT, _T("Prev Subtitle (DVD)")));
00960         ADDCMD((ID_DVD_SUB_ONOFF, 0, FVIRTKEY|FNOINVERT, _T("On/Off Subtitle (DVD)")));
00961 #undef ADDCMD
00962 }
00963 
00964 CMPlayerCApp::Settings::~Settings()
00965 {
00966         if(hAccel)
00967                 DestroyAcceleratorTable(hAccel);
00968 }
00969 
00970 void CMPlayerCApp::Settings::UpdateData(bool fSave)
00971 {
00972         CWinApp* pApp = AfxGetApp();
00973         ASSERT(pApp);
00974 
00975         UINT len;
00976         BYTE* ptr = NULL;
00977 
00978         if(fSave)
00979         {
00980                 if(!fInitialized) return;
00981 
00982                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_HIDECAPTIONMENU), fHideCaptionMenu);
00983                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_CONTROLSTATE), nCS);
00984                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_DEFAULTVIDEOFRAME), iDefaultVideoSize);
00985                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_KEEPASPECTRATIO), fKeepAspectRatio);
00986                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_COMPMONDESKARDIFF), fCompMonDeskARDiff);
00987                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_VOLUME), nVolume);
00988                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_BALANCE), nBalance);
00989                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_MUTE), fMute);
00990                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_LOOPNUM), nLoops);
00991                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_LOOP), fLoopForever);
00992                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_REWIND), fRewind);
00993                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_ZOOM), iZoomLevel);
00994                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_MULTIINST), fAllowMultipleInst);
00995                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_TITLEBARTEXTSTYLE), iTitleBarTextStyle);
00996                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_ONTOP), iOnTop);
00997                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_TRAYICON), fTrayIcon);
00998                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_AUTOZOOM), fRememberZoomLevel);
00999                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_FULLSCREENCTRLS), fShowBarsWhenFullScreen);
01000                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_FULLSCREENCTRLSTIMEOUT), nShowBarsWhenFullScreenTimeOut);
01001                 pApp->WriteProfileBinary(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_FULLSCREENRES), (BYTE*)&dmFullscreenRes, sizeof(dmFullscreenRes));
01002                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_EXITFULLSCREENATTHEEND), fExitFullScreenAtTheEnd);
01003                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_REMEMBERWINDOWPOS), fRememberWindowPos);
01004                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_REMEMBERWINDOWSIZE), fRememberWindowSize);
01005                 pApp->WriteProfileBinary(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_LASTWINDOWRECT), (BYTE*)&rcLastWindowPos, sizeof(rcLastWindowPos));
01006                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_LASTWINDOWTYPE), lastWindowType);
01007                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_ASPECTRATIO_X), AspectRatio.cx);
01008                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_ASPECTRATIO_Y), AspectRatio.cy);
01009                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_KEEPHISTORY), fKeepHistory);
01010                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_DSVIDEORENDERERTYPE), iDSVideoRendererType);
01011                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_RMVIDEORENDERERTYPE), iRMVideoRendererType);
01012                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_QTVIDEORENDERERTYPE), iQTVideoRendererType);
01013                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_APSURACEFUSAGE), iAPSurfaceUsage);
01014                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_VMRSYNCFIX), fVMRSyncFix);
01015                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_DX9_RESIZER), iDX9Resizer);
01016                 pApp->WriteProfileString(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_AUDIORENDERERTYPE), CString(AudioRendererDisplayName));
01017                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_AUTOLOADAUDIO), fAutoloadAudio);
01018                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_AUTOLOADSUBTITLES), fAutoloadSubtitles);
01019                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_ENABLEWORKERTHREADFOROPENING), fEnableWorkerThreadForOpening);
01020                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_REPORTFAILEDPINS), fReportFailedPins);
01021                 pApp->WriteProfileString(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_DVDPATH), sDVDPath);
01022                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_USEDVDPATH), fUseDVDPath);
01023                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_MENULANG), idMenuLang);
01024                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_AUDIOLANG), idAudioLang);
01025                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_SUBTITLESLANG), idSubtitlesLang);
01026                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_AUTOSPEAKERCONF), fAutoSpeakerConf);
01027                 CString style;
01028                 pApp->WriteProfileString(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_SPLOGFONT), style <<= subdefstyle);
01029                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_SPOVERRIDEPLACEMENT), fOverridePlacement);
01030                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_SPHORPOS), nHorPos);
01031                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_SPVERPOS), nVerPos);
01032                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_SPCSIZE), nSPCSize);
01033                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_SPCMAXRES), nSPCMaxRes);
01034                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_POW2TEX), fSPCPow2Tex);
01035                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_ENABLEAUDIOSWITCHER), fEnableAudioSwitcher);
01036                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_ENABLEAUDIOTIMESHIFT), fAudioTimeShift);
01037                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_AUDIOTIMESHIFT), tAudioTimeShift);
01038                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_DOWNSAMPLETO441), fDownSampleTo441);
01039                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_CUSTOMCHANNELMAPPING), fCustomChannelMapping);
01040                 pApp->WriteProfileBinary(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_SPEAKERTOCHANNELMAPPING), (BYTE*)pSpeakerToChannelMap, sizeof(pSpeakerToChannelMap));
01041 
01042                 {
01043                         for(int i = 0; ; i++)
01044                         {
01045                                 CString key;
01046                                 key.Format(_T("%s\\%04d"), ResStr(IDS_R_FILTERS), i);
01047                                 int j = pApp->GetProfileInt(key, _T("Enabled"), -1); 
01048                                 pApp->WriteProfileString(key, NULL, NULL);
01049                                 if(j < 0) break;
01050                         }
01051                         pApp->WriteProfileString(ResStr(IDS_R_FILTERS), NULL, NULL);
01052 
01053                         POSITION pos = filters.GetHeadPosition();
01054                         for(int i = 0; pos; i++)
01055                         {
01056                                 Filter* f = filters.GetNext(pos);
01057 
01058                                 if(f->fTemporary)
01059                                         continue;
01060 
01061                                 CString key;
01062                                 key.Format(_T("%s\\%04d"), ResStr(IDS_R_FILTERS), i);
01063 
01064                                 pApp->WriteProfileInt(key, _T("SourceType"), (int)f->type);
01065                                 pApp->WriteProfileInt(key, _T("Enabled"), (int)!f->fDisabled);
01066                                 if(f->type == Filter::REGISTERED)
01067                                 {
01068                                         pApp->WriteProfileString(key, _T("DisplayName"), CString(f->dispname));
01069                                         pApp->WriteProfileString(key, _T("Name"), f->name);
01070                                 }
01071                                 else if(f->type == Filter::EXTERNAL)
01072                                 {
01073                                         pApp->WriteProfileString(key, _T("Path"), f->path);
01074                                         pApp->WriteProfileString(key, _T("Name"), f->name);
01075                                         pApp->WriteProfileString(key, _T("CLSID"), CStringFromGUID(f->clsid));
01076                                 }
01077                                 POSITION pos2 = f->backup.GetHeadPosition();
01078                                 for(int i = 0; pos2; i++)
01079                                 {
01080                                         CString val;
01081                                         val.Format(_T("org%04d"), i);
01082                                         pApp->WriteProfileString(key, val, CStringFromGUID(f->backup.GetNext(pos2)));
01083                                 }
01084                                 pos2 = f->guids.GetHeadPosition();
01085                                 for(int i = 0; pos2; i++)
01086                                 {
01087                                         CString val;
01088                                         val.Format(_T("mod%04d"), i);
01089                                         pApp->WriteProfileString(key, val, CStringFromGUID(f->guids.GetNext(pos2)));
01090                                 }
01091                                 pApp->WriteProfileInt(key, _T("LoadType"), f->iLoadType);
01092                                 pApp->WriteProfileInt(key, _T("Merit"), f->dwMerit);
01093                         }
01094                 }
01095 
01096                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_INTREALMEDIA), fIntRealMedia);
01097                 // pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_REALMEDIARENDERLESS), fRealMediaRenderless);
01098                 // pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_QUICKTIMERENDERER), iQuickTimeRenderer);
01099                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_REALMEDIAFPS), *((DWORD*)&RealMediaQuickTimeFPS));
01100 
01101                 pApp->WriteProfileString(ResStr(IDS_R_SETTINGS) + _T("\\") + ResStr(IDS_RS_PNSPRESETS), NULL, NULL);
01102                 for(int i = 0, j = m_pnspresets.GetCount(); i < j; i++)
01103                 {
01104                         CString str;
01105                         str.Format(_T("Preset%d"), i);
01106                         pApp->WriteProfileString(ResStr(IDS_R_SETTINGS) + _T("\\") + ResStr(IDS_RS_PNSPRESETS), str, m_pnspresets[i]);
01107                 }
01108 
01109                 pApp->WriteProfileString(ResStr(IDS_R_COMMANDS), NULL, NULL);
01110                 POSITION pos = wmcmds.GetHeadPosition();
01111                 for(int i = 0; pos; )
01112                 {
01113                         wmcmd& wc = wmcmds.GetNext(pos);
01114                         if(wc.IsModified())
01115                         {
01116                                 CString str;
01117                                 str.Format(_T("CommandMod%d"), i);
01118                                 CString str2;
01119                                 str2.Format(_T("%d %x %x %s %d %d %d"), 
01120                                         wc.cmd, wc.fVirt, wc.key, 
01121                                         _T("\"") + CString(wc.rmcmd) +  _T("\""), wc.rmrepcnt,
01122                                         wc.mouse, wc.appcmd);
01123                                 pApp->WriteProfileString(ResStr(IDS_R_COMMANDS), str, str2);
01124                                 i++;
01125                         }
01126                 }
01127 
01128                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_WINLIRC), fWinLirc);
01129                 pApp->WriteProfileString(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_WINLIRCADDR), WinLircAddr);
01130                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_UICE), fUIce);
01131                 pApp->WriteProfileString(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_UICEADDR), UIceAddr);
01132 
01133                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_DISABLEXPTOOLBARS), fDisabeXPToolbars);
01134                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_USEWMASFREADER), fUseWMASFReader);
01135                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_JUMPDISTS), nJumpDistS);
01136                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_JUMPDISTM), nJumpDistM);
01137                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_JUMPDISTL), nJumpDistL);
01138                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_FREEWINDOWRESIZING), fFreeWindowResizing);
01139                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_NOTIFYMSN), fNotifyMSN);            
01140 
01141                 Formats.UpdateData(true);
01142 
01143                 pApp->WriteProfileInt(ResStr(IDS_R_INTERNAL_FILTERS), ResStr(IDS_RS_SRCFILTERS), SrcFilters|~(SRC_LAST-1));
01144                 pApp->WriteProfileInt(ResStr(IDS_R_INTERNAL_FILTERS), ResStr(IDS_RS_TRAFILTERS), TraFilters|~(TRA_LAST-1));
01145 
01146                 pApp->WriteProfileString(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_LOGOFILE), logofn);
01147                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_LOGOID), logoid);
01148                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_LOGOEXT), logoext);
01149 
01150                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_MPEGDI), mpegdi);
01151                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_MPEGBRIGHT), (int)(mpegbright+255));
01152                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_MPEGCONT), (int)(mpegcont*100));
01153                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_MPEGHUE), (int)(mpeghue+180));
01154                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_MPEGSAT), (int)(mpegsat*100));
01155                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_MPEGFORCEDSUBS), mpegforcedsubs);
01156                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_MPEGPLANARYUV), mpegplanaryuv);
01157 
01158                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_MPASF), mpasf);
01159                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_MPANORMALIZE), mpanormalize);
01160                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_AC3SC), ac3sc);
01161                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_AC3DRC), ac3drc);
01162                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_DTSSC), dtssc);
01163                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_DTSDRC), dtsdrc);
01164                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_AACSC), aacsc);
01165                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_MPABOOST), (int)mpaboost);
01166 
01167                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_HIDECDROMSSUBMENU), fHideCDROMsSubMenu);
01168 
01169                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_PRIORITY), priority);
01170                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_LAUNCHFULLSCREEN), launchfullscreen);
01171 
01172                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_ENABLEWEBSERVER), fEnableWebServer);
01173                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_WEBSERVERPORT), nWebServerPort);
01174                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_WEBSERVERPRINTDEBUGINFO), fWebServerPrintDebugInfo);
01175                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_WEBSERVERUSECOMPRESSION), fWebServerUseCompression);
01176                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_WEBSERVERLOCALHOSTONLY), fWebServerLocalhostOnly);
01177                 pApp->WriteProfileString(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_WEBROOT), WebRoot);
01178                 pApp->WriteProfileString(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_WEBDEFINDEX), WebDefIndex);
01179                 pApp->WriteProfileString(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_WEBSERVERCGI), WebServerCGI);
01180 
01181                 pApp->WriteProfileString(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_SNAPSHOTPATH), SnapShotPath);
01182                 pApp->WriteProfileString(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_SNAPSHOTEXT), SnapShotExt);
01183 
01184                 pApp->WriteProfileString(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_ISDB), ISDb);
01185 
01186                 if(pApp->m_pszRegistryKey)
01187                 {
01188                         // WINBUG: on win2k this would crash WritePrivateProfileString
01189                         pApp->WriteProfileInt(_T(""), _T(""), pApp->GetProfileInt(_T(""), _T(""), 0)?0:1);
01190                 }
01191         }
01192         else
01193         {
01194                 if(fInitialized) return;
01195 
01196                 if(pApp->m_pszRegistryKey)
01197                 {
01198                         CRegKey appkey, settingskey;
01199                         appkey.Attach(pApp->GetAppRegistryKey());
01200                         settingskey.Attach(pApp->GetSectionKey(ResStr(IDS_R_INTERNAL_FILTERS)));
01201                         if(appkey && settingskey)
01202                         {
01203                                 ULONGLONG ftapp = 0, ftsettings = 0;
01204                                 RegQueryInfoKey(appkey, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, (FILETIME*)&ftapp);
01205                                 RegQueryInfoKey(settingskey, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, (FILETIME*)&ftsettings);
01206                                 if(ftapp < ftsettings)
01207                                 {
01208                                         pApp->WriteProfileInt(ResStr(IDS_R_INTERNAL_FILTERS), ResStr(IDS_RS_SRCFILTERS), ~0);
01209                                         pApp->WriteProfileInt(ResStr(IDS_R_INTERNAL_FILTERS), ResStr(IDS_RS_TRAFILTERS), ~0^TRA_MPEG1);
01210                                 }
01211                         }
01212                 }
01213 
01214                 OSVERSIONINFO vi;
01215                 vi.dwOSVersionInfoSize = sizeof(vi);
01216                 GetVersionEx(&vi);
01217                 fXpOrBetter = (vi.dwMajorVersion >= 5 && vi.dwMinorVersion >= 1 || vi.dwMajorVersion >= 6);
01218 
01219                 iDXVer = 0;
01220                 CRegKey dxver;
01221                 if(ERROR_SUCCESS == dxver.Open(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\DirectX"), KEY_READ))
01222                 {
01223                         CString str;
01224                         ULONG len = 64;
01225                         if(ERROR_SUCCESS == dxver.QueryStringValue(_T("Version"), str.GetBuffer(len), &len))
01226                         {
01227                                 str.ReleaseBuffer(len);
01228                                 int ver[4];
01229                                 _stscanf(str, _T("%d.%d.%d.%d"), ver+0, ver+1, ver+2, ver+3);
01230                                 iDXVer = ver[1];
01231                         }
01232                 }
01233 
01234                 fHideCaptionMenu = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_HIDECAPTIONMENU), 0);
01235                 nCS = pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_CONTROLSTATE), CS_SEEKBAR|CS_TOOLBAR|CS_INFOBAR|CS_STATUSBAR);
01236                 iDefaultVideoSize = pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_DEFAULTVIDEOFRAME), DVS_FROMINSIDE);
01237                 fKeepAspectRatio = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_KEEPASPECTRATIO), TRUE);
01238                 fCompMonDeskARDiff = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_COMPMONDESKARDIFF), FALSE);
01239                 nVolume = pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_VOLUME), 100);
01240                 nBalance = pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_BALANCE), 0);
01241                 fMute = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_MUTE), 0);
01242                 nLoops = pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_LOOPNUM), 1);
01243                 fLoopForever = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_LOOP), 1);
01244                 fRewind = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_REWIND), TRUE);
01245                 iZoomLevel = pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_ZOOM), 1);
01246                 iDSVideoRendererType = pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_DSVIDEORENDERERTYPE), VIDRNDT_DS_DEFAULT);
01247                 iRMVideoRendererType = pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_RMVIDEORENDERERTYPE), VIDRNDT_RM_DEFAULT);
01248                 iQTVideoRendererType = pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_QTVIDEORENDERERTYPE), VIDRNDT_QT_DEFAULT);
01249                 iAPSurfaceUsage = pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_APSURACEFUSAGE), VIDRNDT_AP_TEXTURE2D);
01250                 fVMRSyncFix = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_VMRSYNCFIX), TRUE);
01251                 iDX9Resizer = pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_DX9_RESIZER), 1);
01252                 AudioRendererDisplayName = pApp->GetProfileString(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_AUDIORENDERERTYPE), _T(""));
01253                 fAutoloadAudio = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_AUTOLOADAUDIO), TRUE);
01254                 fAutoloadSubtitles = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_AUTOLOADSUBTITLES), TRUE);
01255                 fEnableWorkerThreadForOpening = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_ENABLEWORKERTHREADFOROPENING), TRUE);
01256                 fReportFailedPins = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_REPORTFAILEDPINS), TRUE);
01257                 fAllowMultipleInst = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_MULTIINST), 0);
01258                 iTitleBarTextStyle = pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_TITLEBARTEXTSTYLE), 1);
01259                 iOnTop = pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_ONTOP), 0);
01260                 fTrayIcon = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_TRAYICON), 0);
01261                 fRememberZoomLevel = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_AUTOZOOM), 1);
01262                 fShowBarsWhenFullScreen = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_FULLSCREENCTRLS), 1);
01263                 nShowBarsWhenFullScreenTimeOut = pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_FULLSCREENCTRLSTIMEOUT), 0);
01264                 if(pApp->GetProfileBinary(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_FULLSCREENRES), &ptr, &len))
01265                 {
01266                         memcpy(&dmFullscreenRes, ptr, sizeof(dmFullscreenRes));
01267                         delete [] ptr;
01268                 }
01269                 else
01270                 {
01271                         dmFullscreenRes.fValid = false;
01272                 }
01273                 fExitFullScreenAtTheEnd = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_EXITFULLSCREENATTHEEND), 0);
01274                 fRememberWindowPos = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_REMEMBERWINDOWPOS), 0);
01275                 fRememberWindowSize = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_REMEMBERWINDOWSIZE), 0);
01276                 AspectRatio.cx = pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_ASPECTRATIO_X), 0);
01277                 AspectRatio.cy = pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_ASPECTRATIO_Y), 0);
01278                 fKeepHistory = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_KEEPHISTORY), 1);
01279                 if(pApp->GetProfileBinary(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_LASTWINDOWRECT), &ptr, &len))
01280                 {
01281                         memcpy(&rcLastWindowPos, ptr, sizeof(rcLastWindowPos));
01282                         delete [] ptr;
01283                 }
01284                 else
01285                 {
01286                         fRememberWindowPos = false;
01287                 }
01288                 lastWindowType = pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_LASTWINDOWTYPE), SIZE_RESTORED);
01289                 sDVDPath = pApp->GetProfileString(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_DVDPATH), _T(""));
01290                 fUseDVDPath = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_USEDVDPATH), 0);
01291                 idMenuLang = pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_MENULANG), ::GetUserDefaultLCID());
01292                 idAudioLang = pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_AUDIOLANG), ::GetUserDefaultLCID());
01293                 idSubtitlesLang = pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_SUBTITLESLANG), ::GetUserDefaultLCID());
01294                 fAutoSpeakerConf = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_AUTOSPEAKERCONF), 1);
01295                 // TODO: rename subdefstyle -> defStyle, IDS_RS_SPLOGFONT -> IDS_RS_SPSTYLE
01296                 subdefstyle <<= pApp->GetProfileString(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_SPLOGFONT), _T(""));
01297                 fOverridePlacement = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_SPOVERRIDEPLACEMENT), 0);
01298                 nHorPos = pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_SPHORPOS), 50);
01299                 nVerPos = pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_SPVERPOS), 90);
01300                 nSPCSize = pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_SPCSIZE), 3);
01301                 nSPCMaxRes = pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_SPCMAXRES), 2);
01302                 fSPCPow2Tex = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_POW2TEX), TRUE);
01303                 fEnableAudioSwitcher = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_ENABLEAUDIOSWITCHER), TRUE);
01304                 fAudioTimeShift = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_ENABLEAUDIOTIMESHIFT), 0);
01305                 tAudioTimeShift = pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_AUDIOTIMESHIFT), 0);
01306                 fDownSampleTo441 = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_DOWNSAMPLETO441), 0);
01307                 fCustomChannelMapping = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_CUSTOMCHANNELMAPPING), 0);
01308                 if(pApp->GetProfileBinary(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_SPEAKERTOCHANNELMAPPING), &ptr, &len))
01309                 {
01310                         memcpy(pSpeakerToChannelMap, ptr, sizeof(pSpeakerToChannelMap));
01311                         delete [] ptr;
01312                 }
01313                 else
01314                 {
01315                         memset(pSpeakerToChannelMap, 0, sizeof(pSpeakerToChannelMap));
01316                         for(int j = 0; j < 18; j++)
01317                                 for(int i = 0; i <= j; i++)
01318                                         pSpeakerToChannelMap[j][i] = 1<<i;
01319 
01320                         pSpeakerToChannelMap[0][0] = 1<<0;
01321                         pSpeakerToChannelMap[0][1] = 1<<0;
01322 
01323                         pSpeakerToChannelMap[3][0] = 1<<0;
01324                         pSpeakerToChannelMap[3][1] = 1<<1;
01325                         pSpeakerToChannelMap[3][2] = 0;
01326                         pSpeakerToChannelMap[3][3] = 0;
01327                         pSpeakerToChannelMap[3][4] = 1<<2;
01328                         pSpeakerToChannelMap[3][5] = 1<<3;
01329 
01330                         pSpeakerToChannelMap[4][0] = 1<<0;
01331                         pSpeakerToChannelMap[4][1] = 1<<1;
01332                         pSpeakerToChannelMap[4][2] = 1<<2;
01333                         pSpeakerToChannelMap[4][3] = 0;
01334                         pSpeakerToChannelMap[4][4] = 1<<3;
01335                         pSpeakerToChannelMap[4][5] = 1<<4;
01336                 }
01337 
01338                 {
01339                         for(int i = 0; ; i++)
01340                         {
01341                                 CString key;
01342                                 key.Format(_T("%s\\%04d"), ResStr(IDS_R_FILTERS), i);
01343 
01344                                 CAutoPtr<Filter> f(new Filter);
01345 
01346                                 f->fDisabled = !pApp->GetProfileInt(key, _T("Enabled"), 0);
01347 
01348                                 UINT j = pApp->GetProfileInt(key, _T("SourceType"), -1);
01349                                 if(j == 0)
01350                                 {
01351                                         f->type = Filter::REGISTERED;
01352                                         f->dispname = CStringW(pApp->GetProfileString(key, _T("DisplayName"), _T("")));
01353                                         f->name = pApp->GetProfileString(key, _T("Name"), _T(""));
01354                                 }
01355                                 else if(j == 1)
01356                                 {
01357                                         f->type = Filter::EXTERNAL;
01358                                         f->path = pApp->GetProfileString(key, _T("Path"), _T(""));
01359                                         f->name = pApp->GetProfileString(key, _T("Name"), _T(""));
01360                                         f->clsid = GUIDFromCString(pApp->GetProfileString(key, _T("CLSID"), _T("")));
01361                                 }
01362                                 else
01363                                 {
01364                                         pApp->WriteProfileString(key, NULL, 0);
01365                                         break;
01366                                 }
01367 
01368                                 f->backup.RemoveAll();
01369                                 for(int i = 0; ; i++)
01370                                 {
01371                                         CString val;
01372                                         val.Format(_T("org%04d"), i);
01373                                         CString guid = pApp->GetProfileString(key, val, _T(""));
01374                                         if(guid.IsEmpty()) break;
01375                                         f->backup.AddTail(GUIDFromCString(guid));
01376                                 }
01377 
01378                                 f->guids.RemoveAll();
01379                                 for(int i = 0; ; i++)
01380                                 {
01381                                         CString val;
01382                                         val.Format(_T("mod%04d"), i);
01383                                         CString guid = pApp->GetProfileString(key, val, _T(""));
01384                                         if(guid.IsEmpty()) break;
01385                                         f->guids.AddTail(GUIDFromCString(guid));
01386                                 }
01387 
01388                                 f->iLoadType = (int)pApp->GetProfileInt(key, _T("LoadType"), -1);
01389                                 if(f->iLoadType < 0) break;
01390 
01391                                 f->dwMerit = pApp->GetProfileInt(key, _T("Merit"), MERIT_DO_NOT_USE+1);
01392 
01393                                 filters.AddTail(f);
01394                         }
01395                 }
01396 
01397                 fIntRealMedia = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_INTREALMEDIA), 0);
01398                 //fRealMediaRenderless = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_REALMEDIARENDERLESS), 0);
01399                 //iQuickTimeRenderer = pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_QUICKTIMERENDERER), 2);
01400                 RealMediaQuickTimeFPS = 25.0;
01401                 *((DWORD*)&RealMediaQuickTimeFPS) = pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_REALMEDIAFPS), *((DWORD*)&RealMediaQuickTimeFPS));
01402 
01403                 m_pnspresets.RemoveAll();
01404                 for(int i = 0; i < (ID_PANNSCAN_PRESETS_END - ID_PANNSCAN_PRESETS_START); i++)
01405                 {
01406                         CString str;
01407                         str.Format(_T("Preset%d"), i);
01408                         str = pApp->GetProfileString(ResStr(IDS_R_SETTINGS) + _T("\\") + ResStr(IDS_RS_PNSPRESETS), str, _T(""));
01409                         if(str.IsEmpty()) break;
01410                         m_pnspresets.Add(str);
01411                 }
01412                 if(m_pnspresets.IsEmpty())
01413                 {
01414                         double _4p3 = 4.0/3.0;
01415                         double _16p9 = 16.0/9.0;
01416                         double _185p1 = 1.85/1.0;
01417                         double _235p1 = 2.35/1.0;
01418 
01419                         CString str;
01420                         str.Format(_T("Scale to 16:9 TV,%.3f,%.3f,%.3f,%.3f"), 0.5, 0.5, _4p3/_4p3, _16p9/_4p3);
01421                         m_pnspresets.Add(str);
01422                         str.Format(_T("Zoom To Widescreen,%.3f,%.3f,%.3f,%.3f"), 0.5, 0.5, _16p9/_4p3, _16p9/_4p3);
01423                         m_pnspresets.Add(str);
01424                         str.Format(_T("Zoom To Ultra-Widescreen,%.3f,%.3f,%.3f,%.3f"), 0.5, 0.5, _235p1/_4p3, _235p1/_4p3);
01425                         m_pnspresets.Add(str);
01426                 }
01427 
01428                 for(int i = 0; i < wmcmds.GetCount(); i++)
01429                 {
01430                         CString str;
01431                         str.Format(_T("CommandMod%d"), i);
01432                         str = pApp->GetProfileString(ResStr(IDS_R_COMMANDS), str, _T(""));
01433                         if(str.IsEmpty()) break;
01434                         int cmd, fVirt, key, repcnt, mouse, appcmd;
01435                         TCHAR buff[128];
01436                         int n;
01437                         if(5 > (n = _stscanf(str, _T("%d %x %x %s %d %d %d"), &cmd, &fVirt, &key, buff, &repcnt, &mouse, &appcmd)))
01438                                 break;
01439                         if(POSITION pos = wmcmds.Find(cmd))
01440                         {
01441                                 wmcmd& wc = wmcmds.GetAt(pos);
01442                 wc.cmd = cmd;
01443                                 wc.fVirt = fVirt;
01444                                 wc.key = key;
01445                                 if(n >= 6) wc.mouse = (UINT)mouse;
01446                                 if(n >= 7) wc.appcmd = (UINT)appcmd;
01447                                 wc.rmcmd = CStringA(buff).Trim('\"');
01448                                 wc.rmrepcnt = repcnt;
01449                         }
01450                 }
01451 
01452                 CArray<ACCEL> pAccel;
01453                 pAccel.SetSize(wmcmds.GetCount());
01454                 POSITION pos = wmcmds.GetHeadPosition();
01455                 for(int i = 0; pos; i++) pAccel[i] = wmcmds.GetNext(pos);
01456                 hAccel = CreateAcceleratorTable(pAccel.GetData(), pAccel.GetCount());
01457 
01458                 WinLircAddr = pApp->GetProfileString(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_WINLIRCADDR), _T("127.0.0.1:8765"));
01459                 fWinLirc = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_WINLIRC), 0);
01460                 UIceAddr = pApp->GetProfileString(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_UICEADDR), _T("127.0.0.1:1234"));
01461                 fUIce = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_UICE), 0);
01462 
01463                 fDisabeXPToolbars = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_DISABLEXPTOOLBARS), 0);
01464                 fUseWMASFReader = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_USEWMASFREADER), TRUE);
01465                 nJumpDistS = pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_JUMPDISTS), 1000);
01466                 nJumpDistM = pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_JUMPDISTM), 5000);
01467                 nJumpDistL = pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_JUMPDISTL), 20000);
01468                 fFreeWindowResizing = pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_FREEWINDOWRESIZING), TRUE);
01469                 fNotifyMSN = pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_NOTIFYMSN), TRUE);
01470 
01471                 Formats.UpdateData(false);
01472 
01473                 SrcFilters = pApp->GetProfileInt(ResStr(IDS_R_INTERNAL_FILTERS), ResStr(IDS_RS_SRCFILTERS), ~0);
01474                 TraFilters = pApp->GetProfileInt(ResStr(IDS_R_INTERNAL_FILTERS), ResStr(IDS_RS_TRAFILTERS), ~0^TRA_MPEG1);
01475 
01476                 logofn = pApp->GetProfileString(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_LOGOFILE), _T(""));
01477                 logoid = pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_LOGOID), IDB_LOGO7);
01478                 logoext = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_LOGOEXT), 0);
01479 
01480                 mpegdi = pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_MPEGDI), 0);
01481                 mpegbright = (double)pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_MPEGBRIGHT), 255) - 255;
01482                 mpegcont = (double)pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_MPEGCONT), 100) / 100;
01483                 mpeghue = (double)pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_MPEGHUE), 180) - 180;
01484                 mpegsat = (double)pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_MPEGSAT), 100) / 100;
01485                 mpegforcedsubs = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_MPEGFORCEDSUBS), 1);
01486                 mpegplanaryuv = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_MPEGPLANARYUV), 1);
01487 
01488                 mpasf = pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_MPASF), 0);
01489                 mpanormalize = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_MPANORMALIZE), FALSE);
01490                 ac3sc = (int)pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_AC3SC), 2);
01491                 ac3drc = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_AC3DRC), FALSE);
01492                 dtssc = (int)pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_DTSSC), 2);
01493                 dtsdrc = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_DTSDRC), FALSE);
01494                 aacsc = (int)pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_AACSC), 1);
01495                 mpaboost = (float)pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_MPABOOST), 1);
01496 
01497                 fHideCDROMsSubMenu = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_HIDECDROMSSUBMENU), 0);                
01498 
01499                 priority = pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_PRIORITY), NORMAL_PRIORITY_CLASS);
01500                 ::SetPriorityClass(::GetCurrentProcess(), priority);
01501                 launchfullscreen = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_LAUNCHFULLSCREEN), FALSE);
01502 
01503                 fEnableWebServer = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_ENABLEWEBSERVER), FALSE);
01504                 nWebServerPort = pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_WEBSERVERPORT), 13579);
01505                 fWebServerPrintDebugInfo = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_WEBSERVERPRINTDEBUGINFO), FALSE);
01506                 fWebServerUseCompression = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_WEBSERVERUSECOMPRESSION), TRUE);
01507                 fWebServerLocalhostOnly = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_WEBSERVERLOCALHOSTONLY), TRUE);
01508                 WebRoot = pApp->GetProfileString(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_WEBROOT), _T("*./webroot"));
01509                 WebDefIndex = pApp->GetProfileString(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_WEBDEFINDEX), _T("index.html;index.php"));
01510                 WebServerCGI = pApp->GetProfileString(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_WEBSERVERCGI), _T(""));
01511 
01512                 CString MyPictures;
01513 
01514                 CRegKey key;
01515                 // grrrrr
01516                 // if(!SHGetSpecialFolderPath(NULL, MyPictures.GetBufferSetLength(MAX_PATH), CSIDL_MYPICTURES, TRUE)) MyPictures.Empty();
01517                 // else MyPictures.ReleaseBuffer();
01518                 if(ERROR_SUCCESS == key.Open(HKEY_CURRENT_USER, _T("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders"), KEY_READ))
01519                 {
01520                         ULONG len = MAX_PATH;
01521                         if(ERROR_SUCCESS == key.QueryStringValue(_T("My Pictures"), MyPictures.GetBuffer(MAX_PATH), &len)) MyPictures.ReleaseBufferSetLength(len);
01522                         else MyPictures.Empty();
01523                 }
01524                 SnapShotPath = pApp->GetProfileString(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_SNAPSHOTPATH), MyPictures);
01525                 SnapShotExt = pApp->GetProfileString(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_SNAPSHOTEXT), _T(".bmp"));
01526 
01527                 ISDb = pApp->GetProfileString(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_ISDB), _T("isdb.go.dyndns.org"));
01528 
01529                 pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), _T("LastUsedPage"), 0);
01530 
01531                 if(!pApp->GetProfileInt(_T("Shaders"), _T("Initialized"), 0))
01532                 {
01533                         pApp->WriteProfileString(_T("Shaders"), NULL, NULL);
01534 
01535                         CString hdr = 
01536                                 _T("|ps_2_0|")
01537                                 _T("sampler s0 : register(s0);\\n")
01538                                 _T("float4 p0 : register(c0);\\n")
01539                                 _T("float4 p1 : register(c1);\\n")
01540                                 _T("\\n")
01541                                 _T("#define width (p0[0])\\n")
01542                                 _T("#define height (p0[1])\\n")
01543                                 _T("#define counter (p0[2])\\n")
01544                                 _T("#define clock (p0[3])\\n")
01545                                 _T("#define one_over_width (p1[0])\\n")
01546                                 _T("#define one_over_height (p1[1])\\n")
01547                                 _T("\\n")
01548                                 _T("#define PI acos(-1)\\n")
01549                                 _T("\\n")
01550                                 _T("float4 main(float2 tex : TEXCOORD0) : COLOR\\n")
01551                                 _T("{\\n");
01552 
01553                         CString ftr = 
01554                                 _T("\\t\\n")
01555                                 _T("\\treturn c0;\\n}")
01556                                 _T("\\n");
01557 
01558                         pApp->WriteProfileString(_T("Shaders"), _T("0"), _T("contour") + hdr + 
01559                                 _T("\\tfloat dx = 4/width;\\n")
01560                                 _T("\\tfloat dy = 4/height;\\n")
01561                                 _T("\\t\\n")
01562                                 _T("\\tfloat4 c2 = tex2D(s0, tex + float2(0,-dy));\\n")
01563                                 _T("\\tfloat4 c4 = tex2D(s0, tex + float2(-dx,0));\\n")
01564                                 _T("\\tfloat4 c5 = tex2D(s0, tex + float2(0,0));\\n")
01565                                 _T("\\tfloat4 c6 = tex2D(s0, tex + float2(dx,0));\\n")
01566                                 _T("\\tfloat4 c8 = tex2D(s0, tex + float2(0,dy));\\n")
01567                                 _T("\\t\\n")
01568                                 _T("\\tfloat4 c0 = (-c2-c4+c5*4-c6-c8);\\n")
01569                                 _T("\\tif(length(c0) < 1.0) c0 = float4(0,0,0,0);\\n")
01570                                 _T("\\telse c0 = float4(1,1,1,0);\\n") + ftr);
01571 
01572                         pApp->WriteProfileString(_T("Shaders"), _T("1"), _T("deinterlace (blend)") + hdr + 
01573                                 _T("\\tfloat4 c0 = tex2D(s0, tex);\\n")
01574                                 _T("\\t\\n")
01575                                 _T("\\tfloat2 h = float2(0, 1/height);\\n")
01576                                 _T("\\tfloat4 c1 = tex2D(s0, tex-h);\\n")
01577                                 _T("\\tfloat4 c2 = tex2D(s0, tex+h);\\n")
01578                                 _T("\\tc0 = (c0*2+c1+c2)/4;\\n") + ftr);
01579 
01580                         pApp->WriteProfileString(_T("Shaders"), _T("2"), _T("emboss") + hdr + 
01581                                 _T("\\tfloat dx = 1/width;\\n")
01582                                 _T("\\tfloat dy = 1/height;\\n")
01583                                 _T("\\t\\n")
01584                                 _T("\\tfloat4 c1 = tex2D(s0, tex + float2(-dx,-dy));\\n")
01585                                 _T("\\tfloat4 c2 = tex2D(s0, tex + float2(0,-dy));\\n")
01586                                 _T("\\tfloat4 c4 = tex2D(s0, tex + float2(-dx,0));\\n")
01587                                 _T("\\tfloat4 c6 = tex2D(s0, tex + float2(dx,0));\\n")
01588                                 _T("\\tfloat4 c8 = tex2D(s0, tex + float2(0,dy));\\n")
01589                                 _T("\\tfloat4 c9 = tex2D(s0, tex + float2(dx,dy));\\n")
01590                                 _T("\\t\\n")
01591                                 _T("\\tfloat4 c0 = (-c1-c2-c4+c6+c8+c9);\\n")
01592                                 _T("\\tc0 = (c0.r+c0.g+c0.b)/3 + 0.5;\\n") + ftr);
01593 
01594                         pApp->WriteProfileString(_T("Shaders"), _T("3"), _T("grayscale") + hdr + 
01595                                 _T("\\tfloat c0 = dot(tex2D(s0, tex), float4(0.299, 0.587, 0.114, 0));\\n") + ftr);
01596 
01597                         pApp->WriteProfileString(_T("Shaders"), _T("4"), _T("invert") + hdr + 
01598                                 _T("\\tfloat4 c0 = float4(1, 1, 1, 1) - tex2D(s0, tex);\\n") + ftr);
01599 
01600                         pApp->WriteProfileString(_T("Shaders"), _T("5"), _T("letterbox") + hdr + 
01601                                 _T("\\tfloat4 c0 = 0;\\n")
01602                                 _T("\\t\\n")
01603                                 _T("\\tfloat2 ar = float2(16, 9);\\n")
01604                                 _T("\\tfloat h = (1 - width/height * ar.y/ar.x) / 2;\\n")
01605                                 _T("\\t\\n")
01606                                 _T("\\tif(tex.y >= h && tex.y <= 1-h)\\n")
01607                                 _T("\\t\\tc0 = tex2D(s0, tex);\\n") + ftr);
01608 
01609                         pApp->WriteProfileString(_T("Shaders"), _T("6"), _T("sphere") + hdr + 
01610                                 _T("\\t// - this is a very simple raytracer, one sphere only\\n")
01611                                 _T("\\t// - no reflection or refraction, yet (my ati 9800 has a 64 + 32 instruction limit...)\\n")
01612                                 _T("\\t\\n")
01613                                 _T("\\tfloat3 pl = float3(3,-3,-4); // light pos\\n")
01614                                 _T("\\tfloat4 cl = 0.4; // light color\\n")
01615                                 _T("\\t\\n")
01616                                 _T("\\tfloat3 pc = float3(0,0,-1); // cam pos\\n")
01617                                 _T("\\tfloat3 ps = float3(0,0,0.5); // sphere pos\\n")
01618                                 _T("\\tfloat r = 0.65; // sphere radius\\n")
01619                                 _T("\\t\\n")
01620                                 _T("\\tfloat3 pd = normalize(float3(tex.x-0.5, tex.y-0.5, 0) - pc);\\n")
01621                                 _T("\\t\\n")
01622                                 _T("\\tfloat A = 1;\\n")
01623                                 _T("\\tfloat B = 2*dot(pd, pc - ps);\\n")
01624                                 _T("\\tfloat C = dot(pc - ps, pc - ps) - r*r;\\n")
01625                                 _T("\\tfloat D = B*B - 4*A*C;\\n")
01626                                 _T("\\t\\n")
01627                                 _T("\\tfloat4 c0 = 0;\\n")
01628                                 _T("\\t\\n")
01629                                 _T("\\tif(D >= 0)\\n")
01630                                 _T("\\t{\\n")
01631                                 _T("\\t\\t// t2 is the smaller, obviously...\\n")
01632                                 _T("\\t\\t// float t1 = (-B + sqrt(D)) / (2*A);\\n")
01633                                 _T("\\t\\t// float t2 = (-B - sqrt(D)) / (2*A);\\n")
01634                                 _T("\\t\\t// float t = min(t1, t2); \\n")
01635                                 _T("\\t\\t\\n")
01636                                 _T("\\t\\tfloat t = (-B - sqrt(D)) / (2*A);\\n")
01637                                 _T("\\t\\t\\n")
01638                                 _T("\\t\\t// intersection data\\n")
01639                                 _T("\\t\\tfloat3 p = pc + pd*t;\\n")
01640                                 _T("\\t\\tfloat3 n = normalize(p - ps);\\n")
01641                                 _T("\\t\\tfloat3 l = normalize(pl - p);\\n")
01642                                 _T("\\t\\t\\n")
01643                                 _T("\\t\\t// mapping the image onto the sphere\\n")
01644                                 _T("\\t\\ttex = acos(-n)/PI; \\n")
01645                                 _T("\\t\\t\\n")
01646                                 _T("\\t\\t// rotate it\\n")
01647                                 _T("\\t\\ttex.x = frac(tex.x + frac(clock/10));\\n")
01648                                 _T("\\t\\t\\n")
01649                                 _T("\\t\\t// diffuse + specular\\n")
01650                                 _T("\\t\\tc0 = tex2D(s0, tex) * dot(n, l) + cl * pow(max(dot(l, reflect(pd, n)), 0), 50);\\n")
01651                                 _T("\\t}\\n") + ftr);
01652 
01653                         pApp->WriteProfileString(_T("Shaders"), _T("7"), _T("spotlight") + hdr + 
01654                                 _T("\\tfloat4 c0 = tex2D(s0, tex);\\n")
01655                                 _T("\\tfloat3 lightsrc = float3(sin(clock*PI/1.5)/2+0.5,cos(clock*PI)/2+0.5,1);\\n")
01656                                 _T("\\tfloat3 light = normalize(lightsrc - float3(tex.x,tex.y,0));\\n")
01657                                 _T("\\tc0 *= pow(dot(light, float3(0,0,1)), 50);\\n") + ftr);
01658 
01659                         pApp->WriteProfileString(_T("Shaders"), _T("8"), _T("wave") + hdr + 
01660                                 _T("\\t// don't look at this for too long, you'll get dizzy :)\\n")
01661                                 _T("\\t\\n")
01662                                 _T("\\tfloat4 c0 = 0;\\n")
01663                                 _T("\\t\\n")
01664                                 _T("\\ttex.x += sin(tex.x+clock/0.3)/20;\\n")
01665                                 _T("\\ttex.y += sin(tex.x+clock/0.3)/20;\\n")
01666                                 _T("\\t\\n")
01667                                 _T("\\tif(tex.x >= 0 && tex.x <= 1 && tex.y >= 0 && tex.y <= 1)\\n")
01668                                 _T("\\t{\\n")
01669                                 _T("\\t\\tc0 = tex2D(s0, tex);\\n")
01670                                 _T("\\t}\\n") + ftr);
01671 
01672                         pApp->WriteProfileInt(_T("Shaders"), _T("Initialized"), 1);
01673                 }
01674 
01675                 fInitialized = true;
01676         }
01677 }
01678 
01679 void CMPlayerCApp::Settings::ParseCommandLine(CList<CString>& cmdln)
01680 {
01681         nCLSwitches = 0;
01682         slFiles.RemoveAll();
01683         slDubs.RemoveAll();
01684         slSubs.RemoveAll();
01685         slFilters.RemoveAll();
01686         rtStart = 0;
01687         fixedWindowSize.SetSize(0, 0);
01688 
01689         if(launchfullscreen) nCLSwitches |= CLSW_FULLSCREEN;
01690 
01691         POSITION pos = cmdln.GetHeadPosition();
01692         while(pos)
01693         {
01694                 CString param = cmdln.GetNext(pos);
01695                 if(param.IsEmpty()) continue;
01696 
01697                 if((param[0] == '-' || param[0] == '/') && param.GetLength() > 1)
01698                 {
01699                         CString sw = param.Mid(1).MakeLower();
01700                         if(sw == _T("open")) nCLSwitches |= CLSW_OPEN;
01701                         else if(sw == _T("play")) nCLSwitches |= CLSW_PLAY;
01702                         else if(sw == _T("fullscreen")) nCLSwitches |= CLSW_FULLSCREEN;
01703                         else if(sw == _T("minimized")) nCLSwitches |= CLSW_MINIMIZED;
01704                         else if(sw == _T("new")) nCLSwitches |= CLSW_NEW;
01705                         else if(sw == _T("help") || sw == _T("h") || sw == _T("?")) nCLSwitches |= CLSW_HELP;
01706                         else if(sw == _T("dub") && pos) slDubs.AddTail(cmdln.GetNext(pos));
01707                         else if(sw == _T("sub") && pos) slSubs.AddTail(cmdln.GetNext(pos));
01708                         else if(sw == _T("filter") && pos) slFilters.AddTail(cmdln.GetNext(pos));
01709                         else if(sw == _T("dvd")) nCLSwitches |= CLSW_DVD;
01710                         else if(sw == _T("cd")) nCLSwitches |= CLSW_CD;
01711                         else if(sw == _T("add")) nCLSwitches |= CLSW_ADD;
01712                         else if(sw == _T("regvid")) nCLSwitches |= CLSW_REGEXTVID;
01713                         else if(sw == _T("regaud")) nCLSwitches |= CLSW_REGEXTAUD;
01714                         else if(sw == _T("unregvid")) nCLSwitches |= CLSW_UNREGEXTVID;
01715                         else if(sw == _T("unregaud")) nCLSwitches |= CLSW_UNREGEXTAUD;
01716                         else if(sw == _T("start") && pos) {rtStart = 10000i64*_tcstol(cmdln.GetNext(pos), NULL, 10); nCLSwitches |= CLSW_STARTVALID;}
01717                         else if(sw == _T("startpos") && pos) {/* TODO: mm:ss. */;}
01718                         else if(sw == _T("nofocus")) nCLSwitches |= CLSW_NOFOCUS;
01719                         else if(sw == _T("close")) nCLSwitches |= CLSW_CLOSE;
01720                         else if(sw == _T("standby")) nCLSwitches |= CLSW_STANDBY;
01721                         else if(sw == _T("hibernate")) nCLSwitches |= CLSW_HIBERNATE;
01722                         else if(sw == _T("shutdown")) nCLSwitches |= CLSW_SHUTDOWN;
01723                         else if(sw == _T("logoff")) nCLSwitches |= CLSW_LOGOFF;
01724                         else if(sw == _T("fixedsize") && pos)
01725                         {
01726                                 CList<CString> sl;
01727                                 Explode(cmdln.GetNext(pos), sl, ',', 2);
01728                                 if(sl.GetCount() == 2)
01729                                 {
01730                                         fixedWindowSize.SetSize(_ttol(sl.GetHead()), _ttol(sl.GetTail()));
01731                                         if(fixedWindowSize.cx > 0 && fixedWindowSize.cy > 0)
01732                                                 nCLSwitches |= CLSW_FIXEDSIZE;
01733                                 }
01734                         }
01735                         else nCLSwitches |= CLSW_HELP|CLSW_UNRECOGNIZEDSWITCH;
01736                 }
01737                 else
01738                 {
01739                         slFiles.AddTail(param);
01740                 }
01741         }
01742 }
01743 
01744 void CMPlayerCApp::Settings::GetFav(favtype ft, CList<CString>& sl)
01745 {
01746         sl.RemoveAll();
01747 
01748         CString root;
01749 
01750         switch(ft)
01751         {
01752         case FAV_FILE: root = ResStr(IDS_R_FAVFILES); break;
01753         case FAV_DVD: root = ResStr(IDS_R_FAVDVDS); break;
01754         case FAV_DEVICE: root = ResStr(IDS_R_FAVDEVICES); break;
01755         default: return;
01756         }
01757 
01758         for(int i = 0; ; i++)
01759         {
01760                 CString s;
01761                 s.Format(_T("Name%d"), i);
01762                 s = AfxGetApp()->GetProfileString(root, s, NULL);
01763                 if(s.IsEmpty()) break;
01764                 sl.AddTail(s);
01765         }
01766 }
01767 
01768 void CMPlayerCApp::Settings::SetFav(favtype ft, CList<CString>& sl)
01769 {
01770         CString root;
01771 
01772         switch(ft)
01773         {
01774         case FAV_FILE: root = ResStr(IDS_R_FAVFILES); break;
01775         case FAV_DVD: root = ResStr(IDS_R_FAVDVDS); break;
01776         case FAV_DEVICE: root = ResStr(IDS_R_FAVDEVICES); break;
01777         default: return;
01778         }
01779 
01780         AfxGetApp()->WriteProfileString(root, NULL, NULL);
01781 
01782         int i = 0;
01783         POSITION pos = sl.GetHeadPosition();
01784         while(pos)
01785         {
01786                 CString s;
01787                 s.Format(_T("Name%d"), i++);
01788                 AfxGetApp()->WriteProfileString(root, s, sl.GetNext(pos));
01789         }
01790 }
01791 
01792 void CMPlayerCApp::Settings::AddFav(favtype ft, CString s)
01793 {
01794         CList<CString> sl;
01795         GetFav(ft, sl);
01796         if(sl.Find(s)) return;
01797         sl.AddTail(s);
01798         SetFav(ft, sl);
01799 }
01800 
01801 // CMPlayerCApp::Settings::CRecentFileAndURLList
01802 
01803 CMPlayerCApp::Settings::CRecentFileAndURLList::CRecentFileAndURLList(UINT nStart, LPCTSTR lpszSection,
01804                                                                                                                         LPCTSTR lpszEntryFormat, int nSize,     
01805                                                                                                                         int nMaxDispLen) 
01806         : CRecentFileList(nStart, lpszSection, lpszEntryFormat, nSize, nMaxDispLen)     
01807 {
01808 }
01809 
01810 //#include <afximpl.h>
01811 extern BOOL AFXAPI AfxFullPath(LPTSTR lpszPathOut, LPCTSTR lpszFileIn);
01812 extern BOOL AFXAPI AfxComparePath(LPCTSTR lpszPath1, LPCTSTR lpszPath2);
01813 
01814 void CMPlayerCApp::Settings::CRecentFileAndURLList::Add(LPCTSTR lpszPathName)
01815 {
01816         ASSERT(m_arrNames != NULL);
01817         ASSERT(lpszPathName != NULL);
01818         ASSERT(AfxIsValidString(lpszPathName));
01819 
01820         if(CString(lpszPathName).MakeLower().Find(_T("@device:")) >= 0)
01821                 return;
01822 
01823         bool fURL = (CString(lpszPathName).Find(_T("://")) >= 0);
01824 
01825         // fully qualify the path name
01826         TCHAR szTemp[1024];
01827         if(fURL) _tcscpy_s(szTemp, countof(szTemp), lpszPathName);
01828         else AfxFullPath(szTemp, lpszPathName);
01829 
01830         // update the MRU list, if an existing MRU string matches file name
01831         int iMRU;
01832         for (iMRU = 0; iMRU < m_nSize-1; iMRU++)
01833         {
01834                 if((fURL && !_tcscmp(m_arrNames[iMRU], szTemp))
01835                 || AfxComparePath(m_arrNames[iMRU], szTemp))
01836                         break;      // iMRU will point to matching entry
01837         }
01838         // move MRU strings before this one down
01839         for (; iMRU > 0; iMRU--)
01840         {
01841                 ASSERT(iMRU > 0);
01842                 ASSERT(iMRU < m_nSize);
01843                 m_arrNames[iMRU] = m_arrNames[iMRU-1];
01844         }
01845         // place this one at the beginning
01846         m_arrNames[0] = szTemp;
01847 }
01848 
01849 
01850 void CMPlayerCApp::OnHelpShowcommandlineswitches()
01851 {
01852         ShowCmdlnSwitches();
01853 }
01854 
01855 //
01856 
01857 void GetCurDispMode(dispmode& dm)
01858 {
01859         if(HDC hDC = ::GetDC(0))
01860         {
01861                 dm.fValid = true;
01862                 dm.size = CSize(GetDeviceCaps(hDC, HORZRES), GetDeviceCaps(hDC, VERTRES));
01863                 dm.bpp = GetDeviceCaps(hDC, BITSPIXEL);
01864                 dm.freq = GetDeviceCaps(hDC, VREFRESH);
01865                 ::ReleaseDC(0, hDC);
01866         }
01867 }
01868 
01869 bool GetDispMode(int i, dispmode& dm)
01870 {
01871         DEVMODE devmode;
01872         devmode.dmSize = sizeof(DEVMODE);
01873         if(!EnumDisplaySettings(0, i, &devmode))
01874                 return(false);
01875 
01876         dm.fValid = true;
01877         dm.size = CSize(devmode.dmPelsWidth, devmode.dmPelsHeight);
01878         dm.bpp = devmode.dmBitsPerPel;
01879         dm.freq = devmode.dmDisplayFrequency;
01880 
01881         return(true);
01882 }
01883 
01884 void SetDispMode(dispmode& dm)
01885 {
01886         if(!dm.fValid) return;
01887 
01888         DEVMODE dmScreenSettings;
01889         memset(&dmScreenSettings, 0, sizeof(dmScreenSettings));
01890         dmScreenSettings.dmSize = sizeof(dmScreenSettings);
01891         dmScreenSettings.dmPelsWidth = dm.size.cx;
01892         dmScreenSettings.dmPelsHeight = dm.size.cy;
01893         dmScreenSettings.dmBitsPerPel = dm.bpp;
01894         dmScreenSettings.dmDisplayFrequency = dm.freq;
01895         dmScreenSettings.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL | DM_DISPLAYFREQUENCY;
01896         ChangeDisplaySettings(&dmScreenSettings, CDS_FULLSCREEN);
01897 }
01898 
01899 #include <afxsock.h>
01900 #include <atlsync.h>
01901 #include <atlutil.h> // put this before the first detours macro above to see an ICE with vc71 :)
01902 #include <atlrx.h>
01903 
01904 typedef CAtlRegExp<CAtlRECharTraits> CAtlRegExpT;
01905 typedef CAtlREMatchContext<CAtlRECharTraits> CAtlREMatchContextT;
01906 
01907 bool FindRedir(CUrl& src, CString ct, CString& body, CList<CString>& urls, CAutoPtrList<CAtlRegExpT>& res)
01908 {
01909         POSITION pos = res.GetHeadPosition();
01910         while(pos)
01911         {
01912                 CAtlRegExpT* re = res.GetNext(pos);
01913 
01914                 CAtlREMatchContextT mc;
01915                 const CAtlREMatchContextT::RECHAR* s = (LPCTSTR)body;
01916                 const CAtlREMatchContextT::RECHAR* e = NULL;
01917                 for(; s && re->Match(s, &mc, &e); s = e)
01918                 {
01919                         const CAtlREMatchContextT::RECHAR* szStart = 0;
01920                         const CAtlREMatchContextT::RECHAR* szEnd = 0;
01921                         mc.GetMatch(0, &szStart, &szEnd);
01922 
01923                         CString url;
01924                         url.Format(_T("%.*s"), szEnd - szStart, szStart);
01925                         url.Trim();
01926 
01927                         if(url.CompareNoCase(_T("asf path")) == 0) continue;
01928 
01929                         CUrl dst;
01930                         dst.CrackUrl(CString(url));
01931                         if(_tcsicmp(src.GetSchemeName(), dst.GetSchemeName())
01932                         || _tcsicmp(src.GetHostName(), dst.GetHostName())
01933                         || _tcsicmp(src.GetUrlPath(), dst.GetUrlPath()))
01934                         {
01935                                 urls.AddTail(url);
01936                         }
01937                         else
01938                         {
01939                                 // recursive
01940                                 urls.RemoveAll();
01941                                 break;
01942                         }
01943                 }
01944         }
01945 
01946         return urls.GetCount() > 0;
01947 }
01948 
01949 bool FindRedir(CString& fn, CString ct, CList<CString>& fns, CAutoPtrList<CAtlRegExpT>& res)
01950 {
01951         CString body;
01952 
01953         CTextFile f;
01954         if(f.Open(fn)) for(CString tmp; f.ReadString(tmp); body += tmp + '\n');
01955 
01956         CString dir = fn.Left(max(fn.ReverseFind('/'), fn.ReverseFind('\\'))+1); // "ReverseFindOneOf"
01957 
01958         POSITION pos = res.GetHeadPosition();
01959         while(pos)
01960         {
01961                 CAtlRegExpT* re = res.GetNext(pos);
01962 
01963                 CAtlREMatchContextT mc;
01964                 const CAtlREMatchContextT::RECHAR* s = (LPCTSTR)body;
01965                 const CAtlREMatchContextT::RECHAR* e = NULL;
01966                 for(; s && re->Match(s, &mc, &e); s = e)
01967                 {
01968                         const CAtlREMatchContextT::RECHAR* szStart = 0;
01969                         const CAtlREMatchContextT::RECHAR* szEnd = 0;
01970                         mc.GetMatch(0, &szStart, &szEnd);
01971 
01972                         CString fn2;
01973                         fn2.Format(_T("%.*s"), szEnd - szStart, szStart);
01974                         fn2.Trim();
01975 
01976                         if(!fn2.CompareNoCase(_T("asf path"))) continue;
01977                         if(fn2.Find(_T("EXTM3U")) == 0 || fn2.Find(_T("#EXTINF")) == 0) continue;
01978 
01979                         if(fn2.Find(_T(":")) < 0 && fn2.Find(_T("\\\\")) != 0 && fn2.Find(_T("//")) != 0)
01980                         {
01981                                 CPath p;
01982                                 p.Combine(dir, fn2);
01983                                 fn2 = (LPCTSTR)p;
01984                         }
01985 
01986                         if(!fn2.CompareNoCase(fn))
01987                                 continue;
01988 
01989                         fns.AddTail(fn2);
01990                 }
01991         }
01992 
01993         return fns.GetCount() > 0;
01994 }
01995 
01996 CString GetContentType(CString fn, CList<CString>* redir)
01997 {
01998         CUrl url;
01999         CString ct, body;
02000 
02001         if(fn.Find(_T("://")) >= 0)
02002         {
02003                 url.CrackUrl(fn);
02004 
02005                 if(_tcsicmp(url.GetSchemeName(), _T("pnm")) == 0)
02006                         return "audio/x-pn-realaudio";
02007 
02008                 if(_tcsicmp(url.GetSchemeName(), _T("mms")) == 0)
02009                         return "video/x-ms-asf";
02010 
02011                 if(_tcsicmp(url.GetSchemeName(), _T("http")) != 0)
02012                         return "";
02013 
02014                 DWORD ProxyEnable = 0;
02015                 CString ProxyServer;
02016                 DWORD ProxyPort = 0;
02017 
02018                 ULONG len = 256+1;
02019                 CRegKey key;
02020                 if(ERROR_SUCCESS == key.Open(HKEY_CURRENT_USER, _T("Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings"), KEY_READ)
02021                 && ERROR_SUCCESS == key.QueryDWORDValue(_T("ProxyEnable"), ProxyEnable) && ProxyEnable
02022                 && ERROR_SUCCESS == key.QueryStringValue(_T("ProxyServer"), ProxyServer.GetBufferSetLength(256), &len))
02023                 {
02024                         ProxyServer.ReleaseBufferSetLength(len);
02025 
02026                         CList<CString> sl;
02027                         ProxyServer = Explode(ProxyServer, sl, ';');
02028                         if(sl.GetCount() > 1)
02029                         {
02030                                 POSITION pos = sl.GetHeadPosition();
02031                                 while(pos)
02032                                 {
02033                                         CList<CString> sl2;
02034                                         if(!Explode(sl.GetNext(pos), sl2, '=', 2).CompareNoCase(_T("http"))
02035                                         && sl2.GetCount() == 2)
02036                                         {
02037                                                 ProxyServer = sl2.GetTail();
02038                                                 break;
02039                                         }
02040                                 }
02041                         }
02042 
02043                         ProxyServer = Explode(ProxyServer, sl, ':');
02044                         if(sl.GetCount() > 1) ProxyPort = _tcstol(sl.GetTail(), NULL, 10);
02045                 }
02046 
02047                 CSocket s;
02048                 s.Create();
02049                 if(s.Connect(
02050                         ProxyEnable ? ProxyServer : url.GetHostName(), 
02051                         ProxyEnable ? ProxyPort : url.GetPortNumber()))
02052                 {
02053                         CStringA host = CStringA(url.GetHostName());
02054                         CStringA path = CStringA(url.GetUrlPath()) + CStringA(url.GetExtraInfo());
02055 
02056                         if(ProxyEnable) path = "http://" + host + path;
02057 
02058                         CStringA hdr;
02059                         hdr.Format(
02060                                 "GET %s HTTP/1.0\r\n"
02061                                 "User-Agent: Media Player Classic\r\n"
02062                                 "Host: %s\r\n"
02063                                 "Accept: */*\r\n"
02064                                 "\r\n", path, host);
02065 
02066 // MessageBox(NULL, CString(hdr), _T("Sending..."), MB_OK);
02067 
02068                         if(s.Send((LPCSTR)hdr, hdr.GetLength()) < hdr.GetLength()) return "";
02069 
02070                         hdr.Empty();
02071                         while(1)
02072                         {
02073                                 CStringA str;
02074                                 str.ReleaseBuffer(s.Receive(str.GetBuffer(256), 256)); // SOCKET_ERROR == -1, also suitable for ReleaseBuffer
02075                                 if(str.IsEmpty()) break;
02076                                 hdr += str;
02077                                 int hdrend = hdr.Find("\r\n\r\n");
02078                                 if(hdrend >= 0) {body = hdr.Mid(hdrend+4); hdr = hdr.Left(hdrend); break;}
02079                         }
02080 
02081 // MessageBox(NULL, CString(hdr), _T("Received..."), MB_OK);
02082 
02083                         CList<CStringA> sl;
02084                         Explode(hdr, sl, '\n');
02085                         POSITION pos = sl.GetHeadPosition();
02086                         while(pos)
02087                         {
02088                                 CStringA& hdrline = sl.GetNext(pos);
02089                                 CList<CStringA> sl2;
02090                                 Explode(hdrline, sl2, ':', 2);
02091                                 CStringA field = sl2.RemoveHead().MakeLower();
02092                                 if(field == "location" && !sl2.IsEmpty())
02093                                         return GetContentType(CString(sl2.GetHead()), redir);
02094                                 if(field == "content-type" && !sl2.IsEmpty())
02095                                         ct = sl2.GetHead();
02096                         }
02097 
02098                         while(body.GetLength() < 256)
02099                         {
02100                                 CStringA str;
02101                                 str.ReleaseBuffer(s.Receive(str.GetBuffer(256), 256)); // SOCKET_ERROR == -1, also suitable for ReleaseBuffer
02102                                 if(str.IsEmpty()) break;
02103                                 body += str;
02104                         }
02105 
02106                         if(body.GetLength() >= 8)
02107                         {
02108                                 CStringA str = TToA(body);
02109                                 if(!strncmp((LPCSTR)str, ".ra", 3))
02110                                         return "audio/x-pn-realaudio";
02111                                 if(!strncmp((LPCSTR)str, ".RMF", 4))
02112                                         return "audio/x-pn-realaudio";
02113                                 if(*(DWORD*)(LPCSTR)str == 0x75b22630)
02114                                         return "video/x-ms-wmv";
02115                                 if(!strncmp((LPCSTR)str+4, "moov", 4))
02116                                         return "video/quicktime";
02117                         }
02118 
02119                         if(redir && (ct == _T("video/x-ms-asf")
02120                                 || ct == _T("audio/x-scpls") 
02121                                 || ct == _T("audio/x-mpegurl")))
02122                         {
02123                                 while(body.GetLength() < 4*1024) // should be enough for a playlist...
02124                                 {
02125                                         CStringA str;
02126                                         str.ReleaseBuffer(s.Receive(str.GetBuffer(256), 256)); // SOCKET_ERROR == -1, also suitable for ReleaseBuffer
02127                                         if(str.IsEmpty()) break;
02128                                         body += str;
02129                                 }
02130                         }
02131                 }
02132         }
02133         else if(!fn.IsEmpty())
02134         {
02135                 CPath p(fn);
02136                 CString ext = p.GetExtension().MakeLower();
02137                 if(ext == _T(".asx")) ct = _T("video/x-ms-asf");
02138                 else if(ext == _T(".pls")) ct = _T("audio/x-scpls");
02139                 else if(ext == _T(".m3u")) ct = _T("audio/x-mpegurl");
02140                 else if(ext == _T(".qtl")) ct = _T("application/x-quicktimeplayer");
02141 
02142                 if(FILE* f = _tfopen(fn, _T("rb")))
02143                 {
02144                         CStringA str;
02145                         str.ReleaseBufferSetLength(fread(str.GetBuffer(10240), 1, 10240, f));
02146                         body = AToT(str);
02147                         fclose(f);
02148                 }
02149         }
02150 
02151         if(body.GetLength() >= 4) // here only those which cannot be opened through dshow
02152         {
02153                 CStringA str = TToA(body);
02154                 if(!strncmp((LPCSTR)str, ".ra", 3))
02155                         return "audio/x-pn-realaudio";
02156                 if(!strncmp((LPCSTR)str, "FWS", 3))
02157                         return "application/x-shockwave-flash";
02158                 if(strstr((LPCSTR)str, "MPCPLAYLIST"))
02159                         return "application/x-mpc-playlist";
02160 
02161         }
02162 
02163         if(redir && !ct.IsEmpty())
02164         {
02165                 CAutoPtrList<CAtlRegExpT> res;
02166                 CAutoPtr<CAtlRegExpT> re;
02167 
02168                 if(ct == _T("video/x-ms-asf"))
02169                 {
02170                         // ...://..."/>
02171                         re.Attach(new CAtlRegExpT());
02172                         if(re && REPARSE_ERROR_OK == re->Parse(_T("{[a-zA-Z]+://[^\n\">]*}"), FALSE))
02173                                 res.AddTail(re);
02174                         // Ref#n= ...://...\n
02175                         re.Attach(new CAtlRegExpT());
02176                         if(re && REPARSE_ERROR_OK == re->Parse(_T("Ref\\z\\b*=\\b*[\"]*{([a-zA-Z]+://[^\n\"]+}"), FALSE))
02177                                 res.AddTail(re);
02178                 }
02179                 else if(ct == _T("audio/x-scpls"))
02180                 {
02181                         // File1=...\n
02182                         re.Attach(new CAtlRegExp<>());
02183                         if(re && REPARSE_ERROR_OK == re->Parse(_T("file\\z\\b*=\\b*[\"]*{[^\n\"]+}"), FALSE))
02184                                 res.AddTail(re);
02185                 }
02186                 else if(ct == _T("audio/x-mpegurl"))
02187                 {
02188                         // #comment
02189                         // ...
02190                         re.Attach(new CAtlRegExp<>());
02191                         if(re && REPARSE_ERROR_OK == re->Parse(_T("{[^#][^\n]+}"), FALSE))
02192                                 res.AddTail(re);
02193                 }
02194                 else if(ct == _T("audio/x-pn-realaudio"))
02195                 {
02196                         // rtsp://...
02197                         re.Attach(new CAtlRegExp<>());
02198                         if(re && REPARSE_ERROR_OK == re->Parse(_T("{rtsp://[^\n]+}"), FALSE))
02199                                 res.AddTail(re);
02200                 }
02201 
02202                 if(!body.IsEmpty())
02203                 {
02204                         if(fn.Find(_T("://")) >= 0) FindRedir(url, ct, body, *redir, res);
02205                         else FindRedir(fn, ct, *redir, res);
02206                 }
02207         }
02208 
02209         return ct;
02210 }

Generated on Tue Dec 13 14:46:57 2005 for guliverkli by  doxygen 1.4.5