123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251 |
- /** (c) Nullsoft, Inc. C O N F I D E N T I A L
- ** Filename:
- ** Project:
- ** Description:
- ** Author:
- ** Created:
- **/
- #include "Main.h"
- #include "resource.h"
- #include "../nu/AutoWide.h"
- #include "main.hpp"
- #include "api.h"
- /* register winamp as a media player (in "set defaults")*/
- BOOL config_registermediaplayer(DWORD accessEnabled)
- {
- if (config_no_registry)
- return TRUE;
- IFileTypeRegistrar *registrar=0;
- if (GetRegistrar(®istrar, (accessEnabled != 2)) == 0 && registrar)
- {
- wchar_t programname[MAX_PATH] = {0};
- GetModuleFileNameW(hMainInstance,programname,MAX_PATH);
- registrar->RegisterMediaPlayer(!!accessEnabled, programname, AutoWide(app_name), config_whichicon);
- LPCWSTR szProtocols[] = { L"mms", L"mmsu", L"mmst", L"uvox", L"icy", L"sc", L"shout", L"unsv", };
- for (int i = 0; i < sizeof(szProtocols)/sizeof(*szProtocols); i++)
- {
- wchar_t szBuffer[64] = {0};
- StringCbPrintfW(szBuffer, sizeof(szBuffer), L"%s://", szProtocols[i]);
- int offset=0;
- if (NULL != in_setmod_noplay(szBuffer, &offset))
- registrar->RegisterMediaPlayerProtocol(szProtocols[i], AutoWide(app_name));
- else
- registrar->UnregisterMediaPlayerProtocol(szProtocols[i], AutoWide(app_name));
- }
- registrar->Release();
- return TRUE;
- }
- return FALSE;
- }
- BOOL config_adddircontext(BOOL use_fallback)
- {
- if (config_no_registry)
- return TRUE;
- wchar_t programname[MAX_PATH] = {0};
- if (!GetModuleFileNameW(hMainInstance,programname,MAX_PATH)) return FALSE;
- IFileTypeRegistrar *registrar=0;
- if (GetRegistrar(®istrar, !use_fallback) == 0 && registrar)
- {
- wchar_t str[MAX_PATH+128] = {0}, langbuf[1024] = {0};
- StringCchPrintfW(str,MAX_PATH+128,L"\"%s\" \"%%1\"",programname);
- registrar->AddDirectoryContext(str, WINAMP_PLAYW, getStringW(IDS_CONFIG_PLAYSTR,langbuf,1024));
- StringCchPrintfW(str,MAX_PATH+128,L"\"%s\" /ADD \"%%1\"",programname);
- registrar->AddDirectoryContext(str, WINAMP_ENQUEUEW, getStringW(IDS_CONFIG_ENQUEUESTR,langbuf,1024));
- StringCchPrintfW(str,MAX_PATH+128,L"\"%s\" /BOOKMARK \"%%1\"",programname);
- registrar->AddDirectoryContext(str, WINAMP_BOOKMARKW, getStringW(IDS_CONFIG_BOOKMARKSTR,langbuf,1024));
- registrar->Release();
- return TRUE;
- }
- return FALSE;
- }
- int config_isdircontext(void)
- {
- if (config_no_registry)
- return 0;
- HKEY mp3Key;
- if (RegOpenKeyA(HKEY_LOCAL_MACHINE,"SOFTWARE\\Classes\\Directory\\shell\\" WINAMP_PLAY,&mp3Key) != ERROR_SUCCESS) return 0;
- RegCloseKey(mp3Key);
- return 1;
- }
- BOOL config_setup_filetype(const wchar_t *winamp_file, const wchar_t *name, BOOL use_fallback)
- {
- wchar_t programname[MAX_PATH] = {0};
- if (!GetModuleFileNameW(hMainInstance,programname,MAX_PATH)) return FALSE;
- IFileTypeRegistrar *registrar=0;
- if (GetRegistrar(®istrar, use_fallback) == 0 && registrar)
- {
- wchar_t str[MAX_PATH+32] = {0}, langbuf[1024] = {0};
- registrar->SetupFileType(programname, winamp_file, name, config_whichicon, config_addtolist?L"Enqueue":L"Play", L"");
- StringCchPrintfW(str,MAX_PATH+32,L"\"%s\" \"%%1\"",programname);
- registrar->SetupShell(str, winamp_file, getStringW(IDS_CONFIG_PLAYSTR,langbuf,1024), L"Play", L"{46986115-84D6-459c-8F95-52DD653E532E}");
- StringCchPrintfW(str,MAX_PATH+32,L"\"%s\" \"%%1\"",programname);
- registrar->SetupShell(str, winamp_file, L"", L"open", L"{46986115-84D6-459c-8F95-52DD653E532E}");
- StringCchPrintfW(str,MAX_PATH+32,L"\"%s\" /ADD \"%%1\"",programname);
- registrar->SetupShell(str, winamp_file, getStringW(IDS_CONFIG_ENQUEUESTR,langbuf,1024), L"Enqueue", L"{77A366BA-2BE4-4a1e-9263-7734AA3E99A2}");
- StringCchPrintfW(str,MAX_PATH+32,L"\"%s\" /BOOKMARK \"%%1\"",programname);
- registrar->SetupShell(str, winamp_file, getStringW(IDS_CONFIG_BOOKMARKSTR,langbuf,1024), L"ListBookmark", L"");
- registrar->Release();
- return TRUE;
- }
- return FALSE;
- }
- BOOL config_setup_filetypes(int mode)
- {
- if (config_no_registry)
- return TRUE;
- wchar_t programname[MAX_PATH] = {0};
- if (!GetModuleFileNameW(hMainInstance,programname,MAX_PATH)) return FALSE;
- if (!config_setup_filetype(WINAMP_FILEW, getStringW(IDS_WINAMP_MEDIA_FILE,NULL,0), !mode))
- return FALSE;
- IFileTypeRegistrar *registrar=0;
- if (GetRegistrar(®istrar, !mode) == 0 && registrar)
- {
- wchar_t str[MAX_PATH+32] = {0}, langbuf[1024] = {0};
- // droptarget stuff for windows XP
- // clsid for open
- registrar->RegisterGUID(programname, L"{46986115-84D6-459c-8F95-52DD653E532E}");
- // clsid for enqueue
- registrar->RegisterGUID(programname, L"{77A366BA-2BE4-4a1e-9263-7734AA3E99A2}");
- /* Register playlist shell type */
- registrar->RegisterTypeShell(programname, WINAMP_PLAYLISTW, getStringW(IDS_WINAMP_PLAYLIST_FILE,NULL,0), config_whichicon2, config_addtolist?L"Enqueue":L"Play");
- StringCchPrintfW(str,MAX_PATH+32,L"\"%s\" \"%%1\"",programname);
- registrar->SetupShell(str, WINAMP_PLAYLISTW, getStringW(IDS_CONFIG_PLAYSTR,langbuf,1024), L"Play", L"");
- StringCchPrintfW(str,MAX_PATH+32,L"\"%s\" \"%%1\"",programname);
- registrar->SetupShell(str, WINAMP_PLAYLISTW, L"", L"open", L"");
- StringCchPrintfW(str,MAX_PATH+32,L"\"%s\" /ADD \"%%1\"",programname);
- registrar->SetupShell(str, WINAMP_PLAYLISTW, getStringW(IDS_CONFIG_ENQUEUESTR,langbuf,1024), L"Enqueue", L"");
- StringCchPrintfW(str,MAX_PATH+32,L"\"%s\" /BOOKMARK \"%%1\"",programname);
- registrar->SetupShell(str, WINAMP_PLAYLISTW, getStringW(IDS_CONFIG_BOOKMARKSTR,langbuf,1024), L"ListBookmark", L"");
- /* Register skin shell type */
- registrar->RegisterTypeShell(programname, WINAMP_SKINZIPW, getStringW(IDS_WINAMP_EXTENSION_INSTALLATION_FILE,NULL,0), config_whichicon, L"Install");
- StringCchPrintfW(str,MAX_PATH+32,L"\"%s\" \"%%1\"",programname);
- registrar->SetupShell(str, WINAMP_SKINZIPW, getStringW(IDS_WINAMP_FILE_INSTALL,langbuf,1024), L"Install", L"");
- /* Register language file type */
- registrar->RegisterTypeShell(programname, WINAMP_LANGZIPW, getStringW(IDS_WINAMP_LANGUAGE_INSTALLATION_FILE,NULL,0), config_whichicon, L"Install");
- StringCchPrintfW(str,MAX_PATH+32,L"\"%s\" \"%%1\"",programname);
- registrar->SetupShell(str, WINAMP_LANGZIPW, getStringW(IDS_WINAMP_FILE_INSTALL,langbuf,1024), L"Install", L"");
- regmimetype(L"interface/x-winamp-skin", programname, L".wsz", 0);
- regmimetype(L"interface/x-winamp-lang", programname, L".wlz", 0);
- StringCchPrintfW(str,MAX_PATH+32,L"\"%s\" /HANDLE \"%%1\"",programname);
- wchar_t icon[MAX_PATH+32] = {0};
- StringCchPrintfW(icon,MAX_PATH+32,L"\"%s\",%d",programname, config_whichicon);
- //registrar->RegisterProtocol(L"winamp", str, icon);
- // regmimetype(L"application/x-winamp-plugin", programname,L"wpz",0);
- registrar->Release();
- return TRUE;
- }
- return FALSE;
- }
- // mar-17-2005-benski
- void config_regdvdplayer(void)
- {
- wchar_t winampPath[MAX_PATH] = {0};
- // get the full path exe
- if (!GetModuleFileNameW(hMainInstance,winampPath, MAX_PATH))
- return;
- IFileTypeRegistrar *registrar=0;
- if (GetRegistrar(®istrar, true) == 0 && registrar)
- {
- registrar->RegisterDVDPlayer(winampPath, config_whichicon, L"Winamp.DVD", L"Winamp", L"Nullsoft Winamp", L"Play in Winamp");
- registrar->Release();
- }
- }
- static void _reg_associated_filetypes(int force)
- {
- wchar_t ext_list[16384] = {0}, *p = ext_list;
- wchar_t *c_list = in_getextlistW();
- void _r_sW(const char *name, wchar_t *data, int mlen);
- _r_sW("config_extlist", ext_list, ARRAYSIZE(ext_list));
- int something_regged=0;
- while (p && *p)
- {
- wchar_t *p2 = p;
- while (p2 && *p2 && *p2 != L':') p2++;
- if (p2 && *p2 == L':') *p2++ = 0;
- if (!config_isregistered(p))
- {
- // dropped register on startup for Win8 as we cannot
- // re-associate due to changes in the OSes behaviour
- if (force || (!IsWin8() && config_check_ft_startup))
- {
- config_register(p, 1);
- something_regged=1;
- }
- }
- else
- {
- int a = 0;
- wchar_t *w = c_list;
- if (IsPlaylistExtension(p))
- a = 1;
- else while (w && *w && !a)
- {
- if (!_wcsicmp(w, p)) a = 1;
- w += lstrlenW(w) + 1;
- }
- if (!a)
- {
- config_register(p, 0);
- something_regged=1;
- }
- }
- p = p2;
- }
- GlobalFree((HGLOBAL)c_list);
- if (something_regged)
- SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST | SHCNF_FLUSHNOWAIT, NULL, NULL);
- }
- static int RegisterThread(HANDLE handle, void *user_data, intptr_t id)
- {
- CoInitializeEx(0,COINIT_MULTITHREADED);
- _reg_associated_filetypes((int)id);
- CoUninitialize();
- return 0;
- }
- void reg_associated_filetypes(int force)
- {
- WASABI_API_THREADPOOL->RunFunction(0, RegisterThread, 0, force, api_threadpool::FLAG_LONG_EXECUTION|api_threadpool::FLAG_REQUIRE_COM_MT);
- }
|