21
21
#include "php_soap.h"
22
22
#include "ext/libxml/php_libxml.h"
23
23
#include "ext/standard/base64.h"
24
+ #include "ext/date/php_date.h"
24
25
#include <libxml/parserInternals.h>
25
26
#include "zend_strtod.h"
26
27
#include "zend_interfaces.h"
@@ -57,7 +58,7 @@ static xmlNodePtr to_xml_list(encodeTypePtr enc, zval *data, int style, xmlNodeP
57
58
static xmlNodePtr to_xml_list1 (encodeTypePtr enc , zval * data , int style , xmlNodePtr parent );
58
59
59
60
/* Datetime encode/decode */
60
- static xmlNodePtr to_xml_datetime_ex (encodeTypePtr type , zval * data , char * format , int style , xmlNodePtr parent );
61
+ static xmlNodePtr to_xml_datetime_ex (encodeTypePtr type , zval * data , char * format , const char * ext_date_format , size_t ext_date_format_len , int style , xmlNodePtr parent );
61
62
static xmlNodePtr to_xml_datetime (encodeTypePtr type , zval * data , int style , xmlNodePtr parent );
62
63
static xmlNodePtr to_xml_time (encodeTypePtr type , zval * data , int style , xmlNodePtr parent );
63
64
static xmlNodePtr to_xml_date (encodeTypePtr type , zval * data , int style , xmlNodePtr parent );
@@ -2833,7 +2834,7 @@ static zval *guess_zval_convert(zval *ret, encodeTypePtr type, xmlNodePtr data)
2833
2834
}
2834
2835
2835
2836
/* Time encode/decode */
2836
- static xmlNodePtr to_xml_datetime_ex (encodeTypePtr type , zval * data , char * format , int style , xmlNodePtr parent )
2837
+ static xmlNodePtr to_xml_datetime_ex (encodeTypePtr type , zval * data , char * format , const char * ext_date_format , size_t ext_date_format_len , int style , xmlNodePtr parent )
2837
2838
{
2838
2839
/* logic hacked from ext/standard/datetime.c */
2839
2840
struct tm * ta , tmbuf ;
@@ -2891,6 +2892,17 @@ static xmlNodePtr to_xml_datetime_ex(encodeTypePtr type, zval *data, char *forma
2891
2892
efree (buf );
2892
2893
} else if (Z_TYPE_P (data ) == IS_STRING ) {
2893
2894
xmlNodeSetContentLen (xmlParam , BAD_CAST (Z_STRVAL_P (data )), Z_STRLEN_P (data ));
2895
+ } else if (Z_TYPE_P (data ) == IS_OBJECT ) {
2896
+ if (instanceof_function_slow (Z_OBJCE_P (data ), php_date_get_interface_ce ())) {
2897
+ php_date_obj * dateobj = Z_PHPDATE_P (data );
2898
+ if (dateobj -> time ) {
2899
+ zend_string * formatted = php_format_date_ex (ext_date_format , ext_date_format_len , dateobj -> time , dateobj -> time -> is_localtime );
2900
+ xmlNodeSetContentLen (xmlParam , BAD_CAST (ZSTR_VAL (formatted )), ZSTR_LEN (formatted ));
2901
+ zend_string_release_ex (formatted , false);
2902
+ } else {
2903
+ soap_error0 (E_ERROR , "Encoding: Invalid DateTimeInterface" );
2904
+ }
2905
+ }
2894
2906
}
2895
2907
2896
2908
if (style == SOAP_ENCODED ) {
@@ -2905,45 +2917,47 @@ static xmlNodePtr to_xml_duration(encodeTypePtr type, zval *data, int style, xml
2905
2917
return to_xml_string (type , data , style , parent );
2906
2918
}
2907
2919
2920
+ #define TO_XML_DATETIME_EX_HELPER (type , date , format , ext_date_format , style , parent ) \
2921
+ to_xml_datetime_ex(type, data, format, ext_date_format, strlen(ext_date_format), style, parent)
2922
+
2908
2923
static xmlNodePtr to_xml_datetime (encodeTypePtr type , zval * data , int style , xmlNodePtr parent )
2909
2924
{
2910
- return to_xml_datetime_ex (type , data , "%Y-%m-%dT%H:%M:%S" , style , parent );
2925
+ return TO_XML_DATETIME_EX_HELPER (type , data , "%Y-%m-%dT%H:%M:%S" , "Y-m-d\\TH:i:s.up " , style , parent );
2911
2926
}
2912
2927
2913
2928
static xmlNodePtr to_xml_time (encodeTypePtr type , zval * data , int style , xmlNodePtr parent )
2914
2929
{
2915
- /* TODO: microsecconds */
2916
- return to_xml_datetime_ex (type , data , "%H:%M:%S" , style , parent );
2930
+ return TO_XML_DATETIME_EX_HELPER (type , data , "%H:%M:%S" , "H:i:s.up" , style , parent );
2917
2931
}
2918
2932
2919
2933
static xmlNodePtr to_xml_date (encodeTypePtr type , zval * data , int style , xmlNodePtr parent )
2920
2934
{
2921
- return to_xml_datetime_ex (type , data , "%Y-%m-%d" , style , parent );
2935
+ return TO_XML_DATETIME_EX_HELPER (type , data , "%Y-%m-%d" , "Y-m-dp " , style , parent );
2922
2936
}
2923
2937
2924
2938
static xmlNodePtr to_xml_gyearmonth (encodeTypePtr type , zval * data , int style , xmlNodePtr parent )
2925
2939
{
2926
- return to_xml_datetime_ex (type , data , "%Y-%m" , style , parent );
2940
+ return TO_XML_DATETIME_EX_HELPER (type , data , "%Y-%m" , "Y-mp " , style , parent );
2927
2941
}
2928
2942
2929
2943
static xmlNodePtr to_xml_gyear (encodeTypePtr type , zval * data , int style , xmlNodePtr parent )
2930
2944
{
2931
- return to_xml_datetime_ex (type , data , "%Y" , style , parent );
2945
+ return TO_XML_DATETIME_EX_HELPER (type , data , "%Y" , "Yp " , style , parent );
2932
2946
}
2933
2947
2934
2948
static xmlNodePtr to_xml_gmonthday (encodeTypePtr type , zval * data , int style , xmlNodePtr parent )
2935
2949
{
2936
- return to_xml_datetime_ex (type , data , "--%m-%d" , style , parent );
2950
+ return TO_XML_DATETIME_EX_HELPER (type , data , "--%m-%d" , "--m-dp " , style , parent );
2937
2951
}
2938
2952
2939
2953
static xmlNodePtr to_xml_gday (encodeTypePtr type , zval * data , int style , xmlNodePtr parent )
2940
2954
{
2941
- return to_xml_datetime_ex (type , data , "---%d" , style , parent );
2955
+ return TO_XML_DATETIME_EX_HELPER (type , data , "---%d" , "---dp " , style , parent );
2942
2956
}
2943
2957
2944
2958
static xmlNodePtr to_xml_gmonth (encodeTypePtr type , zval * data , int style , xmlNodePtr parent )
2945
2959
{
2946
- return to_xml_datetime_ex (type , data , "--%m--" , style , parent );
2960
+ return TO_XML_DATETIME_EX_HELPER (type , data , "--%m--" , "--m--p " , style , parent );
2947
2961
}
2948
2962
2949
2963
static zval * to_zval_list (zval * ret , encodeTypePtr enc , xmlNodePtr data ) {
0 commit comments