1 /***
2  * Copyright (C) Microsoft. All rights reserved.
3  * Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
4  ****/
5 
6 #include "pch.h"
7 
8 #include "MainPage.xaml.h"
9 
10 #include "cpprest/filestream.h"
11 
12 using namespace WindowsLiveAuth;
13 
14 using namespace Platform;
15 using namespace Windows::Foundation;
16 using namespace Windows::Foundation::Collections;
17 using namespace Windows::UI::Xaml;
18 using namespace Windows::UI::Xaml::Controls;
19 using namespace Windows::UI::Xaml::Controls::Primitives;
20 using namespace Windows::UI::Xaml::Data;
21 using namespace Windows::UI::Xaml::Input;
22 using namespace Windows::UI::Xaml::Media;
23 using namespace Windows::UI::Xaml::Navigation;
24 
25 using namespace Platform::Collections;
26 using namespace Windows::Security::Authentication::OnlineId;
27 
28 // The Blank Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=234238
29 
MainPage()30 MainPage::MainPage() { InitializeComponent(); }
31 
32 /// <summary>
33 /// Invoked when this page is about to be displayed in a Frame.
34 /// </summary>
35 /// <param name="e">Event data that describes how this page was reached.  The Parameter
36 /// property is typically used to configure the page.</param>
37 void MainPage::OnNavigatedTo(NavigationEventArgs ^ e)
38 {
39     (void)e; // Unused parameter
40 }
41 
42 static web::live::live_client lv_client;
43 
44 void MainPage::Button_Click_1(Platform::Object ^ sender, Windows::UI::Xaml::RoutedEventArgs ^ e)
45 {
46     try
47     {
48         auto ui_ctx = pplx::task_continuation_context::use_current();
49 
50         std::vector<utility::string_t> scopes;
51         scopes.push_back(web::live::scopes::wl_basic);
52         scopes.push_back(web::live::scopes::wl_skydrive);
53         scopes.push_back(web::live::scopes::wl_skydrive_update);
54         lv_client.login(std::begin(scopes), std::end(scopes))
55             .then(
__anon9991b5930102(bool ok) 56                 [this](bool ok) {
57                     if (ok)
58                     {
59                         this->LogOutButton->Visibility = Windows::UI::Xaml::Visibility::Visible;
60                         this->LogInButton->Visibility = Windows::UI::Xaml::Visibility::Collapsed;
61 
62                         this->Block1->Text =
63                             ref new Platform::String((L"access_token = \n" + lv_client.access_token()).c_str());
64                     }
65                 },
66                 ui_ctx);
67     }
68     catch (...)
69     {
70     }
71 }
72 
73 void MainPage::LogOutButton_Click(Platform::Object ^ sender, Windows::UI::Xaml::RoutedEventArgs ^ e)
74 {
75     auto ui_ctx = pplx::task_continuation_context::use_current();
76 
77     lv_client.logout().then(
__anon9991b5930202(bool) 78         [this](bool) {
79             this->LogOutButton->Visibility = Windows::UI::Xaml::Visibility::Collapsed;
80             this->LogInButton->Visibility = Windows::UI::Xaml::Visibility::Visible;
81         },
82         ui_ctx);
83 }
84 
85 // The following functions let you get information for an arbitrary WL resource, upload a file, or download a file.
86 // Use the Live Connect Interactive SDK on MSDN to explore your WL data and then try the same here.
87 //
88 // Some other things to try:
89 //
90 //  delete a file using lv_client.remove()
91 //  copy or move a file using lv_client.copy() and lv_client.move().
92 //  create a contact using lv_client.post()
93 //  modify a calendar event using lv_client.put()
94 //
95 void MainPage::Button_Click_2(Platform::Object ^ sender, Windows::UI::Xaml::RoutedEventArgs ^ e)
96 {
97     auto ui_ctx = pplx::task_continuation_context::use_current();
98 
99     lv_client.get(this->Box1->Text->Data())
100         .then(
__anon9991b5930302(pplx::task<web::json::value> value) 101             [this](pplx::task<web::json::value> value) {
102                 try
103                 {
104                     auto str = value.get().serialize();
105                     this->Block1->Text = ref new Platform::String(str.c_str());
106                 }
107                 catch (std::exception& exc)
108                 {
109                     this->Block1->Text =
110                         ref new Platform::String(utility::conversions::to_string_t(exc.what()).c_str());
111                 }
112             },
113             ui_ctx);
114 }
115 
116 void MainPage::UploadButton_Click(Platform::Object ^ sender, Windows::UI::Xaml::RoutedEventArgs ^ e)
117 {
118     this->Block1->Text = ref new Platform::String(L"Processing request...");
119 
120     auto ui_ctx = pplx::task_continuation_context::use_current();
121 
122     auto filePicker = ref new Windows::Storage::Pickers::FileOpenPicker();
123     filePicker->ViewMode = Windows::Storage::Pickers::PickerViewMode::List;
124     filePicker->FileTypeFilter->Append(ref new Platform::String(L".txt"));
125     filePicker->FileTypeFilter->Append(ref new Platform::String(L".jpg"));
126     filePicker->FileTypeFilter->Append(ref new Platform::String(L".pdf"));
127     filePicker->FileTypeFilter->Append(ref new Platform::String(L".docx"));
128     filePicker->FileTypeFilter->Append(ref new Platform::String(L".doc"));
129 
130     auto file = filePicker->PickSingleFileAsync();
131 
132     utility::string_t path = this->Box1->Text->Data();
133 
134     pplx::create_task(file)
__anon9991b5930402(Windows::Storage::StorageFile ^ file) 135         .then([path](Windows::Storage::StorageFile ^ file) {
136             if (file == nullptr)
137             {
138                 throw std::exception("No file was picked");
139             }
140 
141             auto full_path = path + L"/" + file->Name->Data();
142 
143             return lv_client.upload(full_path, file);
144         })
145         .then(
__anon9991b5930502(pplx::task<web::json::value> response) 146             [this](pplx::task<web::json::value> response) {
147                 try
148                 {
149                     auto message = response.get().serialize();
150                     this->Block1->Text = ref new Platform::String(message.c_str());
151                 }
152                 catch (std::exception& exc)
153                 {
154                     this->Block1->Text =
155                         ref new Platform::String(utility::conversions::to_string_t(exc.what()).c_str());
156                 }
157             },
158             ui_ctx);
159 }
160 
161 void MainPage::DownloadButton_Click(Platform::Object ^ sender, Windows::UI::Xaml::RoutedEventArgs ^ e)
162 {
163     this->Block1->Text = ref new Platform::String(L"Processing request...");
164 
165     auto ui_ctx = pplx::task_continuation_context::use_current();
166     utility::string_t path = this->Box1->Text->Data();
167 
168     // Start by getting the file metadata from OneDrive. We need the file name.
169     lv_client.get(path)
__anon9991b5930602(web::json::value file_info) 170         .then([this](web::json::value file_info) {
171             if (!file_info.is_object()) throw std::exception("unexpected file info response format");
172 
173             auto name = file_info[L"name"].as_string();
174 
175             // Once we have the name, we can create a storage file in the downloads folder.
176 
177             return pplx::create_task(Windows::Storage::DownloadsFolder::CreateFileAsync(
178                 ref new Platform::String(name.c_str()), Windows::Storage::CreationCollisionOption::GenerateUniqueName));
179         })
__anon9991b5930702(Windows::Storage::StorageFile ^ file) 180         .then([path, ui_ctx, this](Windows::Storage::StorageFile ^ file) {
181             if (file == nullptr) throw std::exception("unexpected file info response format");
182             auto name = file->Name;
183             // With a file reference in hand, we download the file.
184             return lv_client.download(path, file);
185         })
186         .then(
__anon9991b5930802(pplx::task<size_t> response) 187             [this](pplx::task<size_t> response) {
188                 try
189                 {
190                     response.wait();
191                     this->Block1->Text = ref new Platform::String(L"Download complete.");
192                 }
193                 catch (std::exception& exc)
194                 {
195                     this->Block1->Text =
196                         ref new Platform::String(utility::conversions::to_string_t(exc.what()).c_str());
197                 }
198             },
199             ui_ctx);
200 }
201