예제 #1
0
//=================================================================================================
//	HTTP action object definition
//
static tsk_object_t* thttp_action_ctor(tsk_object_t * self, va_list * app)
{
	thttp_action_t *action = self;
	if(action){
		va_list* app_2;
		thttp_action_param_type_t curr;

		action->type = va_arg(*app, thttp_action_type_t);
		action->url = tsk_strdup(va_arg(*app, const char*));
		action->method = tsk_strdup(va_arg(*app, const char*));
		app_2 = va_arg(*app, va_list*);	

		action->options = tsk_list_create();
		action->headers = tsk_list_create();

		if(!app_2){ /* XCAP stack will pass null va_list */
			goto bail;
		}

		while((curr = va_arg(*app_2, thttp_action_param_type_t)) != thttp_aptype_null){
			switch(curr){
				case thttp_aptype_option:
					{	/* (thttp_action_option_t)ID_ENUM, (const char*)VALUE_STR */
						thttp_action_option_t id = va_arg(*app_2, thttp_action_option_t);
						const char* value = va_arg(*app_2, const char *);
						tsk_options_add_option(&action->options, id, value);
						break;
					}

				case thttp_aptype_header:
					{	/* (const char*)NAME_STR, (const char*)VALUE_STR */
						const char* name = va_arg(*app_2, const char *);
						const char* value = va_arg(*app_2, const char *);
						tsk_params_add_param(&action->headers, name, value);
						break;
					}

				case thttp_aptype_payload:
					{	/* (const void*)PAY_PTR, (tsk_size_t)PAY_SIZE */
						const void* payload = va_arg(*app_2, const void *);
						tsk_size_t size = va_arg(*app_2, tsk_size_t);
						if(payload && size){
							TSK_OBJECT_SAFE_FREE(action->payload);
							action->payload = tsk_buffer_create(payload, size);
						}
						break;
					}

				default:
					{	/* va_list will be unsafe ==> exit */
						TSK_DEBUG_ERROR("NOT SUPPORTED.");
						goto bail;
					}
			} /* switch */
		} /* while */
	}
bail:
	return self;
}
예제 #2
0
int tsk_params_add_param_2(tsk_params_L_t **self, const tsk_param_t* param)
{
	if(!self || !param || !param){
		TSK_DEBUG_ERROR("Invalid parameter");
		return -1;
	}

	return tsk_params_add_param(self, param->name, param->value);
}
예제 #3
0
/** internal fuction used to config a SIP action */
int _tsip_action_set(tsip_action_handle_t* self, va_list* app)
{
	tsip_action_param_type_t curr;
	tsip_action_t* action = self;
	
	if(!action){ /* Nothing to do */
		return 0;
	}
	
	while((curr = va_arg(*app, tsip_action_param_type_t)) != aptype_null){

		switch(curr){
				case aptype_header:
					{	/* (const char*)NAME_STR, (const char*)VALUE_STR */
						const char* name = va_arg(*app, const char *);
						const char* value = va_arg(*app, const char *);

						tsk_params_add_param(&action->headers, name, value);
						break;
					}
				case aptype_config:
					{ /* (const tsip_action_handle_t*)ACTION_CONFIG_HANDLE */
						const tsip_action_t* handle = va_arg(*app, const tsip_action_handle_t *);
						if(handle && handle->type == tsip_atype_config){
							/* Copy headers */
							if(!TSK_LIST_IS_EMPTY(handle->headers)){
								tsk_list_pushback_list(action->headers, handle->headers);
							}
							/* Copy payload */
							if(handle->payload && handle->payload->data && handle->payload->size){
								TSK_OBJECT_SAFE_FREE(action->payload);
								action->payload = tsk_buffer_create(handle->payload->data, handle->payload->size);
							}
							/* Copy resp line */
							action->line_resp.code = handle->line_resp.code;
							tsk_strupdate(&action->line_resp.phrase, handle->line_resp.phrase);
							/* Copy media params */
							if(!TSK_LIST_IS_EMPTY(handle->media.params)){ 
								if(!action->media.params){
									action->media.params = tmedia_params_create();
								}
								tsk_list_pushback_list(action->media.params, handle->media.params);
							}
						}
						else if(handle){ /* Only invalid type should cause error */
							TSK_DEBUG_ERROR("Invalid action configuration handle.");
							return -2;
						}
						break;
					}
				case aptype_payload:
					{	/* (const void*)PAY_PTR, (tsk_size_t)PAY_SIZE */
						const void* payload = va_arg(*app, const void *);
						tsk_size_t size = va_arg(*app, tsk_size_t);
						if(payload && size){
							TSK_OBJECT_SAFE_FREE(action->payload);
							action->payload = tsk_buffer_create(payload, size);
						}
						break;
					}
				
				case aptype_resp_line:
					{	/* (int32_t)CODE_INT, (const char*)PHRASE_STR */
						int32_t code = va_arg(*app, int32_t);
						const char* phrase = va_arg(*app, const void *);
						action->line_resp.code = (short)code;
						tsk_strupdate(&action->line_resp.phrase, phrase);
						break;
					}

				case aptype_media:
					{	/* ... */
						tmedia_params_L_t* params;
						if((params = tmedia_params_create_2(app))){
							if(action->media.params){
								tsk_list_pushback_list(action->media.params, params);
							}
							else{
								action->media.params = tsk_object_ref(params);
							}
							TSK_OBJECT_SAFE_FREE(params);
						}
						break;
					}

				default:
					{	/* va_list will be unsafe ==> exit */
						TSK_DEBUG_ERROR("NOT SUPPORTED.");
						return -3;
					}
		} /* switch */
	} /* while */

	return 0;
}
예제 #4
0
파일: txcap.c 프로젝트: NewComerBH/doubango
/** Internal function used to set options.
*/
int __txcap_stack_set(txcap_stack_t* self, va_list *app)
{
	txcap_stack_param_type_t curr;
	tsk_bool_t cred_updated = tsk_false;

	if(!self || !self->http_session){
		return -1;
	}

	while((curr = va_arg(*app, txcap_stack_param_type_t)) != xcapp_null){
		switch(curr){
			case xcapp_option:
				{	/* (txcap_stack_option_t)ID_ENUM, (const char*)VALUE_STR */
					txcap_stack_option_t ID_ENUM = va_arg(*app, txcap_stack_option_t);
					const char* VALUE_STR = va_arg(*app, const char*);
					switch(ID_ENUM){
						case TXCAP_STACK_OPTION_ROOT:
							{
								tsk_strupdate(&self->xcap_root, VALUE_STR);
								break;
							}
						/* PASSWORD and XUI are not used as options in the HTTP/HTTPS stack */
						case TXCAP_STACK_OPTION_PASSWORD:
							{
								tsk_strupdate(&self->password, VALUE_STR);
								cred_updated = tsk_true;
								break;
							}
						case TXCAP_STACK_OPTION_XUI:
							{
								tsk_strupdate(&self->xui, VALUE_STR);
								cred_updated = tsk_true;
								break;
							}
						case TXCAP_STACK_OPTION_LOCAL_IP:
							{
								thttp_stack_set(self->http_stack, THTTP_STACK_SET_LOCAL_IP(VALUE_STR),
									THTTP_STACK_SET_NULL());
								break;
							}
						case TXCAP_STACK_OPTION_LOCAL_PORT:
							{
								int port = atoi(VALUE_STR);
								thttp_stack_set(self->http_stack, THTTP_STACK_SET_LOCAL_PORT(port),
									THTTP_STACK_SET_NULL());
								break;
							}
						default:
							{ /* HTTP Options: MUST be changed to valid HTTP option enum */
								switch(ID_ENUM){
									case TXCAP_STACK_OPTION_TIMEOUT:
										tsk_options_add_option(&((thttp_session_t*)self->http_session)->options, THTTP_SESSION_OPTION_TIMEOUT, VALUE_STR);
										break;
									case TXCAP_STACK_OPTION_TTL:
										tsk_options_add_option(&((thttp_session_t*)self->http_session)->options, THTTP_SESSION_OPTION_TTL, VALUE_STR);
										break;
									default:
										TSK_DEBUG_WARN("%d is an invalid XCAP option", ID_ENUM);
										break;
								}
								
								break;
							}
					}
					break;
				}
			
			case xcapp_header:
				{	/* (const char*)NAME_STR, (const char*)VALUE_STR */
					const char* NAME_STR = va_arg(*app, const char*);
					const char* VALUE_STR = va_arg(*app, const char*);
					if(VALUE_STR == (const char*)-1){
						tsk_params_remove_param(((thttp_session_t*)self->http_session)->headers, NAME_STR);
					}
					else{
						tsk_params_add_param(&((thttp_session_t*)self->http_session)->headers, NAME_STR, VALUE_STR);
					}
					break;
				}
			
			case xcapp_userdata:
				{	/* (const void*)CTX_PTR */
					const void* CTX_PTR = va_arg(*app, const void*);
					((thttp_session_t*)self->http_session)->userdata = CTX_PTR;
					break;
				}

			case xcapp_auid:
				{	/* (const char*)ID_STR, (const char*)MIME_TYPE_STR, (const char*)NS_STR, (const char*)DOC_NAME_STR, (tsk_bool_t)IS_GLOBAL_BOOL */
					const char* ID_STR = va_arg(*app, const char*);
					const char* MIME_TYPE_STR = va_arg(*app, const char*);
					const char* NS_STR = va_arg(*app, const char*);
					const char* DOC_NAME_STR = va_arg(*app, const char*);
					tsk_bool_t IS_GLOBAL_BOOL = va_arg(*app, tsk_bool_t);
					
					if(txcap_auid_register(self->auids, ID_STR, MIME_TYPE_STR, NS_STR, DOC_NAME_STR, IS_GLOBAL_BOOL)){
						// do nothing
					}

					break;
				}

			default:
				{
					TSK_DEBUG_ERROR("NOT SUPPORTED.");
					goto bail;
				}
		} /* switch */
	} /* while */

	if(cred_updated && self->http_session){
		/* credentials */
		thttp_session_set(self->http_session,
			THTTP_SESSION_SET_CRED(self->xui, self->password),
			THTTP_SESSION_SET_NULL());
	}
	return 0;

bail:
	return -2;
}