pulse: Fix old bug in stream_free
[profile/ivi/pulseaudio.git] / src / pulse / client-conf-x11.c
1 /***
2   This file is part of PulseAudio.
3
4   Copyright 2004-2006 Lennart Poettering
5
6   PulseAudio is free software; you can redistribute it and/or modify
7   it under the terms of the GNU Lesser General Public License as published
8   by the Free Software Foundation; either version 2.1 of the License,
9   or (at your option) any later version.
10
11   PulseAudio is distributed in the hope that it will be useful, but
12   WITHOUT ANY WARRANTY; without even the implied warranty of
13   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14   General Public License for more details.
15
16   You should have received a copy of the GNU Lesser General Public License
17   along with PulseAudio; if not, write to the Free Software
18   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-13071
19   USA.
20 ***/
21
22 #ifdef HAVE_CONFIG_H
23 #include <config.h>
24 #endif
25
26 #include <string.h>
27
28 #include <xcb/xcb.h>
29
30 #include <pulse/xmalloc.h>
31
32 #include <pulsecore/i18n.h>
33 #include <pulsecore/x11prop.h>
34 #include <pulsecore/log.h>
35 #include <pulsecore/core-util.h>
36 #include <pulsecore/macro.h>
37
38 #include "client-conf-x11.h"
39
40 int pa_client_conf_from_x11(pa_client_conf *c, const char *dname) {
41     xcb_connection_t *xcb = NULL;
42     int ret = -1, screen = 0;
43     char t[1024];
44
45     pa_assert(c);
46
47     if (!dname && !(dname = getenv("DISPLAY")))
48         goto finish;
49
50     if (*dname == 0)
51         goto finish;
52
53     if (!(xcb = xcb_connect(dname, NULL))) {
54         pa_log(_("xcb_connect() failed"));
55         goto finish;
56     }
57
58     if (xcb_connection_has_error(xcb)) {
59         pa_log(_("xcb_connection_has_error() returned true"));
60         goto finish;
61     }
62
63     if (pa_x11_get_prop(xcb, screen, "PULSE_SERVER", t, sizeof(t))) {
64         pa_bool_t disable_autospawn = TRUE;
65
66         pa_xfree(c->default_server);
67         c->default_server = pa_xstrdup(t);
68
69         if (pa_x11_get_prop(xcb, screen, "PULSE_SESSION_ID", t, sizeof(t))) {
70             char *id;
71
72             if ((id = pa_session_id())) {
73                 if (pa_streq(t, id))
74                     disable_autospawn = FALSE;
75                 pa_xfree(id);
76             }
77         }
78
79         if (disable_autospawn)
80             c->autospawn = FALSE;
81     }
82
83     if (pa_x11_get_prop(xcb, screen, "PULSE_SINK", t, sizeof(t))) {
84         pa_xfree(c->default_sink);
85         c->default_sink = pa_xstrdup(t);
86     }
87
88     if (pa_x11_get_prop(xcb, screen, "PULSE_SOURCE", t, sizeof(t))) {
89         pa_xfree(c->default_source);
90         c->default_source = pa_xstrdup(t);
91     }
92
93     if (pa_x11_get_prop(xcb, screen, "PULSE_COOKIE", t, sizeof(t))) {
94         uint8_t cookie[PA_NATIVE_COOKIE_LENGTH];
95
96         if (pa_parsehex(t, cookie, sizeof(cookie)) != sizeof(cookie)) {
97             pa_log(_("Failed to parse cookie data"));
98             goto finish;
99         }
100
101         pa_assert(sizeof(cookie) == sizeof(c->cookie));
102         memcpy(c->cookie, cookie, sizeof(cookie));
103
104         c->cookie_valid = TRUE;
105
106         pa_xfree(c->cookie_file);
107         c->cookie_file = NULL;
108     }
109
110     ret = 0;
111
112 finish:
113     if (xcb)
114         xcb_disconnect(xcb);
115
116     return ret;
117
118 }