]> rtime.felk.cvut.cz Git - sojka/lightdm.git/blob - liblightdm-gobject/language.c
Use a private pipe for greeter<->server communication instead of D-Bus (needs to...
[sojka/lightdm.git] / liblightdm-gobject / language.c
1 /*
2  * Copyright (C) 2010 Robert Ancell.
3  * Author: Robert Ancell <robert.ancell@canonical.com>
4  * 
5  * This library is free software; you can redistribute it and/or modify it under
6  * the terms of the GNU Lesser General Public License as published by the Free
7  * Software Foundation; either version 3 of the License, or (at your option) any
8  * later version. See http://www.gnu.org/copyleft/lgpl.html the full text of the
9  * license.
10  */
11
12 #include <locale.h>
13 #include <langinfo.h>
14
15 #include "language.h"
16
17 enum {
18     PROP_0,
19     PROP_CODE,
20     PROP_NAME,
21     PROP_TERRITORY
22 };
23
24 struct _LdmLanguagePrivate
25 {
26     gchar *code;
27     gchar *name;
28     gchar *territory;
29 };
30
31 G_DEFINE_TYPE (LdmLanguage, ldm_language, G_TYPE_OBJECT);
32
33 /**
34  * ldm_language_new:
35  * 
36  * Create a new language.
37  * @code: The language code
38  * 
39  * Return value: the new #LdmLanguage
40  **/
41 LdmLanguage *
42 ldm_language_new (const gchar *code)
43 {
44     return g_object_new (LDM_TYPE_LANGUAGE, "code", code, NULL);
45 }
46
47 /**
48  * ldm_language_get_code:
49  * @language: A #LdmLanguage
50  * 
51  * Get the code of a language.
52  * 
53  * Return value: The code of the language
54  **/
55 const gchar *
56 ldm_language_get_code (LdmLanguage *language)
57 {
58     return language->priv->code;
59 }
60
61 /**
62  * ldm_language_get_name:
63  * @language: A #LdmLanguage
64  * 
65  * Get the name of a language.
66  *
67  * Return value: The name of the language
68  **/
69 const gchar *
70 ldm_language_get_name (LdmLanguage *language)
71 {
72     if (!language->priv->name)
73     {
74         char *current = setlocale(LC_ALL, NULL);
75         setlocale(LC_ALL, language->priv->code);
76         language->priv->name = g_strdup (nl_langinfo (_NL_IDENTIFICATION_LANGUAGE));
77         setlocale(LC_ALL, current);
78     }
79
80     return language->priv->name;
81 }
82
83 /**
84  * ldm_language_get_territory:
85  * @language: A #LdmLanguage
86  * 
87  * Get the territory the language is used in.
88  * 
89  * Return value: The territory the language is used in.
90  **/
91 const gchar *
92 ldm_language_get_territory (LdmLanguage *language)
93 {
94     if (!language->priv->territory)
95     {
96         char *current = setlocale(LC_ALL, NULL);
97         setlocale(LC_ALL, language->priv->code);
98         language->priv->territory = g_strdup (nl_langinfo (_NL_IDENTIFICATION_TERRITORY));
99         setlocale(LC_ALL, current);
100     }
101
102     return language->priv->territory;
103 }
104
105 static gboolean
106 is_utf8 (const gchar *code)
107 {
108    return g_str_has_suffix (code, ".utf8") || g_str_has_suffix (code, ".UTF-8");
109 }
110
111 /**
112  * ldm_language_matches:
113  * @language: A #LdmLanguage
114  * @code: A language code
115  * 
116  * Check if a language code matches this language.
117  * 
118  * Return value: TRUE if the code matches this language.
119  **/
120 gboolean
121 ldm_language_matches (LdmLanguage *language, const gchar *code)
122 {
123     /* Handle the fact the UTF-8 is specified both as '.utf8' and '.UTF-8' */
124     if (is_utf8 (language->priv->code) && is_utf8 (code))
125     {
126         /* Match the characters before the '.' */
127         int i;
128         for (i = 0; language->priv->code[i] && code[i] && language->priv->code[i] == code[i] && code[i] != '.' ; i++);
129         return language->priv->code[i] == '.' && code[i] == '.';
130     }
131
132     return g_str_equal (language->priv->code, code);
133 }
134
135 static void
136 ldm_language_init (LdmLanguage *language)
137 {
138     language->priv = G_TYPE_INSTANCE_GET_PRIVATE (language, LDM_TYPE_LANGUAGE, LdmLanguagePrivate);
139 }
140
141 static void
142 ldm_language_set_property (GObject      *object,
143                            guint         prop_id,
144                            const GValue *value,
145                            GParamSpec   *pspec)
146 {
147     LdmLanguage *self;
148
149     self = LDM_LANGUAGE (object);
150
151     switch (prop_id) {
152     case PROP_CODE:
153         g_free (self->priv->name);
154         self->priv->code = g_strdup (g_value_get_string (value));
155         break;
156     default:
157         G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
158         break;
159     }
160 }
161
162 static void
163 ldm_language_get_property (GObject    *object,
164                            guint       prop_id,
165                            GValue     *value,
166                            GParamSpec *pspec)
167 {
168     LdmLanguage *self;
169
170     self = LDM_LANGUAGE (object);
171
172     switch (prop_id) {
173     case PROP_CODE:
174         g_value_set_string (value, ldm_language_get_code (self));
175         break;
176     case PROP_NAME:
177         g_value_set_string (value, ldm_language_get_name (self));
178         break;
179     case PROP_TERRITORY:
180         g_value_set_string (value, ldm_language_get_territory (self));
181         break;
182     default:
183         G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
184         break;
185     }
186 }
187
188 static void
189 ldm_language_class_init (LdmLanguageClass *klass)
190 {
191     GObjectClass *object_class = G_OBJECT_CLASS (klass);
192   
193     g_type_class_add_private (klass, sizeof (LdmLanguagePrivate));
194
195     object_class->set_property = ldm_language_set_property;
196     object_class->get_property = ldm_language_get_property;
197
198     g_object_class_install_property(object_class,
199                                     PROP_CODE,
200                                     g_param_spec_string("code",
201                                                         "code",
202                                                         "Language code",
203                                                         NULL,
204                                                         G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
205     g_object_class_install_property(object_class,
206                                     PROP_NAME,
207                                     g_param_spec_string("name",
208                                                         "name",
209                                                         "Name of the language",
210                                                         NULL,
211                                                         G_PARAM_READABLE));
212     g_object_class_install_property(object_class,
213                                     PROP_TERRITORY,
214                                     g_param_spec_string("territory",
215                                                         "territory",
216                                                         "Territory the language is from",
217                                                         NULL,
218                                                         G_PARAM_READABLE));
219 }