diff options
Diffstat (limited to 'Src/Winamp/setup/spage_feedback.cpp')
-rw-r--r-- | Src/Winamp/setup/spage_feedback.cpp | 392 |
1 files changed, 392 insertions, 0 deletions
diff --git a/Src/Winamp/setup/spage_feedback.cpp b/Src/Winamp/setup/spage_feedback.cpp new file mode 100644 index 00000000..4a2515e4 --- /dev/null +++ b/Src/Winamp/setup/spage_feedback.cpp @@ -0,0 +1,392 @@ +#define APSTUDIO_READONLY_SYMBOLS +#include "main.h" +#include "./spage_feedback.h" +#include "./setup_resource.h" +#include "../nu/ns_wc.h" +#include "../nu/AutoChar.h" +#include "../nu/AutoWide.h" +#include "./langutil.h" + + +#define FF_ALLOWFEEDBACK 0x0001 +#define FF_ANNOUNCEMENTS 0x0010 +#define FF_STATISTICS 0x0020 + +#define GENDER_UNKNOWN 0 +#define GENDER_MALE 1 +#define GENDER_FEMALE 2 + +setup_page_feedback::setup_page_feedback() : ref(1), hwnd(NULL) +{ + szEmail[0] = 0x00; + szCountry[0] = 0x00; + gender = GENDER_UNKNOWN; + flags = FF_ALLOWFEEDBACK | FF_ANNOUNCEMENTS | FF_STATISTICS; +} + +setup_page_feedback::~setup_page_feedback() +{ +} + +size_t setup_page_feedback::AddRef() +{ + return ++ref; +} + +size_t setup_page_feedback::Release() +{ + if (1 == ref) + { + delete(this); + return 0; + } + return --ref; +} + +HRESULT setup_page_feedback::GetName(bool bShort, const wchar_t **pszName) +{ + if (bShort) + { + static wchar_t szShortName[32] = {0}; + *pszName = (*szShortName) ? szShortName : getStringW(IDS_PAGE_FEEDBACK, szShortName, sizeof(szShortName)/sizeof(wchar_t)); + } + else + { + static wchar_t szLongName[64] = {0}; + *pszName = (*szLongName) ? szLongName : getStringW(IDS_PAGE_FEEDBACK_LONG, szLongName, sizeof(szLongName)/sizeof(wchar_t)); + } + return S_OK; +} + +HRESULT setup_page_feedback::Save(HWND hwndText) +{ + HRESULT hr(S_OK); + + int r, s; + char data[8192] = {0}; + char str[32] = {0}; + + if (FF_ALLOWFEEDBACK & flags) + { + s = GetPrivateProfileIntW(L"WinampReg", L"RegDataLen", 0, INI_FILE); + if (s > 0) GetPrivateProfileStructA("WinampReg", "RegData2", data, s, INI_FILEA); + if (!SetMetricsValueW(data, MAKEINTRESOURCEA(METRICS_EMAIL), szEmail, -1)) hr = E_UNEXPECTED; + if (!SetMetricsValueW(data, MAKEINTRESOURCEA(METRICS_COUNTRY), szCountry, lstrlenW(szCountry)*sizeof(wchar_t))) hr = E_UNEXPECTED; + if (!SetMetricsValueW(data, MAKEINTRESOURCEA(METRICS_GENDER), &gender, sizeof(gender))) hr = E_UNEXPECTED; + r = (FF_ANNOUNCEMENTS == (FF_ANNOUNCEMENTS & flags)); + if (!SetMetricsValueW(data, MAKEINTRESOURCEA(METRICS_ANNOUNCEMENTS), &r, sizeof(r))) hr = E_UNEXPECTED; + config_newverchk2 = (FF_STATISTICS == (FF_STATISTICS & flags)); + } + else config_newverchk2 = 0; + + WritePrivateProfileStringW(AutoWide(app_name), L"newverchk2", (config_newverchk2) ? L"1" : L"0", INI_FILE); + + s = GetMetricsSize(data); + + StringCchPrintfA(str, 32, "%d", s); + WritePrivateProfileStringA("WinampReg", "RegDataLen", (s) ? str : NULL, INI_FILEA); + WritePrivateProfileStructA("WinampReg", "RegData2", (s) ? data : NULL, s, INI_FILEA); + + if (hwnd) UpdateUI(); + return hr; +} + +HRESULT setup_page_feedback::Revert(void) +{ + HRESULT hr(S_OK); + char data[8192] = {0, }; + DWORD sendinfo; + + flags = FF_ALLOWFEEDBACK; + + if (config_newverchk2) flags |= FF_STATISTICS; + + int s = GetPrivateProfileIntW(L"WinampReg", L"RegDataLen", 0, INI_FILE); + if (s > 0) GetPrivateProfileStructA("WinampReg", "RegData2", data, s, INI_FILEA); + + GetMetricsValueW(data, MAKEINTRESOURCEA(METRICS_EMAIL), szEmail, sizeof(szEmail)); + GetMetricsValueW(data, MAKEINTRESOURCEA(METRICS_COUNTRY), szCountry, sizeof(szCountry)); + GetMetricsValueW(data, MAKEINTRESOURCEA(METRICS_GENDER), &gender, sizeof(gender)); + GetMetricsValueW(data, MAKEINTRESOURCEA(METRICS_ANNOUNCEMENTS), &sendinfo, sizeof(sendinfo)); + if (sendinfo) flags |= FF_ANNOUNCEMENTS; + if (hwnd) UpdateUI(); + return hr; +} + +HRESULT setup_page_feedback::IsDirty(void) +{ + char data[8192] = {0}; + wchar_t szTest[256] = {0}; + int r; + DWORD lcid; + + lcid = MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT); + if (0 != (FF_STATISTICS & flags) != !!config_newverchk2) return S_OK; + + int s = GetPrivateProfileIntW(L"WinampReg", L"RegDataLen", 0, INI_FILE); + if (s > 0) GetPrivateProfileStructA("WinampReg", "RegData2", data, s, INI_FILEA); + + if (!GetMetricsValueW(data, MAKEINTRESOURCEA(METRICS_EMAIL), szTest, sizeof(szTest))) return E_UNEXPECTED; + r = CompareStringW(lcid, NORM_IGNORECASE, szTest, -1, szEmail, -1); + if (0 == r) return E_UNEXPECTED; + if (CSTR_EQUAL != r) return S_OK; + + if (!GetMetricsValueW(data, MAKEINTRESOURCEA(METRICS_COUNTRY), szTest, sizeof(szTest))) return E_UNEXPECTED; + r = CompareStringW(lcid, NORM_IGNORECASE, szTest, -1, szCountry, -1); + if (0 == r) return E_UNEXPECTED; + if (CSTR_EQUAL != r) return S_OK; + r = 0; + if (!GetMetricsValueW(data, MAKEINTRESOURCEA(METRICS_GENDER), &r, sizeof(r))) return E_UNEXPECTED; + if (r != gender) return S_OK; + r = 0; + if (!GetMetricsValueW(data, MAKEINTRESOURCEA(METRICS_ANNOUNCEMENTS), &r, sizeof(r))) return E_UNEXPECTED; + if (r != (FF_ANNOUNCEMENTS == (FF_ANNOUNCEMENTS & flags))) return S_OK; + + return S_FALSE; +} + +HRESULT setup_page_feedback::Validate(void) +{ + wchar_t *p; + + if (0 == (FF_ALLOWFEEDBACK & flags) || !*szEmail) return S_OK; + for (p = szEmail; *p != 0x00 && *p != L'@'; p = CharNextW(p)); + + if (L'@' != *p || 0x00 == *CharNextW(p)) + { + WCHAR szTitle[128] = {0}; + HWND hwndTop, hwndTest; + hwndTop = hwnd; + while(NULL != (hwndTest = GetParent(hwndTop))) hwndTop = hwndTest; + GetWindowTextW(hwndTop, szTitle, sizeof(szTitle)/sizeof(WCHAR)); + if (hwndTop) + { + MessageBoxW(hwndTop, getStringW(IDS_PAGE_INCORRECT_EMAIL_ADDRESS, NULL, 0), + szTitle, MB_OK | MB_ICONERROR); + return S_FALSE; + } + } + return S_OK; +} + +HRESULT setup_page_feedback::CreateView(HWND hwndParent, HWND *phwnd) +{ + *phwnd = WACreateDialogParam(MAKEINTRESOURCEW(IDD_SETUP_PAGE_FEEDBACK), hwndParent, ::DialogProc, (LPARAM)this); + return S_OK; +} + +void setup_page_feedback::UpdateUI(void) +{ + + HWND hwndCB; + if (!hwnd || !IsWindow(hwnd)) return; + + CheckDlgButton(hwnd, IDC_CHK_ANNOUNCEMENTS, (FF_ANNOUNCEMENTS & flags) ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(hwnd, IDC_CHK_STATISTICS, (FF_STATISTICS & flags) ? BST_CHECKED : BST_UNCHECKED); + + SetDlgItemTextW(hwnd, IDC_EDT_EMAIL, szEmail); + SetDlgItemTextW(hwnd, IDC_EDT_COUNTRY, szCountry); + + hwndCB = GetDlgItem(hwnd, IDC_CB_GENDER); + if (hwndCB) + { + INT count = (INT)SendMessageW(hwndCB, CB_GETCOUNT, 0, 0L); + if (count > 0) + { + INT i; + for (i = 0; i < count && gender != (INT)SendMessageW(hwndCB, CB_GETITEMDATA, i, 0L); i++); + if (i != count) SendMessageW(hwndCB, CB_SETCURSEL, i, 0L); + } + } +} + + +void setup_page_feedback::ComboBox_OnSelChange(HWND hwndCtrl) +{ + INT index; + index = (INT)SendMessageW(hwndCtrl, CB_GETCURSEL, 0, 0L); + if (CB_ERR == index) return; + gender = (INT)SendMessageW(hwndCtrl, CB_GETITEMDATA, index, 0L); +} + +INT_PTR setup_page_feedback::OnInitDialog(HWND hwndFocus, LPARAM lParam) +{ + HWND hwndCB; + + SendDlgItemMessageW(hwnd, IDC_EDT_EMAIL, EM_LIMITTEXT, sizeof(szEmail)/sizeof(wchar_t), 0); + SendDlgItemMessageW(hwnd, IDC_EDT_COUNTRY, EM_LIMITTEXT, sizeof(szCountry)/sizeof(wchar_t), 0); + + hwndCB = GetDlgItem(hwnd, IDC_CB_GENDER); + if (hwndCB) + { + UINT genderStrID[] = {IDS_GENDER_UNKNOWN, IDS_GENDER_FEMALE, IDS_GENDER_MALE, }; + INT genderVal[] = {GENDER_UNKNOWN, GENDER_FEMALE, GENDER_MALE, }; + for(int i = 0; i < sizeof(genderStrID)/sizeof(UINT); i++) + { + INT index = (INT)SendMessageW(hwndCB, CB_ADDSTRING,0, (LPARAM)getStringW(genderStrID[i], NULL, 0)); + if (CB_ERR != index) SendMessageW(hwndCB, CB_SETITEMDATA, index, (LPARAM)genderVal[i]); + } + } + + UpdateUI(); + return 0; +} + +void setup_page_feedback::OnSize(UINT nType, INT cx, INT cy) +{ + INT ctrlList[] = { IDC_LBL_HEADER, IDC_CHK_ANNOUNCEMENTS, IDC_CHK_STATISTICS, + IDC_EDT_EMAIL, IDC_EDT_COUNTRY, IDC_CB_GENDER, }; + HWND hwndCtrl; + HDWP hdwp; + RECT rw; + INT width, ox; + + hwndCtrl = GetDlgItem(hwnd, IDC_LBL_EMAIL); + GetWindowRect(hwndCtrl, &rw); + MapWindowPoints(HWND_DESKTOP, hwnd, (POINT*)&rw, 2); + ox = rw.left; + + hdwp = BeginDeferWindowPos(sizeof(ctrlList)/sizeof(INT)); + if (!hdwp) return; + + for (int i = 0; i < sizeof(ctrlList)/sizeof(INT); i++) + { + hwndCtrl = GetDlgItem(hwnd, ctrlList[i]); + if (hwndCtrl) + { + GetWindowRect(hwndCtrl, &rw); + MapWindowPoints(HWND_DESKTOP, hwnd, (POINT*)&rw, 2); + switch(ctrlList[i]) + { + case IDC_EDT_EMAIL: + case IDC_EDT_COUNTRY: + case IDC_CB_GENDER: + width = cx - rw.left - ox; + break; + default: + width = cx - rw.left*2; + break; + } + hdwp = DeferWindowPos(hdwp, hwndCtrl, NULL, 0, 0, width, rw.bottom - rw.top, + SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOMOVE); + } + } + if (hdwp) EndDeferWindowPos(hdwp); +} + + +void setup_page_feedback::OnCommand(INT nCtrlID, INT nEvntID, HWND hwndCtrl) +{ + switch(nCtrlID) + { + case IDC_EDT_EMAIL: + switch(nEvntID) + { + case EN_CHANGE: + { + GetWindowTextW(hwndCtrl, szEmail, sizeof(szEmail)/sizeof(wchar_t)); + HWND hwndChk = GetDlgItem(hwnd, IDC_CHK_ANNOUNCEMENTS); + if (IsWindow(hwndChk)) + { + BOOL bEnabled = IsWindowEnabled(hwndChk); + if (bEnabled != (0x00 != *szEmail)) + { + CheckDlgButton(hwnd, IDC_CHK_ANNOUNCEMENTS, (0x00 != *szEmail) ? BST_CHECKED : BST_UNCHECKED); + EnableWindow(GetDlgItem(hwnd, IDC_CHK_ANNOUNCEMENTS), 0x00 != *szEmail); + PostMessageW(hwnd, WM_COMMAND, MAKEWPARAM(IDC_CHK_ANNOUNCEMENTS, BN_CLICKED), (LPARAM)GetDlgItem(hwnd, IDC_CHK_ANNOUNCEMENTS)); + } + } + } + break; + } + break; + case IDC_EDT_COUNTRY: + switch(nEvntID) + { + case EN_CHANGE: + GetWindowTextW(hwndCtrl, szCountry, sizeof(szCountry)/sizeof(wchar_t)); + break; + } + break; + case IDC_CHK_ANNOUNCEMENTS: + switch(nEvntID) + { + case BN_CLICKED: + if (BST_CHECKED & (INT)SendMessageW(hwndCtrl, BM_GETSTATE, 0, 0L)) flags |= FF_ANNOUNCEMENTS; + else flags &= ~FF_ANNOUNCEMENTS; + break; + } + break; + case IDC_CHK_STATISTICS: + switch(nEvntID) + { + case BN_CLICKED: + if (BST_CHECKED & (INT)SendMessageW(hwndCtrl, BM_GETSTATE, 0, 0L)) flags |= FF_STATISTICS; + else flags &= ~FF_STATISTICS; + break; + } + break; + case IDC_CB_GENDER: + switch(nEvntID) + { + case CBN_SELCHANGE: ComboBox_OnSelChange(hwndCtrl); break; + } + break; + } +} + +INT_PTR setup_page_feedback::PageDlgProc(UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + switch(uMsg) + { + case WM_INITDIALOG: return OnInitDialog((HWND)wParam, lParam); + case WM_DESTROY: break; + case WM_SIZE: OnSize((UINT)wParam, LOWORD(lParam), HIWORD(lParam)); break; + case WM_COMMAND: OnCommand(LOWORD(wParam), HIWORD(wParam), (HWND)lParam); break; + } + return 0; +} + +static INT_PTR WINAPI DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + setup_page_feedback *pInst = (setup_page_feedback*)GetPropW(hwnd, L"SETUPPAGE"); + + switch(uMsg) + { + case WM_INITDIALOG: + pInst = (setup_page_feedback*)lParam; + if (pInst) + { + pInst->hwnd = hwnd; + SetPropW(hwnd, L"SETUPPAGE", pInst); + } + break; + case WM_DESTROY: + if (pInst) + { + pInst->PageDlgProc(uMsg, wParam, lParam); + RemovePropW(hwnd, L"SETUPPAGE"); + pInst = NULL; + } + break; + } + + return (pInst) ? pInst->PageDlgProc(uMsg, wParam, lParam) : 0; +} + +#ifdef CBCLASS +#undef CBCLASS +#endif + +#define CBCLASS setup_page_feedback +START_DISPATCH +CB(ADDREF, AddRef) +CB(RELEASE, Release) +CB(API_SETUPPAGE_GET_NAME, GetName) +CB(API_SETUPPAGE_CREATEVIEW, CreateView) +CB(API_SETUPPAGE_SAVE, Save) +CB(API_SETUPPAGE_REVERT, Revert) +CB(API_SETUPPAGE_ISDIRTY, IsDirty) +CB(API_SETUPPAGE_VALIDATE, Validate) +END_DISPATCH +#undef CBCLASS
\ No newline at end of file |