#![allow(non_camel_case_types, non_snake_case)]
use crate::advapi::ffi;
use crate::co;
use crate::decl::*;
use crate::guard::*;
use crate::kernel::privs::*;
use crate::prelude::*;
handle! { HTRANSACTION;
}
impl HTRANSACTION {
pub fn CommitTransaction(&self) -> SysResult<()> {
BoolRet(unsafe { ffi::CommitTransaction(self.ptr()) }).to_sysresult()
}
#[must_use]
pub fn CreateTransaction(
transaction_attributes: Option<&SECURITY_ATTRIBUTES>,
options: Option<co::TRANSACTION_OPT>,
timeout: Option<u32>,
description: &str,
) -> SysResult<CloseHandleGuard<HTRANSACTION>> {
unsafe {
match HTRANSACTION(ffi::CreateTransaction(
pcvoid_or_null(transaction_attributes),
std::ptr::null_mut(),
options.unwrap_or_default().raw(),
0,
0,
timeout.unwrap_or_default(),
WString::from_str(description).as_ptr() as _,
)) {
HTRANSACTION::INVALID => Err(GetLastError()),
handle => Ok(CloseHandleGuard::new(handle)),
}
}
}
#[must_use]
pub fn GetTransactionId(&self) -> SysResult<GUID> {
let mut guid = GUID::default();
BoolRet(unsafe { ffi::GetTransactionId(self.ptr(), pvoid(&mut guid)) })
.to_sysresult()
.map(|_| guid)
}
#[must_use]
pub fn OpenTransaction(
desired_access: co::TRANSACTION,
transaction_id: &GUID,
) -> SysResult<CloseHandleGuard<HTRANSACTION>> {
unsafe {
match HTRANSACTION(ffi::OpenTransaction(desired_access.raw(), pcvoid(transaction_id))) {
HTRANSACTION::INVALID => Err(GetLastError()),
handle => Ok(CloseHandleGuard::new(handle)),
}
}
}
pub fn RollbackTransaction(&self) -> SysResult<()> {
BoolRet(unsafe { ffi::RollbackTransaction(self.ptr()) }).to_sysresult()
}
}