MainPage.h 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  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. std::string getNormalizedExtentionFromPath(const winrt::hstring& path);
  24. struct MainPage : MainPageT<MainPage>
  25. {
  26. MainPage();
  27. static DependencyProperty ConfigItemsProperty();
  28. IObservableVector<Maple_App::ConfigViewModel> ConfigItems();
  29. void Page_Loaded(IInspectable const& sender, RoutedEventArgs const& e);
  30. void CoreTitleBar_LayoutMetricsChanged(CoreApplicationViewTitleBar const& sender, IInspectable const& args);
  31. void CoreWindow_Activated(IInspectable const& sender, WindowActivatedEventArgs const& args);
  32. void ConfigSetAsDefaultMenuItem_Click(IInspectable const& sender, RoutedEventArgs const& e);
  33. void ConfigRenameMenuItem_Click(IInspectable const& sender, RoutedEventArgs const& e);
  34. fire_and_forget ConfigDeleteMenuItem_Click(IInspectable const& sender, RoutedEventArgs const& e);
  35. void RenameDialogPrimaryButton_Click(IInspectable const& sender, ContentDialogButtonClickEventArgs const& e);
  36. void RenameDialogText_KeyDown(IInspectable const& sender, KeyRoutedEventArgs const& e);
  37. fire_and_forget ConfigCreateMenuItem_Click(IInspectable const& sender, RoutedEventArgs const& e);
  38. fire_and_forget ConfigImportMenuItem_Click(IInspectable const& sender, RoutedEventArgs const& e);
  39. fire_and_forget ConfigDuplicateMenuItem_Click(IInspectable const& sender, RoutedEventArgs const& e);
  40. void MainPivot_PivotItemLoaded(Pivot const& sender, PivotItemEventArgs const& args);
  41. void NetifCombobox_SelectionChanged(IInspectable const& sender, SelectionChangedEventArgs const& e);
  42. void ConfigListView_SelectionChanged(IInspectable const& sender, SelectionChangedEventArgs const& e);
  43. void ConfigListView_DragItemsStarting(IInspectable const& sender, DragItemsStartingEventArgs const& e);
  44. void ConfigListView_DragOver(IInspectable const& sender, DragEventArgs const& e);
  45. fire_and_forget ConfigListView_Drop(IInspectable const& sender, DragEventArgs const& e);
  46. void ConfigItem_DoubleTapped(IInspectable const& sender, DoubleTappedRoutedEventArgs const& e);
  47. void WindowWidth_CurrentStateChanged(IInspectable const& sender, VisualStateChangedEventArgs const& e);
  48. void MainSplitView_PaneClosing(SplitView const& sender, SplitViewPaneClosingEventArgs const& args);
  49. fire_and_forget GenerateProfileButton_Click(IInspectable const& sender, RoutedEventArgs const& e);
  50. fire_and_forget ConnectionToggleSwitch_Toggled(IInspectable const& sender, RoutedEventArgs const& e);
  51. private:
  52. inline static DependencyProperty m_configItemsProperty =
  53. DependencyProperty::Register(
  54. L"ConfigItems",
  55. xaml_typename<IObservableVector<Maple_App::ConfigViewModel>>(),
  56. xaml_typename<Maple_App::MainPage>(),
  57. nullptr
  58. );
  59. inline static DependencyProperty m_renamedNameProperty =
  60. DependencyProperty::Register(
  61. L"RenamedName",
  62. xaml_typename<winrt::hstring>(),
  63. xaml_typename<Maple_App::MainPage>(),
  64. nullptr
  65. );
  66. inline static SystemNavigationManager NavigationManager{ nullptr };
  67. inline static VpnManagementAgent VpnMgmtAgent{};
  68. IStorageFolder m_configFolder{ nullptr };
  69. Maple_App::ConfigViewModel m_defaultConfig{ nullptr };
  70. VpnPlugInProfile m_vpnProfile{ nullptr };
  71. static IAsyncAction NotifyUser(const hstring& message);
  72. static IAsyncOperation<IStorageFolder> InitializeConfigFolder();
  73. static IAsyncOperation<StorageFile> CopyDefaultConfig(const IStorageFolder& configFolder, const hstring& desiredName);
  74. static IAsyncOperation<StorageFile> CopyDefaultJsonConfig(const IStorageFolder& configFolder, const hstring& desiredName);
  75. void RequestRenameItem(const Maple_App::ConfigViewModel& item);
  76. void SetAsDefault(const Maple_App::ConfigViewModel& item);
  77. fire_and_forget ConfirmRename();
  78. IAsyncAction LoadConfigs();
  79. fire_and_forget StartConnectionCheck();
  80. template<ConvertableToIStorageItem T>
  81. IAsyncAction ImportFiles(const IVectorView<T>& items) {
  82. const auto lifetime = get_strong();
  83. const auto& targetDir = co_await InitializeConfigFolder();
  84. // TODO: concurrency
  85. for (const auto& item : items) {
  86. const auto& file = item.try_as<IStorageFile>();
  87. if (file == nullptr) {
  88. continue;
  89. }
  90. auto ext = getNormalizedExtentionFromPath(file.Path());
  91. if (ext != ".json" && ext != ".conf" && ext != ".mmdb" && ext != ".dat" && ext != ".cer" && ext != ".crt") {
  92. continue;
  93. }
  94. const auto& newFile = co_await file.CopyAsync(targetDir, file.Name(), NameCollisionOption::GenerateUniqueName);
  95. ConfigItems().Append(co_await ConfigViewModel::FromFile(newFile, false));
  96. }
  97. }
  98. };
  99. }
  100. namespace winrt::Maple_App::factory_implementation
  101. {
  102. struct MainPage : MainPageT<MainPage, implementation::MainPage>
  103. {
  104. };
  105. }