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

Revision 15815, 5.6 kB (checked in by piotras, 9 months ago)

Ported from 1-9

Line 
1 /*
2  * Copyright (C) 2006, 2007 Piotr Pokora <piotrek.pokora@gmail.com>
3  *
4  * This program is free software; you can redistribute it and/or modify it
5  * under the terms of the GNU Lesser General Public License as published
6  * by the Free Software Foundation; either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17  */
18
19 #include "php_midgard.h"
20 #include "php_midgard_gobject.h"
21
22 #define _FREE_PARAMETERS \
23         guint _i; \
24         for(_i = 0; _i < n_params; _i++) { \
25                 g_value_unset(&parameters[_i].value); \
26         } \
27         g_free(parameters); \
28
29 PHP_FUNCTION(_php_midgard_object_list_attachments)
30 {
31         RETVAL_FALSE;
32         CHECK_MGD;
33         zval *zval_object = getThis(); 
34         MgdObject **objects = NULL;
35
36         if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "") != SUCCESS)
37                 return;
38
39         MgdObject *mobj = php_midgard_get_midgard_object(zval_object);
40         objects = midgard_object_list_attachments(mobj);       
41
42         array_init(return_value);
43        
44         if(objects) {   
45                 php_midgard_array_from_objects((GObject **)objects, "midgard_attachment", return_value);
46                 g_free(objects);
47         }
48 }
49
50 PHP_FUNCTION(_php_midgard_object_delete_attachments)
51 {
52         RETVAL_FALSE;
53         CHECK_MGD;
54         zval *zval_object = getThis();
55         zval *params = NULL;
56         guint n_params = 0;
57         gboolean rv = FALSE;
58        
59         if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
60                                 "|z", &params) != SUCCESS) {
61                 return;
62         }       
63
64         GParameter *parameters = php_midgard_array_to_gparameter(params, &n_params);
65         MgdObject *mobj = php_midgard_get_midgard_object(zval_object);
66         rv = midgard_object_delete_attachments(mobj, n_params, parameters);
67
68         _FREE_PARAMETERS;
69
70         RETURN_BOOL(rv);
71 }
72
73 PHP_FUNCTION(_php_midgard_object_purge_attachments)
74 {
75         RETVAL_FALSE;
76         CHECK_MGD;
77         zval *zval_object = getThis();
78         zval *params = NULL;
79         guint n_params = 0;
80         gboolean rv = FALSE;
81         zend_bool zbool = TRUE;
82        
83         if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
84                                 "|zz", &zbool, &params) != SUCCESS) {
85                 return;
86         }       
87
88         GParameter *parameters = php_midgard_array_to_gparameter(params, &n_params);
89         MgdObject *mobj = php_midgard_get_midgard_object(zval_object);
90         rv = midgard_object_purge_attachments(mobj, (gboolean) zbool, n_params, parameters);
91
92         _FREE_PARAMETERS;
93
94         RETURN_BOOL(rv);
95 }
96
97 PHP_FUNCTION(_php_midgard_object_find_attachments)
98 {
99         RETVAL_FALSE;
100         CHECK_MGD;
101         zval *zval_object = getThis();
102         zval *params = NULL;
103         guint n_params = 0;
104         MgdObject **objects = NULL;
105
106         if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
107                                 "|z", &params) != SUCCESS) {
108                 return;
109         }       
110
111         GParameter *parameters = php_midgard_array_to_gparameter(params, &n_params);
112         MgdObject *mobj = php_midgard_get_midgard_object(zval_object);
113         objects = midgard_object_find_attachments(mobj, n_params, parameters);
114
115         _FREE_PARAMETERS;
116
117         array_init(return_value);
118        
119         if(objects) {   
120                 php_midgard_array_from_objects((GObject **)objects, "midgard_attachment", return_value);
121                 g_free(objects);
122         }
123 }
124
125 PHP_FUNCTION(_php_midgard_object_create_attachment)
126 {
127         RETVAL_FALSE;
128         CHECK_MGD;
129         zval *zval_object = getThis(); 
130         gchar *class_name;
131         const gchar *type_name;
132         zend_class_entry **ce;
133         const gchar *name = NULL, *title = NULL, *mimetype = NULL;
134         guint name_length, title_length, mimetype_length;
135        
136         if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
137                                 "|sss", &name, &name_length,
138                                 &title, &title_length,
139                                 &mimetype, &mimetype_length) != SUCCESS) {
140                 return;
141         }       
142
143         MgdObject *mobj = php_midgard_get_midgard_object(zval_object);
144         MgdObject *att = midgard_object_create_attachment(mobj, name, title, mimetype);
145
146         if(att) {
147                
148                 type_name = G_OBJECT_TYPE_NAME((GObject*)att);
149                 class_name = g_ascii_strdown(type_name, strlen(type_name));
150                 zend_hash_find(CG(class_table),
151                                 class_name, strlen(class_name)+1, (void **) &ce);
152                 php_midgard_gobject_new_with_gobject(return_value, *ce, G_OBJECT(att), TRUE);
153                 g_free(class_name);
154                 g_signal_emit(att, MIDGARD_OBJECT_GET_CLASS(att)->signal_action_loaded_hook, 0);
155        
156         } else {
157                
158                 RETURN_NULL();
159         }
160 }
161
162 /* It's not binded from core. This is PHP specific */
163 PHP_FUNCTION(_php_midgard_object_serve_attachment)
164 {
165         RETVAL_FALSE;
166         CHECK_MGD;     
167         MgdObject *att = NULL;
168         const gchar *guid;
169         guint guid_length;
170
171
172         if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
173                                 "s", &guid, &guid_length) != SUCCESS) {
174                 return;
175         }       
176
177         if(!midgard_is_guid(guid)) {
178                 g_warning("Given parameter is not a guid");
179                 return;
180         }
181
182         GValue gval = {0, };
183         g_value_init(&gval, G_TYPE_STRING);
184         g_value_set_string(&gval, guid);
185         att = midgard_object_new(mgd_handle(), "midgard_attachment", &gval);
186
187         /* error is set by core */
188         if(!att)
189                 return;
190
191         MidgardBlob *blob = midgard_blob_new(att);
192
193         if(!blob)
194                 return ;
195         gchar *mimetype;
196         g_object_get(G_OBJECT(att), "mimetype", &mimetype, NULL);
197         gchar *content_type = g_strconcat("Content-type: ", mimetype, NULL);
198         sapi_add_header(content_type, strlen(content_type), 1);
199         g_free(content_type);
200
201         if (sapi_send_headers(TSRMLS_C) != SUCCESS)
202                 return;
203
204         const gchar *path = midgard_blob_get_path(blob);
205         FILE *fp;
206         int b;
207         char buf[1024];
208
209         if (!(fp = fopen(path, "r"))) {
210                 g_warning("File doesn't exist");
211                 MIDGARD_ERRNO_SET(mgd_handle(), MGD_ERR_INTERNAL);
212                 return;
213         }
214
215         while ((b = fread(buf, 1, sizeof(buf), fp)) > 0) {
216                 PHPWRITE(buf, b);
217         }
218        
219         fclose(fp);
220
221         RETVAL_TRUE;;
222 }
Note: See TracBrowser for help on using the browser.