1 /*
2  * Copyright © 2019 Collabora Ltd
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining
5  * a copy of this software and associated documentation files (the
6  * "Software"), to deal in the Software without restriction, including
7  * without limitation the rights to use, copy, modify, merge, publish,
8  * distribute, sublicense, and/or sell copies of the Software, and to
9  * permit persons to whom the Software is furnished to do so, subject to
10  * the following conditions:
11  *
12  * The above copyright notice and this permission notice (including the
13  * next paragraph) shall be included in all copies or substantial
14  * portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19  * NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
20  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
21  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23  * SOFTWARE.
24  */
25 #ifndef WESTON_LOG_INTERNAL_H
26 #define WESTON_LOG_INTERNAL_H
27 
28 #include "wayland-util.h"
29 
30 struct weston_log_subscription;
31 
32 /** Subscriber allows each type of stream to customize or to provide its own
33  * methods to manipulate the underlying storage. It follows also an
34  * object-oriented approach, contains the ops callbacks and a list of
35  * subcriptions of type weston_log_subscription. Each subscription created will
36  * be both added to this subscription list and that of the weston_log_scope.
37  *
38  * A kind of stream can inherit the subscriber class and provide its own callbacks:
39  * @code
40  * struct weston_log_data_stream {
41  * 	struct weston_log_subscriber base;
42  * 	struct weston_data_stream opaque;
43  * };
44  * @endcode
45  *
46  * Passing the base class will require container retrieval type of methods
47  * to be allowed to reach the opaque type (i.e., container_of()).
48  *
49  * @ingroup internal-log
50  *
51  */
52 struct weston_log_subscriber {
53 	/** write the data pointed by @param data */
54 	void (*write)(struct weston_log_subscriber *sub, const char *data, size_t len);
55 	/** For the type of streams that required additional destroy operation
56 	 * for destroying the stream */
57 	void (*destroy)(struct weston_log_subscriber *sub);
58 	/** For the type of streams that can inform the 'consumer' part that
59 	 * write operation has been terminated/finished and should close the
60 	 * stream.
61 	 */
62 	void (*complete)(struct weston_log_subscriber *sub);
63 	struct wl_list subscription_list;       /**< weston_log_subscription::owner_link */
64 };
65 
66 void
67 weston_log_subscription_create(struct weston_log_subscriber *owner,
68 			       struct weston_log_scope *scope);
69 
70 void
71 weston_log_subscription_destroy(struct weston_log_subscription *sub);
72 
73 struct weston_log_subscription *
74 weston_log_subscriber_get_only_subscription(struct weston_log_subscriber *subscriber);
75 
76 void
77 weston_log_subscription_add(struct weston_log_scope *scope,
78 			    struct weston_log_subscription *sub);
79 void
80 weston_log_subscription_remove(struct weston_log_subscription *sub);
81 
82 
83 void
84 weston_log_bind_weston_debug(struct wl_client *client,
85 			     void *data, uint32_t version, uint32_t id);
86 
87 struct weston_log_scope *
88 weston_log_get_scope(struct weston_log_context *log_ctx, const char *name);
89 
90 void
91 weston_log_run_cb_new_subscriber(struct weston_log_subscription *sub);
92 
93 void
94 weston_debug_protocol_advertise_scopes(struct weston_log_context *log_ctx,
95 				       struct wl_resource *res);
96 int
97 weston_log_ctx_compositor_setup(struct weston_compositor *compositor,
98 			      struct weston_log_context *log_ctx);
99 
100 int
101 weston_vlog(const char *fmt, va_list ap);
102 int
103 weston_vlog_continue(const char *fmt, va_list ap);
104 
105 #endif /* WESTON_LOG_INTERNAL_H */
106