Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
215 changes: 215 additions & 0 deletions WindowsAppRuntime.sln

Large diffs are not rendered by default.

5 changes: 5 additions & 0 deletions build/NuSpecs/AppxManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,11 @@

<!-- PowerNotifications -->
<ActivatableClass ActivatableClassId="Microsoft.Windows.System.Power.PowerManager" ThreadingModel="both" />

<!-- ToastNotifications -->
<ActivatableClass ActivatableClassId="Microsoft.Windows.ToastNotifications.ToastActivationInfo" ThreadingModel="both" />
<ActivatableClass ActivatableClassId="Microsoft.Windows.ToastNotifications.ToastAssets" ThreadingModel="both" />
<ActivatableClass ActivatableClassId="Microsoft.Windows.ToastNotifications.ToastNotificationManager" ThreadingModel="both" />

</InProcessServer>
</Extension>
Expand Down
19 changes: 19 additions & 0 deletions dev/ToastNotifications/ToastActivatedEventArgs.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
#pragma once
#include "Microsoft.Windows.ToastNotifications.ToastActivatedEventArgs.g.h"

namespace winrt::Microsoft::Windows::ToastNotifications::implementation
{
struct ToastActivatedEventArgs : ToastActivatedEventArgsT<ToastActivatedEventArgs>
{
ToastActivatedEventArgs() = default;

ToastActivatedEventArgs(winrt::hstring const& arguments, winrt::Windows::Foundation::Collections::IMap<winrt::hstring, winrt::hstring> const& userInput) : m_arguments(arguments), m_userInput(userInput) {};

winrt::hstring ActivationArgs() { return m_arguments; };
winrt::Windows::Foundation::Collections::IMap<hstring, hstring> UserInput() { return m_userInput; };

private:
winrt::hstring m_arguments;
winrt::Windows::Foundation::Collections::IMap<winrt::hstring, winrt::hstring> m_userInput;
};
}
51 changes: 51 additions & 0 deletions dev/ToastNotifications/ToastActivationCallback.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
#include "pch.h"
#include <ToastActivationCallback.h>
#include "ToastActivatedEventArgs.h"
#include "externs.h"
#include <winrt/Windows.Foundation.Collections.h>
#include <winrt/base.h>
#include <winrt/Windows.ApplicationModel.Core.h>
#include <iostream>
#include <ToastNotificationUtility.h>

namespace winrt
{
using namespace Microsoft::Windows::ToastNotifications;
using namespace Windows::ApplicationModel::Core;
using namespace Windows::Foundation;
using namespace Windows::Foundation::Collections;
}

HRESULT __stdcall ToastActivationCallback::Activate(
LPCWSTR /* appUserModelId */,
LPCWSTR invokedArgs,
[[maybe_unused]] NOTIFICATION_USER_INPUT_DATA const* data,
[[maybe_unused]] ULONG dataCount) noexcept try
{
winrt::IMap<winrt::hstring, winrt::hstring> userInput{ winrt::single_threaded_map<winrt::hstring, winrt::hstring>() };
for (unsigned long i = 0; i < dataCount; i++)
{
userInput.Insert(data[i].Key, data[i].Value);
}

winrt::ToastActivatedEventArgs activatedEventArgs = winrt::make<winrt::Microsoft::Windows::ToastNotifications::implementation::ToastActivatedEventArgs>(invokedArgs, userInput);


if (GetToastHandlers())
{
/* As the process is already launched, we invoke the foreground toast event handlers with the activatedEventArgs */
GetToastHandlers()(*this, activatedEventArgs);
}
else
{
/* Activation results in a process launch, we cache the activatedEventArgs in the COM static store
and fire an event to let the main thread know that it is okay to infer into AppLifeCycle::GetToastActivatedEventArgs().
*/
auto appProperties = winrt::CoreApplication::Properties();
appProperties.Insert(ACTIVATED_EVENT_ARGS_KEY, activatedEventArgs);
SetEvent(GetWaitHandleForArgs().get());
}

return S_OK;
}
CATCH_RETURN()
38 changes: 38 additions & 0 deletions dev/ToastNotifications/ToastActivationCallback.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License. See LICENSE in the project root for license information.

