static void open_button_cb(GtkButton *button, PidginXferDialog *dialog) { #ifdef _WIN32 /* If using Win32... */ int code; if (G_WIN32_HAVE_WIDECHAR_API ()) { wchar_t *wc_filename = g_utf8_to_utf16( purple_xfer_get_local_filename( dialog->selected_xfer), -1, NULL, NULL, NULL); code = (int) ShellExecuteW(NULL, NULL, wc_filename, NULL, NULL, SW_SHOW); g_free(wc_filename); } else { char *l_filename = g_locale_from_utf8( purple_xfer_get_local_filename( dialog->selected_xfer), -1, NULL, NULL, NULL); code = (int) ShellExecuteA(NULL, NULL, l_filename, NULL, NULL, SW_SHOW); g_free(l_filename); } if (code == SE_ERR_ASSOCINCOMPLETE || code == SE_ERR_NOASSOC) { purple_notify_error(dialog, NULL, _("There is no application configured to open this type of file."), NULL); } else if (code < 32) { purple_notify_error(dialog, NULL, _("An error occurred while opening the file."), NULL); purple_debug_warning("ft", "filename: %s; code: %d\n", purple_xfer_get_local_filename(dialog->selected_xfer), code); } #else const char *filename = purple_xfer_get_local_filename(dialog->selected_xfer); char *command = NULL; char *tmp = NULL; GError *error = NULL; if (purple_running_gnome()) { char *escaped = g_shell_quote(filename); command = g_strdup_printf("gnome-open %s", escaped); g_free(escaped); } else if (purple_running_kde()) { char *escaped = g_shell_quote(filename); if (purple_str_has_suffix(filename, ".desktop")) command = g_strdup_printf("kfmclient openURL %s 'text/plain'", escaped); else command = g_strdup_printf("kfmclient openURL %s", escaped); g_free(escaped); } else { purple_notify_uri(NULL, filename); return; } if (purple_program_is_valid(command)) { gint exit_status; if (!g_spawn_command_line_sync(command, NULL, NULL, &exit_status, &error)) { tmp = g_strdup_printf(_("Error launching %s: %s"), purple_xfer_get_local_filename(dialog->selected_xfer), error->message); purple_notify_error(dialog, NULL, _("Unable to open file."), tmp); g_free(tmp); g_error_free(error); } if (exit_status != 0) { char *primary = g_strdup_printf(_("Error running %s"), command); char *secondary = g_strdup_printf(_("Process returned error code %d"), exit_status); purple_notify_error(dialog, NULL, primary, secondary); g_free(tmp); } } #endif }
DWORD CALLBACK AboutIniBoxProc (HWND hDlg, DWORD uMsg, DWORD wParam, DWORD /*lParam*/) { static wchar_t RDBHomePage[300], CHTHomePage[300], RDXHomePage[300]; switch (uMsg) { case WM_INITDIALOG: { wchar_t String[200]; //Title LONG_PTR originalWndProc = GetWindowLongPtrW(hDlg, GWLP_WNDPROC); SetWindowLongPtrW(hDlg, GWLP_WNDPROC, (LONG_PTR) DefWindowProcW); SetWindowTextW(hDlg, GS(INI_TITLE)); SetWindowLongPtrW(hDlg, GWLP_WNDPROC, originalWndProc); //Language SetDlgItemTextW(hDlg,IDC_LAN,GS(INI_CURRENT_LANG)); set_about_field(hDlg, IDC_LAN_AUTHOR, GS(INI_AUTHOR), GS(LANGUAGE_AUTHOR)); set_about_field(hDlg, IDC_LAN_VERSION, GS(INI_VERSION), GS(LANGUAGE_VERSION)); set_about_field(hDlg, IDC_LAN_DATE, GS(INI_DATE), GS(LANGUAGE_DATE)); if (wcslen(GS(LANGUAGE_NAME)) == 0) { EnableWindow(GetDlgItem(hDlg,IDC_LAN),FALSE); EnableWindow(GetDlgItem(hDlg,IDC_LAN_AUTHOR),FALSE); EnableWindow(GetDlgItem(hDlg,IDC_LAN_VERSION),FALSE); EnableWindow(GetDlgItem(hDlg,IDC_LAN_DATE),FALSE); } //RDB CIniFile RdbIniFile(g_Settings->LoadString(SupportFile_RomDatabase).c_str()); wcsncpy(String, RdbIniFile.GetString("Meta","Author","").ToUTF16().c_str(),sizeof(String) / sizeof(String[0])); if (wcslen(String) == 0) { EnableWindow(GetDlgItem(hDlg,IDC_RDB),FALSE); EnableWindow(GetDlgItem(hDlg,IDC_RDB_AUTHOR),FALSE); EnableWindow(GetDlgItem(hDlg,IDC_RDB_VERSION),FALSE); EnableWindow(GetDlgItem(hDlg,IDC_RDB_DATE),FALSE); EnableWindow(GetDlgItem(hDlg,IDC_RDB_HOME),FALSE); } set_about_field(hDlg, IDC_RDB_AUTHOR, GS(INI_AUTHOR), String); wcsncpy(String, RdbIniFile.GetString("Meta","Version","").ToUTF16().c_str(),sizeof(String) / sizeof(String[0])); set_about_field(hDlg, IDC_RDB_VERSION, GS(INI_VERSION), String); wcsncpy(String, RdbIniFile.GetString("Meta","Date","").ToUTF16().c_str(),sizeof(String) / sizeof(String[0])); set_about_field(hDlg, IDC_RDB_DATE, GS(INI_DATE), String); wcsncpy(RDBHomePage, RdbIniFile.GetString("Meta","Homepage","").ToUTF16().c_str(),sizeof(RDBHomePage) / sizeof(RDBHomePage[0])); SetDlgItemTextW(hDlg, IDC_RDB_HOME, GS(INI_HOMEPAGE)); if (wcslen(RDBHomePage) == 0) { EnableWindow(GetDlgItem(hDlg,IDC_RDB_HOME),FALSE); } //Cheat SetDlgItemTextW(hDlg,IDC_CHT,GS(INI_CURRENT_CHT)); CIniFile CheatIniFile(g_Settings->LoadString(SupportFile_Cheats).c_str()); wcsncpy(String, CheatIniFile.GetString("Meta","Author","").ToUTF16().c_str(),sizeof(String) / sizeof(String[0])); if (wcslen(String) == 0) { EnableWindow(GetDlgItem(hDlg,IDC_CHT),FALSE); EnableWindow(GetDlgItem(hDlg,IDC_CHT_AUTHOR),FALSE); EnableWindow(GetDlgItem(hDlg,IDC_CHT_VERSION),FALSE); EnableWindow(GetDlgItem(hDlg,IDC_CHT_DATE),FALSE); EnableWindow(GetDlgItem(hDlg,IDC_CHT_HOME),FALSE); } set_about_field(hDlg, IDC_CHT_AUTHOR, GS(INI_AUTHOR), String); wcsncpy(String, CheatIniFile.GetString("Meta","Version","").ToUTF16().c_str(),sizeof(String) / sizeof(String[0])); set_about_field(hDlg, IDC_CHT_VERSION, GS(INI_VERSION), String); wcsncpy(String, CheatIniFile.GetString("Meta","Date","").ToUTF16().c_str(),sizeof(String) / sizeof(String[0])); set_about_field(hDlg, IDC_CHT_DATE, GS(INI_DATE), String); wcsncpy(CHTHomePage, CheatIniFile.GetString("Meta","Homepage","").ToUTF16().c_str(),sizeof(CHTHomePage) / sizeof(CHTHomePage[0])); SetDlgItemTextW(hDlg, IDC_CHT_HOME, GS(INI_HOMEPAGE)); if (wcslen(CHTHomePage) == 0) { EnableWindow(GetDlgItem(hDlg,IDC_CHT_HOME),FALSE); } //Extended Info SetDlgItemTextW(hDlg, IDC_RDX, GS(INI_CURRENT_RDX)); CIniFile RdxIniFile(g_Settings->LoadString(SupportFile_ExtInfo).c_str()); wcsncpy(String, RdxIniFile.GetString("Meta","Author","").ToUTF16().c_str(),sizeof(String) / sizeof(String[0])); if (wcslen(String) == 0) { EnableWindow(GetDlgItem(hDlg,IDC_RDX),FALSE); EnableWindow(GetDlgItem(hDlg,IDC_RDX_AUTHOR),FALSE); EnableWindow(GetDlgItem(hDlg,IDC_RDX_VERSION),FALSE); EnableWindow(GetDlgItem(hDlg,IDC_RDX_DATE),FALSE); EnableWindow(GetDlgItem(hDlg,IDC_RDX_HOME),FALSE); } set_about_field(hDlg, IDC_RDX_AUTHOR, GS(INI_AUTHOR), String); wcsncpy(String, RdxIniFile.GetString("Meta","Version","").ToUTF16().c_str(),sizeof(String) / sizeof(String[0])); set_about_field(hDlg, IDC_RDX_VERSION, GS(INI_VERSION), String); wcsncpy(String, RdxIniFile.GetString("Meta","Date","").ToUTF16().c_str(),sizeof(String) / sizeof(String[0])); set_about_field(hDlg, IDC_RDX_DATE, GS(INI_DATE), String); wcsncpy(RDXHomePage, RdxIniFile.GetString("Meta","Homepage","").ToUTF16().c_str(),sizeof(RDXHomePage) / sizeof(RDXHomePage[0])); SetDlgItemTextW(hDlg, IDC_RDX_HOME, GS(INI_HOMEPAGE)); if (wcslen(RDXHomePage) == 0) { EnableWindow(GetDlgItem(hDlg,IDC_RDX_HOME),FALSE); } SetDlgItemTextW(hDlg, IDOK, GS(CHEAT_OK)); } break; case WM_COMMAND: switch (LOWORD(wParam)) { case IDC_RDB_HOME: ShellExecuteW(NULL,L"open",RDBHomePage,NULL,NULL,SW_SHOWNORMAL); break; case IDC_CHT_HOME: ShellExecuteW(NULL,L"open",CHTHomePage,NULL,NULL,SW_SHOWNORMAL); break; case IDC_RDX_HOME: ShellExecuteW(NULL,L"open",RDXHomePage,NULL,NULL,SW_SHOWNORMAL); break; case IDOK: case IDCANCEL: EndDialog(hDlg,0); break; } default: return FALSE; } return TRUE; }
HRESULT ContextMenu::ShareWithBox(HWND hwndParent) { if (m_appPath == NULL || m_paths.size() == 0) { return E_FAIL; } // calculate total size: WCHAR* buff = NULL; size_t size = 0; if (m_paths.size() > 1) { for(size_t i = 0; i < m_paths.size(); ++i) { WCHAR* path = m_paths.at(i); size += wcslen(path); size += 4; } size += 1; buff = new WCHAR[size]; *buff = 0; } if (buff == NULL) { // can't allocate buffer for all paths. trying to call separatelly: for(size_t i = 0; i < m_paths.size(); ++i) { WCHAR* path = m_paths.at(i); ShareWithBox(path, hwndParent); } } else { // ok buff allocated. coping all paths into it: for(size_t i = 0; i < m_paths.size(); ++i) { WCHAR* path = m_paths.at(i); wcscat(buff, L" \""); wcscat(buff, path); wcscat(buff, L"\""); #ifdef _DEBUG MessageBoxW(hwndParent, buff, path, MB_OK); #endif } #ifdef _DEBUG // MessageBoxW(hwndParent, buff, m_appPath, MB_OK); #endif ShellExecuteW(hwndParent, NULL, m_appPath, buff, NULL, SW_SHOWNORMAL); delete buff; } for(size_t i = 0; i < m_paths.size(); ++i) { WCHAR* path = m_paths.at(i); delete path; } m_paths.clear(); return S_OK; }
BOOL CALLBACK UruLoginDialogProc( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ) { static LoginDialogParam* pLoginParam; static bool showAuthFailed = false; switch( uMsg ) { case WM_INITDIALOG: { s_loginDlgRunning = true; _beginthread(StatusCallback, 0, hwndDlg); pLoginParam = (LoginDialogParam*)lParam; SetWindowText(hwndDlg, "Login"); SendMessage(hwndDlg, WM_SETICON, ICON_BIG, (LPARAM)LoadIcon(gHInst, MAKEINTRESOURCE(IDI_ICON_DIRT))); EnableWindow(GetDlgItem(hwndDlg, IDOK), FALSE); SetDlgItemText(hwndDlg, IDC_URULOGIN_USERNAME, pLoginParam->username); CheckDlgButton(hwndDlg, IDC_URULOGIN_REMEMBERPASS, pLoginParam->remember ? BST_CHECKED : BST_UNCHECKED); if (pLoginParam->remember) SetDlgItemText(hwndDlg, IDC_URULOGIN_PASSWORD, FAKE_PASS_STRING); SetFocus(GetDlgItem(hwndDlg, pLoginParam->focus)); if (IS_NET_ERROR(pLoginParam->authError)) { showAuthFailed = true; } SendMessage(GetDlgItem(hwndDlg, IDC_PRODUCTSTRING), WM_SETTEXT, 0, (LPARAM)plProduct::ProductString().c_str()); for (int i = 0; i < plLocalization::GetNumLocales(); i++) { SendMessage(GetDlgItem(hwndDlg, IDC_LANGUAGE), CB_ADDSTRING, 0, (LPARAM)plLocalization::GetLanguageName((plLocalization::Language)i)); } SendMessage(GetDlgItem(hwndDlg, IDC_LANGUAGE), CB_SETCURSEL, (WPARAM)plLocalization::GetLanguage(), 0); SetTimer(hwndDlg, AUTH_LOGIN_TIMER, 10, NULL); return FALSE; } case WM_USER_SETSTATUSMSG: SendMessage(GetDlgItem(hwndDlg, IDC_STATUS_TEXT), WM_SETTEXT, 0, lParam); return TRUE; case WM_DESTROY: { s_loginDlgRunning = false; s_statusEvent.Wait(); KillTimer(hwndDlg, AUTH_LOGIN_TIMER); return TRUE; } case WM_NCHITTEST: { SetWindowLongPtr(hwndDlg, DWL_MSGRESULT, (LONG_PTR)HTCAPTION); return TRUE; } case WM_PAINT: { if (showAuthFailed) { SetTimer(hwndDlg, AUTH_FAILED_TIMER, 10, NULL); showAuthFailed = false; } return FALSE; } case WM_COMMAND: { if (HIWORD(wParam) == BN_CLICKED && (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)) { bool ok = (LOWORD(wParam) == IDOK); if (ok) { char password[kMaxPasswordLength]; GetDlgItemText(hwndDlg, IDC_URULOGIN_USERNAME, pLoginParam->username, kMaxAccountNameLength); GetDlgItemText(hwndDlg, IDC_URULOGIN_PASSWORD, password, kMaxPasswordLength); pLoginParam->remember = (IsDlgButtonChecked(hwndDlg, IDC_URULOGIN_REMEMBERPASS) == BST_CHECKED); plLocalization::Language new_language = (plLocalization::Language)SendMessage(GetDlgItem(hwndDlg, IDC_LANGUAGE), CB_GETCURSEL, 0, 0L); plLocalization::SetLanguage(new_language); SaveUserPass (pLoginParam, password); // Welcome to HACKland, population: Branan // The code to write general.ini really doesn't belong here, but it works... for now. // When general.ini gets expanded, this will need to find a proper home somewhere. { plFileName gipath = plFileName::Join(plFileSystem::GetInitPath(), "general.ini"); plString ini_str = plFormat("App.SetLanguage {}\n", plLocalization::GetLanguageName(new_language)); hsStream* gini = plEncryptedStream::OpenEncryptedFileWrite(gipath); gini->WriteString(ini_str); gini->Close(); delete gini; } memset(&pLoginParam->authError, 0, sizeof(pLoginParam->authError)); bool cancelled = AuthenticateNetClientComm(&pLoginParam->authError, hwndDlg); if (IS_NET_SUCCESS(pLoginParam->authError) && !cancelled) EndDialog(hwndDlg, ok); else { if (!cancelled) ::DialogBoxParam(gHInst, MAKEINTRESOURCE( IDD_AUTHFAILED ), hwndDlg, AuthFailedDialogProc, (LPARAM)pLoginParam); else { NetCommDisconnect(); } } } else EndDialog(hwndDlg, ok); return TRUE; } else if (HIWORD(wParam) == EN_CHANGE && LOWORD(wParam) == IDC_URULOGIN_USERNAME) { char username[kMaxAccountNameLength]; GetDlgItemText(hwndDlg, IDC_URULOGIN_USERNAME, username, kMaxAccountNameLength); if (StrLen(username) == 0) EnableWindow(GetDlgItem(hwndDlg, IDOK), FALSE); else EnableWindow(GetDlgItem(hwndDlg, IDOK), TRUE); return TRUE; } else if (HIWORD(wParam) == BN_CLICKED && LOWORD(wParam) == IDC_URULOGIN_NEWACCTLINK) { plString signupurl = GetServerSignupUrl(); ShellExecuteW(NULL, L"open", signupurl.ToWchar(), NULL, NULL, SW_SHOWNORMAL); return TRUE; } break; } case WM_TIMER: { switch(wParam) { case AUTH_FAILED_TIMER: KillTimer(hwndDlg, AUTH_FAILED_TIMER); ::DialogBoxParam(gHInst, MAKEINTRESOURCE( IDD_AUTHFAILED ), hwndDlg, AuthFailedDialogProc, (LPARAM)pLoginParam); return TRUE; case AUTH_LOGIN_TIMER: NetCommUpdate(); return TRUE; } return FALSE; } } return FALSE; }
static DWORD WINAPI ThreadFunc(LPVOID Context) { IBindStatusCallback *dl = NULL; WCHAR path[MAX_PATH]; PWSTR p, q; HWND Dlg = (HWND) Context; DWORD dwContentLen, dwBytesWritten, dwBytesRead, dwStatus; DWORD dwCurrentBytesRead = 0; DWORD dwStatusLen = sizeof(dwStatus); BOOL bCancelled = FALSE; BOOL bTempfile = FALSE; BOOL bCab = FALSE; HINTERNET hOpen = NULL; HINTERNET hFile = NULL; HANDLE hOut = INVALID_HANDLE_VALUE; unsigned char lpBuffer[4096]; const LPWSTR lpszAgent = L"RApps/1.0"; URL_COMPONENTS urlComponents; size_t urlLength, filenameLength; /* build the path for the download */ p = wcsrchr(AppInfo->szUrlDownload, L'/'); q = wcsrchr(AppInfo->szUrlDownload, L'?'); /* do we have a final slash separator? */ if (!p) goto end; /* prepare the tentative length of the filename, maybe we've to remove part of it later on */ filenameLength = wcslen(p) * sizeof(WCHAR); /* do we have query arguments in the target URL after the filename? account for them (e.g. https://example.org/myfile.exe?no_adware_plz) */ if (q && q > p && (q - p) > 0) filenameLength -= wcslen(q - 1) * sizeof(WCHAR); /* is this URL an update package for RAPPS? if so store it in a different place */ if (wcscmp(AppInfo->szUrlDownload, APPLICATION_DATABASE_URL) == 0) { bCab = TRUE; if (!GetStorageDirectory(path, _countof(path))) goto end; } else { if (FAILED(StringCbCopyW(path, sizeof(path), SettingsInfo.szDownloadDir))) goto end; } /* is the path valid? can we access it? */ if (GetFileAttributesW(path) == INVALID_FILE_ATTRIBUTES) { if (!CreateDirectoryW(path, NULL)) goto end; } /* append a \ to the provided file system path, and the filename portion from the URL after that */ if (FAILED(StringCbCatW(path, sizeof(path), L"\\"))) goto end; if (FAILED(StringCbCatNW(path, sizeof(path), p + 1, filenameLength))) goto end; /* is the file already there? let's avoid having to download it */ if (!bCab && AppInfo->szSHA1[0] != 0 && GetFileAttributesW(path) != INVALID_FILE_ATTRIBUTES) { /* only open it in case of total correctness */ if (VerifyInteg(AppInfo->szSHA1, path)) goto run; } /* create an async download context for it */ bTempfile = TRUE; dl = CreateDl(Context, &bCancelled); if (dl == NULL) goto end; /* FIXME: this should just be using the system-wide proxy settings */ switch(SettingsInfo.Proxy) { case 0: /* preconfig */ hOpen = InternetOpenW(lpszAgent, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0); break; case 1: /* direct (no proxy) */ hOpen = InternetOpenW(lpszAgent, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0); break; case 2: /* use proxy */ hOpen = InternetOpenW(lpszAgent, INTERNET_OPEN_TYPE_PROXY, SettingsInfo.szProxyServer, SettingsInfo.szNoProxyFor, 0); break; default: /* preconfig */ hOpen = InternetOpenW(lpszAgent, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0); break; } if (!hOpen) goto end; hFile = InternetOpenUrlW(hOpen, AppInfo->szUrlDownload, NULL, 0, INTERNET_FLAG_PRAGMA_NOCACHE | INTERNET_FLAG_KEEP_CONNECTION, 0); if (!hFile) goto end; if (!HttpQueryInfoW(hFile, HTTP_QUERY_STATUS_CODE | HTTP_QUERY_FLAG_NUMBER, &dwStatus, &dwStatusLen, NULL)) goto end; if(dwStatus != HTTP_STATUS_OK) { WCHAR szMsgText[MAX_STR_LEN]; if (!LoadStringW(hInst, IDS_UNABLE_TO_DOWNLOAD, szMsgText, sizeof(szMsgText) / sizeof(WCHAR))) goto end; MessageBoxW(hMainWnd, szMsgText, NULL, MB_OK | MB_ICONERROR); goto end; } dwStatusLen = sizeof(dwStatus); memset(&urlComponents, 0, sizeof(urlComponents)); urlComponents.dwStructSize = sizeof(urlComponents); if(FAILED(StringCbLengthW(AppInfo->szUrlDownload, sizeof(AppInfo->szUrlDownload), &urlLength))) goto end; urlLength /= sizeof(WCHAR); urlComponents.dwSchemeLength = urlLength + 1; urlComponents.lpszScheme = malloc(urlComponents.dwSchemeLength * sizeof(WCHAR)); urlComponents.dwHostNameLength = urlLength + 1; urlComponents.lpszHostName = malloc(urlComponents.dwHostNameLength * sizeof(WCHAR)); if(!InternetCrackUrlW(AppInfo->szUrlDownload, urlLength+1, ICU_DECODE | ICU_ESCAPE, &urlComponents)) goto end; if(urlComponents.nScheme == INTERNET_SCHEME_HTTP || urlComponents.nScheme == INTERNET_SCHEME_HTTPS) HttpQueryInfo(hFile, HTTP_QUERY_CONTENT_LENGTH | HTTP_QUERY_FLAG_NUMBER, &dwContentLen, &dwStatus, 0); if(urlComponents.nScheme == INTERNET_SCHEME_FTP) dwContentLen = FtpGetFileSize(hFile, &dwStatus); #ifdef USE_CERT_PINNING /* are we using HTTPS to download the RAPPS update package? check if the certificate is original */ if ((urlComponents.nScheme == INTERNET_SCHEME_HTTPS) && (wcscmp(AppInfo->szUrlDownload, APPLICATION_DATABASE_URL) == 0) && (!CertIsValid(hOpen, urlComponents.lpszHostName))) { WCHAR szMsgText[MAX_STR_LEN]; if (!LoadStringW(hInst, IDS_CERT_DOES_NOT_MATCH, szMsgText, sizeof(szMsgText) / sizeof(WCHAR))) goto end; MessageBoxW(Dlg, szMsgText, NULL, MB_OK | MB_ICONERROR); goto end; } #endif free(urlComponents.lpszScheme); free(urlComponents.lpszHostName); hOut = CreateFileW(path, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, 0, NULL); if (hOut == INVALID_HANDLE_VALUE) goto end; do { if (!InternetReadFile(hFile, lpBuffer, _countof(lpBuffer), &dwBytesRead)) goto end; if (!WriteFile(hOut, &lpBuffer[0], dwBytesRead, &dwBytesWritten, NULL)) goto end; dwCurrentBytesRead += dwBytesRead; IBindStatusCallback_OnProgress(dl, dwCurrentBytesRead, dwContentLen, 0, AppInfo->szUrlDownload); } while (dwBytesRead && !bCancelled); CloseHandle(hOut); hOut = INVALID_HANDLE_VALUE; if (bCancelled) goto end; /* if this thing isn't a RAPPS update and it has a SHA-1 checksum verify its integrity by using the native advapi32.A_SHA1 functions */ if (!bCab && AppInfo->szSHA1[0] != 0) { WCHAR szMsgText[MAX_STR_LEN]; /* change a few strings in the download dialog to reflect the verification process */ LoadStringW(hInst, IDS_INTEG_CHECK_TITLE, szMsgText, _countof(szMsgText)); SetWindowText(Dlg, szMsgText); SendMessageW(GetDlgItem(Dlg, IDC_DOWNLOAD_STATUS), WM_SETTEXT, 0, (LPARAM)path); /* this may take a while, depending on the file size */ if (!VerifyInteg(AppInfo->szSHA1, path)) { if (!LoadStringW(hInst, IDS_INTEG_CHECK_FAIL, szMsgText, _countof(szMsgText))) goto end; MessageBoxW(Dlg, szMsgText, NULL, MB_OK | MB_ICONERROR); goto end; } } ShowWindow(Dlg, SW_HIDE); run: /* run it */ if (!bCab) ShellExecuteW( NULL, L"open", path, NULL, NULL, SW_SHOWNORMAL ); end: if (hOut != INVALID_HANDLE_VALUE) CloseHandle(hOut); InternetCloseHandle(hFile); InternetCloseHandle(hOpen); if (dl) IBindStatusCallback_Release(dl); if (bTempfile) { if (bCancelled || (SettingsInfo.bDelInstaller && !bCab)) DeleteFileW(path); } EndDialog(Dlg, 0); return 0; }
LRESULT CALLBACK _HyperlinkProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { WNDPROC pfnOrigProc = (WNDPROC) GetProp(hwnd, PROP_ORIGINAL_PROC); switch (message) { case WM_DESTROY: { SetWindowLong(hwnd, GWL_WNDPROC, (LONG) pfnOrigProc); RemoveProp(hwnd, PROP_ORIGINAL_PROC); HFONT hOrigFont = (HFONT) GetProp(hwnd, PROP_ORIGINAL_FONT); SendMessage(hwnd, WM_SETFONT, (WPARAM) hOrigFont, 0); RemoveProp(hwnd, PROP_ORIGINAL_FONT); HFONT hFont = (HFONT) GetProp(hwnd, PROP_UNDERLINE_FONT); DeleteObject(hFont); RemoveProp(hwnd, PROP_UNDERLINE_FONT); RemoveProp(hwnd, PROP_STATIC_HYPERLINK); break; } case WM_MOUSEMOVE: { if (GetCapture() != hwnd) { HFONT hFont = (HFONT) GetProp(hwnd, PROP_UNDERLINE_FONT); SendMessage(hwnd, WM_SETFONT, (WPARAM) hFont, FALSE); InvalidateRect(hwnd, NULL, FALSE); SetCapture(hwnd); } else { RECT rect; GetWindowRect(hwnd, &rect); POINT pt = { LOWORD(lParam), HIWORD(lParam) }; ClientToScreen(hwnd, &pt); if (!PtInRect(&rect, pt)) { HFONT hFont = (HFONT) GetProp(hwnd, PROP_ORIGINAL_FONT); SendMessage(hwnd, WM_SETFONT, (WPARAM) hFont, FALSE); InvalidateRect(hwnd, NULL, FALSE); ReleaseCapture(); } } break; } case WM_SETCURSOR: { // Since IDC_HAND is not available on all operating systems, // we will load the arrow cursor if IDC_HAND is not present. HCURSOR hCursor = LoadCursor(NULL, MAKEINTRESOURCE(IDC_HAND)); if (NULL == hCursor) { hCursor = LoadCursor(NULL, MAKEINTRESOURCE(IDC_ARROW)); } SetCursor(hCursor); return TRUE; } case WM_LBUTTONUP: { // Shell to the website TCHAR lpOpen[MAX_PATH] = L"open"; TCHAR lpFile[MAX_PATH] = L"https://sites.google.com/site/wifilapper/"; int nShowCmd = SW_RESTORE; // Restore the Help document, if it is minimized or whatever. HINSTANCE Check = ShellExecuteW(hwnd, lpOpen, lpFile, NULL, NULL, nShowCmd); if ((int)Check <= 32) MessageBox(NULL, L"There was an error trying to open the website, check your connection and try again", L"ERROR", MB_OK); return true; } } return CallWindowProc(pfnOrigProc, hwnd, message, wParam, lParam); }
/* Process items in the StartUp group of the user's Programs under the Start Menu. Some installers put * shell links here to restart themselves after boot. */ static BOOL ProcessStartupItems(void) { BOOL ret = FALSE; HRESULT hr; IMalloc *ppM = NULL; IShellFolder *psfDesktop = NULL, *psfStartup = NULL; LPITEMIDLIST pidlStartup = NULL, pidlItem; ULONG NumPIDLs; IEnumIDList *iEnumList = NULL; STRRET strret; WCHAR wszCommand[MAX_PATH]; WINE_TRACE("Processing items in the StartUp folder.\n"); hr = SHGetMalloc(&ppM); if (FAILED(hr)) { WINE_ERR("Couldn't get IMalloc object.\n"); goto done; } hr = SHGetDesktopFolder(&psfDesktop); if (FAILED(hr)) { WINE_ERR("Couldn't get desktop folder.\n"); goto done; } hr = SHGetSpecialFolderLocation(NULL, CSIDL_STARTUP, &pidlStartup); if (FAILED(hr)) { WINE_TRACE("Couldn't get StartUp folder location.\n"); goto done; } hr = IShellFolder_BindToObject(psfDesktop, pidlStartup, NULL, &IID_IShellFolder, (LPVOID*)&psfStartup); if (FAILED(hr)) { WINE_TRACE("Couldn't bind IShellFolder to StartUp folder.\n"); goto done; } hr = IShellFolder_EnumObjects(psfStartup, NULL, SHCONTF_NONFOLDERS | SHCONTF_INCLUDEHIDDEN, &iEnumList); if (FAILED(hr)) { WINE_TRACE("Unable to enumerate StartUp objects.\n"); goto done; } while (IEnumIDList_Next(iEnumList, 1, &pidlItem, &NumPIDLs) == S_OK && (NumPIDLs) == 1) { hr = IShellFolder_GetDisplayNameOf(psfStartup, pidlItem, SHGDN_FORPARSING, &strret); if (FAILED(hr)) WINE_TRACE("Unable to get display name of enumeration item.\n"); else { hr = StrRetToBufW(&strret, pidlItem, wszCommand, MAX_PATH); if (FAILED(hr)) WINE_TRACE("Unable to parse display name.\n"); else { HINSTANCE hinst; hinst = ShellExecuteW(NULL, NULL, wszCommand, NULL, NULL, SW_SHOWNORMAL); if (PtrToUlong(hinst) <= 32) WINE_WARN("Error %p executing command %s.\n", hinst, wine_dbgstr_w(wszCommand)); } } IMalloc_Free(ppM, pidlItem); } /* Return success */ ret = TRUE; done: if (iEnumList) IEnumIDList_Release(iEnumList); if (psfStartup) IShellFolder_Release(psfStartup); if (pidlStartup) IMalloc_Free(ppM, pidlStartup); return ret; }