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 );
@@ -2847,7 +2848,7 @@ static zval *guess_zval_convert(zval *ret, encodeTypePtr type, xmlNodePtr data)
2847
2848
}
2848
2849
2849
2850
/* Time encode/decode */
2850
- static xmlNodePtr to_xml_datetime_ex (encodeTypePtr type , zval * data , char * format , int style , xmlNodePtr parent )
2851
+ 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 )
2851
2852
{
2852
2853
/* logic hacked from ext/standard/datetime.c */
2853
2854
struct tm * ta , tmbuf ;
@@ -2905,6 +2906,17 @@ static xmlNodePtr to_xml_datetime_ex(encodeTypePtr type, zval *data, char *forma
2905
2906
efree (buf );
2906
2907
} else if (Z_TYPE_P (data ) == IS_STRING ) {
2907
2908
xmlNodeSetContentLen (xmlParam , BAD_CAST (Z_STRVAL_P (data )), Z_STRLEN_P (data ));
2909
+ } else if (Z_TYPE_P (data ) == IS_OBJECT ) {
2910
+ if (instanceof_function_slow (Z_OBJCE_P (data ), php_date_get_interface_ce ())) {
2911
+ php_date_obj * dateobj = Z_PHPDATE_P (data );
2912
+ if (dateobj -> time ) {
2913
+ zend_string * formatted = php_format_date_ex (ext_date_format , ext_date_format_len , dateobj -> time , dateobj -> time -> is_localtime );
2914
+ xmlNodeSetContentLen (xmlParam , BAD_CAST (ZSTR_VAL (formatted )), ZSTR_LEN (formatted ));
2915
+ zend_string_release_ex (formatted , false);
2916
+ } else {
2917
+ soap_error0 (E_ERROR , "Encoding: Invalid DateTimeInterface" );
2918
+ }
2919
+ }
2908
2920
}
2909
2921
2910
2922
if (style == SOAP_ENCODED ) {
@@ -2919,45 +2931,47 @@ static xmlNodePtr to_xml_duration(encodeTypePtr type, zval *data, int style, xml
2919
2931
return to_xml_string (type , data , style , parent );
2920
2932
}
2921
2933
2934
+ #define TO_XML_DATETIME_EX_HELPER (type , date , format , ext_date_format , style , parent ) \
2935
+ to_xml_datetime_ex(type, data, format, ext_date_format, strlen(ext_date_format), style, parent)
2936
+
2922
2937
static xmlNodePtr to_xml_datetime (encodeTypePtr type , zval * data , int style , xmlNodePtr parent )
2923
2938
{
2924
- return to_xml_datetime_ex (type , data , "%Y-%m-%dT%H:%M:%S" , style , parent );
2939
+ return TO_XML_DATETIME_EX_HELPER (type , data , "%Y-%m-%dT%H:%M:%S" , "Y-m-d\\TH:i:s.up " , style , parent );
2925
2940
}
2926
2941
2927
2942
static xmlNodePtr to_xml_time (encodeTypePtr type , zval * data , int style , xmlNodePtr parent )
2928
2943
{
2929
- /* TODO: microsecconds */
2930
- return to_xml_datetime_ex (type , data , "%H:%M:%S" , style , parent );
2944
+ return TO_XML_DATETIME_EX_HELPER (type , data , "%H:%M:%S" , "H:i:s.up" , style , parent );
2931
2945
}
2932
2946
2933
2947
static xmlNodePtr to_xml_date (encodeTypePtr type , zval * data , int style , xmlNodePtr parent )
2934
2948
{
2935
- return to_xml_datetime_ex (type , data , "%Y-%m-%d" , style , parent );
2949
+ return TO_XML_DATETIME_EX_HELPER (type , data , "%Y-%m-%d" , "Y-m-dp " , style , parent );
2936
2950
}
2937
2951
2938
2952
static xmlNodePtr to_xml_gyearmonth (encodeTypePtr type , zval * data , int style , xmlNodePtr parent )
2939
2953
{
2940
- return to_xml_datetime_ex (type , data , "%Y-%m" , style , parent );
2954
+ return TO_XML_DATETIME_EX_HELPER (type , data , "%Y-%m" , "Y-mp " , style , parent );
2941
2955
}
2942
2956
2943
2957
static xmlNodePtr to_xml_gyear (encodeTypePtr type , zval * data , int style , xmlNodePtr parent )
2944
2958
{
2945
- return to_xml_datetime_ex (type , data , "%Y" , style , parent );
2959
+ return TO_XML_DATETIME_EX_HELPER (type , data , "%Y" , "Yp " , style , parent );
2946
2960
}
2947
2961
2948
2962
static xmlNodePtr to_xml_gmonthday (encodeTypePtr type , zval * data , int style , xmlNodePtr parent )
2949
2963
{
2950
- return to_xml_datetime_ex (type , data , "--%m-%d" , style , parent );
2964
+ return TO_XML_DATETIME_EX_HELPER (type , data , "--%m-%d" , "--m-dp " , style , parent );
2951
2965
}
2952
2966
2953
2967
static xmlNodePtr to_xml_gday (encodeTypePtr type , zval * data , int style , xmlNodePtr parent )
2954
2968
{
2955
- return to_xml_datetime_ex (type , data , "---%d" , style , parent );
2969
+ return TO_XML_DATETIME_EX_HELPER (type , data , "---%d" , "---dp " , style , parent );
2956
2970
}
2957
2971
2958
2972
static xmlNodePtr to_xml_gmonth (encodeTypePtr type , zval * data , int style , xmlNodePtr parent )
2959
2973
{
2960
- return to_xml_datetime_ex (type , data , "--%m--" , style , parent );
2974
+ return TO_XML_DATETIME_EX_HELPER (type , data , "--%m--" , "--m--p " , style , parent );
2961
2975
}
2962
2976
2963
2977
static zval * to_zval_list (zval * ret , encodeTypePtr enc , xmlNodePtr data ) {
0 commit comments