#pragma once

#include "NotificationActivationCallback.h"

struct ToastActivationCallback : winrt::implements<ToastActivationCallback, INotificationActivationCallback>
{
HRESULT __stdcall Activate(
LPCWSTR appUserModelId,
LPCWSTR invokedArgs,
[[maybe_unused]] NOTIFICATION_USER_INPUT_DATA const* data,
[[maybe_unused]] ULONG dataCount) noexcept;
};

struct ToastActivationCallbackFactory : winrt::implements<ToastActivationCallbackFactory, IClassFactory>
{
STDMETHODIMP CreateInstance(_In_opt_ IUnknown* aggregateInterface, _In_ REFIID interfaceId, _Outptr_ VOID** object) noexcept final try
{
RETURN_HR_IF_NULL(CLASS_E_NOAGGREGATION, aggregateInterface);
return winrt::make<ToastActivationCallback>().as(interfaceId, object);
}
CATCH_RETURN()

STDMETHODIMP LockServer(BOOL fLock) noexcept final
{
if (fLock)
{
++winrt::get_module_lock();
}
else
{
--winrt::get_module_lock();
}
return S_OK;
}
};
42 changes: 42 additions & 0 deletions dev/ToastNotifications/ToastActivationInfo.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
#include "pch.h"
#include "ToastActivationInfo.h"
#include "Microsoft.Windows.ToastNotifications.ToastActivationInfo.g.cpp"

namespace winrt::Microsoft::Windows::ToastNotifications::implementation
{
winrt::Microsoft::Windows::ToastNotifications::ToastActivationInfo ToastActivationInfo::CreateFromActivationGuid(winrt::guid const& taskClsid)
{
THROW_HR_IF_MSG(E_ILLEGAL_METHOD_CALL, !AppModel::Identity::IsPackagedProcess(), "Not applicable for unpackaged applications");

THROW_HR_IF(E_INVALIDARG, (taskClsid == winrt::guid(GUID_NULL)));

return winrt::make<ToastActivationInfo>(taskClsid);
}

winrt::Microsoft::Windows::ToastNotifications::ToastActivationInfo ToastActivationInfo::CreateFromToastAssets(winrt::Microsoft::Windows::ToastNotifications::ToastAssets const& assets)
{
THROW_HR_IF_MSG(E_ILLEGAL_METHOD_CALL, AppModel::Identity::IsPackagedProcess(), "Not applicable for packaged applications");

THROW_HR_IF_NULL_MSG(E_POINTER, assets, "Invalid Toast asset parameter");

THROW_HR_IF_NULL_MSG(E_POINTER, assets.IconPath(), "Invalid icon URI");

THROW_HR_IF_MSG(E_INVALIDARG, (assets.DisplayName().size() == 0), "Display name string is empty");

return winrt::make<ToastActivationInfo>(assets);
}

winrt::guid ToastActivationInfo::TaskClsid()
{
THROW_HR_IF_MSG(E_ILLEGAL_METHOD_CALL, !AppModel::Identity::IsPackagedProcess(), "Not applicable for unpackaged applications");

return m_taskClsid;
}

winrt::Microsoft::Windows::ToastNotifications::ToastAssets ToastActivationInfo::Assets()
{
THROW_HR_IF_MSG(E_ILLEGAL_METHOD_CALL, AppModel::Identity::IsPackagedProcess(), "Not applicable for packaged applications");

return m_assets;
}
}
27 changes: 27 additions & 0 deletions dev/ToastNotifications/ToastActivationInfo.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
#pragma once
#include "Microsoft.Windows.ToastNotifications.ToastActivationInfo.g.h"

