Git init
[framework/multimedia/pulseaudio.git] / src / utils / pax11publish.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-1307
19   USA.
20 ***/
21
22 #ifdef HAVE_CONFIG_H
23 #include <config.h>
24 #endif
25
26 #include <stdio.h>
27 #include <getopt.h>
28 #include <string.h>
29 #include <assert.h>
30 #include <locale.h>
31
32 #include <X11/Xlib.h>
33 #include <X11/Xatom.h>
34
35 #include <pulse/util.h>
36 #include <pulse/i18n.h>
37
38 #include <pulsecore/core-util.h>
39 #include <pulsecore/log.h>
40 #include <pulsecore/authkey.h>
41 #include <pulsecore/native-common.h>
42 #include <pulsecore/x11prop.h>
43
44 #include "../pulse/client-conf.h"
45
46 int main(int argc, char *argv[]) {
47     const char *dname = NULL, *sink = NULL, *source = NULL, *server = NULL, *cookie_file = PA_NATIVE_COOKIE_FILE;
48     int c, ret = 1;
49     Display *d = NULL;
50     enum { DUMP, EXPORT, IMPORT, REMOVE } mode = DUMP;
51
52     setlocale(LC_ALL, "");
53     bindtextdomain(GETTEXT_PACKAGE, PULSE_LOCALEDIR);
54
55     while ((c = getopt(argc, argv, "deiD:S:O:I:c:hr")) != -1) {
56         switch (c) {
57             case 'D' :
58                 dname = optarg;
59                 break;
60             case 'h':
61                 printf(_("%s [-D display] [-S server] [-O sink] [-I source] [-c file]  [-d|-e|-i|-r]\n\n"
62                        " -d    Show current PulseAudio data attached to X11 display (default)\n"
63                        " -e    Export local PulseAudio data to X11 display\n"
64                        " -i    Import PulseAudio data from X11 display to local environment variables and cookie file.\n"
65                        " -r    Remove PulseAudio data from X11 display\n"),
66                        pa_path_get_filename(argv[0]));
67                 ret = 0;
68                 goto finish;
69             case 'd':
70                 mode = DUMP;
71                 break;
72             case 'e':
73                 mode = EXPORT;
74                 break;
75             case 'i':
76                 mode = IMPORT;
77                 break;
78             case 'r':
79                 mode = REMOVE;
80                 break;
81             case 'c':
82                 cookie_file = optarg;
83                 break;
84             case 'I':
85                 source = optarg;
86                 break;
87             case 'O':
88                 sink = optarg;
89                 break;
90             case 'S':
91                 server = optarg;
92                 break;
93             default:
94                 fprintf(stderr, _("Failed to parse command line.\n"));
95                 goto finish;
96         }
97     }
98
99     if (!(d = XOpenDisplay(dname))) {
100         pa_log(_("XOpenDisplay() failed"));
101         goto finish;
102     }
103
104     switch (mode) {
105         case DUMP: {
106             char t[1024];
107             if (pa_x11_get_prop(d, "PULSE_SERVER", t, sizeof(t)))
108                 printf(_("Server: %s\n"), t);
109             if (pa_x11_get_prop(d, "PULSE_SOURCE", t, sizeof(t)))
110                 printf(_("Source: %s\n"), t);
111             if (pa_x11_get_prop(d, "PULSE_SINK", t, sizeof(t)))
112                 printf(_("Sink: %s\n"), t);
113             if (pa_x11_get_prop(d, "PULSE_COOKIE", t, sizeof(t)))
114                 printf(_("Cookie: %s\n"), t);
115
116             break;
117         }
118
119         case IMPORT: {
120             char t[1024];
121             if (pa_x11_get_prop(d, "PULSE_SERVER", t, sizeof(t)))
122                 printf("PULSE_SERVER='%s'\nexport PULSE_SERVER\n", t);
123             if (pa_x11_get_prop(d, "PULSE_SOURCE", t, sizeof(t)))
124                 printf("PULSE_SOURCE='%s'\nexport PULSE_SOURCE\n", t);
125             if (pa_x11_get_prop(d, "PULSE_SINK", t, sizeof(t)))
126                 printf("PULSE_SINK='%s'\nexport PULSE_SINK\n", t);
127
128             if (pa_x11_get_prop(d, "PULSE_COOKIE", t, sizeof(t))) {
129                 uint8_t cookie[PA_NATIVE_COOKIE_LENGTH];
130                 size_t l;
131                 if ((l = pa_parsehex(t, cookie, sizeof(cookie))) != sizeof(cookie)) {
132                     fprintf(stderr, _("Failed to parse cookie data\n"));
133                     goto finish;
134                 }
135
136                 if (pa_authkey_save(cookie_file, cookie, l) < 0) {
137                     fprintf(stderr, _("Failed to save cookie data\n"));
138                     goto finish;
139                 }
140             }
141
142             break;
143         }
144
145         case EXPORT: {
146             pa_client_conf *conf = pa_client_conf_new();
147             uint8_t cookie[PA_NATIVE_COOKIE_LENGTH];
148             char hx[PA_NATIVE_COOKIE_LENGTH*2+1];
149             assert(conf);
150
151             if (pa_client_conf_load(conf, NULL) < 0) {
152                 fprintf(stderr, _("Failed to load client configuration file.\n"));
153                 goto finish;
154             }
155
156             if (pa_client_conf_env(conf) < 0) {
157                 fprintf(stderr, _("Failed to read environment configuration data.\n"));
158                 goto finish;
159             }
160
161             pa_x11_del_prop(d, "PULSE_SERVER");
162             pa_x11_del_prop(d, "PULSE_SINK");
163             pa_x11_del_prop(d, "PULSE_SOURCE");
164             pa_x11_del_prop(d, "PULSE_ID");
165             pa_x11_del_prop(d, "PULSE_COOKIE");
166
167             if (server)
168                 pa_x11_set_prop(d, "PULSE_SERVER", server);
169             else if (conf->default_server)
170                 pa_x11_set_prop(d, "PULSE_SERVER", conf->default_server);
171             else {
172                 char hn[256];
173                 if (!pa_get_fqdn(hn, sizeof(hn))) {
174                     fprintf(stderr, _("Failed to get FQDN.\n"));
175                     goto finish;
176                 }
177
178                 pa_x11_set_prop(d, "PULSE_SERVER", hn);
179             }
180
181             if (sink)
182                 pa_x11_set_prop(d, "PULSE_SINK", sink);
183             else if (conf->default_sink)
184                 pa_x11_set_prop(d, "PULSE_SINK", conf->default_sink);
185
186             if (source)
187                 pa_x11_set_prop(d, "PULSE_SOURCE", source);
188             if (conf->default_source)
189                 pa_x11_set_prop(d, "PULSE_SOURCE", conf->default_source);
190
191             pa_client_conf_free(conf);
192
193             if (pa_authkey_load_auto(cookie_file, cookie, sizeof(cookie)) < 0) {
194                 fprintf(stderr, _("Failed to load cookie data\n"));
195                 goto finish;
196             }
197
198             pa_x11_set_prop(d, "PULSE_COOKIE", pa_hexstr(cookie, sizeof(cookie), hx, sizeof(hx)));
199             break;
200         }
201
202         case REMOVE:
203             pa_x11_del_prop(d, "PULSE_SERVER");
204             pa_x11_del_prop(d, "PULSE_SINK");
205             pa_x11_del_prop(d, "PULSE_SOURCE");
206             pa_x11_del_prop(d, "PULSE_ID");
207             pa_x11_del_prop(d, "PULSE_COOKIE");
208             break;
209
210         default:
211             fprintf(stderr, _("Not yet implemented.\n"));
212             goto finish;
213     }
214
215     ret = 0;
216
217 finish:
218
219     if (d) {
220         XSync(d, False);
221         XCloseDisplay(d);
222     }
223
224     return ret;
225 }