123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151 |
- #include "pch.h"
- #include <winsock2.h>
- #include <chrono>
- #include "App.h"
- #include "MainPage.h"
- #include "EditPage.h"
- #include "MonacoEditPage.h"
- #include "UI.h"
- using namespace winrt;
- using namespace Windows::ApplicationModel;
- using namespace Windows::ApplicationModel::Activation;
- using namespace Windows::Foundation;
- using namespace Windows::UI::Xaml;
- using namespace Windows::UI::Xaml::Controls;
- using namespace Windows::UI::Xaml::Navigation;
- using namespace Maple_App;
- using namespace Maple_App::implementation;
- extern "C" void* lwip_strerr(uint8_t) {
- return const_cast<char*>("");
- }
- /// <summary>
- /// Initializes the singleton application object. This is the first line of authored code
- /// executed, and as such is the logical equivalent of main() or WinMain().
- /// </summary>
- App::App()
- {
- WSADATA wsaData;
- if (FAILED(WSAStartup(0x202, &wsaData))) {
- // ???
- }
- InitializeComponent();
- Suspending({ this, &App::OnSuspending });
- UnhandledException([this](IInspectable const&, UnhandledExceptionEventArgs const& e)
- {
- auto errorMessage = e.Message();
- #if defined _DEBUG && !defined DISABLE_XAML_GENERATED_BREAK_ON_UNHANDLED_EXCEPTION
- if (IsDebuggerPresent())
- {
- __debugbreak();
- }
- #endif
- UI::NotifyUser(std::move(errorMessage), L"Unexpected error");
- e.Handled(true);
- });
- }
- /// <summary>
- /// Invoked when the application is launched normally by the end user. Other entry points
- /// will be used such as when the application is launched to open a specific file.
- /// </summary>
- /// <param name="e">Details about the launch request and process.</param>
- void App::OnLaunched(LaunchActivatedEventArgs const& e)
- {
- Frame rootFrame{ nullptr };
- auto content = Window::Current().Content();
- if (content)
- {
- rootFrame = content.try_as<Frame>();
- }
- // Do not repeat app initialization when the Window already has content,
- // just ensure that the window is active
- if (rootFrame == nullptr)
- {
- // Create a Frame to act as the navigation context and associate it with
- // a SuspensionManager key
- rootFrame = Frame();
- rootFrame.NavigationFailed({ this, &App::OnNavigationFailed });
- if (e.PreviousExecutionState() == ApplicationExecutionState::Terminated)
- {
- // Restore the saved session state only when appropriate, scheduling the
- // final launch steps after the restore is complete
- }
- if (e.PrelaunchActivated() == false)
- {
- if (rootFrame.Content() == nullptr)
- {
- // When the navigation stack isn't restored navigate to the first page,
- // configuring the new page by passing required information as a navigation
- // parameter
- rootFrame.Navigate(xaml_typename<Maple_App::MainPage>(), box_value(e.Arguments()));
- }
- // Place the frame in the current Window
- Window::Current().Content(rootFrame);
- // Ensure the current window is active
- Window::Current().Activate();
- }
- }
- else
- {
- if (e.PrelaunchActivated() == false)
- {
- if (rootFrame.Content() == nullptr)
- {
- // When the navigation stack isn't restored navigate to the first page,
- // configuring the new page by passing required information as a navigation
- // parameter
- rootFrame.Navigate(xaml_typename<Maple_App::MainPage>(), box_value(e.Arguments()));
- }
- // Ensure the current window is active
- Window::Current().Activate();
- }
- }
- }
- /// <summary>
- /// Invoked when application execution is being suspended. Application state is saved
- /// without knowing whether the application will be terminated or resumed with the contents
- /// of memory still intact.
- /// </summary>
- /// <param name="sender">The source of the suspend request.</param>
- /// <param name="e">Details about the suspend request.</param>
- fire_and_forget App::OnSuspending([[maybe_unused]] IInspectable const& sender, [[maybe_unused]] SuspendingEventArgs const& e)
- {
- using namespace std::literals::chrono_literals;
- // Save application state and stop any background activity
- const auto saveModifiedContent = std::move(EditPage::SaveModifiedContent);
- const auto saveMonacoModifiedContent = std::move(MonacoEditPage::SaveModifiedContent);
- if (saveModifiedContent == nullptr && saveMonacoModifiedContent == nullptr) {
- co_return;
- }
- const auto& def = e.SuspendingOperation().GetDeferral();
- if (saveModifiedContent != nullptr) {
- co_await saveModifiedContent();
- }
- if (saveMonacoModifiedContent != nullptr)
- {
- co_await saveMonacoModifiedContent();
- }
- def.Complete();
- }
- /// <summary>
- /// Invoked when Navigation to a certain page fails
- /// </summary>
- /// <param name="sender">The Frame which failed navigation</param>
- /// <param name="e">Details about the navigation failure</param>
- void App::OnNavigationFailed(IInspectable const&, NavigationFailedEventArgs const& e)
- {
- throw hresult_error(E_FAIL, hstring(L"Failed to load Page ") + e.SourcePageType().Name);
- }
|