blob: fd62782f8a706760f87edd01d8776438ce34a742 [file] [log] [blame]
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef BASE_WIN_TYPED_EVENT_HANDLER_H_
#define BASE_WIN_TYPED_EVENT_HANDLER_H_
#include <windows.foundation.collections.h>
#include <wrl/implements.h>
#include <utility>
#include "base/callback.h"
namespace base {
namespace win {
// This file provides an implementation of Windows::Foundation's
// ITypedEventHandler. It serves as a thin wrapper around a RepeatingCallback,
// that forwards the arguments to its |Invoke| method to the callback's |Run|
// method.
template <typename SenderT, typename ArgsT>
class TypedEventHandler
: public Microsoft::WRL::RuntimeClass<
Microsoft::WRL::RuntimeClassFlags<Microsoft::WRL::ClassicCom>,
ABI::Windows::Foundation::ITypedEventHandler<SenderT, ArgsT>> {
public:
using SenderAbiT =
typename ABI::Windows::Foundation::Internal::GetAbiType<SenderT>::type;
using ArgsAbiT =
typename ABI::Windows::Foundation::Internal::GetAbiType<ArgsT>::type;
using Handler = base::RepeatingCallback<HRESULT(SenderAbiT, ArgsAbiT)>;
explicit TypedEventHandler(Handler handler) : handler_(std::move(handler)) {}
// ABI::Windows::Foundation::ITypedEventHandler:
IFACEMETHODIMP Invoke(SenderAbiT sender, ArgsAbiT args) override {
return handler_.Run(std::move(sender), std::move(args));
}
private:
Handler handler_;
};
} // namespace win
} // namespace base
#endif // BASE_WIN_TYPED_EVENT_HANDLER_H_