namespace winrt::Microsoft::Windows::ToastNotifications::implementation
{
struct ToastActivationInfo : ToastActivationInfoT<ToastActivationInfo>
{
ToastActivationInfo() = default;

ToastActivationInfo(winrt::guid const& taskClsid) : m_taskClsid(taskClsid) {};
ToastActivationInfo(winrt::Microsoft::Windows::ToastNotifications::ToastAssets const& assets) : m_assets(assets) {};
static winrt::Microsoft::Windows::ToastNotifications::ToastActivationInfo CreateFromActivationGuid(winrt::guid const& taskClsid);
static winrt::Microsoft::Windows::ToastNotifications::ToastActivationInfo CreateFromToastAssets(winrt::Microsoft::Windows::ToastNotifications::ToastAssets const& assets);
winrt::guid TaskClsid();
winrt::Microsoft::Windows::ToastNotifications::ToastAssets Assets();

private:
const winrt::guid m_taskClsid{ GUID_NULL };
const winrt::Microsoft::Windows::ToastNotifications::ToastAssets m_assets{ nullptr };
};
}
namespace winrt::Microsoft::Windows::ToastNotifications::factory_implementation
{
struct ToastActivationInfo : ToastActivationInfoT<ToastActivationInfo, implementation::ToastActivationInfo>
{
};
}
15 changes: 15 additions & 0 deletions dev/ToastNotifications/ToastAssets.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
#include "pch.h"
#include "ToastAssets.h"
#include "Microsoft.Windows.ToastNotifications.ToastAssets.g.cpp"

namespace winrt::Microsoft::Windows::ToastNotifications::implementation
{
hstring ToastAssets::DisplayName()
{
return m_displayName;
}
winrt::Windows::Foundation::Uri ToastAssets::IconPath()
{
return m_iconPath;
}
}
24 changes: 24 additions & 0 deletions dev/ToastNotifications/ToastAssets.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
#pragma once
#include "Microsoft.Windows.ToastNotifications.ToastAssets.g.h"

namespace winrt::Microsoft::Windows::ToastNotifications::implementation
{
struct ToastAssets : ToastAssetsT<ToastAssets>
{
ToastAssets() = default;

ToastAssets(winrt::hstring const& displayName, winrt::Windows::Foundation::Uri const& iconPath) : m_displayName(displayName), m_iconPath(iconPath) {};
hstring DisplayName();
winrt::Windows::Foundation::Uri IconPath();

private:
const hstring m_displayName;
const winrt::Windows::Foundation::Uri m_iconPath;
};
}
namespace winrt::Microsoft::Windows::ToastNotifications::factory_implementation
{
struct ToastAssets : ToastAssetsT<ToastAssets, implementation::ToastAssets>
{
};
}
79 changes: 79 additions & 0 deletions dev/ToastNotifications/ToastNotification.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
#include "pch.h"
#include "ToastNotification.h"
#include "Microsoft.Windows.ToastNotifications.ToastNotification.g.cpp"

namespace winrt::Microsoft::Windows::ToastNotifications::implementation
{
ToastNotification::ToastNotification(winrt::Windows::Data::Xml::Dom::XmlDocument const& /* payload */)
{
throw hresult_not_implemented();
}
hstring ToastNotification::Tag()
{
throw hresult_not_implemented();
}
void ToastNotification::Tag(hstring const& /* value */)
{
throw hresult_not_implemented();
}
hstring ToastNotification::Group()
{
throw hresult_not_implemented();
}
void ToastNotification::Group(hstring const& /* value */)
{
throw hresult_not_implemented();
}
uint32_t ToastNotification::ToastId()
{
throw hresult_not_implemented();
}
void ToastNotification::ToastId(uint32_t /* value */)
{
throw hresult_not_implemented();
}
winrt::Windows::Data::Xml::Dom::XmlDocument ToastNotification::Payload()
{
throw hresult_not_implemented();
}
winrt::Microsoft::Windows::ToastNotifications::ToastProgressData ToastNotification::ProgressData()
{
throw hresult_not_implemented();
}
void ToastNotification::ProgressData(winrt::Microsoft::Windows::ToastNotifications::ToastProgressData const& /* value */)
{
throw hresult_not_implemented();
}
winrt::Windows::Foundation::DateTime ToastNotification::ExpirationTime()
{
throw hresult_not_implemented();
}
void ToastNotification::ExpirationTime(winrt::Windows::Foundation::DateTime const& /* value */)
{
throw hresult_not_implemented();
}
bool ToastNotification::ExpiresOnReboot()
{
throw hresult_not_implemented();
}
void ToastNotification::ExpiresOnReboot(bool /* value */)
{
throw hresult_not_implemented();
}
winrt::Microsoft::Windows::ToastNotifications::ToastPriority ToastNotification::Priority()
{
throw hresult_not_implemented();
}
void ToastNotification::Priority(winrt::Microsoft::Windows::ToastNotifications::ToastPriority const& /* value */)
{
throw hresult_not_implemented();
}
bool ToastNotification::SuppressDisplay()
{
throw hresult_not_implemented();
}
void ToastNotification::SuppressDisplay(bool /* value */)
{
throw hresult_not_implemented();
}
}
35 changes: 35 additions & 0 deletions dev/ToastNotifications/ToastNotification.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
#pragma once
#include "Microsoft.Windows.ToastNotifications.ToastNotification.g.h"

