/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 Hartvigsson
  • Date: 2014-02-09 11:51:12 UTC
  • Revision ID: gustav.hartvigsson@gmail.com-20140209115112-p922hfdsjzp6ldb9
Fixed the probelms I have been having.

Show diffs side-by-side

added added

removed removed

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