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; }
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; }
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; }