namespace winrt::Microsoft::Windows::ToastNotifications::implementation
{
struct ToastNotification : ToastNotificationT<ToastNotification>
{
ToastNotification() = default;

ToastNotification(winrt::Windows::Data::Xml::Dom::XmlDocument const& payload);
hstring Tag();
void Tag(hstring const& value);
hstring Group();
void Group(hstring const& value);
uint32_t ToastId();
void ToastId(uint32_t value);
winrt::Windows::Data::Xml::Dom::XmlDocument Payload();
winrt::Microsoft::Windows::ToastNotifications::ToastProgressData ProgressData();
void ProgressData(winrt::Microsoft::Windows::ToastNotifications::ToastProgressData const& value);
winrt::Windows::Foundation::DateTime ExpirationTime();
void ExpirationTime(winrt::Windows::Foundation::DateTime const& value);
bool ExpiresOnReboot();
void ExpiresOnReboot(bool value);
winrt::Microsoft::Windows::ToastNotifications::ToastPriority Priority();
void Priority(winrt::Microsoft::Windows::ToastNotifications::ToastPriority const& value);
bool SuppressDisplay();
void SuppressDisplay(bool value);
};
}
namespace winrt::Microsoft::Windows::ToastNotifications::factory_implementation
{
struct ToastNotification : ToastNotificationT<ToastNotification, implementation::ToastNotification>
{
};
}
31 changes: 31 additions & 0 deletions dev/ToastNotifications/ToastNotificationHistory.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
#include "pch.h"
#include "ToastNotificationHistory.h"
#include "Microsoft.Windows.ToastNotifications.ToastNotificationHistory.g.cpp"

namespace winrt::Microsoft::Windows::ToastNotifications::implementation
{
winrt::Windows::Foundation::IAsyncAction ToastNotificationHistory::RemoveWithIdentiferAsync(uint32_t /* toastIdentifier */)
{
throw hresult_not_implemented();
}
winrt::Windows::Foundation::IAsyncAction ToastNotificationHistory::RemoveWithTagAsync(hstring /* tag */)
{
throw hresult_not_implemented();
}
winrt::Windows::Foundation::IAsyncAction ToastNotificationHistory::RemoveWithTagGroupAsync(hstring /* tag */, hstring /* group */)
{
throw hresult_not_implemented();
}
winrt::Windows::Foundation::IAsyncAction ToastNotificationHistory::RemoveGroupAsync(hstring /* group */)
{
throw hresult_not_implemented();
}
winrt::Windows::Foundation::IAsyncAction ToastNotificationHistory::RemoveAllAsync()
{
throw hresult_not_implemented();
}
winrt::Windows::Foundation::IAsyncOperation<winrt::Windows::Foundation::Collections::IVector<winrt::Microsoft::Windows::ToastNotifications::ToastNotification>> ToastNotificationHistory::GetAllAsync()
{
throw hresult_not_implemented();
}
}
Loading