repo_description: An open-source remote desktop application designed for self-hosting, as an alternative to TeamViewer.
repo_topics: android anydesk dart flatpak flutter flutter-apps ios linux macos p2p rdp remote-control remote-desktop rust rust-lang teamviewer vnc wayland windows
code: use hbb_common::log;
  use std::ffi::c_char;
  
  const LOG_LEVEL_TRACE: &[u8; 6] = b"trace\0";
  const LOG_LEVEL_DEBUG: &[u8; 6] = b"debug\0";
  const LOG_LEVEL_INFO: &[u8; 5] = b"info\0";
  const LOG_LEVEL_WARN: &[u8; 5] = b"warn\0";
  const LOG_LEVEL_ERROR: &[u8; 6] = b"error\0";
  
  #[inline]
  fn is_level(level: *const c_char, level_bytes: &[u8]) -> bool {
      level_bytes == unsafe { std::slice::from_raw_parts(level as *const u8, level_bytes.len()) }
  }
  
  #[no_mangle]
  pub(super) extern "C" fn plugin_log(level: *const c_char, msg: *const c_char) {
      if level.is_null() || msg.is_null() {
          return;
      }
  
      if let Ok(msg) = super::cstr_to_string(msg) {
          if is_level(level, LOG_LEVEL_TRACE) {
              log::trace!("{}", msg);
          } else if is_level(level, LOG_LEVEL_DEBUG) {
              log::debug!("{}", msg);
          } else if is_level(level, LOG_LEVEL_INFO) {
              log::info!("{}", msg);
          } else if is_level(level, LOG_LEVEL_WARN) {
              log::warn!("{}", msg);
          } else if is_level(level, LOG_LEVEL_ERROR) {
              log::error!("{}", msg);
          }
      }
  }
  