2
* This file is a part of the Cairo-Dock project
4
* Copyright : (C) see the 'copyright' file.
5
* E-mail : see the 'copyright' file.
7
* This program is free software; you can redistribute it and/or
8
* modify it under the terms of the GNU General Public License
9
* as published by the Free Software Foundation; either version 3
10
* of the License, or (at your option) any later version.
12
* This program is distributed in the hope that it will be useful,
13
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
* GNU General Public License for more details.
16
* You should have received a copy of the GNU General Public License
17
* along with this program. If not, see <http://www.gnu.org/licenses/>.
23
#include "cairo-dock-log.h"
24
#include "cairo-dock-keyfile-utilities.h"
27
GKeyFile *cairo_dock_open_key_file (const gchar *cConfFilePath)
29
GKeyFile *pKeyFile = g_key_file_new ();
30
GError *erreur = NULL;
31
g_key_file_load_from_file (pKeyFile, cConfFilePath, G_KEY_FILE_KEEP_COMMENTS | G_KEY_FILE_KEEP_TRANSLATIONS, &erreur);
34
cd_warning (erreur->message);
35
g_error_free (erreur);
36
g_key_file_free (pKeyFile);
42
void cairo_dock_write_keys_to_file (GKeyFile *pKeyFile, const gchar *cConfFilePath)
44
cd_debug ("%s (%s)", __func__, cConfFilePath);
45
GError *erreur = NULL;
47
gchar *cDirectory = g_path_get_dirname (cConfFilePath);
48
if (! g_file_test (cDirectory, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_EXECUTABLE))
50
g_mkdir_with_parents (cDirectory, 7*8*8+7*8+5);
56
gchar *cNewConfFileContent = g_key_file_to_data (pKeyFile, &length, &erreur);
59
cd_warning ("Error while fetching data : %s", erreur->message);
60
g_error_free (erreur);
63
g_return_if_fail (cNewConfFileContent != NULL && *cNewConfFileContent != '\0');
65
g_file_set_contents (cConfFilePath, cNewConfFileContent, length, &erreur);
68
cd_warning ("Error while writing data to %s : %s", cConfFilePath, erreur->message);
69
g_error_free (erreur);
72
g_free (cNewConfFileContent);
76
void cairo_dock_flush_conf_file_full (GKeyFile *pKeyFile, const gchar *cConfFilePath, const gchar *cShareDataDirPath, gboolean bUseFileKeys, const gchar *cTemplateFileName)
78
gchar *cTemplateConfFilePath = g_strdup_printf ("%s/%s", cShareDataDirPath, cTemplateFileName);
79
cd_message ("%s (%s)", __func__, cTemplateConfFilePath);
81
if (! g_file_test (cTemplateConfFilePath, G_FILE_TEST_EXISTS))
83
cd_warning ("Couldn't find any installed conf file in %s", cShareDataDirPath);
87
gchar *cCommand = g_strdup_printf ("/bin/cp \"%s\" \"%s\"", cTemplateConfFilePath, cConfFilePath);
88
int r = system (cCommand);
91
cairo_dock_replace_values_in_conf_file (cConfFilePath, pKeyFile, bUseFileKeys, 0);
93
g_free (cTemplateConfFilePath);
98
void cairo_dock_replace_key_values (GKeyFile *pOriginalKeyFile, GKeyFile *pReplacementKeyFile, gboolean bUseOriginalKeys, gchar iIdentifier)
100
//g_print ("%s (%d, %d)\n", __func__, iIdentifier, bUseOriginalKeys);
101
GError *erreur = NULL;
104
gchar **pGroupList = g_key_file_get_groups ((bUseOriginalKeys ? pOriginalKeyFile : pReplacementKeyFile), &length);
105
g_return_if_fail (pGroupList != NULL);
106
gchar *cGroupName, *cKeyName, *cKeyValue, *cComment;
110
while (pGroupList[i] != NULL)
112
cGroupName = pGroupList[i];
115
pKeyList = g_key_file_get_keys ((bUseOriginalKeys ? pOriginalKeyFile : pReplacementKeyFile), cGroupName, NULL, NULL);
116
g_return_if_fail (pKeyList != NULL);
119
while (pKeyList[j] != NULL)
121
cKeyName = pKeyList[j];
122
//g_print ("%s\n %s", cKeyName, g_key_file_get_comment (pOriginalKeyFile, cGroupName, cKeyName, NULL));
124
if (iIdentifier != 0)
126
cComment = g_key_file_get_comment (bUseOriginalKeys ? pOriginalKeyFile : pReplacementKeyFile, cGroupName, cKeyName, NULL);
127
//g_print ("%s\n %s", cKeyName, cComment);
128
if (cComment == NULL || strlen (cComment) < 2 || cComment[1] != iIdentifier)
130
//g_print (" on saute %s;%s (%s)\n", cGroupName, cKeyName, cComment);
138
cKeyValue = g_key_file_get_string (pReplacementKeyFile, cGroupName, cKeyName, &erreur);
141
cd_warning (erreur->message);
142
g_error_free (erreur);
147
//g_print (" -> %s\n", cKeyValue);
148
if (cKeyValue[strlen(cKeyValue) - 1] == '\n')
149
cKeyValue[strlen(cKeyValue) - 1] = '\0';
150
g_key_file_set_string (pOriginalKeyFile, cGroupName, cKeyName, (cKeyValue != NULL ? cKeyValue : ""));
156
g_strfreev (pKeyList);
159
g_strfreev (pGroupList);
161
if (bUseOriginalKeys)
163
pGroupList = g_key_file_get_groups (pReplacementKeyFile, &length);
165
while (pGroupList[i] != NULL)
167
cGroupName = pGroupList[i];
170
pKeyList = g_key_file_get_keys (pReplacementKeyFile, cGroupName, NULL, NULL);
173
while (pKeyList[j] != NULL)
175
cKeyName = pKeyList[j];
176
//g_print ("%s\n %s", cKeyName, g_key_file_get_comment (pOriginalKeyFile, cGroupName, cKeyName, NULL));
178
cComment = g_key_file_get_comment (pReplacementKeyFile, cGroupName, cKeyName, NULL);
179
if (cComment == NULL || strlen (cComment) < 3 || (cComment[1] != '0' && cComment[2] != '0'))
185
if (iIdentifier != 0)
187
if (cComment == NULL || strlen (cComment) < 2 || cComment[1] != iIdentifier)
189
//g_print (" on saute %s;%s (%s)\n", cGroupName, cKeyName, cComment);
196
cKeyValue = g_key_file_get_string (pReplacementKeyFile, cGroupName, cKeyName, &erreur);
199
cd_warning (erreur->message);
200
g_error_free (erreur);
205
//g_print (" -> %s\n", cKeyValue);
206
if (cKeyValue[strlen(cKeyValue) - 1] == '\n')
207
cKeyValue[strlen(cKeyValue) - 1] = '\0';
208
g_key_file_set_string (pOriginalKeyFile, cGroupName, cKeyName, (cKeyValue != NULL ? cKeyValue : ""));
209
if (cComment != NULL)
211
g_key_file_set_comment (pOriginalKeyFile, cGroupName, cKeyName, cComment, &erreur);
214
cd_warning (erreur->message);
215
g_error_free (erreur);
225
g_strfreev (pKeyList);
228
g_strfreev (pGroupList);
233
void cairo_dock_replace_values_in_conf_file (const gchar *cConfFilePath, GKeyFile *pValidKeyFile, gboolean bUseFileKeys, gchar iIdentifier)
235
GKeyFile *pConfKeyFile = cairo_dock_open_key_file (cConfFilePath);
236
if (pConfKeyFile == NULL)
239
g_print ("%s (%s)\n", __func__,cConfFilePath );
240
cairo_dock_replace_key_values (pConfKeyFile, pValidKeyFile, bUseFileKeys, iIdentifier);
242
cairo_dock_write_keys_to_file (pConfKeyFile, cConfFilePath);
244
g_key_file_free (pConfKeyFile);
247
void cairo_dock_replace_keys_by_identifier (const gchar *cConfFilePath, gchar *cReplacementConfFilePath, gchar iIdentifier)
249
GKeyFile *pReplacementKeyFile = cairo_dock_open_key_file (cReplacementConfFilePath);
250
if (pReplacementKeyFile == NULL)
253
g_print ("%s (%s <- %s, '%c')\n", __func__, cConfFilePath, cReplacementConfFilePath, iIdentifier);
254
cairo_dock_replace_values_in_conf_file (cConfFilePath, pReplacementKeyFile, TRUE, iIdentifier);
256
g_key_file_free (pReplacementKeyFile);
261
void cairo_dock_get_conf_file_version (GKeyFile *pKeyFile, gchar **cConfFileVersion)
263
*cConfFileVersion = NULL;
265
gchar *cFirstComment = g_key_file_get_comment (pKeyFile, NULL, NULL, NULL);
267
if (cFirstComment != NULL && *cFirstComment != '\0')
269
gchar *str = strchr (cFirstComment, '\n');
273
str = strchr (cFirstComment, ';'); // le 1er est pour la langue (obsolete).
276
*cConfFileVersion = g_strdup (str+1);
280
*cConfFileVersion = g_strdup (cFirstComment + (*cFirstComment == '!')); // le '!' est obsolete.
283
g_free (cFirstComment);
286
gboolean cairo_dock_conf_file_needs_update (GKeyFile *pKeyFile, const gchar *cVersion)
288
gchar *cPreviousVersion = NULL;
289
cairo_dock_get_conf_file_version (pKeyFile, &cPreviousVersion);
290
gboolean bNeedsUpdate;
291
if (cPreviousVersion == NULL || strcmp (cPreviousVersion, cVersion) != 0)
294
bNeedsUpdate = FALSE;
296
g_free (cPreviousVersion);
301
void cairo_dock_add_remove_element_to_key (const gchar *cConfFilePath, const gchar *cGroupName, const gchar *cKeyName, gchar *cElementName, gboolean bAdd)
303
GKeyFile *pKeyFile = cairo_dock_open_key_file (cConfFilePath);
304
if (pKeyFile == NULL)
307
gchar *cElementList = g_key_file_get_string (pKeyFile, cGroupName, cKeyName, NULL), *cNewElementList = NULL;
308
if (cElementList != NULL && *cElementList == '\0')
310
g_free (cElementList);
316
//g_print ("on rajoute %s\n", cElementName);
317
if (cElementList != NULL)
318
cNewElementList = g_strdup_printf ("%s;%s", cElementList, cElementName);
320
cNewElementList = g_strdup (cElementName);
324
//g_print ("on enleve %s\n", cElementName);
325
gchar *str = g_strstr_len (cElementList, strlen (cElementList), cElementName);
326
g_return_if_fail (str != NULL);
327
if (str == cElementList)
329
if (str[strlen (cElementName)] == '\0')
330
cNewElementList = g_strdup ("");
332
cNewElementList = g_strdup (str + strlen (cElementName) + 1);
337
if (str[strlen (cElementName)] == '\0')
338
cNewElementList = g_strdup (cElementList);
340
cNewElementList = g_strdup_printf ("%s;%s", cElementList, str + strlen (cElementName) + 1);
343
g_key_file_set_string (pKeyFile, cGroupName, cKeyName, cNewElementList);
344
cairo_dock_write_keys_to_file (pKeyFile, cConfFilePath);
345
g_free (cElementList);
346
g_free (cNewElementList);
347
g_key_file_free (pKeyFile);
351
void cairo_dock_add_widget_to_conf_file (GKeyFile *pKeyFile, const gchar *cGroupName, const gchar *ckeyName, const gchar *cInitialValue, gchar iWidgetType, const gchar *cDescription, const gchar *cTooltip)
353
g_key_file_set_string (pKeyFile, cGroupName, ckeyName, cInitialValue);
354
gchar *Comment = g_strdup_printf ("%c0 %s%s%s%s", iWidgetType, cDescription, cTooltip ? "\n{" : "", cTooltip ? cTooltip : "", cTooltip ? "}" : "");
355
g_key_file_set_comment (pKeyFile, cGroupName, ckeyName, Comment, NULL);
360
gboolean cairo_dock_rename_group_in_conf_file (GKeyFile *pKeyFile, const gchar *cGroupName, const gchar *cNewGroupName)
362
if (g_key_file_has_group (pKeyFile, cNewGroupName))
365
gchar **pKeyList = g_key_file_get_keys (pKeyFile, cGroupName, NULL, NULL);
368
for (i = 0; pKeyList[i] != NULL; i ++)
370
cValue = g_key_file_get_value (pKeyFile, cGroupName, pKeyList[i], NULL);
371
g_key_file_set_value (pKeyFile, cNewGroupName, pKeyList[i], cValue);
374
g_strfreev (pKeyList);
376
g_key_file_remove_group (pKeyFile, cGroupName, NULL);