2009-07-31 08:16:55 +00:00
|
|
|
// Log.cs - Wrapper for message logging functions
|
|
|
|
//
|
|
|
|
// Authors:
|
|
|
|
// Gonzalo Paniagua Javier (gonzalo@ximian.com)
|
|
|
|
//
|
|
|
|
//
|
|
|
|
// Copyright (c) 2002 Gonzalo Paniagua
|
|
|
|
//
|
|
|
|
// This program is free software; you can redistribute it and/or
|
|
|
|
// modify it under the terms of version 2 of the Lesser GNU General
|
|
|
|
// Public License as published by the Free Software Foundation.
|
|
|
|
//
|
|
|
|
// This program is distributed in the hope that it will be useful,
|
|
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
// Lesser General Public License for more details.
|
|
|
|
//
|
|
|
|
// You should have received a copy of the GNU Lesser General Public
|
|
|
|
// License along with this program; if not, write to the
|
|
|
|
// Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
|
|
|
// Boston, MA 02111-1307, USA.
|
|
|
|
|
|
|
|
//
|
|
|
|
|
2009-08-05 14:48:13 +00:00
|
|
|
namespace Gst.GLib {
|
2009-07-31 08:16:55 +00:00
|
|
|
|
|
|
|
using System;
|
|
|
|
using System.Collections;
|
|
|
|
using System.Runtime.InteropServices;
|
|
|
|
|
|
|
|
public delegate void LogFunc (string log_domain, LogLevelFlags log_level, string message);
|
|
|
|
|
|
|
|
public delegate void PrintFunc (string message);
|
|
|
|
|
|
|
|
[Flags]
|
|
|
|
public enum LogLevelFlags : int
|
|
|
|
{
|
|
|
|
/* log flags */
|
|
|
|
FlagRecursion = 1 << 0,
|
|
|
|
FlagFatal = 1 << 1,
|
|
|
|
|
|
|
|
/* GLib log levels */
|
|
|
|
Error = 1 << 2, /* always fatal */
|
|
|
|
Critical = 1 << 3,
|
|
|
|
Warning = 1 << 4,
|
|
|
|
Message = 1 << 5,
|
|
|
|
Info = 1 << 6,
|
|
|
|
Debug = 1 << 7,
|
|
|
|
|
|
|
|
/* Convenience values */
|
|
|
|
AllButFatal = 253,
|
|
|
|
AllButRecursion = 254,
|
|
|
|
All = 255,
|
|
|
|
|
|
|
|
FlagMask = 3,
|
|
|
|
LevelMask = unchecked ((int) 0xFFFFFFFC)
|
|
|
|
}
|
|
|
|
|
|
|
|
public class Log {
|
|
|
|
|
2009-09-11 06:37:33 +00:00
|
|
|
[UnmanagedFunctionPointer (CallingConvention.Cdecl)]
|
2009-09-03 09:07:43 +00:00
|
|
|
delegate void LogFuncNative (IntPtr log_domain, LogLevelFlags flags, IntPtr message, IntPtr user_data);
|
|
|
|
|
|
|
|
static LogFuncNative native_handler;
|
|
|
|
|
|
|
|
static void NativeCallback (IntPtr log_domain_native, LogLevelFlags flags, IntPtr message_native, IntPtr user_data)
|
|
|
|
{
|
|
|
|
if (user_data == IntPtr.Zero)
|
|
|
|
return;
|
|
|
|
string log_domain = Marshaller.Utf8PtrToString (log_domain_native);
|
|
|
|
string message = Marshaller.Utf8PtrToString (message_native);
|
|
|
|
GCHandle gch = (GCHandle) user_data;
|
|
|
|
LogFunc func = gch.Target as LogFunc;
|
|
|
|
if (func != null)
|
|
|
|
func (log_domain, flags, message);
|
|
|
|
}
|
|
|
|
|
2009-09-11 06:37:33 +00:00
|
|
|
[UnmanagedFunctionPointer (CallingConvention.Cdecl)]
|
2009-09-03 09:07:43 +00:00
|
|
|
delegate void PrintFuncNative (IntPtr message);
|
|
|
|
|
|
|
|
class PrintHelper {
|
|
|
|
|
|
|
|
PrintFuncNative native;
|
|
|
|
PrintFunc managed;
|
|
|
|
|
|
|
|
public PrintHelper (PrintFuncNative native)
|
|
|
|
{
|
|
|
|
this.native = native;
|
|
|
|
}
|
|
|
|
|
|
|
|
public PrintHelper (PrintFunc managed)
|
|
|
|
{
|
|
|
|
this.managed = managed;
|
|
|
|
GCHandle.Alloc (this);
|
|
|
|
}
|
|
|
|
|
|
|
|
void Callback (IntPtr nmessage)
|
|
|
|
{
|
|
|
|
string message = Marshaller.Utf8PtrToString (nmessage);
|
|
|
|
managed (message);
|
|
|
|
}
|
|
|
|
|
|
|
|
void Invoke (string message)
|
|
|
|
{
|
|
|
|
IntPtr nmessage = Marshaller.StringToPtrGStrdup (message);
|
|
|
|
native (nmessage);
|
|
|
|
Marshaller.Free (nmessage);
|
|
|
|
}
|
|
|
|
|
|
|
|
public PrintFuncNative Handler {
|
|
|
|
get { return new PrintFuncNative (Callback); }
|
|
|
|
}
|
|
|
|
|
|
|
|
public PrintFunc Invoker {
|
|
|
|
get { return new PrintFunc (Invoke); }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static System.Collections.Generic.Dictionary<uint, GCHandle> handlers;
|
2009-07-31 08:16:55 +00:00
|
|
|
|
|
|
|
static void EnsureHash ()
|
|
|
|
{
|
|
|
|
if (handlers == null)
|
2009-09-03 09:07:43 +00:00
|
|
|
handlers = new System.Collections.Generic.Dictionary<uint, GCHandle> ();
|
2009-07-31 08:16:55 +00:00
|
|
|
}
|
|
|
|
|
2009-09-11 06:37:33 +00:00
|
|
|
[DllImport ("libglib-2.0-0.dll", CallingConvention = CallingConvention.Cdecl)]
|
2009-07-31 08:16:55 +00:00
|
|
|
static extern void g_logv (IntPtr log_domain, LogLevelFlags flags, IntPtr message);
|
|
|
|
|
|
|
|
public void WriteLog (string logDomain, LogLevelFlags flags, string format, params object [] args)
|
|
|
|
{
|
|
|
|
IntPtr ndom = Marshaller.StringToPtrGStrdup (logDomain);
|
|
|
|
IntPtr nmessage = Marshaller.StringToPtrGStrdup (String.Format (format, args));
|
|
|
|
g_logv (ndom, flags, nmessage);
|
|
|
|
Marshaller.Free (ndom);
|
|
|
|
Marshaller.Free (nmessage);
|
|
|
|
}
|
|
|
|
|
2009-09-11 06:37:33 +00:00
|
|
|
[DllImport ("libglib-2.0-0.dll", CallingConvention = CallingConvention.Cdecl)]
|
2009-09-03 09:07:43 +00:00
|
|
|
static extern uint g_log_set_handler (IntPtr log_domain, LogLevelFlags flags, LogFuncNative log_func, IntPtr user_data);
|
2009-07-31 08:16:55 +00:00
|
|
|
|
|
|
|
public static uint SetLogHandler (string logDomain, LogLevelFlags flags, LogFunc logFunc)
|
|
|
|
{
|
2009-09-03 09:07:43 +00:00
|
|
|
if (native_handler == null)
|
|
|
|
native_handler = new LogFuncNative (NativeCallback);
|
|
|
|
|
2009-07-31 08:16:55 +00:00
|
|
|
IntPtr ndom = Marshaller.StringToPtrGStrdup (logDomain);
|
2009-09-03 09:07:43 +00:00
|
|
|
GCHandle gch = GCHandle.Alloc (logFunc);
|
|
|
|
uint result = g_log_set_handler (ndom, flags, native_handler, (IntPtr) gch);
|
2009-07-31 08:16:55 +00:00
|
|
|
Marshaller.Free (ndom);
|
|
|
|
EnsureHash ();
|
2009-09-03 09:07:43 +00:00
|
|
|
handlers [result] = gch;
|
2009-07-31 08:16:55 +00:00
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
2009-09-11 06:37:33 +00:00
|
|
|
[DllImport ("libglib-2.0-0.dll", CallingConvention = CallingConvention.Cdecl)]
|
2009-07-31 08:16:55 +00:00
|
|
|
static extern uint g_log_remove_handler (IntPtr log_domain, uint handler_id);
|
|
|
|
|
|
|
|
public static void RemoveLogHandler (string logDomain, uint handlerID)
|
|
|
|
{
|
2009-09-03 09:07:43 +00:00
|
|
|
if (handlers != null && handlers.ContainsKey (handlerID)) {
|
|
|
|
handlers [handlerID].Free ();
|
2009-07-31 08:16:55 +00:00
|
|
|
handlers.Remove (handlerID);
|
2009-09-03 09:07:43 +00:00
|
|
|
}
|
2009-07-31 08:16:55 +00:00
|
|
|
|
|
|
|
IntPtr ndom = Marshaller.StringToPtrGStrdup (logDomain);
|
|
|
|
g_log_remove_handler (ndom, handlerID);
|
|
|
|
Marshaller.Free (ndom);
|
|
|
|
}
|
|
|
|
|
2009-09-11 06:37:33 +00:00
|
|
|
[DllImport ("libglib-2.0-0.dll", CallingConvention = CallingConvention.Cdecl)]
|
2009-09-03 09:07:43 +00:00
|
|
|
static extern PrintFuncNative g_set_print_handler (PrintFuncNative handler);
|
2009-07-31 08:16:55 +00:00
|
|
|
|
|
|
|
public static PrintFunc SetPrintHandler (PrintFunc handler)
|
|
|
|
{
|
2009-09-03 09:07:43 +00:00
|
|
|
PrintHelper helper = new PrintHelper (handler);
|
|
|
|
PrintFuncNative prev = g_set_print_handler (helper.Handler);
|
|
|
|
helper = new PrintHelper (prev);
|
|
|
|
return helper.Invoker;
|
2009-07-31 08:16:55 +00:00
|
|
|
}
|
|
|
|
|
2009-09-11 06:37:33 +00:00
|
|
|
[DllImport ("libglib-2.0-0.dll", CallingConvention = CallingConvention.Cdecl)]
|
2009-09-03 09:07:43 +00:00
|
|
|
static extern PrintFuncNative g_set_printerr_handler (PrintFuncNative handler);
|
2009-07-31 08:16:55 +00:00
|
|
|
|
|
|
|
public static PrintFunc SetPrintErrorHandler (PrintFunc handler)
|
|
|
|
{
|
2009-09-03 09:07:43 +00:00
|
|
|
PrintHelper helper = new PrintHelper (handler);
|
|
|
|
PrintFuncNative prev = g_set_printerr_handler (helper.Handler);
|
|
|
|
helper = new PrintHelper (prev);
|
|
|
|
return helper.Invoker;
|
2009-07-31 08:16:55 +00:00
|
|
|
}
|
|
|
|
|
2009-09-11 06:37:33 +00:00
|
|
|
[DllImport ("libglib-2.0-0.dll", CallingConvention = CallingConvention.Cdecl)]
|
2009-07-31 08:16:55 +00:00
|
|
|
static extern void g_log_default_handler (IntPtr log_domain, LogLevelFlags log_level, IntPtr message, IntPtr unused_data);
|
|
|
|
|
|
|
|
public static void DefaultHandler (string logDomain, LogLevelFlags logLevel, string message)
|
|
|
|
|
|
|
|
{
|
|
|
|
IntPtr ndom = Marshaller.StringToPtrGStrdup (logDomain);
|
|
|
|
IntPtr nmess = Marshaller.StringToPtrGStrdup (message);
|
|
|
|
g_log_default_handler (ndom, logLevel, nmess, IntPtr.Zero);
|
|
|
|
Marshaller.Free (ndom);
|
|
|
|
Marshaller.Free (nmess);
|
|
|
|
}
|
|
|
|
|
2009-09-11 06:37:33 +00:00
|
|
|
[DllImport ("libglib-2.0-0.dll", CallingConvention = CallingConvention.Cdecl)]
|
2009-07-31 08:16:55 +00:00
|
|
|
extern static LogLevelFlags g_log_set_always_fatal (LogLevelFlags fatal_mask);
|
|
|
|
|
|
|
|
public static LogLevelFlags SetAlwaysFatal (LogLevelFlags fatalMask)
|
|
|
|
{
|
|
|
|
return g_log_set_always_fatal (fatalMask);
|
|
|
|
}
|
|
|
|
|
2009-09-11 06:37:33 +00:00
|
|
|
[DllImport ("libglib-2.0-0.dll", CallingConvention = CallingConvention.Cdecl)]
|
2009-07-31 08:16:55 +00:00
|
|
|
extern static LogLevelFlags g_log_set_fatal_mask (IntPtr log_domain, LogLevelFlags fatal_mask);
|
|
|
|
|
|
|
|
public static LogLevelFlags SetAlwaysFatal (string logDomain, LogLevelFlags fatalMask)
|
|
|
|
{
|
|
|
|
IntPtr ndom = Marshaller.StringToPtrGStrdup (logDomain);
|
|
|
|
LogLevelFlags result = g_log_set_fatal_mask (ndom, fatalMask);
|
|
|
|
Marshaller.Free (ndom);
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
2009-09-03 09:07:43 +00:00
|
|
|
class Invoker {
|
|
|
|
|
|
|
|
LogFuncNative native;
|
|
|
|
|
|
|
|
public Invoker (LogFuncNative native)
|
|
|
|
{
|
|
|
|
this.native = native;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Invoke (string log_domain, LogLevelFlags flags, string message)
|
|
|
|
{
|
|
|
|
IntPtr ndom = Marshaller.StringToPtrGStrdup (log_domain);
|
|
|
|
IntPtr nmess = Marshaller.StringToPtrGStrdup (message);
|
|
|
|
native (ndom, flags, nmess, IntPtr.Zero);
|
|
|
|
Marshaller.Free (ndom);
|
|
|
|
Marshaller.Free (nmess);
|
|
|
|
}
|
|
|
|
|
|
|
|
public LogFunc Handler {
|
|
|
|
get { return new LogFunc (Invoke); }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-09-11 06:37:33 +00:00
|
|
|
[DllImport ("libglib-2.0-0.dll", CallingConvention = CallingConvention.Cdecl)]
|
2009-09-03 09:07:43 +00:00
|
|
|
extern static LogFuncNative g_log_set_default_handler (LogFuncNative log_func, IntPtr user_data);
|
|
|
|
|
|
|
|
public static LogFunc SetDefaultHandler (LogFunc log_func)
|
|
|
|
{
|
|
|
|
if (native_handler == null)
|
|
|
|
native_handler = new LogFuncNative (NativeCallback);
|
|
|
|
|
|
|
|
LogFuncNative prev = g_log_set_default_handler (native_handler, (IntPtr) GCHandle.Alloc (log_func));
|
|
|
|
if (prev == null)
|
|
|
|
return null;
|
|
|
|
Invoker invoker = new Invoker (prev);
|
|
|
|
return invoker.Handler;
|
|
|
|
}
|
|
|
|
|
2009-07-31 08:16:55 +00:00
|
|
|
/*
|
|
|
|
* Some common logging methods.
|
|
|
|
*
|
|
|
|
* Sample usage:
|
|
|
|
*
|
|
|
|
* // Print the messages for the NULL domain
|
|
|
|
* LogFunc logFunc = new LogFunc (Log.PrintLogFunction);
|
|
|
|
* Log.SetLogHandler (null, LogLevelFlags.All, logFunc);
|
|
|
|
*
|
|
|
|
* // Print messages and stack trace for Gtk critical messages
|
|
|
|
* logFunc = new LogFunc (Log.PrintTraceLogFunction);
|
|
|
|
* Log.SetLogHandler ("Gtk", LogLevelFlags.Critical, logFunc);
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
public static void PrintLogFunction (string domain, LogLevelFlags level, string message)
|
|
|
|
{
|
|
|
|
Console.WriteLine ("Domain: '{0}' Level: {1}", domain, level);
|
|
|
|
Console.WriteLine ("Message: {0}", message);
|
|
|
|
}
|
|
|
|
|
|
|
|
public static void PrintTraceLogFunction (string domain, LogLevelFlags level, string message)
|
|
|
|
{
|
|
|
|
PrintLogFunction (domain, level, message);
|
|
|
|
Console.WriteLine ("Trace follows:\n{0}", new System.Diagnostics.StackTrace ());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|