55#include "msgpack_pack.h"
66#include "msgpack_unpack.h"
77#include "msgpack_class.h"
8+ #include "msgpack_convert.h"
9+ #include "msgpack_errors.h"
810
911typedef struct {
1012 zend_object object ;
@@ -96,6 +98,7 @@ ZEND_END_ARG_INFO()
9698
9799ZEND_BEGIN_ARG_INFO_EX (arginfo_msgpack_base_unpack , 0 , 0 , 1 )
98100 ZEND_ARG_INFO (0 , str )
101+ ZEND_ARG_INFO (0 , object )
99102ZEND_END_ARG_INFO ()
100103
101104ZEND_BEGIN_ARG_INFO_EX (arginfo_msgpack_base_unpacker , 0 , 0 , 0 )
@@ -144,6 +147,7 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_msgpack_unpacker_execute, 1, 0, 0)
144147ZEND_END_ARG_INFO ()
145148
146149ZEND_BEGIN_ARG_INFO_EX (arginfo_msgpack_unpacker_data , 0 , 0 , 0 )
150+ ZEND_ARG_INFO (0 , object )
147151ZEND_END_ARG_INFO ()
148152
149153ZEND_BEGIN_ARG_INFO_EX (arginfo_msgpack_unpacker_reset , 0 , 0 , 0 )
@@ -289,12 +293,8 @@ static ZEND_METHOD(msgpack, setOption)
289293 base -> php_only = Z_BVAL_P (value );
290294 break ;
291295 default :
292- if (MSGPACK_G (error_display ))
293- {
294- zend_error (E_WARNING ,
295- "[msgpack] (MessagePack::setOption) "
296- "error setting msgpack option" );
297- }
296+ MSGPACK_WARNING ("[msgpack] (MessagePack::setOption) "
297+ "error setting msgpack option" );
298298 RETURN_FALSE ;
299299 break ;
300300 }
@@ -330,11 +330,13 @@ static ZEND_METHOD(msgpack, unpack)
330330{
331331 char * str ;
332332 int str_len ;
333+ zval * object = NULL ;
333334 int php_only = MSGPACK_G (php_only );
334335 MSGPACK_BASE_OBJECT ;
335336
336337 if (zend_parse_parameters (
337- ZEND_NUM_ARGS () TSRMLS_CC , "s" , & str , & str_len ) == FAILURE )
338+ ZEND_NUM_ARGS () TSRMLS_CC , "s|z" ,
339+ & str , & str_len , & object ) == FAILURE )
338340 {
339341 return ;
340342 }
@@ -346,7 +348,22 @@ static ZEND_METHOD(msgpack, unpack)
346348
347349 MSGPACK_G (php_only ) = base -> php_only ;
348350
349- php_msgpack_unserialize (return_value , str , str_len TSRMLS_CC );
351+ if (object == NULL )
352+ {
353+ php_msgpack_unserialize (return_value , str , str_len TSRMLS_CC );
354+ }
355+ else
356+ {
357+ zval * zv ;
358+
359+ ALLOC_INIT_ZVAL (zv );
360+ php_msgpack_unserialize (zv , str , str_len TSRMLS_CC );
361+
362+ if (msgpack_convert_object (return_value , object , & zv ) != SUCCESS )
363+ {
364+ RETURN_NULL ();
365+ }
366+ }
350367
351368 MSGPACK_G (php_only ) = php_only ;
352369}
@@ -429,12 +446,8 @@ static ZEND_METHOD(msgpack_unpacker, setOption)
429446 unpacker -> php_only = Z_BVAL_P (value );
430447 break ;
431448 default :
432- if (MSGPACK_G (error_display ))
433- {
434- zend_error (E_WARNING ,
435- "[msgpack] (MessagePackUnpacker::setOption) "
436- "error setting msgpack option" );
437- }
449+ MSGPACK_WARNING ("[msgpack] (MessagePackUnpacker::setOption) "
450+ "error setting msgpack option" );
438451 RETURN_FALSE ;
439452 break ;
440453 }
@@ -468,7 +481,7 @@ static ZEND_METHOD(msgpack_unpacker, execute)
468481{
469482 char * str = NULL , * data ;
470483 long str_len = 0 ;
471- zval * offset ;
484+ zval * offset = NULL ;
472485 int ret ;
473486 size_t len , off ;
474487 int error_display = MSGPACK_G (error_display );
@@ -484,20 +497,16 @@ static ZEND_METHOD(msgpack_unpacker, execute)
484497
485498 if (str != NULL )
486499 {
487- if (ZEND_NUM_ARGS () < 2 )
488- {
489- if (MSGPACK_G (error_display ))
490- {
491- zend_error (E_WARNING ,
492- "[msgpack] (MessagePackUnpacker::execute) "
493- "expects exactly 2 parameters" );
494- }
495- RETURN_FALSE ;
496- }
497-
498500 data = (char * )str ;
499501 len = (size_t )str_len ;
500- off = Z_LVAL_P (offset );
502+ if (offset != NULL )
503+ {
504+ off = Z_LVAL_P (offset );
505+ }
506+ else
507+ {
508+ off = 0 ;
509+ }
501510 }
502511 else
503512 {
@@ -538,7 +547,10 @@ static ZEND_METHOD(msgpack_unpacker, execute)
538547
539548 if (str != NULL )
540549 {
541- ZVAL_LONG (offset , off );
550+ if (offset != NULL )
551+ {
552+ ZVAL_LONG (offset , off );
553+ }
542554 }
543555 else
544556 {
@@ -560,11 +572,33 @@ static ZEND_METHOD(msgpack_unpacker, execute)
560572
561573static ZEND_METHOD (msgpack_unpacker , data )
562574{
575+ zval * object = NULL ;
563576 MSGPACK_UNPACKER_OBJECT ;
564577
578+ if (zend_parse_parameters (
579+ ZEND_NUM_ARGS () TSRMLS_CC , "|z" , & object ) == FAILURE )
580+ {
581+ return ;
582+ }
583+
565584 if (unpacker -> retval != NULL )
566585 {
567- ZVAL_ZVAL (return_value , unpacker -> retval , 1 , 0 );
586+ if (object == NULL )
587+ {
588+ ZVAL_ZVAL (return_value , unpacker -> retval , 1 , 0 );
589+ }
590+ else
591+ {
592+ zval * zv ;
593+
594+ ALLOC_INIT_ZVAL (zv );
595+ ZVAL_ZVAL (zv , unpacker -> retval , 1 , 0 );
596+
597+ if (msgpack_convert_object (return_value , object , & zv ) != SUCCESS )
598+ {
599+ RETURN_NULL ();
600+ }
601+ }
568602
569603 MSGPACK_METHOD (msgpack_unpacker , reset , NULL , getThis ());
570604
0 commit comments