Ejemplo n.º 1
0
int router_set_query_end(void * message,void * policy)
{
	int ret;
    	MSG_HEAD * msg_head;	
   	DISPATCH_POLICY * msg_policy=(DISPATCH_POLICY *)policy;
	ROUTE_RULE * rule;
	char * target;
	int jumpcount=1;

    	if(policy==NULL)
        	return -EINVAL;
    	if(message==NULL)
        	return -EINVAL;
    	msg_head=message_get_head(message);
	message_set_policy(message,policy);
	ret=dispatch_policy_getfirstrouterule(policy,&rule);
	if(ret<0)
		return ret;
	while(rule!=NULL)
	{
		jumpcount++;
		if((rule->target_type==ROUTE_TARGET_CONN)||(rule->target_type==ROUTE_TARGET_NAME))	
			break;
		ret=dispatch_policy_getnextrouterule(policy,&rule);
	}

	if(rule==NULL)
		return -EINVAL;
	ret=dispatch_policy_getnextrouterule(policy,&rule);

	if(rule==NULL)
		msg_head->flow=MSG_FLOW_FINISH;
	else
	{
		// if next target is a remote target, change flow to DELIVER
		message_set_receiver(message,rule->target_name);
		if(rule->target_type!=ROUTE_TARGET_LOCAL)
		{
			msg_head->flow=MSG_FLOW_DELIVER;
			msg_head->flag &=~MSG_FLAG_RESPONSE;
		}
	}
	msg_head->ljump=jumpcount++;
	return 1;	
}
Ejemplo n.º 2
0
int _routine_dispatch_recv_start()
{
	int ret;
	int count=0;
	void * policy;
	void * match_rule;
	void * route_rule;
	void * msg;
	void * message_list=_get_recv_message_list(NULL);

	do
	{
		ret=list_queue_get(message_list,&msg);
		if(ret<0)
			return ret;
		if(msg==NULL)
			break;
		ret=dispatch_policy_getfirst(&policy);
		if(ret<0)
			return -EINVAL;
		while(policy!=NULL)
		{
			ret=dispatch_match_message(policy,msg);
			if(ret>0)
			{
				ret=dispatch_policy_getfirstrouterule(policy,&route_rule);
//				if(route_rule!=NULL)
//				{
//					
//				}
			}
			ret=dispatch_policy_getnext(&policy);
		}
		
	}while(1);

	return count;
}
Ejemplo n.º 3
0
int router_set_next_jump(void * message)
{
	int ret;
    	MSG_HEAD * msg_head;	
   	DISPATCH_POLICY * msg_policy;
	ROUTE_RULE * rule;
	char * target;
	int i;

    	if(message==NULL)
        	return -EINVAL;
    	msg_head=message_get_head(message);
		
	msg_policy=message_get_policy(message);
	if(msg_policy==NULL)
		return 0;	

	ret=dispatch_policy_getfirstrouterule(msg_policy,&rule);
	if(rule==NULL)
		return 0;
	for(i=1;i<msg_head->ljump;i++)
	{
		ret=dispatch_policy_getnextrouterule(msg_policy,&rule);		
		if(rule==NULL)
			return 0;
	}

	Memset(msg_head->receiver_uuid,0,DIGEST_SIZE);

	switch(rule->target_type)
	{
		case ROUTE_TARGET_LOCAL:
		case ROUTE_TARGET_PORT:
			ret=rule_get_target(rule,message,&target);
			if(ret<0)
				return ret;		
			Strncpy(msg_head->receiver_uuid,target,DIGEST_SIZE);
			msg_head->flag |=MSG_FLAG_LOCAL;
			Free(target);
			//message_set_state(message,MSG_FLOW_LOCAL);
			break;
		case ROUTE_TARGET_NAME:
		case ROUTE_TARGET_RECORD:
		case ROUTE_TARGET_EXPAND:
			ret=rule_get_target(rule,message,&target);
			if(ret<0)
				return ret;		
			if(Isstrinuuid(target))
			{
//				msg_head->receiver_uuid[0]='@';
				Strncpy(msg_head->receiver_uuid,target,DIGEST_SIZE/4*3);
			}
			else
			{
				Memcpy(msg_head->receiver_uuid,target,DIGEST_SIZE);
			}	
			Free(target);
			message_set_state(message,MSG_FLOW_DELIVER);
			msg_head->flag&=~MSG_FLAG_LOCAL;
//			msg_head->rjump++;
			break;
		case ROUTE_TARGET_CONN:
			ret=rule_get_target(rule,message,&target);
			if(ret<0)
				return ret;		
			Strncpy(msg_head->receiver_uuid,target,DIGEST_SIZE-1);
			Free(target);
			message_set_state(message,MSG_FLOW_DELIVER);
			msg_head->flag&=~MSG_FLAG_LOCAL;
//			msg_head->rjump++;
			break;
		default:
			return -EINVAL;
	}
	return 1;	
}