Skip to content

Commit

Permalink
yaf_route_simple_assemble complete
Browse files Browse the repository at this point in the history
  • Loading branch information
zxcvdavid committed Sep 5, 2012
1 parent b23a97d commit ff95ac1
Show file tree
Hide file tree
Showing 9 changed files with 188 additions and 4 deletions.
6 changes: 6 additions & 0 deletions routes/interface.c
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,11 @@
YAF_BEGIN_ARG_INFO_EX(yaf_route_route_arginfo, 0, 0, 1)
YAF_ARG_INFO(0, request)
YAF_END_ARG_INFO()

YAF_BEGIN_ARG_INFO_EX(yaf_route_assemble_arginfo, 0, 0, 1)
YAF_ARG_INFO(0, mvc)
YAF_ARG_INFO(0, query)
YAF_END_ARG_INFO()
/* }}} */

zend_class_entry *yaf_route_ce;
Expand Down Expand Up @@ -138,6 +143,7 @@ yaf_route_t * yaf_route_instance(yaf_route_t *this_ptr, zval *config TSRMLS_DC)
*/
zend_function_entry yaf_route_methods[] = {
PHP_ABSTRACT_ME(yaf_route, route, yaf_route_route_arginfo)
PHP_ABSTRACT_ME(yaf_route, assemble, yaf_route_assemble_arginfo)
{NULL, NULL, NULL}
};
/* }}} */
Expand Down
8 changes: 8 additions & 0 deletions routes/map.c
Original file line number Diff line number Diff line change
Expand Up @@ -159,11 +159,19 @@ PHP_METHOD(yaf_route_map, __construct) {
}
/* }}} */

/** {{{ proto public Yaf_Route_Map::assemble(array $mvc[, array $query = NULL])
*/
PHP_METHOD(yaf_route_map, assemble) {

}
/* }}} */

/** {{{ yaf_route_map_methods
*/
zend_function_entry yaf_route_map_methods[] = {
PHP_ME(yaf_route_map, __construct, yaf_route_map_construct_arginfo, ZEND_ACC_PUBLIC|ZEND_ACC_CTOR)
PHP_ME(yaf_route_map, route, yaf_route_route_arginfo, ZEND_ACC_PUBLIC)
PHP_ME(yaf_route_map, assemble, yaf_route_assemble_arginfo, ZEND_ACC_PUBLIC)
{NULL, NULL, NULL}
};
/* }}} */
Expand Down
8 changes: 8 additions & 0 deletions routes/regex.c
Original file line number Diff line number Diff line change
Expand Up @@ -232,11 +232,19 @@ PHP_METHOD(yaf_route_regex, __construct) {
}
/** }}} */

/** {{{ proto public Yaf_Route_regex::assemble(array $mvc[, array $query = NULL])
*/
PHP_METHOD(yaf_route_regex, assemble) {

}
/* }}} */

/** {{{ yaf_route_regex_methods
*/
zend_function_entry yaf_route_regex_methods[] = {
PHP_ME(yaf_route_regex, __construct, yaf_route_regex_construct_arginfo, ZEND_ACC_PUBLIC|ZEND_ACC_CTOR)
PHP_ME(yaf_route_regex, route, yaf_route_route_arginfo, ZEND_ACC_PUBLIC)
PHP_ME(yaf_route_regex, assemble, yaf_route_assemble_arginfo, ZEND_ACC_PUBLIC)
{NULL, NULL, NULL}
};
/* }}} */
Expand Down
8 changes: 8 additions & 0 deletions routes/rewrite.c
Original file line number Diff line number Diff line change
Expand Up @@ -287,11 +287,19 @@ PHP_METHOD(yaf_route_rewrite, __construct) {
}
/** }}} */

/** {{{ proto public Yaf_Route_rewrite::assemble(array $mvc[, array $query = NULL])
*/
PHP_METHOD(yaf_route_rewrite, assemble) {

}
/* }}} */

