summaryrefslogtreecommitdiff
path: root/src/plugins/kde.c
blob: e8976774545411045ac14ab44b4461703abef5b7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
/*******************************************************************************
 * libproxy - A library for proxy configuration
 * Copyright (C) 2006 Nathaniel McCallum <nathaniel@natemccallum.com>
 * 
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 * 
 * This library 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 library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA
 ******************************************************************************/

#include <stdlib.h>
#include <string.h>
#include <stdarg.h>

#include <misc.h>
#include <proxy_factory.h>
#include <config_file.h>

#include <X11/Xlib.h>
#include <X11/Xmu/WinUtil.h>

// From xhasclient.c
bool x_has_client(char *prog, ...);

pxConfig *
kde_config_cb(pxProxyFactory *self)
{
	// TODO: make ignores work w/ KDE
	char *url = NULL, *ignore = NULL, *tmp = getenv("HOME");
	if (!tmp) return NULL;
	
	// Open the config file
	pxConfigFile *cf = px_proxy_factory_misc_get(self, "kde");
	if (!cf || px_config_file_is_stale(cf))
	{
		if (cf) px_config_file_free(cf);
		tmp = px_strcat(getenv("HOME"), "/.kde/share/config/kioslaverc", NULL);
		cf = px_config_file_new(tmp);
		px_free(tmp);
		px_proxy_factory_misc_set(self, "kde", cf);
	}
	if (!cf)  goto out;
	
	// Read the config file to find out what type of proxy to use
	tmp = px_config_file_get_value(cf, "Proxy Settings", "ProxyType");
	if (!tmp) { px_config_file_free(cf); goto out; }
	
	// Don't use any proxy
	if (!strcmp(tmp, "0"))
		url = px_strdup("direct://");
		
	// Use a manual proxy
	else if (!strcmp(tmp, "1"))
		url = px_config_file_get_value(cf, "Proxy Settings", "httpProxy");
		
	// Use a manual PAC
	else if (!strcmp(tmp, "2"))
	{
		px_free(tmp);
		tmp = px_config_file_get_value(cf, "Proxy Settings", "Proxy Config Script");
		if (tmp) url = px_strcat("pac+", tmp);
		else     url = px_strdup("wpad://");
	}
	
	// Use WPAD
	else if (!strcmp(tmp, "3"))
		url = px_strdup("wpad://");
	
	// Use envvar
	else if (!strcmp(tmp, "4"))
		url = NULL; // We'll bypass this config plugin and let the envvar plugin work
	
	// Cleanup
	px_free(tmp);
	px_config_file_free(cf);
			
	out:
		return px_config_create(url, ignore);
}

bool
on_proxy_factory_instantiate(pxProxyFactory *self)
{
	// If we are running in KDE, then make sure this plugin is registered.
	if (x_has_client("kicker", NULL))
		return px_proxy_factory_config_add(self, "kde", PX_CONFIG_CATEGORY_SESSION, 
											(pxProxyFactoryPtrCallback) kde_config_cb);
	return false;
}

void
on_proxy_factory_destantiate(pxProxyFactory *self)
{
	px_proxy_factory_config_del(self, "kde");
	px_config_file_free(px_proxy_factory_misc_get(self, "kde"));
	px_proxy_factory_misc_set(self, "kde", NULL);
}