1 //*********************************************************
2 //
3 // Copyright (c) Microsoft. All rights reserved.
4 // THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF
5 // ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY
6 // IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR
7 // PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.
8 //
9 //*********************************************************
10 
11 //
12 // App.xaml.cpp
13 // Implementation of the App.xaml class.
14 //
15 
16 #include "pch.h"
17 #include "MainPage.xaml.h"
18 #include "AdvancedCapture.xaml.h"
19 #include "Common\SuspensionManager.h"
20 
21 using namespace SDKSample;
22 using namespace SDKSample::Common;
23 using namespace SDKSample::MediaCapture;
24 
25 using namespace Concurrency;
26 using namespace Platform;
27 using namespace Windows::ApplicationModel;
28 using namespace Windows::ApplicationModel::Activation;
29 using namespace Windows::Foundation;
30 using namespace Windows::Foundation::Collections;
31 using namespace Windows::UI::Core;
32 using namespace Windows::UI::Xaml;
33 using namespace Windows::UI::Xaml::Controls;
34 using namespace Windows::UI::Xaml::Controls::Primitives;
35 using namespace Windows::UI::Xaml::Data;
36 using namespace Windows::UI::Xaml::Input;
37 using namespace Windows::UI::Xaml::Interop;
38 using namespace Windows::UI::Xaml::Media;
39 using namespace Windows::UI::Xaml::Navigation;
40 
41 /// <summary>
42 /// Initializes the singleton application object.  This is the first line of authored code
43 /// executed, and as such is the logical equivalent of main() or WinMain().
44 /// </summary>
App()45 App::App()
46 {
47     InitializeComponent();
48     this->Suspending += ref new SuspendingEventHandler(this, &SDKSample::App::OnSuspending);
49 }
50 
51 /// <summary>
52 /// Invoked when the application is launched normally by the end user.  Other entry points will
53 /// be used when the application is launched to open a specific file, to display search results,
54 /// and so forth.
55 /// </summary>
56 /// <param name="pArgs">Details about the launch request and process.</param>
57 void App::OnLaunched(LaunchActivatedEventArgs^ pArgs)
58 {
59     this->LaunchArgs = pArgs;
60 
61     // Do not repeat app initialization when already running, just ensure that
62     // the window is active
63     if (pArgs->PreviousExecutionState == ApplicationExecutionState::Running)
64     {
65         Window::Current->Activate();
66         return;
67     }
68 
69     // Create a Frame to act as the navigation context and associate it with
70     // a SuspensionManager key
71     auto rootFrame = ref new Frame();
72     SuspensionManager::RegisterFrame(rootFrame, "AppFrame");
73 
__anon9c20ffed0102()74     auto prerequisite = task<void>([](){});
75     if (pArgs->PreviousExecutionState == ApplicationExecutionState::Terminated)
76     {
77         // Restore the saved session state only when appropriate, scheduling the
78         // final launch steps after the restore is complete
79         prerequisite = SuspensionManager::RestoreAsync();
80     }
81     prerequisite.then([=]()
__anon9c20ffed0202() 82     {
83         // When the navigation stack isn't restored navigate to the first page,
84         // configuring the new page by passing required information as a navigation
85         // parameter
86         if (rootFrame->Content == nullptr)
87         {
88             if (!rootFrame->Navigate(TypeName(MainPage::typeid)))
89             {
90                 throw ref new FailureException("Failed to create initial page");
91             }
92         }
93 
94         // Place the frame in the current Window and ensure that it is active
95         Window::Current->Content = rootFrame;
96         Window::Current->Activate();
97     }, task_continuation_context::use_current());
98 }
99 
100 /// <summary>
101 /// Invoked when application execution is being suspended.  Application state is saved
102 /// without knowing whether the application will be terminated or resumed with the contents
103 /// of memory still intact.
104 /// </summary>
105 /// <param name="sender">The source of the suspend request.</param>
106 /// <param name="e">Details about the suspend request.</param>
107 void App::OnSuspending(Object^ sender, SuspendingEventArgs^ e)
108 {
109     (void) sender;	// Unused parameter
110 
111     auto deferral = e->SuspendingOperation->GetDeferral();
112     SuspensionManager::SaveAsync().then([=]()
__anon9c20ffed0302() 113     {
114         deferral->Complete();
115     });
116 }
117