/gpump/trunk

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/gpump/trunk

« back to all changes in this revision

Viewing changes to src/GPumpSettingsData.c

  • Committer: Gustav Hatvigsson
  • Date: 2014-04-14 13:21:13 UTC
  • Revision ID: gustav.hartvigsson@gmail.com-20140414132113-q0uur6tj32re82l1
* made a few changes, nothing big.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
 
 
2
#include "GPumpSettingsData.h"
 
3
 
 
4
#define GPUMP_SETTINGS_DATA_GET_PRIVATE(obj)\
 
5
  (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GPUMP_TYPE_SETTINGS_DATA,\
 
6
                                GPumpSettingsDataPrivate))
 
7
 
 
8
G_DEFINE_TYPE (GPumpSettingsData, gpump_settings_data, G_TYPE_OBJECT)
 
9
 
 
10
 
 
11
/* Private datastructure */
 
12
struct GPumpSettingsDataPrivate {
 
13
#if GPUMP_USE_GSETTINGS
 
14
  /* org.gego.gpump.ui */
 
15
  GSettings * ui_settings;
 
16
  /* org.gego.gpump */
 
17
  GSettings * gpump_settings;
 
18
#else
 
19
  GKeyFile * gpump_settings; /* Stores both UI and other settings... */
 
20
  GFile * gpump_settings_file;
 
21
#endif /* GPUMP_USE_GSETTINGS */
 
22
};
 
23
 
 
24
/* * Override the default constructer *****************************************/
 
25
GObject * _constructor (GType type,
 
26
                        guint n_construct_params,
 
27
                        GObjectConstructParam * construct_params);
 
28
 
 
29
 
 
30
/******************************************************************************/
 
31
GPumpSettingsData * gpump_settings_data_get_default () {
 
32
  GPumpSettingsData * self = g_object_new (GPUMP_TYPE_SETTINGS_DATA,
 
33
                                           NULL);
 
34
  
 
35
  return self;
 
36
}
 