/** {{{ yaf_route_rewrite_methods
*/
zend_function_entry yaf_route_rewrite_methods[] = {
PHP_ME(yaf_route_rewrite, __construct, yaf_route_rewrite_construct_arginfo, ZEND_ACC_PUBLIC|ZEND_ACC_CTOR)
PHP_ME(yaf_route_rewrite, route, yaf_route_route_arginfo, ZEND_ACC_PUBLIC)
PHP_ME(yaf_route_rewrite, assemble, yaf_route_assemble_arginfo, ZEND_ACC_PUBLIC)
{NULL, NULL, NULL}
};
/* }}} */
Expand Down
101 changes: 101 additions & 0 deletions routes/simple.c
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,91 @@ yaf_route_t * yaf_route_simple_instance(yaf_route_t *this_ptr, zval *module, zva
}
/* }}} */

/** {{{ zval * yaf_route_simple_assemble(zval *mvc, zval *query TSRMLS_DC)
*/
zval * yaf_route_simple_assemble(yaf_route_t *this_ptr, zval *mvc, zval *query TSRMLS_DC) {
char *tvalue;
zval *nmodule, *ncontroller, *naction;
zval *uri;

MAKE_STD_ZVAL(uri);
tvalue = emalloc(sizeof("?"));
tvalue[0] = '\0';
strncat(tvalue, "?", strlen("?"));

nmodule = zend_read_property(yaf_route_simple_ce, this_ptr, ZEND_STRL(YAF_ROUTE_SIMPLE_VAR_NAME_MODULE), 1 TSRMLS_CC);
ncontroller = zend_read_property(yaf_route_simple_ce, this_ptr, ZEND_STRL(YAF_ROUTE_SIMPLE_VAR_NAME_CONTROLLER), 1 TSRMLS_CC);
naction = zend_read_property(yaf_route_simple_ce, this_ptr, ZEND_STRL(YAF_ROUTE_SIMPLE_VAR_NAME_ACTION), 1 TSRMLS_CC);

do {
zval **tmp;
char tsprintf[1024];
uint tlen;

if (zend_hash_find(Z_ARRVAL_P(mvc), ZEND_STRS(YAF_ROUTE_SIMPLE_VAR_NAME_MODULE), (void **)&tmp) == SUCCESS) {
tlen = strlen("=&") + Z_STRLEN_P(nmodule) + Z_STRLEN_PP(tmp);
tlen = snprintf(tsprintf, tlen + 1, "%s=%s&", Z_STRVAL_P(nmodule), Z_STRVAL_PP(tmp));
if (tlen) {
tvalue = erealloc(tvalue, strlen(tvalue) + tlen + 1);
strncat(tvalue, tsprintf, strlen(tsprintf));
}
}

if (zend_hash_find(Z_ARRVAL_P(mvc), ZEND_STRS(YAF_ROUTE_SIMPLE_VAR_NAME_CONTROLLER), (void **)&tmp) == FAILURE) {
yaf_trigger_error(YAF_ERR_TYPE_ERROR TSRMLS_CC, "%s", "You need to specify the controller");
break;
}

tlen = strlen("=&") + Z_STRLEN_P(ncontroller) + Z_STRLEN_PP(tmp);
tlen = snprintf(tsprintf, tlen + 1, "%s=%s&", Z_STRVAL_P(ncontroller), Z_STRVAL_PP(tmp));
if (tlen) {
tvalue = erealloc(tvalue, strlen(tvalue) + tlen + 1);
strncat(tvalue, tsprintf, strlen(tsprintf));
}

if(zend_hash_find(Z_ARRVAL_P(mvc), ZEND_STRS(YAF_ROUTE_SIMPLE_VAR_NAME_ACTION), (void **)&tmp) == FAILURE) {
yaf_trigger_error(YAF_ERR_TYPE_ERROR TSRMLS_CC, "%s", "You need to specify the action");
break;
}

tlen = strlen("=") + Z_STRLEN_P(naction) + Z_STRLEN_PP(tmp);
tlen = snprintf(tsprintf, tlen + 1, "%s=%s", Z_STRVAL_P(naction), Z_STRVAL_PP(tmp));
if (tlen) {
tvalue = erealloc(tvalue, strlen(tvalue) + tlen + 1);
strncat(tvalue, tsprintf, strlen(tsprintf));
}

if ( IS_ARRAY == Z_TYPE_P(query)) {
uint key_type, key_len;
char *key;
ulong key_idx;

for (zend_hash_internal_pointer_reset(Z_ARRVAL_P(query));
zend_hash_get_current_data(Z_ARRVAL_P(query), (void **)&tmp) == SUCCESS;
zend_hash_move_forward(Z_ARRVAL_P(query))) {

if (IS_STRING == Z_TYPE_PP(tmp)
&& HASH_KEY_IS_STRING == zend_hash_get_current_key_ex(Z_ARRVAL_P(query), &key, &key_len, &key_idx, 0, NULL)) {

tlen = strlen("=&") + key + Z_STRLEN_PP(tmp);
tlen = snprintf(tsprintf, tlen + 1, "&%s=%s", key, Z_STRVAL_PP(tmp));
if (tlen) {
tvalue = erealloc(tvalue, strlen(tvalue) + tlen + 1);
strncat(tvalue, tsprintf, strlen(tsprintf));
}
}
}
}

ZVAL_STRING(uri, tvalue, 0);
return uri;
} while (0);

efree(tvalue);
ZVAL_NULL(uri);
return uri;
}

