MainPage.h 6.1 KB

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