123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251 |
- /** (c) Nullsoft, Inc. C O N F I D E N T I A L
- ** Filename:
- ** Project:
- ** Description:
- ** Author:
- ** Created:
- **/
- #ifndef CONFIG_IMPL
- #define CONFIG_IMPL
- #endif
- #include "Main.h"
- #include "config.h"
- #include "WinampAttributes.h"
- #include "../nu/AutoWide.h"
- #include "../nu/AutoChar.h"
- #include "../nu/ns_wc.h"
- #include "../nu/AutoLock.h"
- #include "../nu/AutoCharFn.h"
- #include "../Elevator/FileTypeRegistrar.h"
- #include "main.hpp"
- #include <shobjidl.h>
- #if (_MSC_VER < 1500)
- typedef struct tagBIND_OPTS3 : tagBIND_OPTS2
- {
- HWND hwnd;
- } BIND_OPTS3, * LPBIND_OPTS3;
- #endif
- static HRESULT CoCreateInstanceAsAdmin(HWND hwnd, REFCLSID rclsid, REFIID riid, void ** ppv)
- {
- BIND_OPTS3 bo;
- WCHAR wszCLSID[50] = {0};
- WCHAR wszMonikerName[300] = {0};
- StringFromGUID2(rclsid, wszCLSID, sizeof(wszCLSID)/sizeof(wszCLSID[0]));
- HRESULT hr = StringCchPrintfW(wszMonikerName, sizeof(wszMonikerName)/sizeof(wszMonikerName[0]), L"Elevation:Administrator!new:%s", wszCLSID);
- if (FAILED(hr))
- return hr;
- memset(&bo, 0, sizeof(bo));
- bo.cbStruct = sizeof(bo);
- bo.hwnd = hwnd;
- bo.dwClassContext = CLSCTX_LOCAL_SERVER;
- return CoGetObject(wszMonikerName, &bo, riid, ppv);
- }
- static bool NeedElevation()
- {
- return !IsUserAnAdmin();
- }
- static Nullsoft::Utility::LockGuard registrarGuard;
- static const GUID ftr_guid =
- { 0x3B29AB5C, 0x52CB, 0x4a36, { 0x93,0x14,0xE3,0xFE,0xE0,0xBA,0x74,0x68 } };
- static IFileTypeRegistrar *masterRegistrar;
- static FileTypeRegistrar builtIn;
- bool usingBuiltIn = false;
- int GetRegistrar(IFileTypeRegistrar **registrar, BOOL use_fallback)
- {
- Nullsoft::Utility::AutoLock autolock(registrarGuard);
- // attempt to re-get an elevated object as needed
- // i.e. if user selects no but wants to try again
- // then we need to try going elevated again
- if (!masterRegistrar || usingBuiltIn)
- {
- #if 1 // benski> on Vista, we need this object to run out-of-process so it can be elevated to Administrator
- // without elevating Winamp itself - see http://msdn2.microsoft.com/en-us/ms679687.aspx
- OSVERSIONINFO version = {0};
- version.dwOSVersionInfoSize = sizeof(version);
- if (!GetVersionEx(&version)) ZeroMemory(&version, sizeof(OSVERSIONINFO));
- if (version.dwMajorVersion >= 6 && NeedElevation()) // Vista
- {
- IFileTypeRegistrar *registrar = 0;
- HRESULT hr = CoCreateInstanceAsAdmin(0, ftr_guid, __uuidof(IFileTypeRegistrar), (void**)®istrar);
- if (SUCCEEDED(hr) && registrar)
- {
- if (masterRegistrar) masterRegistrar->Release();
- masterRegistrar = registrar;
- usingBuiltIn = false;
- }
- else
- {
- if (!use_fallback)
- {
- if (registrar) registrar->Release();
- if (masterRegistrar) masterRegistrar->Release();
- registrar = masterRegistrar = 0;
- usingBuiltIn = false;
- return 1;
- }
- }
- }
- #if 0
- else /* benski> on earlier OS's just for testing purposes, we'll get rid of this totally once the COM stuff is worked out */
- {
- CoCreateInstance(ftr_guid, NULL, CLSCTX_LOCAL_SERVER, __uuidof(IFileTypeRegistrar), (void**)&masterRegistrar);
- }
- #endif
- #endif
- }
- if (!masterRegistrar) /* wasn't registered? we'll use our internal version (but it won't work well on Vista+) */
- {
- masterRegistrar = &builtIn;
- usingBuiltIn = true;
- }
- if (masterRegistrar)
- {
- *registrar = masterRegistrar;
- masterRegistrar->AddRef();
- return 0;
- }
- return 1;
- }
- void RemoveRegistrar()
- {
- Nullsoft::Utility::AutoLock autolock(registrarGuard);
- if (masterRegistrar) masterRegistrar->Release();
- masterRegistrar = 0;
- usingBuiltIn = false;
- }
- int _r_i(char *name, int def)
- {
- return GetPrivateProfileIntA(app_name, name, def, INI_FILEA);
- }
- #define RI(x) (( config_##x ) = _r_i(#x,( config_##x )))
- #define RI_NP(x) (( x ) = _r_i(#x,( x )))
- #define RB(x) (( config_##x ) = !!_r_i(#x,( config_##x )))
- void _w_i(char *name, intptr_t d)
- {
- char str[120] = {0};
- StringCchPrintfA(str, 120, "%d", d);
- WritePrivateProfileStringA(app_name, name, str, INI_FILEA);
- }
- #define WI(x) _w_i(#x,( config_##x ))
- #define WI_NP(x) _w_i(#x,( x ))
- void _r_s(char *name, char *data, int mlen)
- {
- char utf8_data[2048] = {0};
- wchar_t utf16_data[2048] = {0};
- char buf[2048] = {0};
- StringCchCopyA(buf, 2048, data);
- GetPrivateProfileStringA(app_name, name, buf, utf8_data, 2048, INI_FILEA);
- MultiByteToWideCharSZ(CP_UTF8, 0, utf8_data, -1, utf16_data, 2048);
- WideCharToMultiByteSZ(CP_ACP, 0, utf16_data, -1, data, mlen, 0, 0);
- }
- #define RS(x) (_r_s(#x,config_##x,sizeof(config_##x)))
- #define RS_NP(x) (_r_s(#x,x,sizeof(x)))
- void _r_sW(const char *name, wchar_t *data, int mlen)
- {
- char utf8_data[2048] = {0};
- char default_data[2048] = {0};
- WideCharToMultiByteSZ(config_utf8?CP_UTF8:CP_ACP, 0, data, -1, default_data, 2048,0,0);
- GetPrivateProfileStringA(app_name, name, default_data, utf8_data, 2048, INI_FILEA);
- MultiByteToWideCharSZ(config_utf8?CP_UTF8:CP_ACP, 0, utf8_data, -1, data, mlen);
- }
- #define RSW(x) (_r_sW(#x,config_##x,sizeof(config_##x)/sizeof(wchar_t)))
- #define RSW_NP(x) (_r_sW(#x,x,sizeof(x)/sizeof(wchar_t)))
- void _w_s(char *name, char *data)
- {
- WritePrivateProfileStringA(app_name, name, AutoChar(AutoWide(data), CP_UTF8), INI_FILEA);
- }
- #define WS(x) (_w_s(#x,config_##x))
- #define WS_NP(x) (_w_s(#x,x))
- void _w_sW(const char *name, const wchar_t *data)
- {
- WritePrivateProfileStringA(app_name, name, AutoChar(data, CP_UTF8), INI_FILEA); // TODO: don't want autowide here
- }
- #define WSW(x) (_w_sW(#x,config_##x))
- #define WSW_NP(x) (_w_sW(#x,x))
- void config_write(int i)
- {
- config_pilp = PlayList_getPosition();
- //GetCurrentDirectoryW(MAX_PATH, config_cwd);
- if (i && plneedsave)
- {
- // changed 5.64 to only save if there was a change as this can save a
- // decent amount of time on closing with a large unmodified playlist.
- savem3ufn(M3U_FILE, 0, 1);
- savem3ufn(OLD_M3U_FILE, 0, 1);
- }
- config_utf8=1;
- WI(utf8);
- if (i != 1) // write mostly unused stuff, like proxy, plugin names, etc
- {
- WS(defext);
- WSW(titlefmt);
- WI(proxy80);
- WS(proxy);
- WSW(visplugin_name);
- WSW(dspplugin_name);
- WI(check_ft_startup);
- WI(updated_ft_startup);
- WI(visplugin_num);
- WI(pe_fontsize);
- WI(pe_direction);
- WI(visplugin_priority);
- WI(visplugin_autoexec);
- WI(dspplugin_num);
- WI(sticon);
- WI(splash);
- WI(taskbar);
- WI(dropaotfs);
- WI(nomwheel);
- WI(ascb_new);
- WI(ttips);
- WI(riol);
- WI(minst);
- WI(whichicon);
- WI(whichicon2);
- WI(addtolist);
- WI(snap);
- WI(snaplen);
- WI(parent);
- WI(hilite);
- WI(disvis);
- WI(rofiob);
- WI(shownumsinpl);
- WI(keeponscreen);
- WI(eqdsize);
- WI(usecursors);
- WI(fixtitles);
- WI(priority);
- WI(shuffle_morph_rate);
- WI(useexttitles);
- WI(bifont);
- WI(bifont_alt);
- WI(dotitlenum);
- WI(dotasknum);
- WI(plscrollsize);
- WI(plmw2xscroll);
- WI(inet_mode);
- WI(ospb);
- WI(embedwnd_freesize);
- WI(no_visseh);
- }
- WI(newverchk);
- WI(newverchk2);
- WI(newverchk3);
- WI(newverchk_rc);
- WI(user_consent_join_channels);
- // write everything else
- {
- int config_prefs_last_page = prefs_last_page | (about_lastpage << 8);
- WI(prefs_last_page);
- prefs_last_page &= 255;
- _w_i("prefs_wx", prefs_rect.left);
- _w_i("prefs_wy", prefs_rect.top);
- _w_i("alt3_wx", alt3_rect.left);
- _w_i("alt3_wy", alt3_rect.top);
- _w_i("editinfo_wx", editinfo_rect.left);
- _w_i("editinfo_wy", editinfo_rect.top);
- _w_i("ctrle_wx", ctrle_rect.left);
- _w_i("ctrle_wy", ctrle_rect.top);
- _w_i("about_wx", about_rect.left);
- _w_i("about_wy", about_rect.top);
- _w_i("loc_wx", loc_rect.left);
- _w_i("loc_wy", loc_rect.top);
- _w_i("time_wx", time_rect.left);
- _w_i("time_wy", time_rect.top);
- _w_i("load_wx", load_rect.left);
- _w_i("load_wy", load_rect.top);
- }
- WI(autoload_eq);
- WI(playlist_recyclebin);
- WI(use_eq);
- WI(eq_ws);
- WI(wx);
- WI(wy);
- WI(minimized);
- WI(aot);
- WI(shuffle);
- WI(repeat);
- WI(volume);
- WI(pan);
- WI(easymove);
- WI(dsize);
- WI(timeleftmode);
- WI(autoscrollname);
- WI(sa);
- WI(safire);
- WI(saref);
- WI(safalloff);
- WI(sa_peaks);
- WI(sa_peak_falloff);
- WI(eq_wx);
- WI(eq_wy);
- WI(eq_open);
- WI(mw_open);
- WI(pe_wx);
- WI(pe_wy);
- WI(pe_open);
- WI(pe_width);
- WI(pe_height);
- WI(pe_height_ws);
- WI(eq_limiter);
- WI(eq_type);
- WI(eq_frequencies);
- /*
- WI(si_wx);
- WI(si_wy);
- WI(si_width);
- WI(si_height);
- WI(si_autoshow);
- WI(si_autosize);
- WI(si_autohide);
- WI(si_open);
- */
- WI(video_wx);
- WI(video_wy);
- WI(video_open);
- WI(video_width);
- WI(video_height);
- WI(video_ratio1);
- WI(video_ratio2);
- WI(video_useratio);
- WI(windowshade);
- WI(preamp);
- WI(pilp);
- WI(randskin);
- WSW(cwd);
- WSW(skin);
- WS(outname);
- WI(pladv);
- {
- char config_eq_data[256] = {0};
- StringCchPrintfA(config_eq_data, 256, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d",
- eq_tab[0], eq_tab[1], eq_tab[2], eq_tab[3], eq_tab[4],
- eq_tab[5], eq_tab[6], eq_tab[7], eq_tab[8], eq_tab[9]);
- WS(eq_data);
- }
- WI(video_vsync2);
- WI(video_aspectadj);
- WI(video_overlays);
- WI(video_gdiplus);
- WI(video_ddraw);
- WI(video_updsize);
- WI(video_autoopen);
- WI(video_autoclose);
- WI(video_noss);
- WI(video_logo);
- WI(video_osd);
- WI(video_yv12);
- WI(video_stopclose);
- WI(video_auto_fs);
- WI(playback_thread_priority);
- WI(audio_bits);
- WI(audio_mono);
- WI(audio_surround);
- WI(audio_dither);
- WI(replaygain);
- WI(replaygain_mode);
- WI(replaygain_source);
- WI(replaygain_preferred_only);
- _w_i("replaygain_non_rg_gain", (intptr_t)(config_replaygain_non_rg_gain.GetFloat()*1000.0f));
- _w_i("replaygain_preamp", (intptr_t)(config_replaygain_preamp.GetFloat()*1000.0f));
- // WI(video_contrast);
- // WI(video_brightness);
- WI(video_fliprgb);
- WI(video_remove_fs_on_stop);
- WI(wav_do_header);
- WI(wav_convert);
- WS(wav_ext);
- _w_sW("playlist_custom_font", playlist_custom_fontW);
- WI(custom_plfont);
- WI(no_registry);
- WI(last_classic_skin_page);
- WI(last_playback_page);
- WI(last_fileinfo_page);
- WSW(artwork_filter);
- WI(zeropadplnum);
- WI(wlz_menu);
- WI(accessibility_modalbeep);
- WI(accessibility_modalflash);
- WI(noml_ratings_prompt);
- WI(noml_ratings);
- WI(uid_ft);
- }
- void config_read(int i)
- {
- wchar_t programname[MAX_PATH] = {0};
- GetModuleFileNameW(hMainInstance, programname, MAX_PATH);
- // regmimetype(L"interface/x-winamp-skin", programname, L".wsz", 0); // hack cause wa3 is gheeeeeey
- RI(utf8);
- RI(eq_ws);
- RI(updated_ft_startup);
- // fiddle things so if running an existing install then we force restore file assoc off
- // when we're running on Vista / Win7+ to resolve complaints from users on those OSes.
- // vista
- if(config_updated_ft_startup)
- {
- RI(check_ft_startup);
- }
- else
- {
- OSVERSIONINFO version = {0};
- version.dwOSVersionInfoSize = sizeof(version);
- if (!GetVersionEx(&version)) ZeroMemory(&version, sizeof(OSVERSIONINFO));
- if (version.dwMajorVersion >= 6) // Vista
- {
- config_updated_ft_startup = 0;
- }
- else
- {
- RI(check_ft_startup);
- }
- }
- config_updated_ft_startup = 1;
-
- RS(browserbrand);
- RI(inet_mode);
- RI(pe_fontsize);
- RI(pe_direction);
- RI(ospb);
- RI(visplugin_num);
- RI(visplugin_priority);
- RI(visplugin_autoexec);
- RI(dspplugin_num);
- RI(sticon);
- RI(splash);
- RI(taskbar);
- RI(dropaotfs);
- RI(nomwheel);
- RI(ascb_new);
- RI(ttips);
- RI(keeponscreen);
- RI(riol);
- RI(whichicon);
- RI(whichicon2);
- RI(addtolist);
- RI(snap);
- RI(snaplen);
- RI(parent);
- RI(hilite);
- RI(disvis);
- RI(minst);
- RI(eqdsize);
- RI(pladv);
- RI(bifont);
- RI(bifont_alt);
- RI(autoload_eq);
- RI(playlist_recyclebin);
- RI(use_eq);
- RI(wx);
- RI(wy);
- RI(minimized);
- RI(aot);
- RI(shuffle);
- RI(repeat);
- RI(volume);
- RI(pan);
- RI(easymove);
- RI(dsize);
- RI(timeleftmode);
- RI(autoscrollname);
- RI(sa);
- RI(safire);
- RI(saref);
- RI(safalloff);
- RI(sa_peaks);
- RI(sa_peak_falloff);
- RI(eq_wx);
- RI(eq_wy);
- RI(eq_open);
- RI(mw_open);
- RI(pe_wx);
- RI(pe_wy);
- RI(pe_open);
- RI(pe_width);
- RI(pe_height);
- RI(pe_height_ws);
- RB(eq_limiter);
- RI(eq_type);
- RI(eq_frequencies);
- /*
- RI(si_wx);
- RI(si_wy);
- RI(si_height);
- RI(si_width);
- RI(si_autoshow);
- RI(si_autosize);
- RI(si_autohide);
- RI(si_open);
- */
- RI(video_wx);
- RI(video_wy);
- RI(video_open);
- RI(video_width);
- RI(video_height);
- RI(video_ratio1);
- RI(video_ratio2);
- RI(video_useratio);
- RI(windowshade);
- RI(preamp);
- RI(pilp);
- RI(randskin);
- if (!*config_cwd) // don't read if the user has overridden it through paths.ini
- RSW(cwd);
- RSW(skin);
- RI_NP(prefs_last_page);
- about_lastpage = prefs_last_page >> 8;
- prefs_last_page &= 255;
- prefs_rect.left = _r_i("prefs_wx", -1);
- prefs_rect.top = _r_i("prefs_wy", -1);
- alt3_rect.left = _r_i("alt3_wx", -1);
- alt3_rect.top = _r_i("alt3_wy", -1);
- editinfo_rect.left = _r_i("editinfo_wx", -1);
- editinfo_rect.top = _r_i("editinfo_wy", -1);
- ctrle_rect.left = _r_i("ctrle_wx", -1);
- ctrle_rect.top = _r_i("ctrle_wy", -1);
- about_rect.left = _r_i("about_wx", -1);
- about_rect.top = _r_i("about_wy", -1);
- loc_rect.left = _r_i("loc_wx", -1);
- loc_rect.top = _r_i("loc_wy", -1);
- time_rect.left = _r_i("time_wx", -1);
- time_rect.top = _r_i("time_wy", -1);
- load_rect.left = _r_i("load_wx", -1);
- load_rect.top = _r_i("load_wy", -1);
- RI(rofiob);
- RI(shownumsinpl);
- RS(outname);
- RI(usecursors);
- RI(fixtitles);
- RI(priority);
- if (!_r_i("fixpriority", 0))
- {
- if (config_priority > 1)
- {
- config_priority++;
- WI(priority);
- }
- _w_i("fixpriority", 1);
- }
- RI(shuffle_morph_rate);
- RI(useexttitles);
- RI(newverchk);
- RI(newverchk2);
- RI(newverchk3);
- RI(newverchk_rc);
- RI(user_consent_join_channels);
- RI(embedwnd_freesize);
- RB(video_vsync2);
- RI(video_aspectadj);
- RB(video_overlays);
- RB(video_gdiplus);
- RB(video_ddraw);
- RI(video_updsize);
- RB(video_autoopen);
- RB(video_autoclose);
- RI(video_noss);
- RI(video_logo);
- RI(video_osd);
- RB(video_yv12);
- RI(video_stopclose);
- RB(video_auto_fs);//RI(video_auto_fs); plague> changed to RB
- RI(dotitlenum);
- RI(dotasknum);
- RI(plscrollsize);
- RI(plmw2xscroll);
- RI(playback_thread_priority);
- RI(audio_bits);
- RB(audio_mono);
- RB(audio_surround);
- RB(audio_dither);
- RB(replaygain);
- RI(replaygain_mode);
- RI(replaygain_source);
- RB(replaygain_preferred_only);
- int gain10 = _r_i("replaygain_non_rg_gain", (int)(config_replaygain_non_rg_gain.GetFloat()*1000.0f));
- config_replaygain_non_rg_gain = (float)((float)gain10/1000.0f);
- gain10 = _r_i("replaygain_preamp", (int)(config_replaygain_preamp.GetFloat()*1000.0f));
- config_replaygain_preamp = (float)((float)gain10/1000.0f);
- RI(last_classic_skin_page);
- RI(last_playback_page);
- RI(last_fileinfo_page);
- RI(upd_mode);
- RSW(artwork_filter);
- RI(noml_ratings_prompt);
- RI(noml_ratings);
- RI(jtf_check);
- RI(block_img);
- // RI(video_contrast);
- // RI(video_brightness);
- RI(video_fliprgb);
- RI(video_remove_fs_on_stop);
- RI(wav_do_header);
- RI(wav_convert);
- RS(wav_ext);
- RI(no_visseh);
- _r_sW("playlist_custom_font", playlist_custom_fontW, sizeof(playlist_custom_fontW)/sizeof(*playlist_custom_fontW));
- if (!*playlist_custom_fontW) StringCbCopyW(playlist_custom_fontW, sizeof(playlist_custom_fontW), DEFAULT_FONT);
- WideCharToMultiByteSZ(CP_ACP, 0, playlist_custom_fontW, -1, playlist_custom_font, 128, 0, 0);
- RI(custom_plfont);
- RI(no_registry);
- RB(proxy80);
- RS(proxy);
- RS(defext);
- RSW(titlefmt);
- RSW(visplugin_name);
- RSW(dspplugin_name);
- RI(zeropadplnum);
- RI(wlz_menu);
- RB(accessibility_modalbeep);
- RB(accessibility_modalflash);
- {
- char eq_data[256] = {0, };
- int x;
- char *p = eq_data;
- RS_NP(eq_data);
- for (x = 0; x < 10; x ++)
- {
- int b = 0, s = 0;
- while (p && *p >= '0' && *p <= '9')
- {
- s = 1;b = b * 10 + *p++ -'0';
- }
- if (!s) break;
- p++;
- eq_tab[x] = min(63, max(b, 0));
- }
- }
- //SetCurrentDirectoryW(config_cwd);
- config_utf8=1;
- WI(utf8);
- if (!i)
- {
- if (!PathFileExistsW(M3U_FILE))
- {
- LoadPlaylistByExtension(OLD_M3U_FILE, L".m3u", 1, 1);
- savem3ufn(M3U_FILE, 0, 1);
- }
- else
- LoadPlaylistByExtension(M3U_FILE, L".m3u8", 1, 1);
- PlayList_setposition(config_pilp);
- }
- }
- int config_isregistered(wchar_t *ext)
- {
- wchar_t b[256] = {0};
- DWORD rval = 0, s = sizeof(b);
- if (config_no_registry) return 0;
- if (!ext[0]) return 0;
- StringCchPrintfW(b, 256, L".%s", ext);
- OSVERSIONINFO version = {0};
- version.dwOSVersionInfoSize = sizeof(version);
- if (!GetVersionEx(&version)) ZeroMemory(&version, sizeof(OSVERSIONINFO));
- if (IsWin8()) // Windows 8
- {
- // QueryAppIsDefault(..) was deprecated in Windows 8 so this is an alternative
- // which seems to work though how long it will keep working is currently unknown
- IApplicationAssociationRegistration* pAAR = 0;
- HRESULT hr = CoCreateInstance(CLSID_ApplicationAssociationRegistration,
- NULL, CLSCTX_INPROC,
- __uuidof(IApplicationAssociationRegistration),
- (void**)&pAAR);
- if (SUCCEEDED(hr) && pAAR)
- {
- LPWSTR app = 0;
- /*hr = */pAAR->QueryCurrentDefault(b,
- AT_FILEEXTENSION,
- AL_EFFECTIVE,
- &app);
- pAAR->Release();
- if (IsPlaylistExtension(ext))
- {
- if(!lstrcmpiW(WINAMP_PLAYLISTW, app)){ rval = 1; }
- }
- else if (!_wcsicmp(ext, L"wsz") || !_wcsicmp(ext, L"wal") || !_wcsicmp(ext, L"wpz"))
- {
- if(!lstrcmpiW(WINAMP_SKINZIPW, app)){ rval = 1; }
- }
- else if (!_wcsicmp(ext, L"wlz"))
- {
- if(!lstrcmpiW(WINAMP_LANGZIPW, app)){ rval = 1; }
- }
- else
- {
- wchar_t str[64] = {0};
- StringCchPrintfW(str, 64, L"%s%hs", WINAMP_FILEW, b);
- if(!lstrcmpiW(str, app)){ rval = 1; }
- }
- if (app) CoTaskMemFree(app);
- }
- }
- else if (version.dwMajorVersion >= 6) // Vista
- {
- IApplicationAssociationRegistration* pAAR = NULL;
- HRESULT hr = CoCreateInstance(CLSID_ApplicationAssociationRegistration,
- NULL, CLSCTX_INPROC,
- __uuidof(IApplicationAssociationRegistration),
- (void**)&pAAR);
- if (SUCCEEDED(hr) && pAAR)
- {
- BOOL hasExt=FALSE;
- hr = pAAR->QueryAppIsDefault(b,
- AT_FILEEXTENSION,
- AL_EFFECTIVE,
- AutoWide(app_name),
- &hasExt);
- pAAR->Release();
- if (SUCCEEDED(hr))
- {
- rval=!!hasExt;
- }
- }
- }
- else
- {
- HKEY key = NULL;
- if (RegOpenKeyW(HKEY_CLASSES_ROOT, b, &key) != ERROR_SUCCESS) return 0;
- DWORD vt = 0;
- if (RegQueryValueExW(key, NULL, 0, &vt, (LPBYTE)b, &s) == ERROR_SUCCESS)
- {
- if (vt != REG_SZ || (wcsncmp(b, WINAMP_FILEW, wcslen(WINAMP_FILEW)) &&
- wcscmp(b, WINAMP_PLAYLISTW) &&
- wcscmp(b, WINAMP_SKINZIPW) &&
- wcscmp(b, WINAMP_LANGZIPW))) rval = 0;
- else rval = 1;
- }
- else rval = 0;
- RegCloseKey(key);
- }
- return rval;
- }
- bool allowed_extension(wchar_t *ext)
- {
- const wchar_t* blocked[] = {L"exe", L"dll",
- L"jpg", L"jpeg", L"gif", L"bmp",
- L"png", L"tif", L"tiff"};
- // ensure we block at least 'exe' and 'dll', and images if not disabled
- for (size_t i = 0; i < (config_block_img ? ARRAYSIZE(blocked) : 2); i++)
- {
- if (!_wcsicmp(ext, blocked[i])) return false;
- }
- return true;
- }
- void config_register(wchar_t *ext, int reg)
- {
- const wchar_t *which_str = WINAMP_FILEW;
- if (config_no_registry) return ;
- if (!ext[0]) return ;
- if (!allowed_extension(ext)) return ; //windows=gay
- IFileTypeRegistrar *registrar=0;
- if (GetRegistrar(®istrar, true) == 0 && registrar)
- {
- wchar_t family_str[256] = {0};
- if (IsPlaylistExtension(ext))
- which_str = WINAMP_PLAYLISTW;
- else if (!_wcsicmp(ext, L"wsz") || !_wcsicmp(ext, L"wal") || !_wcsicmp(ext, L"wpz"))
- which_str = WINAMP_SKINZIPW;
- else if (!_wcsicmp(ext, L"wlz"))
- which_str = WINAMP_LANGZIPW;
- else
- {
- StringCchPrintfW(family_str, 256, L"%s.%s", WINAMP_FILEW, ext);
- wchar_t family_description[256] = {0};
- if (in_get_extended_fileinfoW(family_str, L"family", family_description, 255) && family_description[0])
- {
- which_str=family_str;
- if (reg)
- config_setup_filetype(family_str, family_description, 0);
- }
- }
- if (reg && !_wcsicmp(ext, L"asx"))
- {
- wchar_t programname[MAX_PATH] = {0};
- GetModuleFileNameW(hMainInstance, programname, MAX_PATH);
- regmimetype(L"video/x-asx", programname, L".asx", 0);
- regmimetype(L"video/asx", programname, L".asx", 0);
- regmimetype(L"video/x-ms-asf", programname, L".asx", 0);
- }
- if (reg && !_wcsicmp(ext, L"wal"))
- {
- wchar_t programname[MAX_PATH] = {0};
- GetModuleFileNameW(hMainInstance, programname, MAX_PATH);
- regmimetype(L"interface/x-winamp3-skin", programname, L".wal", 0);
- }
- if (reg && !_wcsicmp(ext, L"wsz"))
- {
- wchar_t programname[MAX_PATH] = {0};
- GetModuleFileNameW(hMainInstance, programname, MAX_PATH);
- regmimetype(L"interface/x-winamp-skin", programname, L".wsz", 0);
- }
- if (reg && !_wcsicmp(ext, L"wlz"))
- {
- wchar_t programname[MAX_PATH] = {0};
- GetModuleFileNameW(hMainInstance, programname, MAX_PATH);
- regmimetype(L"interface/x-winamp-lang", programname, L".wlz", 0);
- }
- if (reg && !_wcsicmp(ext, L"pls"))
- {
- wchar_t programname[MAX_PATH] = {0};
- GetModuleFileNameW(hMainInstance, programname, MAX_PATH);
- regmimetype(L"audio/x-scpls", programname, L".pls", 0);
- regmimetype(L"audio/scpls", programname, L".pls", 0);
- }
- if (reg && !_wcsicmp(ext, L"wma"))
- {
- wchar_t programname[MAX_PATH] = {0};
- GetModuleFileNameW(hMainInstance, programname, MAX_PATH);
- regmimetype(L"audio/x-ms-wma", programname, L".wma", 1);
- regmimetype(L"application/x-msdownload", programname, L".wma", 1);
- }
- if (reg && !_wcsicmp(ext, L"m3u"))
- {
- wchar_t programname[MAX_PATH] = {0};
- GetModuleFileNameW(hMainInstance, programname, MAX_PATH);
- regmimetype(L"audio/x-mpegurl", programname, L".m3u", 0);
- regmimetype(L"audio/mpegurl", programname, L".m3u", 0);
- }
- if (reg && !_wcsicmp(ext, L"mp3"))
- {
- wchar_t programname[MAX_PATH] = {0};
- GetModuleFileNameW(hMainInstance, programname, MAX_PATH);
- regmimetype(L"audio/x-mpeg", programname, L".mp3", 1);
- regmimetype(L"audio/x-mp3", programname, L".mp3", 1);
- regmimetype(L"audio/x-mpg", programname, L".mp3", 1);
- regmimetype(L"audio/mp3", programname, L".mp3", 1);
- regmimetype(L"audio/mpg", programname, L".mp3", 1);
- regmimetype(L"audio/mpeg", programname, L".mp3", 1);
- }
- wchar_t b[128] = {0};
- StringCchPrintfW(b, 128, L".%s", ext);
- CharLowerBuffW(b, ARRAYSIZE(b));
- if (reg)
- registrar->RegisterType(b, which_str, AutoWide(app_name));
- else
- {
- // avoid removing WINAMP_FILEW as this will break some parts
- // this will generally happen from 3rd party plugins where
- // no %family% will be correctly returned in the relevant
- if(_wcsicmp(which_str, WINAMP_FILEW))
- {
- registrar->UnregisterType(b, which_str, AutoWide(app_name), IsPlaylistExtension(ext));
- }
- }
- registrar->Release();
- }
- }
- void regmimetype(const wchar_t *mtype, const wchar_t *programname, const wchar_t *ext, int nsonly)
- {
- if (config_no_registry)
- return ;
- IFileTypeRegistrar *registrar=0;
- if (GetRegistrar(®istrar, true) == 0 && registrar)
- {
- registrar->RegisterMIMEType(mtype, programname, ext, nsonly);
- registrar->Release();
- }
- }
- void trimPathW(wchar_t *pathStart)
- {
- PathRemoveBlanksW(pathStart);
- PathRemoveBackslashW(pathStart);
- }
- void config_setinifile(wchar_t *inifile)
- {
- lstrcpynW(INI_FILE, inifile, sizeof(INI_FILE) / sizeof(INI_FILE[0]));
- }
- void config_setinidir(const wchar_t *inidir)
- {
- if (SUCCEEDED(StringCchCopyW(CONFIGDIR, MAX_PATH, inidir)))
- trimPathW(CONFIGDIR);
- else
- CONFIGDIR[0] = 0;
- }
- void config_setm3udir(const wchar_t *m3udir)
- {
- if (SUCCEEDED(StringCchCopyW(M3UDIR, MAX_PATH, m3udir)))
- trimPathW(M3UDIR);
- else
- M3UDIR[0] = 0;
- }
- void config_setm3ubase(const wchar_t *m3ubase)
- {
- if (SUCCEEDED(StringCchCopyW(M3UBASE, MAX_PATH, m3ubase)))
- trimPathW(M3UBASE);
- else
- M3UBASE[0] = 0;
- }
- void init_config()
- {
- GetModuleFileNameW(hMainInstance, PROGDIR, MAX_PATH);
- PathRemoveFileSpecW(PROGDIR);
- SetEnvironmentVariableW(L"WINAMP_PROGRAM_DIR", PROGDIR);
- wchar_t winamp_root[MAX_PATH] = {0};
- StringCchCopyW(winamp_root, MAX_PATH, PROGDIR);
- PathStripToRootW(winamp_root);
- SetEnvironmentVariableW(L"WINAMP_ROOT_DIR", winamp_root);
- }
- void setup_config(void)
- {
- if (!CONFIGDIR[0])
- StringCchCopyW(CONFIGDIR, MAX_PATH, PROGDIR);
- if (!M3UDIR[0])
- StringCchCopyW(M3UDIR, MAX_PATH, CONFIGDIR);
- if (!M3UBASE[0])
- StringCchCopyW(M3UBASE, MAX_PATH, M3UDIR);
- CreateDirectoryW(M3UDIR, NULL);
- CreateDirectoryW(CONFIGDIR, NULL);
- // basic config files
- PathCombineW(OLD_M3U_FILE, M3UDIR, L"Winamp.m3u");
- PathCombineW(M3U_FILE, M3UDIR, L"Winamp.m3u8");
- PathCombineW(BOOKMARKFILE, CONFIGDIR, L"Winamp.bm");
- PathCombineW(BOOKMARKFILE8, CONFIGDIR, L"Winamp.bm8");
- // just make sure if a winamp.bm8 doesn't exist then
- // go make one from winamp.bm - implemented for 5.58+
- if(!PathFileExistsW(BOOKMARKFILE8))
- {
- CopyFileW(BOOKMARKFILE,BOOKMARKFILE8,FALSE);
- }
- PathCombineW(EQDIR1, CONFIGDIR, L"Winamp.q1");
- PathCombineW(EQDIR2, CONFIGDIR, L"Winamp.q2");
- wchar_t tempPath[MAX_PATH] = {0};
- GetTempPathW(MAX_PATH, tempPath);
- PathCombineW(TEMP_FILE, tempPath, L"Winamp.tmp");
- PathCombineW(DEMOMP3, M3UDIR, L"demo.mp3");
- PathCombineW(JSAPI2_INIFILE, CONFIGDIR, L"jsapisec.ini");
- PathCombineW(ML_INI_FILE, CONFIGDIR, L"Plugins\\gen_ml.ini");
- // override INI_FILE if specified
- if (INI_FILE[0])
- {
- if (PathIsFileSpecW(INI_FILE) || PathIsRelativeW(INI_FILE))
- {
- wchar_t temp[MAX_PATH] = {0};
- PathCombineW(temp, CONFIGDIR, INI_FILE);
- lstrcpynW(INI_FILE, temp, MAX_PATH);
- }
- }
- else
- PathCombineW(INI_FILE, CONFIGDIR, L"Winamp.ini");
- // maintain a ansi version of INI_FILE for some aspects
- StringCchCopyA(INI_FILEA, MAX_PATH, AutoCharFn(INI_FILE));
- RI(utf8);
- // skin and plugin directories
- PathCombineW(SKINDIR, PROGDIR, L"Skins");
- PathCombineW(PLUGINDIR, PROGDIR, L"Plugins");
- PathCombineW(SYSPLUGINDIR, PROGDIR, L"System");
- PathCombineW(SKINDIR, PROGDIR, L"Skins");
- PathCombineW(LANGDIR, PROGDIR, L"Lang");
- PathCombineW(VISDIR, PROGDIR, L"Plugins");
- PathCombineW(DSPDIR, PROGDIR, L"Plugins");
- // override skin/plugin directories from config
- {
- wchar_t bW[MAX_PATH] = {0}, *pW;
- bW[0]=0;
- _r_sW("PluginDir", bW, MAX_PATH);
- pW = bW;
- while (pW && (*pW == L' ' || *pW == L'\t')) pW++;
- if (pW && *pW)
- {
- StringCchCopyW(PLUGINDIR, MAX_PATH, bW);
- }
- ZeroMemory(bW, sizeof(bW));
- _r_sW("DSPDir", bW, MAX_PATH);
- pW = bW;
- while (pW && (*pW == L' ' || *pW == L'\t')) pW++;
- if (pW && *pW)
- {
- StringCchCopyW(DSPDIR, MAX_PATH, bW);
- }
- ZeroMemory(bW, sizeof(bW));
- _r_sW("VISDir", bW, MAX_PATH);
- pW = bW;
- while (pW && (*pW == L' ' || *pW == L'\t')) pW++;
- if (pW && *pW)
- {
- StringCchCopyW(VISDIR, MAX_PATH, bW);
- }
- ZeroMemory(bW, sizeof(bW));
- _r_sW("SkinDir", bW, MAX_PATH);
- pW = bW;
- while (pW && (*pW == L' ' || *pW == L'\t')) pW++;
- if (pW && *pW)
- {
- StringCchCopyW(SKINDIR, MAX_PATH, bW);
- }
- ZeroMemory(bW, sizeof(bW));
- _r_sW("LangDir", bW, MAX_PATH);
- pW = bW;
- while (pW && (*pW == L' ' || *pW == L'\t')) pW++;
- if (pW && *pW)
- {
- StringCchCopyW(LANGDIR, MAX_PATH, bW);
- }
- }
- // create a skin temp directory, too
- wchar_t buf[MAX_PATH] = {0};
- GetTempPathW(MAX_PATH, buf);
- GetTempFileNameW(buf, L"WAS", GetTickCount(), SKINTEMPDIR);
- // create a lang temp directory, too by
- // trying to use part of the wlz's name
- // so it's easier to see when debugging
- // e.g. W<lang>XXXX.tmp otherwise it'll
- // revert back to the older WLZXXXX.tmp
- config_load_langpack_var();
- if (wcstok(config_langpack, L"-"))
- {
- wchar_t *p = wcstok(NULL, L"-");
- if (p)
- {
- wchar_t buf2[4] = {0};
- StringCchPrintfW(buf2, 4, L"W%s", p);
- CharUpperBuffW(buf2, 4);
- GetTempFileNameW(buf, buf2, GetTickCount(), LANGTEMPDIR);
- }
- else
- {
- GetTempFileNameW(buf, L"WLZ", GetTickCount(), LANGTEMPDIR);
- }
- }
- else
- {
- GetTempFileNameW(buf, L"WLZ", GetTickCount(), LANGTEMPDIR);
- }
- RI(minst);
- }
- BOOL config_removedircontext(BOOL use_fallback)
- {
- if (config_no_registry)
- return TRUE;
- IFileTypeRegistrar *registrar=0;
- if (GetRegistrar(®istrar, !use_fallback) == 0 && registrar)
- {
- registrar->RemoveDirectoryContext(WINAMP_PLAYW);
- registrar->RemoveDirectoryContext(WINAMP_ENQUEUEW);
- registrar->RemoveDirectoryContext(WINAMP_BOOKMARKW);
- registrar->Release();
- return TRUE;
- }
- return FALSE;
- }
- int config_iscdplayer(void)
- {
- DWORD r = 0, s;
- HKEY mp3Key;
- char buf[MAX_PATH], buf2[MAX_PATH] = "\"";;
- if (!GetModuleFileNameA(hMainInstance, buf2 + 1, sizeof(buf2) - 8)) return 0;
- if (RegOpenKeyA(HKEY_CLASSES_ROOT, "AudioCD\\shell\\play\\command", &mp3Key) != ERROR_SUCCESS) return 0;
- StringCchCatA(buf2, MAX_PATH, "\" %1");
- s = sizeof(buf);
- if (RegQueryValueEx(mp3Key, NULL, 0, NULL, (LPBYTE)buf, &s) == ERROR_SUCCESS)
- {
- if (!lstrcmpiA(buf, buf2)) r = 1;
- }
- RegCloseKey(mp3Key);
- return r;
- }
- BOOL config_regcdplayer(int reg, int mode)
- {
- if (config_no_registry) return TRUE;
- IFileTypeRegistrar *registrar=0;
- if (GetRegistrar(®istrar, !mode) == 0 && registrar)
- {
- wchar_t programName[MAX_PATH] = {0};
- if (GetModuleFileNameW(hMainInstance, programName, MAX_PATH))
- {
- if (reg)
- registrar->RegisterCDPlayer(programName);
- else
- registrar->UnregisterCDPlayer(programName);
- }
- registrar->Release();
- return TRUE;
- }
- return FALSE;
- }
- void config_load_langpack_var(void)
- {
- RSW(langpack);
- }
- void config_save_langpack_var(void)
- {
- WSW(langpack);
- }
- void config_agent_add(void)
- {
- if (config_no_registry) return;
- IFileTypeRegistrar *registrar=0;
- if (GetRegistrar(®istrar, true) == 0 && registrar)
- {
- wchar_t exe_name[MAX_PATH + 2] = {0};
- GetModuleFileNameW(hMainInstance, exe_name, sizeof(exe_name)/sizeof(wchar_t));
- PathRemoveFileSpecW(exe_name);
- PathCombineW(exe_name, exe_name, L"winampa.exe");
- PathQuoteSpacesW(exe_name);
- registrar->AddAgent(exe_name);
- registrar->Release();
- }
- Lang_LocaliseAgentOnTheFly(TRUE);
- }
- void config_agent_remove(void)
- {
- if (config_no_registry) return ;
- IFileTypeRegistrar *registrar=0;
- if (GetRegistrar(®istrar, true) == 0 && registrar)
- {
- HWND hwnd = FindWindowW(L"WinampAgentMain", NULL);
- if (hwnd)
- {
- SendMessageW(hwnd, WM_CLOSE, 0, 0);
- }
- registrar->RemoveAgent();
- registrar->Release();
- }
- Lang_LocaliseAgentOnTheFly(FALSE);
- }
- BOOL config_register_capability(wchar_t *ext, int mode)
- {
- if (config_no_registry) return TRUE;
- IFileTypeRegistrar *registrar=0;
- if (GetRegistrar(®istrar, !mode) == 0 && registrar)
- {
- WCHAR szApplication[128] = {0}, szExtension[64] = {0}, szProgId[256] = {0};
- size_t required = MultiByteToWideCharSZ(CP_ACP, 0, app_name, -1, NULL, 0);
- if (required > ARRAYSIZE(szApplication))
- return TRUE;
- if (0 == MultiByteToWideCharSZ(CP_ACP, 0, app_name, -1, szApplication, ARRAYSIZE(szApplication)))
- return TRUE;
- LPWSTR cursor = szProgId;
- size_t remaining = ARRAYSIZE(szProgId);
- if (FAILED(StringCchCopyExW(cursor, remaining, WINAMP_FILEW, &cursor, &remaining, 0)))
- return TRUE;
- if (FAILED(StringCchCopyExW(cursor, remaining, L".", &cursor, &remaining, 0)))
- return TRUE;
- if (FAILED(StringCchCopyExW(cursor, remaining, ext/*szExtension*/, &cursor, &remaining, 0)))
- return TRUE;
- //CharLowerW(szExtension);
- registrar->RegisterCapability(szApplication, szProgId, szExtension);
- registrar->Release();
- return TRUE;
- }
- return FALSE;
- }
|