summaryrefslogtreecommitdiff
path: root/plugins/ini/src/ini.h
blob: 0790072ec3f2ac69a262a2e1193e7231f863ab91 (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
/*
 * Copyright © 2008 Danny Baumann
 *
 * Permission to use, copy, modify, distribute, and sell this software
 * and its documentation for any purpose is hereby granted without
 * fee, provided that the above copyright notice appear in all copies
 * and that both that copyright notice and this permission notice
 * appear in supporting documentation, and that the name of
 * Danny Baumann not be used in advertising or publicity pertaining to
 * distribution of the software without specific, written prior permission.
 * Danny Baumann makes no representations about the suitability of this
 * software for any purpose. It is provided "as is" without express or
 * implied warranty.
 *
 * DANNY BAUMANN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN
 * NO EVENT SHALL DANNY BAUMANN BE LIABLE FOR ANY SPECIAL, INDIRECT OR
 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
 * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
 * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
 * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 *
 * Author: Danny Baumann <dannybaumann@web.de>
 */

#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>

#include <iostream>
#include <fstream>

#include <core/core.h>
#include <core/privatehandler.h>

#define HOME_OPTIONDIR     ".compiz/options"
#define CORE_NAME           "general"
#define FILE_SUFFIX         ".conf"

class IniScreen :
    public ScreenInterface,
    public PrivateHandler<IniScreen, CompScreen>
{
    public:
	IniScreen (CompScreen *screen);
	~IniScreen ();

	bool initPluginForScreen (CompPlugin *p);
	bool setOptionForPlugin (const char        *plugin,
				 const char        *name,
				 CompOption::Value &v);

	void updateDirectoryWatch (const CompString&);

    private:
	CompFileWatchHandle directoryWatchHandle;

	void fileChanged (const char *name);

	bool blockWrites;

    public:
	static CompString getHomeDir ();
	static bool createDir (const CompString& path);
};

class IniPluginVTable :
    public CompPlugin::VTableForScreen<IniScreen>
{
    public:

	bool init ();
};

class IniFile
{
    public:
	IniFile (CompPlugin *p);
	~IniFile ();

	void load ();
	void save ();

    private:
	CompPlugin *plugin;
	CompString filePath;

	std::fstream optionFile;

	bool open (bool write);

	CompString optionValueToString (CompOption::Value &value,
					CompOption::Type  type);
	CompString optionToString (CompOption &option,
				   bool       &valid);
	bool stringToOption (CompOption *option,
			     CompString &valueString);
	bool stringToOptionValue (CompString        &string,
				  CompOption::Type  type,
				  CompOption::Value &value);

	bool validItemType (CompOption::Type type);
	bool validListItemType (CompOption::Type type);
};