1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
use std::ffi::CString;
use std::ptr;

use ffi::*;
use std::os::raw::{c_char, c_void};

pub struct LogStream {
    raw: AiLogStream,
    attached: bool
}

impl LogStream {
    pub fn file(filename: &str) -> Option<LogStream> {
        let cstr = CString::new(filename).unwrap();
        let stream = unsafe { aiGetPredefinedLogStream(AiDefaultLogStream::File, cstr.as_ptr()) };
        if stream.callback.is_some() {
            Some(LogStream { raw: stream, attached: false })
        } else {
            None
        }
    }

    pub fn stdout() -> LogStream {
        let stream = unsafe { aiGetPredefinedLogStream(AiDefaultLogStream::StdOut, ptr::null()) };
        LogStream { raw: stream, attached: false }
    }

    pub fn stderr() -> LogStream {
        let stream = unsafe { aiGetPredefinedLogStream(AiDefaultLogStream::StdErr, ptr::null()) };
        LogStream { raw: stream, attached: false }
    }

    #[cfg(windows)]
    pub fn debug() -> LogStream {
        let stream = unsafe { aiGetPredefinedLogStream(AiDefaultLogStream::Debugger, ptr::null()) };
        LogStream { raw: stream, attached: false }
    }

    pub fn callback(cb: unsafe extern "system" fn(*const c_char, *mut c_char)) -> LogStream {
        LogStream {
            raw: AiLogStream {
                callback: Some(cb),
                user: ptr::null::<c_void>() as *mut c_void
            },
            attached: false
        }
    }

    pub fn attached(&self) -> bool { self.attached }

    pub fn attach(&mut self) {
        if !self.attached { unsafe { aiAttachLogStream(&self.raw) } }
    }

    pub fn detach(&mut self) {
        if self.attached { unsafe { aiDetachLogStream(&self.raw); } }
    }

    pub fn set_verbose_logging(state: bool) {
        unsafe { aiEnableVerboseLogging(if state { AI_TRUE } else { AI_FALSE }) }
    }
}

impl Drop for LogStream {
    fn drop(&mut self) {
        self.detach()
    }
}