forked from libgit2/php-git
-
Notifications
You must be signed in to change notification settings - Fork 0
/
signature.c
129 lines (106 loc) · 4.41 KB
/
signature.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
/*
* The MIT License
*
* Copyright (c) 2010 - 2012 Shuhei Tanuma
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
#include "php_git2.h"
#include <date/php_date.h>
#include <time.h>
PHPAPI zend_class_entry *git2_signature_class_entry;
inline void php_git2_create_signature(zval *object, char *name, int name_len, char *email, int email_len, zval *date TSRMLS_DC)
{
zval *r_timestamp,*r_offset, *z_name, *z_email = NULL;
php_git2_signature *m_signature;
long timestamp, offset = 0;
int error = 0;
MAKE_STD_ZVAL(z_name);
MAKE_STD_ZVAL(z_email);
ZVAL_STRINGL(z_name,name,name_len,1);
ZVAL_STRINGL(z_email,email,email_len,1);
add_property_zval_ex(object, "name", sizeof("name") ,z_name TSRMLS_CC);
add_property_zval_ex(object, "email",sizeof("email"),z_email TSRMLS_CC);
add_property_zval_ex(object, "time", sizeof("time") ,date TSRMLS_CC);
m_signature = PHP_GIT2_GET_OBJECT(php_git2_signature, object);
error = php_git2_call_user_function_v(&r_timestamp, date, "getTimeStamp", sizeof("getTimeStamp")-1, 0);
timestamp = Z_LVAL_P(r_timestamp);
php_git2_call_user_function_v(&r_offset, date, "getOffset", sizeof("getOffset")-1, 0);
offset = Z_LVAL_P(r_offset);
git_signature_new(&m_signature->signature, name,email,(git_time_t)timestamp,offset / 60);
zval_ptr_dtor(&r_timestamp);
zval_ptr_dtor(&r_offset);
zval_ptr_dtor(&z_email);
zval_ptr_dtor(&z_name);
}
static void php_git2_signature_free_storage(php_git2_signature *object TSRMLS_DC)
{
if (object->signature != NULL) {
git_signature_free(object->signature);
object->signature = NULL;
}
zend_object_std_dtor(&object->zo TSRMLS_CC);
efree(object);
}
zend_object_value php_git2_signature_new(zend_class_entry *ce TSRMLS_DC)
{
zend_object_value retval;
PHP_GIT2_STD_CREATE_OBJECT(php_git2_signature);
return retval;
}
ZEND_BEGIN_ARG_INFO_EX(arginfo_git2_signature___construct, 0,0,3)
ZEND_ARG_INFO(0, name)
ZEND_ARG_INFO(0, email)
ZEND_ARG_INFO(0, date)
ZEND_END_ARG_INFO()
/*
{{{ proto: Git2\Signature::__construct(string $name, string $email, \DateTime $time)
*/
PHP_METHOD(git2_signature, __construct)
{
char *name, *email;
int error, name_len, email_len = 0;
zval *date = NULL;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
"ssz", &name, &name_len, &email, &email_len, &date) == FAILURE) {
return;
}
if (!instanceof_function(Z_OBJCE_P(date), php_date_get_date_ce() TSRMLS_CC)) {
RETURN_FALSE;
}
//@memo
//error = php_git2_call_user_function_v(×tamp, date, "getTimeStamp", sizeof("getTimeStamp")-1, 0);
//zval_ptr_dtor(×tamp);
php_git2_create_signature(getThis(), name, name_len, email, email_len, date TSRMLS_CC);
}
/* }}} */
static zend_function_entry php_git2_signature_methods[] = {
PHP_ME(git2_signature, __construct, arginfo_git2_signature___construct, ZEND_ACC_PUBLIC | ZEND_ACC_CTOR)
{NULL,NULL,NULL}
};
void php_git2_signature_init(TSRMLS_D)
{
zend_class_entry ce;
INIT_NS_CLASS_ENTRY(ce, PHP_GIT2_NS, "Signature", php_git2_signature_methods);
git2_signature_class_entry = zend_register_internal_class(&ce TSRMLS_CC);
git2_signature_class_entry->create_object = php_git2_signature_new;
zend_declare_property_null(git2_signature_class_entry, "name", sizeof("name")-1, ZEND_ACC_PUBLIC TSRMLS_CC);
zend_declare_property_null(git2_signature_class_entry, "email", sizeof("email")-1, ZEND_ACC_PUBLIC TSRMLS_CC);
zend_declare_property_null(git2_signature_class_entry, "time", sizeof("time")-1, ZEND_ACC_PUBLIC TSRMLS_CC);
}