| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140 | // Winamp error feedback plugin// Copyright (C) 2005 Nullsoft//#define PLUGIN_DESC "Nullsoft Error Feedback"#define PLUGIN_VER L"1.16"#include ".\main.h"#include "configDlg.h"#include "crashDlg.h"#include "api__gen_crasher.h"#include "../nu/ServiceWatcher.h"ServiceWatcher watcher;Settings settings;prefsDlgRecW prefItem = {0};char *winampVersion;static wchar_t prefsTitle[64];// wasabi based services for localisation supportapi_service *WASABI_API_SVC = 0;api_language *WASABI_API_LNG = 0;api_syscb *WASABI_API_SYSCB = 0;api_application *WASABI_API_APP = 0;HINSTANCE WASABI_API_LNG_HINST = 0, WASABI_API_ORIG_HINST = 0;int init(void);void config(void);void quit(void);extern "C" winampGeneralPurposePlugin plugin ={	GPPHDR_VER_U,	"nullsoft(gen_crasher.dll)",	init,	config,	quit,};extern "C" __declspec(dllexport) winampGeneralPurposePlugin * winampGetGeneralPurposePlugin() {	return &plugin; }int init(void){	if (!settings.IsOk()) return GEN_INIT_FAILURE;	// loader so that we can get the localisation service api for use	WASABI_API_SVC = (api_service*)SendMessage(plugin.hwndParent, WM_WA_IPC, 0, IPC_GET_API_SERVICE);	if (!WASABI_API_SVC || WASABI_API_SVC == (api_service *)1)		return GEN_INIT_FAILURE;	waServiceFactory *sf = WASABI_API_SVC->service_getServiceByGuid(applicationApiServiceGuid);	if (sf) WASABI_API_SYSCB = reinterpret_cast<api_syscb*>(sf->getInterface());	watcher.WatchWith(WASABI_API_SVC);	watcher.WatchFor(&WASABI_API_LNG, languageApiGUID);	WASABI_API_SYSCB->syscb_registerCallback(&watcher);	sf = WASABI_API_SVC->service_getServiceByGuid(applicationApiServiceGuid);	if (sf) WASABI_API_APP = reinterpret_cast<api_application*>(sf->getInterface());	// need to have this initialised before we try to do anything with localisation features	WASABI_API_START_LANG(plugin.hDllInstance,GenCrasherLangGUID);	static wchar_t szDescription[256];	swprintf(szDescription, ARRAYSIZE(szDescription),			 WASABI_API_LNGSTRINGW(IDS_NULLSOFT_ERROR_FEEDBACK), PLUGIN_VER);	plugin.description = (char*)szDescription;	//register prefs screen	prefItem.dlgID = IDD_CONFIG;	prefItem.name = WASABI_API_LNGSTRINGW_BUF(IDS_ERROR_FEEDBACK,prefsTitle,64);	prefItem.proc = (void*) ConfigDlgProc;	prefItem.hInst = WASABI_API_LNG_HINST;	prefItem.where = -1;	SendMessageA(plugin.hwndParent, WM_WA_IPC, (WPARAM) &prefItem, IPC_ADD_PREFS_DLGW);	winampVersion = (char *)SendMessageA(plugin.hwndParent,WM_WA_IPC,0,IPC_GETVERSIONSTRING);	return GEN_INIT_SUCCESS;}void config(void){	SendMessage(plugin.hwndParent,WM_WA_IPC,(WPARAM)&prefItem,IPC_OPENPREFSTOPAGE);}void quit(void){	watcher.StopWatching();	watcher.Clear();	waServiceFactory *sf = WASABI_API_SVC->service_getServiceByGuid(languageApiGUID);	if (sf) sf->releaseInterface(WASABI_API_LNG);	WASABI_API_LNG=0;}int StartHandler(wchar_t* iniPath){		settings.SetPath(iniPath);	if (!settings.Load()) 	{		if (!(settings.CreateDefault(iniPath) && settings.Save()))		{			//OutputDebugString(L"Feedback plugin - unable to read settings. Error feedback disabled.\r\n");		}	}	SetUnhandledExceptionFilter(FeedBackFilter);	//OutputDebugString(L"Error FeedBack started.\r\n");	return 0;}PEXCEPTION_POINTERS gExceptionInfo;LONG WINAPI FeedBackFilter( struct _EXCEPTION_POINTERS *pExceptionInfo ){	if (alreadyProccessing) return EXCEPTION_CONTINUE_EXECUTION;		alreadyProccessing = TRUE;	gExceptionInfo = pExceptionInfo; 	// show user dialog	HWND hwnd;	if (WASABI_API_LNG)		hwnd = WASABI_API_CREATEDIALOGPARAMW(IDD_CRASHDLG, NULL, CrashDlgProc, (LPARAM)WASABI_API_ORIG_HINST);	else 	#ifdef _M_IX86		hwnd = CreateDialogParam(plugin.hDllInstance, MAKEINTRESOURCE(IDD_CRASHDLG), NULL, CrashDlgProc, (LPARAM)plugin.hDllInstance);	#endif	#ifdef _M_X64		hwnd = CreateDialogParam(plugin.hDllInstance, MAKEINTRESOURCE(IDD_CRASHDLG), NULL, (DLGPROC)CrashDlgProc, (LPARAM)plugin.hDllInstance);	#endif	SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOMOVE);	while (IsWindow(hwnd))	{		MSG msg;		if (!GetMessage(&msg, NULL, 0, 0)) break;		if (IsDialogMessage(hwnd, &msg)) continue;		TranslateMessage(&msg);		DispatchMessage(&msg);	}	return EXCEPTION_EXECUTE_HANDLER;}
 |