22#include "php_git2_priv.h"
33#include "packbuilder.h"
44
5+ static int php_git2_git_packbuilder_progress (
6+ int stage ,
7+ unsigned int current ,
8+ unsigned int total ,
9+ void * payload )
10+ {
11+ php_git2_t * result ;
12+ zval * param_stage = NULL , * param_current = NULL , * param_total = NULL , * retval_ptr = NULL ;
13+ php_git2_cb_t * p = (php_git2_cb_t * )payload ;
14+ int i = 0 ;
15+ long retval = 0 ;
16+ GIT2_TSRMLS_SET (p -> tsrm_ls )
17+
18+ Z_ADDREF_P (p -> payload );
19+ MAKE_STD_ZVAL (param_stage );
20+ MAKE_STD_ZVAL (param_current );
21+ MAKE_STD_ZVAL (param_total );
22+ ZVAL_LONG (param_stage , stage );
23+ ZVAL_LONG (param_current , current );
24+ ZVAL_LONG (param_total , total );
25+
26+ if (php_git2_call_function_v (p -> fci , p -> fcc TSRMLS_CC , & retval_ptr , 4 ,
27+ & param_stage , & param_current , & param_total , & p -> payload )) {
28+ return GIT_EUSER ;
29+ }
30+
31+ if (retval_ptr ) {
32+ retval = Z_LVAL_P (retval_ptr );
33+ zval_ptr_dtor (& retval_ptr );
34+ }
35+ return retval ;
36+ }
37+
38+ static int php_git2_git_packbuilder_foreach_cb (void * buf , size_t size , void * payload )
39+ {
40+ php_git2_t * result ;
41+ zval * param_buf = NULL , * param_size = NULL , * retval_ptr = NULL ;
42+ php_git2_cb_t * p = (php_git2_cb_t * )payload ;
43+ int i = 0 ;
44+ long retval = 0 ;
45+ GIT2_TSRMLS_SET (p -> tsrm_ls )
46+
47+ Z_ADDREF_P (p -> payload );
48+ MAKE_STD_ZVAL (param_buf );
49+ MAKE_STD_ZVAL (param_size );
50+ ZVAL_STRINGL (param_buf , buf , size , 1 );
51+ ZVAL_LONG (param_size , size );
52+
53+ if (php_git2_call_function_v (p -> fci , p -> fcc TSRMLS_CC , & retval_ptr , 3 ,
54+ & param_buf , & param_size , & p -> payload )) {
55+ return GIT_EUSER ;
56+ }
57+
58+ if (retval_ptr ) {
59+ retval = Z_LVAL_P (retval_ptr );
60+ zval_ptr_dtor (& retval_ptr );
61+ }
62+ return retval ;
63+ }
64+
65+
66+ static int php_git2_git_transfer_progress_callback (const git_transfer_progress * stats , void * payload )
67+ {
68+ php_git2_t * result ;
69+ zval * param_stats = NULL , * retval_ptr = NULL ;
70+ php_git2_cb_t * p = (php_git2_cb_t * )payload ;
71+ int i = 0 ;
72+ long retval = 0 ;
73+ GIT2_TSRMLS_SET (p -> tsrm_ls )
74+
75+ Z_ADDREF_P (p -> payload );
76+ php_git2_git_transfer_progress_to_array (stats , & param_stats TSRMLS_CC );
77+
78+
79+ if (php_git2_call_function_v (p -> fci , p -> fcc TSRMLS_CC , & retval_ptr , 2 ,
80+ & param_stats , & p -> payload )) {
81+ return GIT_EUSER ;
82+ }
83+
84+ if (retval_ptr ) {
85+ retval = Z_LVAL_P (retval_ptr );
86+ zval_ptr_dtor (& retval_ptr );
87+ }
88+ return retval ;
89+ }
90+
591/* {{{ proto resource git_packbuilder_new(resource $repo)
692 */
793PHP_FUNCTION (git_packbuilder_new )
@@ -142,7 +228,7 @@ PHP_FUNCTION(git_packbuilder_write)
142228 if (php_git2_cb_init (& cb , & fci , & fcc , progress_cb_payload TSRMLS_CC )) {
143229 RETURN_FALSE ;
144230 }
145- // result = git_packbuilder_write(PHP_GIT2_V(_pb, packbuilder), path, mode, <CHANGEME> , cb);
231+ result = git_packbuilder_write (PHP_GIT2_V (_pb , packbuilder ), path , mode , php_git2_git_transfer_progress_callback , cb );
146232 php_git2_cb_free (cb );
147233 RETURN_LONG (result );
148234}
@@ -169,6 +255,7 @@ PHP_FUNCTION(git_packbuilder_hash)
169255}
170256/* }}} */
171257
258+
172259/* {{{ proto long git_packbuilder_foreach(resource $pb, Callable $cb, $payload)
173260 */
174261PHP_FUNCTION (git_packbuilder_foreach )
@@ -189,7 +276,7 @@ PHP_FUNCTION(git_packbuilder_foreach)
189276 if (php_git2_cb_init (& cb , & fci , & fcc , payload TSRMLS_CC )) {
190277 RETURN_FALSE ;
191278 }
192- // result = git_packbuilder_foreach(PHP_GIT2_V(_pb, packbuilder), <CHANGEME> , cb);
279+ result = git_packbuilder_foreach (PHP_GIT2_V (_pb , packbuilder ), php_git2_git_packbuilder_foreach_cb , cb );
193280 php_git2_cb_free (cb );
194281 RETURN_LONG (result );
195282}
@@ -240,8 +327,8 @@ PHP_FUNCTION(git_packbuilder_set_callbacks)
240327 int result = 0 , error = 0 ;
241328 zval * pb = NULL , * progress_cb = NULL , * progress_cb_payload = NULL ;
242329 php_git2_t * _pb = NULL ;
243- zend_fcall_info fci = empty_fcall_info ;
244- zend_fcall_info_cache fcc = empty_fcall_info_cache ;
330+ zend_fcall_info fci = empty_fcall_info , * _fci ;
331+ zend_fcall_info_cache fcc = empty_fcall_info_cache , * _fcc ;
245332 php_git2_cb_t * cb = NULL ;
246333
247334 if (zend_parse_parameters (ZEND_NUM_ARGS () TSRMLS_CC ,
@@ -250,11 +337,16 @@ PHP_FUNCTION(git_packbuilder_set_callbacks)
250337 }
251338
252339 ZEND_FETCH_RESOURCE (_pb , php_git2_t * , & pb , -1 , PHP_GIT2_RESOURCE_NAME , git2_resource_handle );
253- if (php_git2_cb_init (& cb , & fci , & fcc , progress_cb_payload TSRMLS_CC )) {
340+ _fci = emalloc (sizeof (zend_fcall_info ));
341+ _fcc = emalloc (sizeof (zend_fcall_info_cache ));
342+ memcpy (_fci , & fci , sizeof (zend_fcall_info ));
343+ memcpy (_fcc , & fcc , sizeof (zend_fcall_info_cache ));
344+
345+ /* TODO(chobie): free memory when the resource removed */
346+ if (php_git2_cb_init (& cb , & _fci , & _fcc , progress_cb_payload TSRMLS_CC )) {
254347 RETURN_FALSE ;
255348 }
256- //result = git_packbuilder_set_callbacks(PHP_GIT2_V(_pb, packbuilder), <CHANGEME>, cb);
257- php_git2_cb_free (cb );
349+ result = git_packbuilder_set_callbacks (PHP_GIT2_V (_pb , packbuilder ), php_git2_git_packbuilder_progress , cb );
258350 RETURN_LONG (result );
259351}
260352/* }}} */
0 commit comments