File: main.cpp

package info (click to toggle)
firefox 144.0-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 4,637,504 kB
  • sloc: cpp: 7,576,692; javascript: 6,430,831; ansic: 3,748,119; python: 1,398,978; xml: 628,810; asm: 438,679; java: 186,194; sh: 63,212; makefile: 19,159; objc: 13,086; perl: 12,986; yacc: 4,583; cs: 3,846; pascal: 3,448; lex: 1,720; ruby: 1,003; exp: 762; php: 436; lisp: 258; awk: 247; sql: 66; sed: 53; csh: 10
file content (79 lines) | stat: -rw-r--r-- 2,943 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include <iostream>
#include <optional>
#include <rpc.h>
#include <shellapi.h>
#include <string>
#include <windows.h>
#include "download_firefox.h"
#include "file_sink.h"
#include "find_firefox.h"
#include "tempfile_name.h"

#define DOWNLOAD_PAGE L"https://www.mozilla.org/firefox/new/"

int wmain() {
  // For telemetry purposes, let's set the env variable to indicate that
  // we used the launcher to start Firefox
  if (!SetEnvironmentVariableW(L"FIREFOX_LAUNCHED_BY_DESKTOP_LAUNCHER",
                               L"TRUE")) {
    std::wcout
        << L"Could not set env variable FIREFOX_LAUNCHED_BY_DESKTOP_LAUNCHER"
        << std::endl;
  }

  // First, we try to launch Firefox if it is installed
  std::optional<std::wstring> firefox_path = lookupFirefoxPath();
  if (firefox_path.has_value()) {
    std::wcout << L"Found Firefox at path " << firefox_path.value()
               << std::endl;
    HINSTANCE hinst =
        ShellExecuteW(nullptr, nullptr, firefox_path.value().c_str(), nullptr,
                      nullptr, SW_SHOWNORMAL);
    if ((INT_PTR)hinst > 32) {
      // ShellExecuteW returns a value > 32 on success. So we assume that
      // Firefox has launched.
      std::wcout << L"Firefox launched" << std::endl;
      return 0;
    }
  }
  bool download_completed = false;
  // If that doesn't work, we try to download the installer.
  std::optional<std::wstring> tempfileName = get_tempfile_name();
  if (tempfileName.has_value()) {
    std::unique_ptr<FileSink> fileSink = std::make_unique<FileSink>();
    if (fileSink->open(tempfileName.value())) {
      ErrCode rc = download_firefox(fileSink.get());
      if (rc == ErrCode::OK) {
        std::wcout << L"Firefox installer successfully downloaded" << std::endl;
        download_completed = true;
      }
    }
  }
  // If the installer successfully downloaded, try to launch it
  if (download_completed) {
    SHELLEXECUTEINFOW sei = {0};
    sei.cbSize = sizeof(sei);
    sei.fMask = SEE_MASK_WAITFORINPUTIDLE | SEE_MASK_NOASYNC;
    sei.lpFile = tempfileName.value().c_str();
    sei.lpParameters = L"/Prompt";
    sei.nShow = SW_SHOWNORMAL;
    ShellExecuteExW(&sei);

    if ((INT_PTR)sei.hInstApp > 32) {
      // ShellExecuteW returns a value > 32 on success.
      std::wcout << L"Firefox installer launched" << std::endl;
      return 0;
    }
  }
  // If that doesn't work, open the download page in the default browser
  HINSTANCE default_browser_hinst = ShellExecuteW(
      nullptr, nullptr, DOWNLOAD_PAGE, nullptr, nullptr, SW_SHOWNORMAL);
  if ((INT_PTR)default_browser_hinst > 32) {
    // ShellExecuteW returns a value > 32 on success.
    std::wcout << L"Opened default browser to the download page" << std::endl;
  }
  return 0;
}