/* * Copyright (c) 2024 Huawei Device Co., Ltd. * 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. */ #ifndef META_INTERFACE_IATTACH_H #define META_INTERFACE_IATTACH_H #include #include #include #include #include #include #include META_BEGIN_NAMESPACE() META_REGISTER_INTERFACE(IAttach, "2cc0d7b9-ccec-474e-acdd-d06fb5aeb714") class IAttachment; /** * @brief The IAttach interface defines a common interface for classes to which attachments can be attached. */ class IAttach : public CORE_NS::IInterface { META_INTERFACE(CORE_NS::IInterface, IAttach) public: /** * @brief Attach an attachment to this object. The object being attached to will be used as the data context. * @param attachment The attachment to add * @return True if the operation succeeded. False otherwise. */ bool Attach(const IObject::Ptr& attachment) { return Attach(attachment, {}); } /** Type helper for Attach */ template bool Attach(const T& object) { return Attach(interface_pointer_cast(object), {}); } /** * @brief Attach an attachment to this object. * @param attachment The attachment to add * @param dataContext The object to use as the data context for the attachment. If dataContext is null, * the object being attached to will be used as the data context. * @return True if the operation succeeded. False otherwise. */ virtual bool Attach(const IObject::Ptr& attachment, const IObject::Ptr& dataContext) = 0; /** Type helper for Attach */ template bool Attach(const T& object, const U& dataContext) { return Attach(interface_pointer_cast(object), interface_pointer_cast(dataContext)); } /** * @brief Detach an attachment from this object. * @param attachment The attachment to detach. * @return True if the opeation succeeded, false otherwise. */ virtual bool Detach(const IObject::Ptr& attachment) = 0; /** Type helper for Detach */ template bool Detach(const T& object) { return Detach(interface_pointer_cast(object)); } /** * @brief Returns true if any attachments have been attached to the object. */ virtual bool HasAttachments() const = 0; /** * @brief Returns the attachment container or nullptr if no attachments have been added. */ IContainer::Ptr GetAttachmentContainer() const { return GetAttachmentContainer(false); } /** * @brief Returns the container which hosts all attachments attached to the object. * @param initializeAlways If true, always return a valid IContainer::Ptr. If false, * the function may return nullptr in case no attachments have been added to * the object. * @return An IContainer instance which holds all attachments that have been added * to the container. */ virtual IContainer::Ptr GetAttachmentContainer(bool initializeAlways) const = 0; /** * @brief Returns a list of all attachments attached to this object. * @return A list of attachments which are attached to this object. */ BASE_NS::vector GetAttachments() const { return GetAttachments({}, false); } /** * @brief Returns a list of all attachments attached to this object. * @param uids A list of interface Uids the returned attachments should implement. If the list is empty, return * all attachments. * @param strict If true, the attachments added to the list must implement all of the given interfaces. * If false, it is enough for the attachment to implement one (or more) of the given uids to be * added to the list. * @return A list of attachments which are attached to this object and fullfil the requirements. */ virtual BASE_NS::vector GetAttachments(const BASE_NS::vector& uids, bool strict) const = 0; /** * @brief A helper template which can be used to retrieve a list of attachments which implement a given interface. * The returned list contains the found attachments pre-casted to T::Ptr. */ template BASE_NS::vector GetAttachments() const { return PtrArrayCast(GetAttachments({ T::UID }, false)); } }; META_END_NAMESPACE() META_INTERFACE_TYPE(META_NS::IAttach); // Include intf_attachment.h to ensure that we get full implementation of our forward declarations #include #endif