spectrum2/3rdparty/cpprestsdk/samples/WindowsLiveAuth/MainPage.xaml.cpp
2015-11-19 15:19:14 +01:00

213 lines
7.4 KiB
C++

/***
* ==++==
*
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
****/
#include "pch.h"
#include "MainPage.xaml.h"
#include "cpprest/filestream.h"
using namespace WindowsLiveAuth;
using namespace Platform;
using namespace Windows::Foundation;
using namespace Windows::Foundation::Collections;
using namespace Windows::UI::Xaml;
using namespace Windows::UI::Xaml::Controls;
using namespace Windows::UI::Xaml::Controls::Primitives;
using namespace Windows::UI::Xaml::Data;
using namespace Windows::UI::Xaml::Input;
using namespace Windows::UI::Xaml::Media;
using namespace Windows::UI::Xaml::Navigation;
using namespace Platform::Collections;
using namespace Windows::Security::Authentication::OnlineId;
// The Blank Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=234238
MainPage::MainPage()
{
InitializeComponent();
}
/// <summary>
/// Invoked when this page is about to be displayed in a Frame.
/// </summary>
/// <param name="e">Event data that describes how this page was reached. The Parameter
/// property is typically used to configure the page.</param>
void MainPage::OnNavigatedTo(NavigationEventArgs^ e)
{
(void) e; // Unused parameter
}
static web::live::live_client lv_client;
void MainPage::Button_Click_1(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
{
try
{
auto ui_ctx = pplx::task_continuation_context::use_current();
std::vector<utility::string_t> scopes;
scopes.push_back(web::live::scopes::wl_basic);
scopes.push_back(web::live::scopes::wl_skydrive);
scopes.push_back(web::live::scopes::wl_skydrive_update);
lv_client.login(std::begin(scopes), std::end(scopes)).then([this](bool ok)
{
if (ok)
{
this->LogOutButton->Visibility = Windows::UI::Xaml::Visibility::Visible;
this->LogInButton->Visibility = Windows::UI::Xaml::Visibility::Collapsed;
this->Block1->Text = ref new Platform::String((L"access_token = \n" + lv_client.access_token()).c_str());
}
}, ui_ctx);
}
catch(...)
{
}
}
void MainPage::LogOutButton_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
{
auto ui_ctx = pplx::task_continuation_context::use_current();
lv_client.logout().then([this](bool)
{
this->LogOutButton->Visibility = Windows::UI::Xaml::Visibility::Collapsed;
this->LogInButton->Visibility = Windows::UI::Xaml::Visibility::Visible;
}, ui_ctx);
}
// The following functions let you get information for an arbitrary WL resource, upload a file, or download a file.
// Use the Live Connect Interactive SDK on MSDN to explore your WL data and then try the same here.
//
// Some other things to try:
//
// delete a file using lv_client.remove()
// copy or move a file using lv_client.copy() and lv_client.move().
// create a contact using lv_client.post()
// modify a calendar event using lv_client.put()
//
void MainPage::Button_Click_2(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
{
auto ui_ctx = pplx::task_continuation_context::use_current();
lv_client.get(this->Box1->Text->Data()).then(
[this](pplx::task<web::json::value> value)
{
try
{
auto str = value.get().serialize();
this->Block1->Text = ref new Platform::String(str.c_str());
}
catch(std::exception& exc)
{
this->Block1->Text = ref new Platform::String(utility::conversions::to_string_t(exc.what()).c_str());
}
}, ui_ctx);
}
void MainPage::UploadButton_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
{
this->Block1->Text = ref new Platform::String(L"Processing request...");
auto ui_ctx = pplx::task_continuation_context::use_current();
auto filePicker = ref new Windows::Storage::Pickers::FileOpenPicker();
filePicker->ViewMode = Windows::Storage::Pickers::PickerViewMode::List;
filePicker->FileTypeFilter->Append(ref new Platform::String(L".txt"));
filePicker->FileTypeFilter->Append(ref new Platform::String(L".jpg"));
filePicker->FileTypeFilter->Append(ref new Platform::String(L".pdf"));
filePicker->FileTypeFilter->Append(ref new Platform::String(L".docx"));
filePicker->FileTypeFilter->Append(ref new Platform::String(L".doc"));
auto file = filePicker->PickSingleFileAsync();
utility::string_t path = this->Box1->Text->Data();
pplx::create_task(file)
.then([path](Windows::Storage::StorageFile^ file)
{
if ( file == nullptr )
{
throw std::exception("No file was picked");
}
auto full_path = path + L"/" + file->Name->Data();
return lv_client.upload(full_path, file);
})
.then([this](pplx::task<web::json::value> response)
{
try
{
auto message = response.get().serialize();
this->Block1->Text = ref new Platform::String(message.c_str());
}
catch(std::exception& exc)
{
this->Block1->Text = ref new Platform::String(utility::conversions::to_string_t(exc.what()).c_str());
}
}, ui_ctx);
}
void MainPage::DownloadButton_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
{
this->Block1->Text = ref new Platform::String(L"Processing request...");
auto ui_ctx = pplx::task_continuation_context::use_current();
utility::string_t path = this->Box1->Text->Data();
// Start by getting the file metadata from OneDrive. We need the file name.
lv_client.get(path)
.then([this](web::json::value file_info)
{
if (!file_info.is_object())
throw std::exception("unexpected file info response format");
auto name = file_info[L"name"].as_string();
// Once we have the name, we can create a storage file in the downloads folder.
return pplx::create_task(
Windows::Storage::DownloadsFolder::CreateFileAsync(
ref new Platform::String(name.c_str()),
Windows::Storage::CreationCollisionOption::GenerateUniqueName));
})
.then([path,ui_ctx,this](Windows::Storage::StorageFile^ file)
{
if ( file == nullptr )
throw std::exception("unexpected file info response format");
auto name = file->Name;
// With a file reference in hand, we download the file.
return lv_client.download(path, file);
})
.then([this](pplx::task<size_t> response)
{
try
{
response.wait();
this->Block1->Text = ref new Platform::String(L"Download complete.");
}
catch(std::exception& exc)
{
this->Block1->Text = ref new Platform::String(utility::conversions::to_string_t(exc.what()).c_str());
}
}, ui_ctx);
}