/** {{{ proto public Yaf_Route_Simple::route(Yaf_Request $req)
*/
PHP_METHOD(yaf_route_simple, route) {
Expand Down Expand Up @@ -114,11 +199,27 @@ PHP_METHOD(yaf_route_simple, __construct) {
}
/* }}} */

/** {{{ proto public Yaf_Route_Simple::assemble(array $mvc[, array $query = NULL])
*/
PHP_METHOD(yaf_route_simple, assemble) {
zval *mvc, *query;
zval *return_uri;

if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z|z", &mvc, &query) == FAILURE) {
return;
} else {
return_uri = yaf_route_simple_assemble(getThis(), mvc, query TSRMLS_CC);
RETURN_ZVAL(return_uri, 1, 0);
}
}
/* }}} */

/** {{{ yaf_route_simple_methods
*/
zend_function_entry yaf_route_simple_methods[] = {
PHP_ME(yaf_route_simple, __construct, yaf_route_simple_construct_arginfo, ZEND_ACC_PUBLIC|ZEND_ACC_CTOR)
PHP_ME(yaf_route_simple, route, yaf_route_route_arginfo, ZEND_ACC_PUBLIC)
PHP_ME(yaf_route_simple, assemble, yaf_route_assemble_arginfo, ZEND_ACC_PUBLIC)
{NULL, NULL, NULL}
};
/* }}} */
Expand Down
8 changes: 8 additions & 0 deletions routes/static.c
Original file line number Diff line number Diff line change
Expand Up @@ -182,11 +182,19 @@ PHP_METHOD(yaf_route_static, match) {
}
/* }}} */

/** {{{ proto public Yaf_Route_Static::assemble(array $mvc[, array $query = NULL])
*/
PHP_METHOD(yaf_route_static, assemble) {

}
/* }}} */

/** {{{ yaf_route_static_methods
*/
zend_function_entry yaf_route_static_methods[] = {
PHP_ME(yaf_route_static, match, yaf_route_static_match_arginfo, ZEND_ACC_PUBLIC)
PHP_ME(yaf_route_static, route, yaf_route_route_arginfo, ZEND_ACC_PUBLIC)
PHP_ME(yaf_route_static, assemble, yaf_route_assemble_arginfo, ZEND_ACC_PUBLIC)
{NULL, NULL, NULL}
};
/* }}} */
Expand Down
8 changes: 8 additions & 0 deletions routes/supervar.c
Original file line number Diff line number Diff line change
Expand Up @@ -101,11 +101,19 @@ PHP_METHOD(yaf_route_supervar, __construct) {
}
/** }}} */

