summaryrefslogtreecommitdiffstats
path: root/uriloader/exthandler/win/nsOSHelperAppService.h
blob: e2bce86d5bcd8c3cbcb1d9cec8ee66420ce924b8 (plain)
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
80
81
/* -*- Mode: C++; tab-width: 3; indent-tabs-mode: nil; c-basic-offset: 2 -*-
 * 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/. */

#ifndef nsOSHelperAppService_h__
#define nsOSHelperAppService_h__

// The OS helper app service is a subclass of nsExternalHelperAppService and is
// implemented on each platform. It contains platform specific code for finding
// helper applications for a given mime type in addition to launching those
// applications.

#include "nsExternalHelperAppService.h"
#include "nsCExternalHandlerService.h"
#include "nsCOMPtr.h"
#include <windows.h>

#ifdef _WIN32_WINNT
#  undef _WIN32_WINNT
#endif
#define _WIN32_WINNT 0x0600
#include <shlobj.h>

class nsMIMEInfoWin;
class nsIMIMEInfo;

class nsOSHelperAppService : public nsExternalHelperAppService {
 public:
  nsOSHelperAppService();
  virtual ~nsOSHelperAppService();

  // override nsIExternalProtocolService methods
  NS_IMETHOD OSProtocolHandlerExists(const char* aProtocolScheme,
                                     bool* aHandlerExists) override;
  nsresult LoadUriInternal(nsIURI* aURL);
  NS_IMETHOD GetApplicationDescription(const nsACString& aScheme,
                                       nsAString& _retval) override;

  NS_IMETHOD IsCurrentAppOSDefaultForProtocol(const nsACString& aScheme,
                                              bool* _retval) override;

  // method overrides for windows registry look up steps....
  NS_IMETHOD GetMIMEInfoFromOS(const nsACString& aMIMEType,
                               const nsACString& aFileExt, bool* aFound,
                               nsIMIMEInfo** aMIMEInfo) override;
  NS_IMETHOD UpdateDefaultAppInfo(nsIMIMEInfo* aMIMEInfo) override;
  NS_IMETHOD GetProtocolHandlerInfoFromOS(const nsACString& aScheme,
                                          bool* found,
                                          nsIHandlerInfo** _retval);
  virtual bool GetMIMETypeFromOSForExtension(const nsACString& aExtension,
                                             nsACString& aMIMEType) override;

  /** Get the string value of a registry value and store it in result.
   * @return true on success, false on failure
   */
  static bool GetValueString(HKEY hKey, const char16_t* pValueName,
                             nsAString& result);

 protected:
  nsresult GetDefaultAppInfo(const nsAString& aTypeName,
                             nsAString& aDefaultDescription,
                             nsIFile** aDefaultApplication);
  // Lookup a mime info by extension, using an optional type hint
  already_AddRefed<nsMIMEInfoWin> GetByExtension(
      const nsString& aFileExt, const char* aTypeHint = nullptr);
  nsresult InternalSetDefaultsOnMIME(nsMIMEInfoWin* aMIMEInfo);
  nsresult FindOSMimeInfoForType(const char* aMimeContentType, nsIURI* aURI,
                                 char** aFileExtension,
                                 nsIMIMEInfo** aMIMEInfo);

  static nsresult GetMIMEInfoFromRegistry(const nsString& fileType,
                                          nsIMIMEInfo* pInfo);
  /// Looks up the type for the extension aExt and compares it to aType
  static bool typeFromExtEquals(const char16_t* aExt, const char* aType);

 private:
  IApplicationAssociationRegistration* mAppAssoc;
};

#endif  // nsOSHelperAppService_h__