import ctypes
from enum import IntEnum
from typing import Optional, Callable, Union
from ubse.ffi.ubs_engine_binding_base import UbsEngineBindingBase
class LogLevel(IntEnum):
"""日志级别枚举"""
DEBUG = 0
INFO = 1
WARN = 2
ERROR = 3
CRIT = 4
@classmethod
def from_int(cls, value: int) -> 'LogLevel':
"""从整数值创建枚举"""
try:
return cls(value)
except ValueError:
return cls.DEBUG
class UbsEngineBindingLog(UbsEngineBindingBase):
def __init__(self):
super().__init__()
self._log_callback = None
self._setup_log_prototypes()
def ubs_engine_log_callback_register(
self,
log_handler: Callable[[Union[LogLevel, int], str], None]
):
"""注册日志处理函数,支持枚举和整数"""
def log_callback_wrapper(c_level, c_message):
level_int = c_level
message = c_message.decode('utf-8', errors='ignore') if c_message else ""
try:
import inspect
sig = inspect.signature(log_handler)
params = list(sig.parameters.values())
if len(params) > 0 and hasattr(params[0].annotation, '__args__'):
if LogLevel in params[0].annotation.__args__:
log_handler(LogLevel.from_int(level_int), message)
else:
log_handler(level_int, message)
else:
try:
log_handler(LogLevel.from_int(level_int), message)
except TypeError:
log_handler(level_int, message)
except Exception as e:
print(f"Log callback error: {e}")
self._log_callback = self.log_callback(log_callback_wrapper)
self.lib_ubse.ubs_engine_log_callback_register(self._log_callback)
def _setup_log_prototypes(self):
"""设置日志相关函数的原型"""
self.log_callback = ctypes.CFUNCTYPE(None, ctypes.c_uint32, ctypes.c_char_p)
self.lib_ubse.ubs_engine_log_callback_register.argtypes = [self.log_callback]
self.lib_ubse.ubs_engine_log_callback_register.restype = None