#include ".\main.h" #include ".\xzip\xzip.h" #include ".\smtp\smtp.h" #include ".\email\sendemail.h" #include const wchar_t* GetFileName(const wchar_t *fullname) { if (!fullname) return NULL; const wchar_t *start = wcsrchr(fullname, L'\\'); if (start && start != fullname) start = CharNext(start); return start; } BOOL ZipData(void) { BOOL retCode = FALSE; HZIP hz = CreateZip(settings.zipPath, 0, ZIP_FILENAME); if (hz) { retCode = TRUE; if (settings.createLOG && settings.ReadLogCollectResult()) retCode = (ZR_OK == ZipAdd(hz, GetFileName(settings.logPath), settings.logPath, 0, ZIP_FILENAME)); if (retCode && settings.createDMP && settings.ReadDmpCollectResult()) retCode = (ZR_OK == ZipAdd(hz, GetFileName(settings.dumpPath), settings.dumpPath, 0, ZIP_FILENAME)); } CloseZip(hz); return retCode; } LPCTSTR BuildSubjectString(LPCTSTR subject) { static wchar_t subject_str[512] = {L"Winamp Error Report"}; wchar_t uid_str[64] = {0}, path[MAX_PATH] = {0}; if (GetModuleFileName(0, path, MAX_PATH)) { PathRemoveFileSpec(path); wchar_t *p = path + wcslen(path) - 1; while(p && *p && *p != L'\\') { p = CharPrev(path, p); } if (p) *p = 0; PathAppend(path, L"winamp.exe"); HKEY hkey = NULL; if (RegCreateKeyEx(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Nullsoft\\Winamp", 0, 0, 0, KEY_READ, NULL, &hkey, NULL) == ERROR_SUCCESS) { DWORD s = 512, t = REG_SZ; if (RegQueryValueEx(hkey, path, 0, &t, (LPBYTE)uid_str, &s) != ERROR_SUCCESS || t != REG_SZ) uid_str[0] = 0; RegCloseKey(hkey); } } // if it fails then we'll need to make something... if (!uid_str[0]) { GUID guid; UuidCreate(&guid); StringCbPrintf(uid_str, ARRAYSIZE(uid_str), L"%08X%04X%04X%02X%02X%02X%02X%02X%02X%02X%02X", (int)guid.Data1, (int)guid.Data2, (int)guid.Data3, (int)guid.Data4[0], (int)guid.Data4[1], (int)guid.Data4[2], (int)guid.Data4[3], (int)guid.Data4[4], (int)guid.Data4[5], (int)guid.Data4[6], (int)guid.Data4[7]); } if (StringCchPrintfW(subject_str, ARRAYSIZE(subject_str), L"%s [%s]", subject, uid_str) == S_OK) return subject_str; else return subject; } BOOL SendData(HWND hwnd) { BOOL retCode = FALSE; const wchar_t *subject = L"Winamp Error Report"; const wchar_t *senderName = L"Winamp Error Reporter"; const wchar_t *recipientAddress = L"bug@winamp.com"; const wchar_t *recipientName = L"Nullsoft Bug Reporting"; wchar_t *msgInfo = _wcsdup(settings.ReadBody()); wchar_t *p = msgInfo, *end = p + wcslen(msgInfo); while(p != end) { if (*p == 1) *p = L'\r'; if (*p == 2) *p = L'\n'; p++; } if (settings.sendBySMTP) { CSmtp smtp; CSmtpMessage msg; CSmtpMessageBody body; CSmtpAttachment attach; msg.Subject = BuildSubjectString(subject); // Who the message is from msg.Sender.Name = senderName; msg.Sender.Address = settings.smtpAddress; msg.Recipient.Address = recipientAddress; msg.Recipient.Name = recipientName; if(settings.zipData ) { attach.FileName = settings.zipPath; msg.Attachments.Add(attach); } else { if (settings.createLOG && settings.ReadLogCollectResult()) attach.FileName = settings.logPath; msg.Attachments.Add(attach); if (settings.createDMP && settings.ReadDmpCollectResult()) attach.FileName = settings.dumpPath; msg.Attachments.Add(attach); } // smtp.m_wSmtpPort = settings.smtpPort; - not working for some reasons if (settings.smtpAuth) { smtp.m_strUser = settings.smtpUser; smtp.m_strPass = settings.smtpPwd;; } body = L"This message was generated by Winamp Error Reporter v1.09.\r\nPlease check attachments for viruses.\r\n"; body.Data.append(L"\r\n"); body.Data.append(msgInfo); msg.Message.Add(body); retCode = smtp.Connect(settings.smtpServer); if ( retCode ) { // Send the message and close the connection afterwards retCode = (smtp.SendMessage(msg) == 0); smtp.Close(); } } else if(settings.sendByClient) { retCode = SendEmail(hwnd, recipientAddress, recipientName, BuildSubjectString(subject), msgInfo, settings.zipPath); } return retCode; } BOOL Restart(void) { STARTUPINFO si = {0}; si.cb = sizeof(si); si.dwFlags = STARTF_USESHOWWINDOW; si.wShowWindow = SW_SHOW; PROCESS_INFORMATION pi = {0}; return CreateProcess( settings.ReadWinamp(), // name of executable module NULL, // command line string NULL, // process attributes NULL, // thread attributes FALSE, // handle inheritance option 0, // creation flags NULL, // new environment block NULL, // current directory name &si, // startup information &pi // process information ); }