root/trunk/midgard/apis/php5/php_midgard_connection.c

Revision 17022, 11.8 kB (checked in by piotras, 4 months ago)

Removed set_debuglevel method in favour of set_loglevel one

Line 
1 /* Copyright (C) 2007 Piotr Pokora <piotrek.pokora@gmail.com>
2  * This program is free software; you can redistribute it and/or modify it
3  * under the terms of the GNU Lesser General Public License as published
4  * by the Free Software Foundation; either version 2 of the License, or
5  * (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software
14  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
15  */
16
17 #include "php_midgard.h"
18 #include "php_midgard_gobject.h"
19 #include <zend_exceptions.h>
20
21 static zend_class_entry *php_midgard_connection_class;
22
23 static MidgardConnection *__midgard_connection_get_ptr(void)
24 {       
25         zval **_mcg;
26         if(zend_hash_find(&EG(symbol_table), "_MIDGARD_CONNECTION",
27                                 sizeof("_MIDGARD_CONNECTION"), (void **) &_mcg) == FAILURE )
28         {
29                 php_error(E_ERROR, "Can not find underlying MidgardConnection object");
30
31         } else {
32
33                 if(Z_TYPE_PP(_mcg) != IS_OBJECT)
34                         php_error(E_ERROR, "_MIDGARD_CONNECTION superglobal is not an object");
35
36                 MidgardConnection *cnc = mgd_handle();
37
38                 if(cnc == NULL)
39                         php_error(E_ERROR, "MidgardConnection underlying GObject is NULL");
40
41                 return cnc;
42         }
43
44         return NULL;
45 }
46
47 /* Legacy */
48 static zval **__get_midgard_ptr(void)
49 {
50         zval **_midgard;
51
52         if(zend_hash_find(&EG(symbol_table), "_MIDGARD",
53                                 sizeof("_MIDGARD"), (void **) &_midgard) == FAILURE )
54         {
55                 php_error(E_ERROR, "Can not find _MIDGARD superglobal");
56
57         } else {
58
59                 if(Z_TYPE_PP(_midgard) != IS_ARRAY)
60                         php_error(E_ERROR, "_MIDGARD superglobal is not an array");
61
62                 return _midgard;
63         }
64
65         return NULL;
66 }
67
68 /* MidgardConnection callbacks ( to update _MIDGARD ) */
69 static void __sitegroup_change_callback(MidgardConnection *mgd, gpointer ud)
70 {
71         zval **_midgard = __get_midgard_ptr();
72
73         zval *sgid;
74         MAKE_STD_ZVAL(sgid);
75         ZVAL_LONG(sgid, midgard_connection_get_sitegroup_id(mgd_handle()));
76
77         zend_hash_update(Z_ARRVAL_PP(_midgard),
78                         "sitegroup", sizeof("sitegroup"),
79                         &sgid, sizeof(zval *), NULL);
80 }
81
82 static void __lang_change_callback(MidgardConnection *mgd, gpointer ud)
83 {
84         zval **_midgard = __get_midgard_ptr();
85
86         zval *langid;
87         MAKE_STD_ZVAL(langid);
88         ZVAL_LONG(langid,
89                         midgard_connection_get_lang_id(mgd_handle(),
90                         midgard_connection_get_lang(mgd_handle())));
91
92         zend_hash_update(Z_ARRVAL_PP(_midgard),
93                         "lang", sizeof("lang"),
94                         &langid, sizeof(zval *), NULL);
95 }
96
97
98 static void __user_change_callback(MidgardConnection *mgd, gpointer ud)
99 {
100         zval **_midgard = __get_midgard_ptr();
101
102         /* TODO , get user id */
103         GObject *person;
104         g_object_get(G_OBJECT(mgd_handle()), "person", &person, NULL);
105
106         if(person != NULL) {
107                
108                 GValue pval = {0, };
109                 g_value_init(&pval, G_TYPE_UINT);
110                 g_object_get_property(G_OBJECT(person), "id", &pval);   
111                 zval *pid;
112                 MAKE_STD_ZVAL(pid);
113                 php_midgard_gvalue2zval(&pval, pid);
114                 g_value_unset(&pval);
115                 zend_hash_update(Z_ARRVAL_PP(_midgard),
116                                 "user", sizeof("user"),
117                                 &pid, sizeof(zval *), NULL);
118         }
119
120         GObject *user;
121         g_object_get(G_OBJECT(mgd_handle()), "user", &user, NULL);
122
123         /* set user and admin info */
124         if(user != NULL) {
125                
126                 zval *isroot;
127                 MAKE_STD_ZVAL(isroot);
128                 ZVAL_BOOL(isroot, midgard_user_is_root(MIDGARD_USER(user)));
129
130                 zend_hash_update(Z_ARRVAL_PP(_midgard),
131                                 "root", sizeof("root"),
132                                 &isroot, sizeof(zval *), NULL);
133
134                 zval *isadmin;
135                 MAKE_STD_ZVAL(isadmin);
136                 ZVAL_BOOL(isadmin, midgard_user_is_admin(MIDGARD_USER(user)));
137
138                 zend_hash_update(Z_ARRVAL_PP(_midgard),
139                                 "admin", sizeof("admin"),
140                                 &isadmin, sizeof(zval *), NULL);
141         }       
142 }
143
144 /* Object constructor */
145 static PHP_METHOD(midgard_connection, __construct)
146 {
147         RETVAL_FALSE;
148         MidgardConnection *mgd;
149         zval *zval_object = getThis();
150         zval *_mcg;
151        
152         if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "") == FAILURE)
153                 return;
154
155         /* Check if _MIDGARD_CONNECTION is already set */
156         if(zend_hash_find(&EG(symbol_table), "_MIDGARD_CONNECTION",
157                                 sizeof("_MIDGARD_CONNECTION"), (void **) &_mcg) == SUCCESS )
158         {
159                 g_warning("_MIDGARD_CONNECTION superglobal (singleton) already initialized");
160                 /* FIXME , throw an exception ? */
161                 return;
162         }
163
164         mgd = midgard_connection_new();
165
166         if(!mgd)
167                 return;
168
169         php_midgard_gobject *php_gobject =
170                 (php_midgard_gobject *)zend_object_store_get_object(zval_object TSRMLS_CC);
171
172         php_gobject->gobject = G_OBJECT(mgd);
173
174         mgd_handle_set(mgd);
175
176         g_signal_connect(G_OBJECT(mgd), "sitegroup-changed",
177                         G_CALLBACK(__sitegroup_change_callback), NULL);
178        
179         g_signal_connect(G_OBJECT(mgd), "auth-changed",
180                         G_CALLBACK(__user_change_callback), NULL);
181        
182         g_signal_connect(G_OBJECT(mgd), "lang-changed",
183                         G_CALLBACK(__lang_change_callback), NULL);
184
185         if(zend_hash_find(&EG(symbol_table), "_MIDGARD_CONNECTION",
186                                 sizeof("_MIDGARD_CONNECTION"), (void **) &_mcg) != SUCCESS )
187         {
188                 _mcg = zval_object;
189                 zval_add_ref(&_mcg);   
190                 zend_hash_update(&EG(symbol_table), "_MIDGARD_CONNECTION",
191                                 sizeof("_MIDGARD_CONNECTION"),
192                                 (void **)&_mcg, sizeof(zval *), NULL);
193         }
194 }
195
196 static PHP_METHOD(midgard_connection, open)
197 {
198         RETVAL_FALSE;
199         gchar *cnf_name;
200         guint cnf_name_length;
201         gboolean rv;
202
203         if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
204                                 "s", &cnf_name, &cnf_name_length) == FAILURE)
205                 return;
206
207         MidgardConnection *mgd =__midgard_connection_get_ptr();
208        
209         GError *error = NULL;
210         rv = midgard_connection_open(mgd, (const gchar *)cnf_name, &error);
211
212         if(rv) {
213                
214                 if(global_loghandler)
215                         g_log_remove_handler(G_LOG_DOMAIN, global_loghandler);
216
217                 guint loghandler =
218                         g_log_set_handler(G_LOG_DOMAIN, G_LOG_LEVEL_MASK,
219                                         php_midgard_log_errors, (gpointer)mgd);
220                 midgard_connection_set_loghandler(mgd, loghandler);
221
222                 RETURN_TRUE;
223         }
224
225         if(!rv) {
226                
227                 if(error) {
228                
229                         zend_throw_exception_ex(zend_exception_get_default(TSRMLS_C),
230                                         0 TSRMLS_CC, error->message);
231                         g_clear_error(&error);
232                         RETURN_FALSE;
233                 }
234         }
235 }
236
237 static PHP_METHOD(midgard_connection, open_config)
238 {
239         RETVAL_FALSE;
240         zval *cnf_object;
241         gboolean rv = FALSE;
242
243         if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
244                                 "z", &cnf_object) == FAILURE)
245                 return;
246        
247         MidgardConnection *mgd =__midgard_connection_get_ptr();
248        
249         php_midgard_gobject *php_gobject =
250                 (php_midgard_gobject *)zend_object_store_get_object(cnf_object TSRMLS_CC);
251        
252         MidgardConfig *config = MIDGARD_CONFIG(php_gobject->gobject);
253        
254         if(MIDGARD_IS_CONFIG(config))
255                 rv = midgard_connection_open_config(mgd, config);
256
257         RETURN_BOOL(rv);               
258 }
259
260 static PHP_METHOD(midgard_connection, set_sitegroup)
261 {
262         RETVAL_FALSE;
263         CHECK_MGD;
264         gchar *name;
265         guint name_length;
266         gboolean rv;
267
268         if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
269                                 "s", &name, &name_length) == FAILURE)
270                 return;
271
272         MidgardConnection *mgd =__midgard_connection_get_ptr();
273
274         rv = midgard_connection_set_sitegroup(mgd, (const gchar *)name);
275
276         RETURN_BOOL(rv);
277 }
278
279 static PHP_METHOD(midgard_connection, get_sitegroup)
280 {
281         RETVAL_NULL();
282         CHECK_MGD;
283
284         if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "") == FAILURE)
285                 return;
286        
287         MidgardConnection *mgd =__midgard_connection_get_ptr();
288
289         const gchar *name =
290                 midgard_connection_get_sitegroup(mgd);
291
292         if(name != NULL)
293                 RETURN_STRING((gchar *)name, 1);
294 }
295
296 static PHP_METHOD(midgard_connection, set_lang)
297 {
298         RETVAL_FALSE;
299         CHECK_MGD;
300         gchar *lang;
301         guint lang_length;
302         gboolean rv;
303        
304         if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
305                                 "s", &lang, &lang_length) == FAILURE)
306                 return;
307
308         MidgardConnection *mgd =__midgard_connection_get_ptr();
309
310         rv = midgard_connection_set_lang(mgd, (const gchar *) lang);
311
312         RETURN_BOOL(rv);
313 }
314
315 static PHP_METHOD(midgard_connection, get_lang)
316 {
317         RETVAL_NULL();
318         CHECK_MGD;
319
320         if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "") == FAILURE)
321                 return;
322
323         MidgardConnection *mgd =__midgard_connection_get_ptr();
324        
325         const gchar *lang =
326                 midgard_connection_get_lang(mgd);
327        
328         if(lang != NULL)
329                 RETURN_STRING((gchar *)lang, 1);
330 }
331
332 static PHP_METHOD(midgard_connection, set_default_lang)
333 {
334         RETVAL_FALSE;
335         CHECK_MGD;
336         gchar *lang;
337         guint lang_length;
338         gboolean rv;
339        
340         if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
341                                 "s", &lang, &lang_length) == FAILURE)
342                 return;
343
344         MidgardConnection *mgd =__midgard_connection_get_ptr();
345
346         rv = midgard_connection_set_default_lang(mgd, (const gchar *) lang);
347
348         RETURN_BOOL(rv);
349 }
350
351 static PHP_METHOD(midgard_connection, get_default_lang)
352 {
353         RETVAL_NULL();
354         CHECK_MGD;
355
356         if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "") == FAILURE)
357                 return;
358
359         MidgardConnection *mgd =__midgard_connection_get_ptr();
360        
361         const gchar *lang =
362                 midgard_connection_get_default_lang(mgd);
363        
364         if(lang != NULL)
365                 RETURN_STRING((gchar *)lang, 1);
366 }
367
368 static PHP_METHOD(midgard_connection, get_error)
369 {
370         CHECK_MGD;
371        
372         if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "") == FAILURE)
373                 return;
374        
375         MidgardConnection *mgd = mgd_handle();
376        
377         RETURN_LONG(midgard_connection_get_error(mgd));
378 }
379
380 static PHP_METHOD(midgard_connection, get_error_string)
381 {
382         RETVAL_NULL();
383         CHECK_MGD;     
384
385         if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "") == FAILURE)
386                 return;
387        
388         MidgardConnection *mgd = mgd_handle();
389        
390         RETURN_STRING((gchar *)midgard_connection_get_error_string(mgd), 1);
391 }
392
393 static PHP_METHOD(midgard_connection, get_user)
394 {
395         RETVAL_NULL();
396         CHECK_MGD;
397        
398         if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "") == FAILURE)
399                 return;
400        
401         MidgardConnection *mgd =mgd_handle();
402         MidgardUser *user = midgard_connection_get_user(mgd);
403        
404         if(user == NULL)
405                 RETURN_NULL();
406        
407         zend_class_entry *user_ce =
408                 php_midgard_get_baseclass_ptr_by_name("midgard_user");
409        
410         php_midgard_gobject_new_with_gobject(return_value, user_ce,
411                         G_OBJECT(user), TRUE);
412 }
413
414 static PHP_METHOD(midgard_connection, set_loglevel)
415 {
416         RETVAL_NULL();
417         CHECK_MGD;
418         const gchar *level;
419         guint level_length;
420         zval *callback;
421        
422         if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|z",
423                                 &level, &level_length,
424                                 &callback) == FAILURE)
425                 return;
426        
427         MidgardConnection *mgd = mgd_handle();
428        
429         gboolean rv = midgard_connection_set_loglevel(mgd, level, php_midgard_log_errors);
430        
431         RETURN_BOOL(rv);
432 }
433
434 static PHP_METHOD(midgard_connection, connect)
435 {
436         CHECK_MGD;     
437         php_midgard_gobject_connect(INTERNAL_FUNCTION_PARAM_PASSTHRU);
438 }
439
440 void php_midgard_connection_init(int module_number)
441 {
442         static function_entry connection_methods[] = {
443                 PHP_ME(midgard_connection,      __construct,    NULL,   ZEND_ACC_PUBLIC)
444                 PHP_ME(midgard_connection,      open,           NULL,   ZEND_ACC_PUBLIC | ZEND_ACC_STATIC)
445                 PHP_ME(midgard_connection,      open_config,    NULL,   ZEND_ACC_PUBLIC | ZEND_ACC_STATIC)
446                 PHP_ME(midgard_connection,      set_sitegroup,  NULL,   ZEND_ACC_PUBLIC | ZEND_ACC_STATIC)
447                 PHP_ME(midgard_connection,      get_sitegroup,  NULL,   ZEND_ACC_PUBLIC | ZEND_ACC_STATIC)
448                 PHP_ME(midgard_connection,      set_lang,       NULL,   ZEND_ACC_PUBLIC | ZEND_ACC_STATIC)
449                 PHP_ME(midgard_connection,      get_lang,       NULL,   ZEND_ACC_PUBLIC | ZEND_ACC_STATIC)
450                 PHP_ME(midgard_connection,      set_default_lang,       NULL,   ZEND_ACC_PUBLIC | ZEND_ACC_STATIC)
451                 PHP_ME(midgard_connection,      get_default_lang,       NULL,   ZEND_ACC_PUBLIC | ZEND_ACC_STATIC)
452                 PHP_ME(midgard_connection,      connect,        NULL,   ZEND_ACC_PUBLIC)
453                 PHP_ME(midgard_connection,      get_error,      NULL,   ZEND_ACC_PUBLIC | ZEND_ACC_STATIC)
454                 PHP_ME(midgard_connection,      get_error_string,      NULL,   ZEND_ACC_PUBLIC | ZEND_ACC_STATIC)
455                 PHP_ME(midgard_connection,      get_user,       NULL,   ZEND_ACC_PUBLIC | ZEND_ACC_STATIC)
456                 PHP_ME(midgard_connection,      set_loglevel, NULL,   ZEND_ACC_PUBLIC | ZEND_ACC_STATIC)
457                 {NULL, NULL, NULL}
458         };
459        
460         static zend_class_entry php_midgard_connection_class_entry;
461        
462         INIT_CLASS_ENTRY(
463                         php_midgard_connection_class_entry,
464                         "midgard_connection", connection_methods);
465        
466         php_midgard_connection_class =
467                 zend_register_internal_class(&php_midgard_connection_class_entry TSRMLS_CC);
468
469         /* Set function to initialize underlying data */
470         php_midgard_connection_class->create_object = php_midgard_gobject_new;
471 }
Note: See TracBrowser for help on using the browser.