wdext 0.1.0

A DbgEng wrapper framework
// SPDX-FileCopyrightText: 2026 takubokudori
// SPDX-License-Identifier: MIT OR Apache-2.0
//! IDebugPlmClient
use crate::dbgeng::{output_stream::DebugOutputStream, *};
use windy::WStr;

impl_debug_interface!(
    DebugPlmClient,
    DebugPlmClientRef,
    IDebugPlmClient3,
    IDebugPlmClient
);

// IDebugPlmClient
impl DebugPlmClient {
    pub fn launch_plm_package_for_debug_wide(
        &self,
        server: PlmPackageServer,
        timeout: u32,
        package_full_name: impl AsRef<WStr>,
        app_name: impl AsRef<WStr>,
        arguments: impl AsRef<WStr>,
    ) -> WinResult<(ProcessId, ThreadId)> {
        let mut process_id = ProcessId(0);
        let mut thread_id = ThreadId(0);
        unsafe {
            self.0.LaunchPlmPackageForDebugWide(
                server.into(),
                timeout,
                pcw!(package_full_name),
                pcw!(app_name),
                pcw!(arguments),
                &mut process_id.0,
                &mut thread_id.0,
            )?;
            Ok((process_id, thread_id))
        }
    }
}

// IDebugPlmClient2
impl DebugPlmClient {
    pub fn launch_plm_bg_task_for_debug_wide(
        &self,
        server: PlmPackageServer,
        timeout: u32,
        package_full_name: impl AsRef<WStr>,
        background_task_id: impl AsRef<WStr>,
    ) -> WinResult<(ProcessId, ThreadId)> {
        let mut process_id = ProcessId(0);
        let mut thread_id = ThreadId(0);
        unsafe {
            self.0.LaunchPlmBgTaskForDebugWide(
                server.into(),
                timeout,
                pcw!(package_full_name),
                pcw!(background_task_id),
                &mut process_id.0,
                &mut thread_id.0,
            )?;
            Ok((process_id, thread_id))
        }
    }
}

// IDebugPlmClient3
impl DebugPlmClient {
    pub fn query_plm_package_wide(
        &self,
        server: PlmPackageServer,
        package_full_name: impl AsRef<WStr>,
        stream: &DebugOutputStream,
    ) -> WinResult<()> {
        unsafe {
            self.0.QueryPlmPackageWide(
                server.into(),
                pcw!(package_full_name),
                stream.as_raw(),
            )
        }
    }

    pub fn query_plm_package_list(
        &self,
        server: PlmPackageServer,
        stream: &DebugOutputStream,
    ) -> WinResult<()> {
        unsafe { self.0.QueryPlmPackageList(server.into(), stream.as_raw()) }
    }

    pub fn enable_plm_package_debug_wide(
        &self,
        server: PlmPackageServer,
        package_full_name: impl AsRef<WStr>,
    ) -> WinResult<()> {
        unsafe {
            self.0.EnablePlmPackageDebugWide(
                server.into(),
                pcw!(package_full_name),
            )
        }
    }

    pub fn disable_plm_package_debug_wide(
        &self,
        server: PlmPackageServer,
        package_full_name: impl AsRef<WStr>,
    ) -> WinResult<()> {
        unsafe {
            self.0.DisablePlmPackageDebugWide(
                server.into(),
                pcw!(package_full_name),
            )
        }
    }

    pub fn suspend_plm_package_wide(
        &self,
        server: PlmPackageServer,
        package_full_name: impl AsRef<WStr>,
    ) -> WinResult<()> {
        unsafe {
            self.0
                .SuspendPlmPackageWide(server.into(), pcw!(package_full_name))
        }
    }

    pub fn resume_plm_package_wide(
        &self,
        server: PlmPackageServer,
        package_full_name: impl AsRef<WStr>,
    ) -> WinResult<()> {
        unsafe {
            self.0
                .ResumePlmPackageWide(server.into(), pcw!(package_full_name))
        }
    }

    pub fn terminate_plm_package_wide(
        &self,
        server: PlmPackageServer,
        package_full_name: impl AsRef<WStr>,
    ) -> WinResult<()> {
        unsafe {
            self.0
                .TerminatePlmPackageWide(server.into(), pcw!(package_full_name))
        }
    }

    pub fn launch_and_debug_plm_app_wide(
        &self,
        server: PlmPackageServer,
        package_full_name: impl AsRef<WStr>,
        app_name: impl AsRef<WStr>,
        arguments: impl AsRef<WStr>,
    ) -> WinResult<()> {
        unsafe {
            self.0.LaunchAndDebugPlmAppWide(
                server.into(),
                pcw!(package_full_name),
                pcw!(app_name),
                pcw!(arguments),
            )
        }
    }

    pub fn activate_and_debug_plm_bg_task_wide(
        &self,
        server: PlmPackageServer,
        package_full_name: impl AsRef<WStr>,
        background_task_id: impl AsRef<WStr>,
    ) -> WinResult<()> {
        unsafe {
            self.0.ActivateAndDebugPlmBgTaskWide(
                server.into(),
                pcw!(package_full_name),
                pcw!(background_task_id),
            )
        }
    }
}