37
 
 
38
void gpump_settings_data_init (GPumpSettingsData * self) {
 
39
  g_print ("Init GPumpSettingsData\n");
 
40
  
 
41
  self->priv = GPUMP_SETTINGS_DATA_GET_PRIVATE (self);
 
42
  
 
43
#if GPUMP_USE_GSETTINGS
 
44
  /* This will not be compiled, this will have to be implemented later...
 
45
   * much later...
 
46
   */
 
47
  self->ui_settings = g_settings_new ("org.gego.gpump.ui");
 
48
  self->gpump_settings = g_settings_new ("org.gego.gpump");
 
49
#else
 
50
  
 
51
  /* Construct the path for the files, 1) the GPump settings 2) the GPump UI 
 
52
   * settings.
 
53
   *
 
54
   * The file names are defined static, so they do not need to be re-created,
 
55
   * each and every time te object is re-created.
 
56
   */
 
57
  self->priv->gpump_settings = g_key_file_new ();
 
58
  
 
59
  static gchar * gpump_settings_file_uri = NULL;
 
60
  gchar * settings_basedir = NULL;
 
61
  
 
62
  if (!(gpump_settings_file_uri)) {
 
63
    
 
64
    g_print ("Constructing path!\n");
 
65
    
 
66
    gchar * base_config_dir = g_get_user_config_dir ();
 
67
    
 
68
    settings_basedir = g_strdup_printf ("%s/%s",
 
69
                                                base_config_dir,
 
70
                                                "gpump");
 
71
    g_free (base_config_dir);
 
72
    
 
73
    gpump_settings_file_uri = g_strdup_printf ("%s/%s",
 
74
                                               settings_basedir,
 
75
                                               "gpump.conf");
 
76
  }
 
77
  
 
78
  self->priv->gpump_settings_file = g_file_new_for_path (
 
79
                                                      gpump_settings_file_uri);
 
80
  GError ** err_arr = NULL;
 
81
  /* Dose the file exist? */
 
82
  if (!g_file_test (gpump_settings_file_uri, G_FILE_TEST_EXISTS )) {
 
83
    /* Nope, it did not exist */
 
84
    g_print ("Config file does not exist, creating it.\n");
 
85
    
 
86
    g_mkdir_with_parents (settings_basedir, 0700);
 
87
    
 
88
    GFileOutputStream * file_stream = g_file_create (
 
89
                                                self->priv->gpump_settings_file,
 
90
                                                G_FILE_CREATE_PRIVATE,
 
91
                                                NULL,
 
92
                                                err_arr);
 
93
    if (err_arr) {
 
94
      for (int i = 0; err_arr[i] != NULL; i++) {
 
95
         g_print ("GPumpSettingsData:\n An %s error occured:\n\t%s\n\n",
 
96
                   g_quark_to_string (err_arr[i]->domain),
 
97
                   err_arr[i]->message);
 
98
      }
 
99
      abort ();
 
100
    }
 
101
    /* Construct a set of default settings */
 
102
    
 
103
    /* UI settings */
 
104
    /* -1 is undefined, these are set when the main window is displayed */
 
105
    g_key_file_set_integer (self->priv->gpump_settings, "ui","x", -1);
 
106
    g_key_file_set_integer (self->priv->gpump_settings, "ui","y", -1);
 
107
    /* 500x500 is the default window size */
 
108
    g_key_file_set_integer (self->priv->gpump_settings, "ui","h", 500);
 
109
    g_key_file_set_integer (self->priv->gpump_settings, "ui","w", 500);
 
110
    /* main settings */
 
111
    g_key_file_set_boolean (self->priv->gpump_settings,
 
112
                            "main",
 
113
                            "use dark",
 
114
                            FALSE);
 
115
    g_key_file_set_boolean (self->priv->gpump_settings,
 
116
                            "main",
 
117
                            "first run",
 
118
                            TRUE);
 
119
    
 
120
    g_assert (err_arr == NULL);
 
121
    
 
122
    gchar * buff = g_key_file_to_data (self->priv->gpump_settings,
 
123
                                       NULL,
 
124
                                       err_arr);
 
125
    
 
126
    if (err_arr) {
 
127
      for (int i = 0; err_arr[i] != NULL; i++) {
 
128
         g_print ("GPumpSettingsData:\n An %s error occured:\n\t%s\n\n",
 
129
                   g_quark_to_string (err_arr[i]->domain),
 
130
                   err_arr[i]->message);
 
131
      }
 
132
      abort ();
 
133
    }
 
134
    
 
135
    gint written = g_output_stream_write (G_OUTPUT_STREAM (file_stream),
 
136
                           buff,
 
137
                           strlen (buff),
 
138
                           NULL,
 
139
                           err_arr);
 
140
    
 
141
    g_free (buff);
 
142
    
 
143
    if (err_arr) {
 
144
      for (int i = 0; err_arr[i] != NULL; i++) {
 
145
         g_print ("GPumpSettingsData:\n An %s error occured:\n\t%s\n\n",
 
146
                   g_quark_to_string (err_arr[i]->domain),
 
147
                   err_arr[i]->message);
 
148
      }
 
149
      abort ();
 
150
    }
 
151
    
 
152
    
 
153
    g_object_unref (file_stream);
 
154
  } else {
 
155
    /* yes, the file did exit */
 
156
    g_key_file_load_from_file (self->priv->gpump_settings,
 
157
                               gpump_settings_file_uri,
 
158
                               G_KEY_FILE_NONE,
 
159
                               err_arr);
 
160
    if (err_arr) {
 
161
      for (int i = 0; err_arr[i] != NULL; i++) {
 
162
         g_print ("GPumpSettingsData:\n An %s error occured:\n\t%s\n\n",
 
163
                   g_quark_to_string (err_arr[i]->domain),
 
164
                   err_arr[i]->message);
 
165
      }
 
166
      abort ();
 
167
    }
 
168
  }
 
169
  g_free (settings_basedir);
 
170
#endif
 
171
}
 
