Skip to content

Commit bc7c243

Browse files
committed
php: added unpack of class object converter
1 parent 1d6d393 commit bc7c243

86 files changed

Lines changed: 14797 additions & 1453 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

ChangeLog

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
msgpack extension changelog
22

3+
Version 0.4.0
4+
-------------
5+
* Fix array pack.
6+
* Fix test code.
7+
* Add unpack of class object converter.
8+
39
Version 0.3.4
410
-------------
511
* Support PHP 5.3.x version on Windows.

config.m4

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ Make sure that the comment is aligned:
2222
[ --with-msgpack Include msgpack support])
2323

2424
if test "$PHP_MSGPACK" != "no"; then
25-
PHP_NEW_EXTENSION(msgpack, msgpack.c msgpack_pack.c msgpack_unpack.c msgpack_class.c, $ext_shared)
25+
PHP_NEW_EXTENSION(msgpack, msgpack.c msgpack_pack.c msgpack_unpack.c msgpack_class.c msgpack_convert.c, $ext_shared)
2626

2727
ifdef([PHP_INSTALL_HEADERS],
2828
[

config.w32

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,5 @@ ARG_ENABLE("msgpack", "for msgpack support", "yes");
55

66
if (PHP_MSGPACK != "no") {
77
EXTENSION("msgpack", "msgpack.c", PHP_MSGPACK_SHARED, "");
8-
ADD_SOURCES(configure_module_dirname, "msgpack_pack.c msgpack_unpack.c msgpack_class.c", "msgpack");
8+
ADD_SOURCES(configure_module_dirname, "msgpack_pack.c msgpack_unpack.c msgpack_class.c msgpack_convert.c", "msgpack");
99
}

msgpack.c

Lines changed: 29 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
#include "msgpack_pack.h"
1616
#include "msgpack_unpack.h"
1717
#include "msgpack_class.h"
18+
#include "msgpack_convert.h"
19+
#include "msgpack_errors.h"
1820
#include "msgpack/version.h"
1921

2022
static ZEND_FUNCTION(msgpack_serialize);
@@ -26,6 +28,7 @@ ZEND_END_ARG_INFO()
2628

2729
ZEND_BEGIN_ARG_INFO_EX(arginfo_msgpack_unserialize, 0, 0, 1)
2830
ZEND_ARG_INFO(0, str)
31+
ZEND_ARG_INFO(0, object)
2932
ZEND_END_ARG_INFO()
3033

3134
PHP_INI_BEGIN()
@@ -248,42 +251,26 @@ PHP_MSGPACK_API void php_msgpack_unserialize(
248251
switch (ret)
249252
{
250253
case MSGPACK_UNPACK_PARSE_ERROR:
251-
{
252254
msgpack_unserialize_var_destroy(&var_hash, 1);
253-
if (MSGPACK_G(error_display))
254-
{
255-
zend_error(E_WARNING,
256-
"[msgpack] (%s) Parse error", __FUNCTION__);
257-
}
255+
MSGPACK_WARNING("[msgpack] (%s) Parse error", __FUNCTION__);
258256
break;
259-
}
260257
case MSGPACK_UNPACK_CONTINUE:
261-
{
262258
msgpack_unserialize_var_destroy(&var_hash, 1);
263-
if (MSGPACK_G(error_display))
264-
{
265-
zend_error(E_WARNING,
266-
"[msgpack] (%s) Insufficient data for unserializing",
267-
__FUNCTION__);
268-
}
259+
MSGPACK_WARNING(
260+
"[msgpack] (%s) Insufficient data for unserializing",
261+
__FUNCTION__);
269262
break;
270-
}
271263
case MSGPACK_UNPACK_EXTRA_BYTES:
272264
case MSGPACK_UNPACK_SUCCESS:
273265
msgpack_unserialize_var_destroy(&var_hash, 0);
274-
if (off < (size_t)str_len && MSGPACK_G(error_display))
266+
if (off < (size_t)str_len)
275267
{
276-
zend_error(E_WARNING,
277-
"[msgpack] (%s) Extra bytes", __FUNCTION__);
268+
MSGPACK_WARNING("[msgpack] (%s) Extra bytes", __FUNCTION__);
278269
}
279270
break;
280271
default:
281272
msgpack_unserialize_var_destroy(&var_hash, 0);
282-
if (MSGPACK_G(error_display))
283-
{
284-
zend_error(E_WARNING,
285-
"[msgpack] (%s) Unknown result", __FUNCTION__);
286-
}
273+
MSGPACK_WARNING("[msgpack] (%s) Unknown result", __FUNCTION__);
287274
break;
288275
}
289276
}
@@ -310,9 +297,11 @@ static ZEND_FUNCTION(msgpack_unserialize)
310297
{
311298
char *str;
312299
int str_len;
300+
zval *object = NULL;
313301

314302
if (zend_parse_parameters(
315-
ZEND_NUM_ARGS() TSRMLS_CC, "s", &str, &str_len) == FAILURE)
303+
ZEND_NUM_ARGS() TSRMLS_CC, "s|z",
304+
&str, &str_len, &object) == FAILURE)
316305
{
317306
return;
318307
}
@@ -322,5 +311,20 @@ static ZEND_FUNCTION(msgpack_unserialize)
322311
RETURN_NULL();
323312
}
324313

325-
php_msgpack_unserialize(return_value, str, str_len TSRMLS_CC);
314+
if (object == NULL)
315+
{
316+
php_msgpack_unserialize(return_value, str, str_len TSRMLS_CC);
317+
}
318+
else
319+
{
320+
zval *zv;
321+
322+
ALLOC_INIT_ZVAL(zv);
323+
php_msgpack_unserialize(zv, str, str_len TSRMLS_CC);
324+
325+
if (msgpack_convert_object(return_value, object, &zv) != SUCCESS)
326+
{
327+
RETURN_NULL();
328+
}
329+
}
326330
}

msgpack_class.c

Lines changed: 63 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
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

911
typedef struct {
1012
zend_object object;
@@ -96,6 +98,7 @@ ZEND_END_ARG_INFO()
9698

9799
ZEND_BEGIN_ARG_INFO_EX(arginfo_msgpack_base_unpack, 0, 0, 1)
98100
ZEND_ARG_INFO(0, str)
101+
ZEND_ARG_INFO(0, object)
99102
ZEND_END_ARG_INFO()
100103

101104
ZEND_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)
144147
ZEND_END_ARG_INFO()
145148

146149
ZEND_BEGIN_ARG_INFO_EX(arginfo_msgpack_unpacker_data, 0, 0, 0)
150+
ZEND_ARG_INFO(0, object)
147151
ZEND_END_ARG_INFO()
148152

149153
ZEND_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

561573
static 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

Comments
 (0)