/ src / modules / imageresizer / dll / dllmain.cpp
dllmain.cpp
  1  #include "pch.h"
  2  #include "Generated Files/resource.h"
  3  #include "ImageResizerExt_i.h"
  4  #include "dllmain.h"
  5  
  6  #include <ImageResizerConstants.h>
  7  #include <Settings.h>
  8  #include <trace.h>
  9  
 10  #include <common/logger/logger.h>
 11  #include <common/SettingsAPI/settings_objects.h>
 12  #include <common/utils/package.h>
 13  #include <common/utils/process_path.h>
 14  #include <common/utils/resources.h>
 15  #include <common/utils/logger_helper.h>
 16  #include <interface/powertoy_module_interface.h>
 17  #include "RuntimeRegistration.h"
 18  
 19  CImageResizerExtModule _AtlModule;
 20  HINSTANCE g_hInst_imageResizer = 0;
 21  
 22  extern "C" BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
 23  {
 24      switch (dwReason)
 25      {
 26      case DLL_PROCESS_ATTACH:
 27          g_hInst_imageResizer = hInstance;
 28          Trace::RegisterProvider();
 29          break;
 30      case DLL_PROCESS_DETACH:
 31          Trace::UnregisterProvider();
 32          break;
 33      }
 34      return _AtlModule.DllMain(dwReason, lpReserved);
 35  }
 36  
 37  class ImageResizerModule : public PowertoyModuleIface
 38  {
 39  private:
 40      // Enabled by default
 41      bool m_enabled = false;
 42      std::wstring app_name;
 43      //contains the non localized key of the powertoy
 44      std::wstring app_key;
 45  
 46      // Update registration based on enabled state
 47      void UpdateRegistration(bool enabled)
 48      {
 49          if (enabled)
 50          {
 51  #if defined(ENABLE_REGISTRATION) || defined(NDEBUG)
 52              ImageResizerRuntimeRegistration::EnsureRegistered();
 53              Logger::info(L"ImageResizer context menu registered");
 54  #endif
 55          }
 56          else
 57          {
 58  #if defined(ENABLE_REGISTRATION) || defined(NDEBUG)
 59              ImageResizerRuntimeRegistration::Unregister();
 60              Logger::info(L"ImageResizer context menu unregistered");
 61  #endif
 62          }
 63      }
 64  
 65  
 66  public:
 67      // Constructor
 68      ImageResizerModule()
 69      {
 70          m_enabled = CSettingsInstance().GetEnabled();
 71          UpdateRegistration(m_enabled);
 72          app_name = GET_RESOURCE_STRING(IDS_IMAGERESIZER);
 73          app_key = ImageResizerConstants::ModuleKey;
 74          LoggerHelpers::init_logger(app_key, L"ModuleInterface", LogSettings::imageResizerLoggerName);
 75      };
 76  
 77      // Destroy the powertoy and free memory
 78      virtual void destroy() override
 79      {
 80          delete this;
 81      }
 82  
 83      // Return the localized display name of the powertoy
 84      virtual const wchar_t* get_name() override
 85      {
 86          return app_name.c_str();
 87      }
 88  
 89      // Return the non localized key of the powertoy, this will be cached by the runner
 90      virtual const wchar_t* get_key() override
 91      {
 92          return app_key.c_str();
 93      }
 94  
 95      // Return the configured status for the gpo policy for the module
 96      virtual powertoys_gpo::gpo_rule_configured_t gpo_policy_enabled_configuration() override
 97      {
 98          return powertoys_gpo::getConfiguredImageResizerEnabledValue();
 99      }
100  
101      // Return JSON with the configuration options.
102      virtual bool get_config(wchar_t* buffer, int* buffer_size) override
103      {
104          HINSTANCE hinstance = reinterpret_cast<HINSTANCE>(&__ImageBase);
105  
106          // Create a Settings object.
107          PowerToysSettings::Settings settings(hinstance, get_name());
108          settings.set_description(GET_RESOURCE_STRING(IDS_SETTINGS_DESCRIPTION));
109          settings.set_overview_link(L"https://aka.ms/PowerToysOverview_ImageResizer");
110          settings.set_icon_key(L"pt-image-resizer");
111          settings.add_header_szLarge(L"imageresizer_settingsheader", GET_RESOURCE_STRING(IDS_SETTINGS_HEADER_DESCRIPTION), GET_RESOURCE_STRING(IDS_SETTINGS_HEADER));
112          return settings.serialize_to_buffer(buffer, buffer_size);
113      }
114  
115      // Signal from the Settings editor to call a custom action.
116      // This can be used to spawn more complex editors.
117      virtual void call_custom_action(const wchar_t* /*action*/) override {}
118  
119      // Called by the runner to pass the updated settings values as a serialized JSON.
120      virtual void set_config(const wchar_t* /*config*/) override {}
121  
122      // Enable the powertoy
123      virtual void enable()
124      {
125          m_enabled = true;
126  
127          if (package::IsWin11OrGreater())
128          {
129              std::wstring path = get_module_folderpath(g_hInst_imageResizer);
130              std::wstring packageUri = path + L"\\ImageResizerContextMenuPackage.msix";
131              if (!package::IsPackageRegisteredWithPowerToysVersion(ImageResizerConstants::ModulePackageDisplayName))
132              {
133                  package::RegisterSparsePackage(path, packageUri);
134              }
135          }
136          UpdateRegistration(m_enabled);
137          Trace::EnableImageResizer(m_enabled);
138      }
139  
140      // Disable the powertoy
141      virtual void disable()
142      {
143          m_enabled = false;
144          UpdateRegistration(m_enabled);
145          Trace::EnableImageResizer(m_enabled);
146      }
147  
148      // Returns if the powertoys is enabled
149      virtual bool is_enabled() override
150      {
151          return m_enabled;
152      }
153  };
154  
155  extern "C" __declspec(dllexport) PowertoyModuleIface* __cdecl powertoy_create()
156  {
157      return new ImageResizerModule();
158  }