172
 
 
173
 
 
174
void gpump_settings_data_class_init (GPumpSettingsDataClass * klass) {
 
175
  GObjectClass * parent = G_OBJECT_CLASS (klass);
 
176
  
 
177
  parent->constructor = _constructor;
 
178
  
 
179
  g_type_class_add_private (klass, sizeof (GPumpSettingsDataPrivate));
 
180
}
 
181
 
 
182
 
 
183
void gpump_settings_data_set (GPumpSettingsData * self,
 
184
                              gchar * name,
 
185
                              GVariant * data) {
 
186
#if GPUMP_USE_GSETTINGS
 
187
  /* TODO */
 
188
#else
 
189
  
 
190
#endif
 
191
}
 
192
 
 
193
 
 
194
GVariant * gpump_settings_data_get (GPumpSettingsData * self,
 
195
                                    gchar * name) {
 
196
#if GPUMP_USE_GSETTINGS
 
197
  /* TODO */
 
198
#else
 
199
  
 
200
#endif
 
201
}
 
202
 
 
203
 
 
204
gboolean gpump_settings_data_commit (GPumpSettingsData * self,
 
205
                                     GError ** err_arr) {
 
206
  g_object_ref (G_OBJECT(self));
 
207
#if GPUMP_USE_GSETTINGS
 
208
  /* Do thothing */
 
209
  return TRUE;
 
210
#else
 
211
  
 
212
  g_print ("Commiting data to file!\n");
 
213
  g_assert ( err_arr == NULL || *err_arr == NULL);
 
214
  
 
215
  GFileOutputStream * out_stream = g_file_replace (
 
216
                                                self->priv->gpump_settings_file,
 
217
                                                NULL,
 
218
                                                FALSE,
 
219
                                                G_FILE_CREATE_PRIVATE,
 
220
                                                NULL,
 
221
                                                err_arr);
 
222
  if (err_arr[0]) {
 
223
    g_object_unref (out_stream);
 
224
    return FALSE;
 
225
  }
 
226
  
 
227
  gchar * buff = g_key_file_to_data (self->priv->gpump_settings, NULL, err_arr);
 
228
  
 
229
  if (err_arr) {
 
230
   g_object_unref (out_stream);
 
231
   g_free (buff);
 
232
   return FALSE;
 
233
  }
 
234
  
 
235
  g_output_stream_write (G_OUTPUT_STREAM (out_stream),
 
236
                         buff,
 
237
                         strlen (buff),
 
238
                         NULL,
 
239
                         err_arr);
 
240
  
 
241
  if (err_arr) {
 
242
    g_object_unref (out_stream);
 
243
    g_free (buff);
 
244
    return FALSE;
 
245
  }
 
246
  
 
247
  g_object_unref (out_stream);
 
248
  g_free (buff);
 
249
  
 
250
  return TRUE;
 
251
#endif
 
252
  g_object_unref (G_OBJECT (self));
 
253
}
 
254
 
 
255
/* * Implementation of the constructor ****************************************
 
256
 *
 
257
 * See: blogs.gnome.org/xclaesse/2010/02/11/how-to-make-a-gobject-singleton/
 
258
 * for more information.
 
259
 */
 
260
GObject * _constructor (GType type,
 
261
                        guint n_construct_params,
 
262
                        GObjectConstructParam * construct_params) {
 
263
  static GObject * self = NULL;
 
264
  static GMutex mutex;
 
265
  
 
266
  g_mutex_lock (&mutex);
 
267
  if (self == NULL) {
 
268
    self = G_OBJECT_CLASS (gpump_settings_data_parent_class)->constructor (
 
269
      type, n_construct_params, construct_params);
 
270
    g_object_add_weak_pointer (self, (gpointer) &self);
 
271
    g_mutex_unlock (&mutex);
 
272
    return self;
 
273
  }
 
274
  g_mutex_unlock (&mutex);
 
275
  return g_object_ref (self);
 
276
}
 
277
 
 
278