70
70
#include "xmlrpc.h"
71
71
#include "xmlrpc_arginfo.h"
72
72
73
- static int le_xmlrpc_server ;
73
+ #include "Zend/zend_interfaces.h"
74
74
75
75
zend_module_entry xmlrpc_module_entry = {
76
76
STANDARD_MODULE_HEADER ,
@@ -98,6 +98,7 @@ typedef struct _xmlrpc_server_data {
98
98
zval method_map ;
99
99
zval introspection_map ;
100
100
XMLRPC_SERVER server_ptr ;
101
+ zend_object std ;
101
102
} xmlrpc_server_data ;
102
103
103
104
@@ -172,36 +173,74 @@ XMLRPC_VECTOR_TYPE xmlrpc_str_as_vector_type(const char* str);
172
173
int set_zval_xmlrpc_type (zval * value , XMLRPC_VALUE_TYPE type );
173
174
174
175
/*********************
175
- * startup / shutdown *
176
+ * XmlRpcServer object *
176
177
*********************/
177
178
178
- static void destroy_server_data (xmlrpc_server_data * server )
179
+ zend_class_entry * xmlrpc_server_ce ;
180
+ static zend_object_handlers xmlrpc_server_object_handlers ;
181
+ static const zend_function_entry xmlrpc_server_object_methods [] = {
182
+ PHP_FE_END
183
+ };
184
+
185
+ static inline xmlrpc_server_data * xmlrpc_server_from_obj (zend_object * obj ) {
186
+ return (xmlrpc_server_data * )((char * )(obj ) - XtOffsetOf (xmlrpc_server_data , std ));
187
+ }
188
+
189
+ #define Z_XMLRPC_SERVER_P (zv ) xmlrpc_server_from_obj(Z_OBJ_P(zv))
190
+
191
+ static zend_object * xmlrpc_server_create_object (zend_class_entry * class_type ) {
192
+ xmlrpc_server_data * intern = zend_object_alloc (sizeof (xmlrpc_server_data ), class_type );
193
+
194
+ zend_object_std_init (& intern -> std , class_type );
195
+ object_properties_init (& intern -> std , class_type );
196
+ intern -> std .handlers = & xmlrpc_server_object_handlers ;
197
+
198
+ return & intern -> std ;
199
+ }
200
+
201
+ static zend_function * xmlrpc_server_get_constructor (zend_object * object ) {
202
+ zend_throw_error (NULL , "Cannot directly construct XmlRpcServer, use xmlrpc_server_create() instead" );
203
+ return NULL ;
204
+ }
205
+
206
+ static void xmlrpc_server_free_obj (zend_object * object )
179
207
{
180
- if (server ) {
181
- XMLRPC_ServerDestroy (server -> server_ptr );
208
+ xmlrpc_server_data * server = xmlrpc_server_from_obj (object );
182
209
183
- zval_ptr_dtor (& server -> method_map );
184
- zval_ptr_dtor (& server -> introspection_map );
210
+ XMLRPC_ServerDestroy (server -> server_ptr );
185
211
186
- efree (server );
187
- }
212
+ zval_ptr_dtor (& server -> method_map );
213
+ zval_ptr_dtor (& server -> introspection_map );
214
+ zend_object_std_dtor (& server -> std );
188
215
}
189
216
190
- /* called when server is being destructed. either when xmlrpc_server_destroy
191
- * is called, or when request ends. */
192
- static void xmlrpc_server_destructor (zend_resource * rsrc )
217
+ static HashTable * xmlrpc_server_get_gc (zend_object * object , zval * * table , int * n )
193
218
{
194
- if (rsrc && rsrc -> ptr ) {
195
- GC_ADDREF (rsrc );
196
- destroy_server_data ((xmlrpc_server_data * ) rsrc -> ptr );
197
- GC_DELREF (rsrc );
198
- }
219
+ xmlrpc_server_data * xmlrpc_server = xmlrpc_server_from_obj (object );
220
+
221
+ * table = & xmlrpc_server -> method_map ;
222
+ * n = 2 ;
223
+
224
+ return zend_std_get_properties (object );
199
225
}
200
226
201
227
/* module init */
202
228
PHP_MINIT_FUNCTION (xmlrpc )
203
229
{
204
- le_xmlrpc_server = zend_register_list_destructors_ex (xmlrpc_server_destructor , NULL , "xmlrpc server" , module_number );
230
+ zend_class_entry ce ;
231
+ INIT_CLASS_ENTRY (ce , "XmlRpcServer" , xmlrpc_server_object_methods );
232
+ xmlrpc_server_ce = zend_register_internal_class (& ce );
233
+ xmlrpc_server_ce -> ce_flags |= ZEND_ACC_FINAL ;
234
+ xmlrpc_server_ce -> create_object = xmlrpc_server_create_object ;
235
+ xmlrpc_server_ce -> serialize = zend_class_serialize_deny ;
236
+ xmlrpc_server_ce -> unserialize = zend_class_unserialize_deny ;
237
+
238
+ memcpy (& xmlrpc_server_object_handlers , & std_object_handlers , sizeof (zend_object_handlers ));
239
+ xmlrpc_server_object_handlers .offset = XtOffsetOf (xmlrpc_server_data , std );
240
+ xmlrpc_server_object_handlers .free_obj = xmlrpc_server_free_obj ;
241
+ xmlrpc_server_object_handlers .get_gc = xmlrpc_server_get_gc ;
242
+ xmlrpc_server_object_handlers .get_constructor = xmlrpc_server_get_constructor ;
243
+ xmlrpc_server_object_handlers .clone_obj = NULL ;
205
244
206
245
return SUCCESS ;
207
246
}
@@ -735,7 +774,7 @@ PHP_FUNCTION(xmlrpc_decode)
735
774
* server related methods *
736
775
*************************/
737
776
738
- /* {{{ proto resource xmlrpc_server_create(void)
777
+ /* {{{ proto XmlRpcServer xmlrpc_server_create(void)
739
778
Creates an xmlrpc server */
740
779
PHP_FUNCTION (xmlrpc_server_create )
741
780
{
@@ -744,42 +783,31 @@ PHP_FUNCTION(xmlrpc_server_create)
744
783
}
745
784
746
785
if (USED_RET ()) {
747
- xmlrpc_server_data * server = emalloc (sizeof (xmlrpc_server_data ));
786
+ xmlrpc_server_data * server ;
787
+
788
+ object_init_ex (return_value , xmlrpc_server_ce );
789
+ server = Z_XMLRPC_SERVER_P (return_value );
748
790
749
- /* allocate server data. free'd in destroy_server_data() */
750
791
array_init (& server -> method_map );
751
792
array_init (& server -> introspection_map );
752
793
server -> server_ptr = XMLRPC_ServerCreate ();
753
794
754
795
XMLRPC_ServerRegisterIntrospectionCallback (server -> server_ptr , php_xmlrpc_introspection_callback );
755
-
756
- /* store for later use */
757
- RETURN_RES (zend_register_resource (server , le_xmlrpc_server ));
758
796
}
759
797
}
760
798
/* }}} */
761
799
762
- /* {{{ proto int xmlrpc_server_destroy(resource server)
800
+ /* {{{ proto bool xmlrpc_server_destroy(XmlRpcServer server)
763
801
Destroys server resources */
764
802
PHP_FUNCTION (xmlrpc_server_destroy )
765
803
{
766
804
zval * arg1 ;
767
- int bSuccess = FAILURE ;
768
- xmlrpc_server_data * server ;
769
-
770
- if (zend_parse_parameters (ZEND_NUM_ARGS (), "r" , & arg1 ) == FAILURE ) {
771
- RETURN_THROWS ();
772
- }
773
805
774
- if (( server = ( xmlrpc_server_data * ) zend_fetch_resource ( Z_RES_P ( arg1 ) , "xmlrpc server " , le_xmlrpc_server )) == NULL ) {
806
+ if (zend_parse_parameters ( ZEND_NUM_ARGS () , "O " , & arg1 , xmlrpc_server_ce ) == FAILURE ) {
775
807
RETURN_THROWS ();
776
808
}
777
809
778
- bSuccess = zend_list_close (Z_RES_P (arg1 ));
779
- /* called by hashtable destructor
780
- * destroy_server_data(server);
781
- */
782
- RETURN_BOOL (bSuccess == SUCCESS );
810
+ RETURN_TRUE ;
783
811
}
784
812
/* }}} */
785
813
@@ -881,7 +909,7 @@ static void php_xmlrpc_introspection_callback(XMLRPC_SERVER server, void* data)
881
909
}
882
910
/* }}} */
883
911
884
- /* {{{ proto bool xmlrpc_server_register_method(resource server, string method_name, string function)
912
+ /* {{{ proto bool xmlrpc_server_register_method(XmlRpcServer server, string method_name, string function)
885
913
Register a PHP function to handle method matching method_name */
886
914
PHP_FUNCTION (xmlrpc_server_register_method )
887
915
{
@@ -890,13 +918,11 @@ PHP_FUNCTION(xmlrpc_server_register_method)
890
918
zval * handle , * method_name ;
891
919
xmlrpc_server_data * server ;
892
920
893
- if (zend_parse_parameters (ZEND_NUM_ARGS (), "rsz " , & handle , & method_key , & method_key_len , & method_name ) == FAILURE ) {
921
+ if (zend_parse_parameters (ZEND_NUM_ARGS (), "Osz " , & handle , xmlrpc_server_ce , & method_key , & method_key_len , & method_name ) == FAILURE ) {
894
922
RETURN_THROWS ();
895
923
}
896
924
897
- if ((server = (xmlrpc_server_data * )zend_fetch_resource (Z_RES_P (handle ), "xmlrpc server" , le_xmlrpc_server )) == NULL ) {
898
- RETURN_THROWS ();
899
- }
925
+ server = Z_XMLRPC_SERVER_P (handle );
900
926
901
927
/* register with C engine. every method just calls our standard callback,
902
928
* and it then dispatches to php as necessary
@@ -913,20 +939,18 @@ PHP_FUNCTION(xmlrpc_server_register_method)
913
939
}
914
940
/* }}} */
915
941
916
- /* {{{ proto bool xmlrpc_server_register_introspection_callback(resource server, string function)
942
+ /* {{{ proto bool xmlrpc_server_register_introspection_callback(XmlRpcServer server, string function)
917
943
Register a PHP function to generate documentation */
918
944
PHP_FUNCTION (xmlrpc_server_register_introspection_callback )
919
945
{
920
946
zval * method_name , * handle ;
921
947
xmlrpc_server_data * server ;
922
948
923
- if (zend_parse_parameters (ZEND_NUM_ARGS (), "rz " , & handle , & method_name ) == FAILURE ) {
949
+ if (zend_parse_parameters (ZEND_NUM_ARGS (), "Oz " , & handle , xmlrpc_server_ce , & method_name ) == FAILURE ) {
924
950
RETURN_THROWS ();
925
951
}
926
952
927
- if ((server = (xmlrpc_server_data * )zend_fetch_resource (Z_RES_P (handle ), "xmlrpc server" , le_xmlrpc_server )) == NULL ) {
928
- RETURN_THROWS ();
929
- }
953
+ server = Z_XMLRPC_SERVER_P (handle );
930
954
931
955
Z_TRY_ADDREF_P (method_name );
932
956
/* register our php method */
@@ -938,7 +962,7 @@ PHP_FUNCTION(xmlrpc_server_register_introspection_callback)
938
962
939
963
/* this function is itchin for a re-write */
940
964
941
- /* {{{ proto mixed xmlrpc_server_call_method(resource server, string xml, mixed user_data [, array output_options])
965
+ /* {{{ proto mixed xmlrpc_server_call_method(XmlRpcServer server, string xml, mixed user_data [, array output_options])
942
966
Parses XML requests and call methods */
943
967
PHP_FUNCTION (xmlrpc_server_call_method )
944
968
{
@@ -952,7 +976,7 @@ PHP_FUNCTION(xmlrpc_server_call_method)
952
976
php_output_options out ;
953
977
int argc = ZEND_NUM_ARGS ();
954
978
955
- if (zend_parse_parameters (argc , "rsz |a" , & handle , & rawxml , & rawxml_len , & caller_params , & output_opts ) != SUCCESS ) {
979
+ if (zend_parse_parameters (argc , "Osz |a" , & handle , xmlrpc_server_ce , & rawxml , & rawxml_len , & caller_params , & output_opts ) != SUCCESS ) {
956
980
RETURN_THROWS ();
957
981
}
958
982
/* user output options */
@@ -962,9 +986,7 @@ PHP_FUNCTION(xmlrpc_server_call_method)
962
986
set_output_options (& out , output_opts );
963
987
}
964
988
965
- if ((server = (xmlrpc_server_data * )zend_fetch_resource (Z_RES_P (handle ), "xmlrpc server" , le_xmlrpc_server )) == NULL ) {
966
- RETURN_THROWS ();
967
- }
989
+ server = Z_XMLRPC_SERVER_P (handle );
968
990
969
991
/* HACK: use output encoding for now */
970
992
input_opts .xml_elem_opts .encoding = utf8_get_encoding_id_from_string (out .xmlrpc_out .xml_elem_opts .encoding );
@@ -1046,21 +1068,19 @@ PHP_FUNCTION(xmlrpc_server_call_method)
1046
1068
}
1047
1069
/* }}} */
1048
1070
1049
- /* {{{ proto int xmlrpc_server_add_introspection_data(resource server, array desc)
1071
+ /* {{{ proto int xmlrpc_server_add_introspection_data(XmlRpcServer server, array desc)
1050
1072
Adds introspection documentation */
1051
1073
PHP_FUNCTION (xmlrpc_server_add_introspection_data )
1052
1074
{
1053
1075
zval * handle , * desc ;
1054
1076
xmlrpc_server_data * server ;
1055
1077
XMLRPC_VALUE xDesc ;
1056
1078
1057
- if (zend_parse_parameters (ZEND_NUM_ARGS (), "ra " , & handle , & desc ) == FAILURE ) {
1079
+ if (zend_parse_parameters (ZEND_NUM_ARGS (), "Oa " , & handle , xmlrpc_server_ce , & desc ) == FAILURE ) {
1058
1080
RETURN_THROWS ();
1059
1081
}
1060
1082
1061
- if ((server = (xmlrpc_server_data * )zend_fetch_resource (Z_RES_P (handle ), "xmlrpc server" , le_xmlrpc_server )) == NULL ) {
1062
- RETURN_THROWS ();
1063
- }
1083
+ server = Z_XMLRPC_SERVER_P (handle );
1064
1084
1065
1085
xDesc = PHP_to_XMLRPC (desc );
1066
1086
if (xDesc ) {
0 commit comments