/** {{{ proto public Yaf_Route_Supervar::assemble(array $mvc[, array $query = NULL])
*/
PHP_METHOD(yaf_route_supervar, assemble) {

}
/* }}} */

/** {{{ yaf_route_supervar_methods
*/
zend_function_entry yaf_route_supervar_methods[] = {
PHP_ME(yaf_route_supervar, __construct, yaf_route_supervar_construct_arginfo, ZEND_ACC_PUBLIC|ZEND_ACC_CTOR)
PHP_ME(yaf_route_supervar, route, yaf_route_route_arginfo, ZEND_ACC_PUBLIC)
PHP_ME(yaf_route_supervar, assemble, yaf_route_assemble_arginfo, ZEND_ACC_PUBLIC)
{NULL, NULL, NULL}
};
/* }}} */
Expand Down
27 changes: 27 additions & 0 deletions tests/051.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
--TEST--
Check for Yaf_Route_Simple::assemble
--SKIPIF--
<?php if (!extension_loaded("yaf")) print "skip"; ?>
--FILE--
<?php

$router = new Yaf_Router();

$route = new Yaf_Route_Simple('m', 'c', 'a');

$router->addRoute("simple", $route);

var_dump($router->getRoute('simple')->assemble(
array(
'action' => 'yafaction',
'tkey' => 'tval',
'controller' => 'yafcontroller',
'module' => 'yafmodule'
),
array(
'tkey1' => 'tval1',
'tkey2' => 'tval2'
)
));
--EXPECTF--
string(64) "?m=yafmodule&c=yafcontroller&a=yafaction&tkey1=tval1&tkey2=tval2"
18 changes: 14 additions & 4 deletions yaf_response.c
Original file line number Diff line number Diff line change
Expand Up @@ -223,10 +223,15 @@ zval * yaf_response_get_body(yaf_response_t *response, char *name, uint name_len
/** {{{ int yaf_response_send(yaf_response_t *response TSRMLS_DC)
*/
int yaf_response_send(yaf_response_t *response TSRMLS_DC) {
zval *body = yaf_response_get_body(response, NULL, 0 TSRMLS_CC);
zval **val;

if (body) {
php_write(Z_STRVAL_P(body), Z_STRLEN_P(body) TSRMLS_CC);
zval *zbody = zend_read_property(yaf_response_ce, response, ZEND_STRL(YAF_RESPONSE_PROPERTY_NAME_BODY), 1 TSRMLS_CC);

zend_hash_internal_pointer_reset(Z_ARRVAL_P(zbody));
while (SUCCESS == zend_hash_get_current_data(Z_ARRVAL_P(zbody), (void**)&val)) {
convert_to_string_ex(val);
php_write(Z_STRVAL_PP(val), Z_STRLEN_PP(val) TSRMLS_CC);
zend_hash_move_forward(Z_ARRVAL_P(zbody));
}

return 1;
Expand Down Expand Up @@ -403,7 +408,12 @@ PHP_METHOD(yaf_response, response) {
/** {{{ proto public Yaf_Response_Abstract::__toString(void)
*/
PHP_METHOD(yaf_response, __toString) {
PHP_MN(yaf_response_getBody)(INTERNAL_FUNCTION_PARAM_PASSTHRU);
zval delim;
zval *zbody = zend_read_property(yaf_response_ce, getThis(), ZEND_STRL(YAF_RESPONSE_PROPERTY_NAME_BODY), 1 TSRMLS_CC);

ZVAL_EMPTY_STRING(&delim);
php_implode(&delim, zbody, return_value TSRMLS_CC);
zval_dtor(&delim);
}
/* }}} */

Expand Down

0 comments on commit ff95ac1

Please sign in to comment.