110 lines
3.1 KiB
Rust
110 lines
3.1 KiB
Rust
// GStreamer
|
|
//
|
|
// Copyright (C) 2015-2023 Sebastian Dröge <sebastian@centricular.com>
|
|
//
|
|
// This Source Code Form is subject to the terms of the Mozilla Public License, v2.0.
|
|
// If a copy of the MPL was not distributed with this file, You can obtain one at
|
|
// <https://mozilla.org/MPL/2.0/>.
|
|
//
|
|
// SPDX-License-Identifier: MPL-2.0
|
|
|
|
#[cfg(not(test))]
|
|
use crate::io::Stderr;
|
|
#[cfg(not(test))]
|
|
use std::io::{self, Cursor, Write};
|
|
|
|
#[derive(Copy, Clone, PartialEq, Eq)]
|
|
#[repr(u8)]
|
|
#[allow(dead_code)]
|
|
pub enum LogLevel {
|
|
Error = 1,
|
|
Warning = 2,
|
|
_Fixme = 3,
|
|
Info = 4,
|
|
Debug = 5,
|
|
_Log = 6,
|
|
Trace = 7,
|
|
}
|
|
|
|
/*
|
|
* - 1 byte GstDebugLevel
|
|
* - 2 byte BE filename length
|
|
* - filename UTF-8 string
|
|
* - 2 byte BE module path length
|
|
* - module path UTF-8 string
|
|
* - 4 byte BE line number
|
|
* - remainder is UTF-8 string
|
|
*/
|
|
#[cfg(test)]
|
|
pub fn log(
|
|
_level: LogLevel,
|
|
_file: &str,
|
|
_module_path: &str,
|
|
_line: u32,
|
|
_args: std::fmt::Arguments,
|
|
) {
|
|
}
|
|
|
|
#[cfg(not(test))]
|
|
pub fn log(level: LogLevel, file: &str, module_path: &str, line: u32, args: std::fmt::Arguments) {
|
|
let mut stderr = Stderr::acquire();
|
|
let mut buffer = [0u8; 8192];
|
|
let mut cursor = Cursor::new(&mut buffer[..]);
|
|
|
|
// Silently ignore errors. What was written to the buffer was written and if there's more data
|
|
// than fits it will simply be cut off in the end.
|
|
let _ = (|| -> Result<(), io::Error> {
|
|
cursor.write_all(&[0u8, 0u8])?;
|
|
cursor.write_all(&[level as u8])?;
|
|
cursor.write_all(&(file.len() as u16).to_be_bytes())?;
|
|
cursor.write_all(file.as_bytes())?;
|
|
cursor.write_all(&(module_path.len() as u16).to_be_bytes())?;
|
|
cursor.write_all(module_path.as_bytes())?;
|
|
cursor.write_all(&line.to_be_bytes())?;
|
|
cursor.write_fmt(args)?;
|
|
|
|
Ok(())
|
|
})();
|
|
|
|
let pos = cursor.position() as u16;
|
|
if pos < 2 {
|
|
return;
|
|
}
|
|
|
|
cursor.set_position(0);
|
|
let _ = cursor.write_all(&(pos - 2).to_be_bytes());
|
|
|
|
let _ = stderr.write_all(&buffer[..pos as usize]);
|
|
}
|
|
|
|
#[allow(unused_macros)]
|
|
macro_rules! error {
|
|
($format:expr $(, $arg:expr)* $(,)?) => {{
|
|
$crate::log::log($crate::log::LogLevel::Error, file!(), module_path!(), line!(), format_args!($format, $($arg),*));
|
|
}};
|
|
}
|
|
#[allow(unused_macros)]
|
|
macro_rules! warn {
|
|
($format:expr $(, $arg:expr)* $(,)?) => {{
|
|
$crate::log::log($crate::log::LogLevel::Warning, file!(), module_path!(), line!(), format_args!($format, $($arg),*));
|
|
}};
|
|
}
|
|
#[allow(unused_macros)]
|
|
macro_rules! info {
|
|
($format:expr $(, $arg:expr)* $(,)?) => {{
|
|
$crate::log::log($crate::log::LogLevel::Info, file!(), module_path!(), line!(), format_args!($format, $($arg),*));
|
|
}};
|
|
}
|
|
#[allow(unused_macros)]
|
|
macro_rules! debug {
|
|
($format:expr $(, $arg:expr)* $(,)?) => {{
|
|
$crate::log::log($crate::log::LogLevel::Debug, file!(), module_path!(), line!(), format_args!($format, $($arg),*));
|
|
}};
|
|
}
|
|
#[allow(unused_macros)]
|
|
macro_rules! trace {
|
|
($format:expr $(, $arg:expr)* $(,)?) => {{
|
|
$crate::log::log($crate::log::LogLevel::Trace, file!(), module_path!(), line!(), format_args!($format, $($arg),*));
|
|
}};
|
|
}
|