use windows::core::Interface as _;
use crate::opc_da::errors::{OpcError, OpcResult};
use super::{
ClientTrait,
traits::{
AsyncIoTrait, BrowseServerAddressSpaceTrait, DataObjectTrait, GroupStateMgtTrait,
ItemMgtTrait, PublicGroupStateMgtTrait, ServerPublicGroupsTrait, ServerTrait, SyncIoTrait,
},
};
#[derive(Debug)]
pub struct Client;
impl ClientTrait<Server> for Client {
const CATALOG_ID: windows::core::GUID = crate::bindings::da::CATID_OPCDAServer10::IID;
}
pub struct Server {
pub(crate) server: crate::bindings::da::IOPCServer,
pub(crate) server_public_groups: Option<crate::bindings::da::IOPCServerPublicGroups>,
pub(crate) browse_server_address_space:
Option<crate::bindings::da::IOPCBrowseServerAddressSpace>,
}
impl TryFrom<windows::core::IUnknown> for Server {
type Error = windows::core::Error;
fn try_from(value: windows::core::IUnknown) -> windows::core::Result<Self> {
Ok(Self {
server: value.cast()?,
server_public_groups: value.cast().ok(),
browse_server_address_space: value.cast().ok(),
})
}
}
impl ServerTrait<Group> for Server {
fn interface(&self) -> OpcResult<&crate::bindings::da::IOPCServer> {
Ok(&self.server)
}
}
impl ServerPublicGroupsTrait for Server {
fn interface(&self) -> OpcResult<&crate::bindings::da::IOPCServerPublicGroups> {
self.server_public_groups.as_ref().ok_or_else(|| {
OpcError::NotImplemented("IOPCServerPublicGroups not supported".to_string())
})
}
}
impl BrowseServerAddressSpaceTrait for Server {
fn interface(&self) -> OpcResult<&crate::bindings::da::IOPCBrowseServerAddressSpace> {
self.browse_server_address_space.as_ref().ok_or_else(|| {
OpcError::NotImplemented("IOPCBrowseServerAddressSpace not supported".to_string())
})
}
}
pub type GroupIterator = super::GroupIterator<Group>;
pub struct Group {
pub(crate) item_mgt: crate::bindings::da::IOPCItemMgt,
pub(crate) group_state_mgt: crate::bindings::da::IOPCGroupStateMgt,
pub(crate) public_group_state_mgt: Option<crate::bindings::da::IOPCPublicGroupStateMgt>,
pub(crate) sync_io: crate::bindings::da::IOPCSyncIO,
pub(crate) async_io: crate::bindings::da::IOPCAsyncIO,
pub(crate) data_object: windows::Win32::System::Com::IDataObject,
}
impl TryFrom<windows::core::IUnknown> for Group {
type Error = windows::core::Error;
fn try_from(value: windows::core::IUnknown) -> windows::core::Result<Self> {
Ok(Self {
item_mgt: value.cast()?,
group_state_mgt: value.cast()?,
public_group_state_mgt: value.cast().ok(),
sync_io: value.cast()?,
async_io: value.cast()?,
data_object: value.cast()?,
})
}
}
impl ItemMgtTrait for Group {
fn interface(&self) -> OpcResult<&crate::bindings::da::IOPCItemMgt> {
Ok(&self.item_mgt)
}
}
impl GroupStateMgtTrait for Group {
fn interface(&self) -> OpcResult<&crate::bindings::da::IOPCGroupStateMgt> {
Ok(&self.group_state_mgt)
}
}
impl PublicGroupStateMgtTrait for Group {
fn interface(&self) -> OpcResult<&crate::bindings::da::IOPCPublicGroupStateMgt> {
self.public_group_state_mgt.as_ref().ok_or_else(|| {
OpcError::NotImplemented("IOPCPublicGroupStateMgt not supported".to_string())
})
}
}
impl SyncIoTrait for Group {
fn interface(&self) -> OpcResult<&crate::bindings::da::IOPCSyncIO> {
Ok(&self.sync_io)
}
}
impl AsyncIoTrait for Group {
fn interface(&self) -> OpcResult<&crate::bindings::da::IOPCAsyncIO> {
Ok(&self.async_io)
}
}
impl DataObjectTrait for Group {
fn interface(&self) -> OpcResult<&windows::Win32::System::Com::IDataObject> {
Ok(&self.data_object)
}
}