1 /*****************************************************************************
2 * log.c: libvlc new API log functions
3 *****************************************************************************
4 * Copyright (C) 2005 the VideoLAN team
8 * Authors: Damien Fouilleul <damienf@videolan.org>
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
23 *****************************************************************************/
25 #include "libvlc_internal.h"
26 #include "../libvlc.h"
27 #include <vlc/libvlc.h>
31 libvlc_instance_t
*p_instance
;
32 msg_subscription_t
*p_messages
;
35 struct libvlc_log_iterator_t
37 msg_subscription_t
*p_messages
;
43 unsigned libvlc_get_log_verbosity( const libvlc_instance_t
*p_instance
, libvlc_exception_t
*p_e
)
47 libvlc_priv_t
*p_priv
= libvlc_priv( p_instance
->p_libvlc_int
);
48 return p_priv
->i_verbose
;
50 RAISEZERO("Invalid VLC instance!");
53 void libvlc_set_log_verbosity( libvlc_instance_t
*p_instance
, unsigned level
, libvlc_exception_t
*p_e
)
57 libvlc_priv_t
*p_priv
= libvlc_priv( p_instance
->p_libvlc_int
);
58 p_priv
->i_verbose
= level
;
61 RAISEVOID("Invalid VLC instance!");
64 libvlc_log_t
*libvlc_log_open( libvlc_instance_t
*p_instance
, libvlc_exception_t
*p_e
)
66 struct libvlc_log_t
*p_log
=
67 (struct libvlc_log_t
*)malloc(sizeof(struct libvlc_log_t
));
69 if( !p_log
) RAISENULL( "Out of memory" );
71 p_log
->p_instance
= p_instance
;
72 p_log
->p_messages
= msg_Subscribe(p_instance
->p_libvlc_int
);
74 if( !p_log
->p_messages
)
77 RAISENULL( "Out of memory" );
80 libvlc_retain( p_instance
);
84 void libvlc_log_close( libvlc_log_t
*p_log
, libvlc_exception_t
*p_e
)
86 if( p_log
&& p_log
->p_messages
)
88 msg_Unsubscribe(p_log
->p_instance
->p_libvlc_int
, p_log
->p_messages
);
89 libvlc_release( p_log
->p_instance
);
93 RAISEVOID("Invalid log object!");
96 unsigned libvlc_log_count( const libvlc_log_t
*p_log
, libvlc_exception_t
*p_e
)
98 if( p_log
&& p_log
->p_messages
)
100 int i_start
= p_log
->p_messages
->i_start
;
101 int i_stop
= *(p_log
->p_messages
->pi_stop
);
103 if( i_stop
>= i_start
)
104 return i_stop
-i_start
;
106 return VLC_MSG_QSIZE
-(i_start
-i_stop
);
108 RAISEZERO("Invalid log object!");
111 void libvlc_log_clear( libvlc_log_t
*p_log
, libvlc_exception_t
*p_e
)
113 if( p_log
&& p_log
->p_messages
)
115 vlc_mutex_lock(p_log
->p_messages
->p_lock
);
116 p_log
->p_messages
->i_start
= *(p_log
->p_messages
->pi_stop
);
117 vlc_mutex_unlock(p_log
->p_messages
->p_lock
);
120 RAISEVOID("Invalid log object!");
123 libvlc_log_iterator_t
*libvlc_log_get_iterator( const libvlc_log_t
*p_log
, libvlc_exception_t
*p_e
)
125 if( p_log
&& p_log
->p_messages
)
127 struct libvlc_log_iterator_t
*p_iter
=
128 (struct libvlc_log_iterator_t
*)malloc(sizeof(struct libvlc_log_iterator_t
));
130 if( !p_iter
) RAISENULL( "Out of memory" );
132 vlc_mutex_lock(p_log
->p_messages
->p_lock
);
133 p_iter
->p_messages
= p_log
->p_messages
;
134 p_iter
->i_start
= p_log
->p_messages
->i_start
;
135 p_iter
->i_pos
= p_log
->p_messages
->i_start
;
136 p_iter
->i_end
= *(p_log
->p_messages
->pi_stop
);
137 vlc_mutex_unlock(p_log
->p_messages
->p_lock
);
141 RAISENULL("Invalid log object!");
144 void libvlc_log_iterator_free( libvlc_log_iterator_t
*p_iter
, libvlc_exception_t
*p_e
)
151 RAISEVOID("Invalid log iterator!");
154 int libvlc_log_iterator_has_next( const libvlc_log_iterator_t
*p_iter
, libvlc_exception_t
*p_e
)
158 return p_iter
->i_pos
!= p_iter
->i_end
;
160 RAISEZERO("Invalid log iterator!");
163 libvlc_log_message_t
*libvlc_log_iterator_next( libvlc_log_iterator_t
*p_iter
,
164 libvlc_log_message_t
*buffer
,
165 libvlc_exception_t
*p_e
)
170 RAISENULL("Invalid log iterator!");
172 RAISENULL("Invalid message buffer!");
174 i_pos
= p_iter
->i_pos
;
175 if( i_pos
!= p_iter
->i_end
)
178 vlc_mutex_lock(p_iter
->p_messages
->p_lock
);
179 msg
= p_iter
->p_messages
->p_msg
+i_pos
;
180 buffer
->i_severity
= msg
->i_type
;
181 buffer
->psz_type
= msg
->psz_object_type
;
182 buffer
->psz_name
= msg
->psz_module
;
183 buffer
->psz_header
= msg
->psz_header
;
184 buffer
->psz_message
= msg
->psz_msg
;
185 p_iter
->i_pos
= ++i_pos
% VLC_MSG_QSIZE
;
186 vlc_mutex_unlock(p_iter
->p_messages
->p_lock
);
190 RAISENULL("No more messages");