MainPage.h 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. #pragma once
  2. #include "MainPage.g.h"
  3. #include "Model/ConfigViewModel.h"
  4. #include <winrt/Windows.Networking.Vpn.h>
  5. #include "ConfigUtil.h"
  6. using namespace winrt;
  7. using namespace Windows::ApplicationModel::Core;
  8. using namespace Windows::ApplicationModel::DataTransfer;
  9. using namespace Windows::Foundation;
  10. using namespace Windows::Foundation::Collections;
  11. using namespace Windows::Networking::Vpn;
  12. using namespace Windows::Storage;
  13. using namespace Windows::UI::Core;
  14. using namespace Windows::UI::Xaml;
  15. using namespace Windows::UI::Xaml::Controls;
  16. using namespace Windows::UI::Xaml::Input;
  17. using namespace Windows::UI::Xaml::Navigation;
  18. namespace winrt::Maple_App::implementation
  19. {
  20. template<typename T>
  21. concept ConvertableToIStorageItem = std::convertible_to<T, IStorageItem>;
  22. static const hstring CONFIG_PATH_SETTING_KEY = L"CONFIG_PATH";
  23. static const hstring NETIF_SETTING_KEY = L"NETIF";
  24. static const std::wstring_view DEFAULT_CONF_FILE_PATH = L"ms-appx:///Config/default.conf";
  25. static const std::wstring_view DEFAULT_JSON_FILE_PATH = L"ms-appx:///Config/default.json";
  26. static const std::wstring_view DEFAULT_MINIMAL_FILE_PATH = L"ms-appx:///Config/minimal.conf";
  27. std::string getNormalizedExtentionFromPath(const winrt::hstring& path);
  28. struct MainPage : MainPageT<MainPage>
  29. {
  30. MainPage();
  31. static DependencyProperty ConfigItemsProperty();
  32. static DependencyProperty UsingDefaultConfigFolderProperty();
  33. IObservableVector<Maple_App::ConfigViewModel> ConfigItems();
  34. bool UsingDefaultConfigFolder();
  35. fire_and_forget Page_Loaded(IInspectable const& sender, RoutedEventArgs const& e);
  36. void CoreTitleBar_LayoutMetricsChanged(CoreApplicationViewTitleBar const& sender, IInspectable const& args);
  37. void CoreWindow_Activated(IInspectable const& sender, WindowActivatedEventArgs const& args);
  38. void ConfigSetAsDefaultMenuItem_Click(IInspectable const& sender, RoutedEventArgs const& e);
  39. void ConfigRenameMenuItem_Click(IInspectable const& sender, RoutedEventArgs const& e);
  40. fire_and_forget ConfigDeleteMenuItem_Click(IInspectable const& sender, RoutedEventArgs const& e);
  41. void RenameDialogPrimaryButton_Click(IInspectable const& sender, ContentDialogButtonClickEventArgs const& e);
  42. void RenameDialogText_KeyDown(IInspectable const& sender, KeyRoutedEventArgs const& e);
  43. fire_and_forget ConfigCreateMenuItem_Click(IInspectable const& sender, RoutedEventArgs const& e);
  44. fire_and_forget ConfigImportMenuItem_Click(IInspectable const& sender, RoutedEventArgs const& e);
  45. fire_and_forget ConfigDuplicateMenuItem_Click(IInspectable const& sender, RoutedEventArgs const& e);
  46. void MainPivot_PivotItemLoaded(Pivot const& sender, PivotItemEventArgs const& args);
  47. void NetifCombobox_SelectionChanged(IInspectable const& sender, SelectionChangedEventArgs const& e);
  48. void ConfigListView_SelectionChanged(IInspectable const& sender, SelectionChangedEventArgs const& e);
  49. void ConfigListView_DragItemsStarting(IInspectable const& sender, DragItemsStartingEventArgs const& e);
  50. void ConfigListView_DragOver(IInspectable const& sender, DragEventArgs const& e);
  51. fire_and_forget ConfigListView_Drop(IInspectable const& sender, DragEventArgs const& e);
  52. void ConfigItem_DoubleTapped(IInspectable const& sender, DoubleTappedRoutedEventArgs const& e);
  53. void WindowWidth_CurrentStateChanged(IInspectable const& sender, VisualStateChangedEventArgs const& e);
  54. void MainSplitView_PaneClosing(SplitView const& sender, SplitViewPaneClosingEventArgs const& args);
  55. fire_and_forget GenerateProfileButton_Click(IInspectable const& sender, RoutedEventArgs const& e);
  56. fire_and_forget ConnectionToggleSwitch_Toggled(IInspectable const& sender, RoutedEventArgs const& e);
  57. fire_and_forget ConfigFolderSelectButton_Click(IInspectable const& sender, RoutedEventArgs const& e);
  58. void ConfigFolderResetButton_Click(IInspectable const& sender, RoutedEventArgs const& e);
  59. private:
  60. inline static DependencyProperty m_configItemsProperty =
  61. DependencyProperty::Register(
  62. L"ConfigItems",
  63. xaml_typename<IObservableVector<Maple_App::ConfigViewModel>>(),
  64. xaml_typename<Maple_App::MainPage>(),
  65. nullptr
  66. );
  67. inline static DependencyProperty m_usingDefaultConfigFolderProperty =
  68. DependencyProperty::Register(
  69. L"UsingDefaultConfigFolder",
  70. xaml_typename<bool>(),
  71. xaml_typename<Maple_App::MainPage>(),
  72. nullptr
  73. );
  74. inline static DependencyProperty m_renamedNameProperty =
  75. DependencyProperty::Register(
  76. L"RenamedName",
  77. xaml_typename<winrt::hstring>(),
  78. xaml_typename<Maple_App::MainPage>(),
  79. nullptr
  80. );
  81. inline static SystemNavigationManager NavigationManager{ nullptr };
  82. inline static VpnManagementAgent VpnMgmtAgent{};
  83. IStorageFolder m_configFolder{ nullptr };
  84. Maple_App::ConfigViewModel m_defaultConfig{ nullptr };
  85. VpnPlugInProfile m_vpnProfile{ nullptr };
  86. Pickers::FolderPicker m_configFolderPicker{};
  87. static IAsyncAction NotifyUser(const hstring& message);
  88. static IAsyncOperation<StorageFile> CopyDefaultConfig(const IStorageFolder& configFolder, std::wstring_view path, const hstring& desiredName);
  89. void RequestRenameItem(const Maple_App::ConfigViewModel& item);
  90. void SetAsDefault(const Maple_App::ConfigViewModel& item);
  91. fire_and_forget ConfirmRename();
  92. IAsyncAction LoadConfigs();
  93. fire_and_forget StartConnectionCheck();
  94. template<ConvertableToIStorageItem T>
  95. IAsyncAction ImportFiles(const IVectorView<T>& items) {
  96. const auto lifetime = get_strong();
  97. const auto& targetDir = co_await ConfigUtil::GetConfigFolder();
  98. // TODO: concurrency
  99. for (const auto& item : items) {
  100. const auto& file = item.try_as<IStorageFile>();
  101. if (file == nullptr) {
  102. continue;
  103. }
  104. auto ext = getNormalizedExtentionFromPath(file.Path());
  105. if (ext != ".json" && ext != ".conf" && ext != ".mmdb" && ext != ".dat" && ext != ".cer" && ext != ".crt") {
  106. continue;
  107. }
  108. const auto& newFile = co_await file.CopyAsync(targetDir, file.Name(), NameCollisionOption::GenerateUniqueName);
  109. ConfigItems().Append(co_await ConfigViewModel::FromFile(newFile, false));
  110. }
  111. }
  112. };
  113. }
  114. namespace winrt::Maple_App::factory_implementation
  115. {
  116. struct MainPage : MainPageT<MainPage, implementation::MainPage>
  117. {
  118. };
  119. }