2
2
#include "php_git2_priv.h"
3
3
#include "packbuilder.h"
4
4
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
+
5
91
/* {{{ proto resource git_packbuilder_new(resource $repo)
6
92
*/
7
93
PHP_FUNCTION (git_packbuilder_new )
@@ -142,7 +228,7 @@ PHP_FUNCTION(git_packbuilder_write)
142
228
if (php_git2_cb_init (& cb , & fci , & fcc , progress_cb_payload TSRMLS_CC )) {
143
229
RETURN_FALSE ;
144
230
}
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 );
146
232
php_git2_cb_free (cb );
147
233
RETURN_LONG (result );
148
234
}
@@ -169,6 +255,7 @@ PHP_FUNCTION(git_packbuilder_hash)
169
255
}
170
256
/* }}} */
171
257
258
+
172
259
/* {{{ proto long git_packbuilder_foreach(resource $pb, Callable $cb, $payload)
173
260
*/
174
261
PHP_FUNCTION (git_packbuilder_foreach )
@@ -189,7 +276,7 @@ PHP_FUNCTION(git_packbuilder_foreach)
189
276
if (php_git2_cb_init (& cb , & fci , & fcc , payload TSRMLS_CC )) {
190
277
RETURN_FALSE ;
191
278
}
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 );
193
280
php_git2_cb_free (cb );
194
281
RETURN_LONG (result );
195
282
}
@@ -240,8 +327,8 @@ PHP_FUNCTION(git_packbuilder_set_callbacks)
240
327
int result = 0 , error = 0 ;
241
328
zval * pb = NULL , * progress_cb = NULL , * progress_cb_payload = NULL ;
242
329
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 ;
245
332
php_git2_cb_t * cb = NULL ;
246
333
247
334
if (zend_parse_parameters (ZEND_NUM_ARGS () TSRMLS_CC ,
@@ -250,11 +337,16 @@ PHP_FUNCTION(git_packbuilder_set_callbacks)
250
337
}
251
338
252
339
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 )) {
254
347
RETURN_FALSE ;
255
348
}
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 );
258
350
RETURN_LONG (result );
259
351
}
260
352
/* }}} */
0 commit comments