// ---------------------------------------------------------------------------
// Event call
// ------------
void bXMapNetClean::process_network(bArray& nodes, bArray& edges){
_bTrace_("bXMapNetClean::process_network(bArray&,bArray&)",true);
bGenericType*	tp;
it_prm			iter;
int				fields[_gapp->typesMgr()->count()];
netcleanact_prm	bkprm;
    
    bkprm=_act_prm;
    
    _act_prm.create_nodes=true;
    _act_prm.cut_edges=true;
    _act_prm.join_on_nodes=true;
    _act_prm.join_on_edges=false;
    _act_prm.check_nodes=false;
    _act_prm.check_edges=false;
    
// Liste des itérateurs
    for(long i=1;i<=_nodes.count();i++){
        _nodes.get(i,&tp);
        if(tp){
            iter.tp=tp;
            iter.it=tp->iterator();
            iter.field=0;
            _nitr.add(&iter);
        }
    }
    for(long i=1;i<=_edges.count();i++){
        _edges.get(i,&tp);
        if(tp){
            iter.tp=tp;
            iter.it=tp->iterator();
            iter.field=0;
            _eitr.add(&iter);
        }
    }
    
// Champs controle
    for(long i=1;i<=_gapp->typesMgr()->count();i++){
        fields[i-1]=0;
    }
    
bEventLog	log(_gapp,this);
    process_network(&_act_prm,fields,nodes,edges);
    log.close();
    _nitr.reset();
    _eitr.reset();
    
    _act_prm=bkprm;
}
Esempio n. 2
0
void main_thread()
{
	struct pollfd *fds;
	int fdcount;
	
	fdcount = 5;
	
	fds = calloc(sizeof(struct pollfd), fdcount);
	
	fds[0].fd = x_render_pipe[0];		fds[0].events = POLLIN;
	fds[1].fd = console_pipe[0];		fds[1].events = POLLIN;
	fds[2].fd = key_out_pipe[0];		fds[2].events = POLLIN;
	fds[3].fd = download_out_pipe[0];	fds[3].events = POLLIN;
	fds[4].fd = net_out_pipe[0];	fds[4].events = POLLIN;
	

	while(1)
	{
		if(downloading_map)
			fdcount = 4;
		else
			fdcount = 5;
		
		if(TEMP_FAILURE_RETRY(poll(fds, fdcount, -1)) == -1)
			client_shutdown();
		
		if(fds[0].revents & POLLIN)
			process_x_render_pipe();
		
		if(fds[1].revents & POLLIN)
			process_console_pipe();
		
		if(fds[2].revents & POLLIN)
			process_key_out_pipe();
		
		if(fds[3].revents & POLLIN)
			process_download_out_pipe();
		
		if(!downloading_map)
		{
			if(fds[4].revents & POLLIN)
				process_network();
		}
	}
}
// ---------------------------------------------------------------------------
//
// -----------
void bXMapNetClean::check_events(){
_bTrace_("bXMapNetClean::check_events",true);
bArray*				arr=_gapp->eventMgr()->events();
bGenericEvent*		evt;
bGenericType*		tp;
bGenericGeoElement*	o;
int					sign=GetSignature(this);
bArray				nods(sizeof(bGenericGeoElement*));
bArray				edgs(sizeof(bGenericGeoElement*));
UInt32				cs;
    
    for(long i=1;i<=arr->count();i++){
        arr->get(i,&evt);
//_tm_("Event "+evt->eid());
        
        cs=evt->creator();
//_tm_("creator:"+&cs);
        if(	(evt->creator()==sign)	||
            (evt->is_undo())		||
            (evt->is_redo())		){
//_tm_("creator=NetClean, Undo, or Redo");
            continue;
        }
        if(evt->kind()==kEventKindGeoElement){
            if(!_cfg_prm.autoclean){
                continue;
            }
            switch(evt->action()){
                case kEventActionModify:
                case kEventActionCreate:
                    for(long j=1;j<=evt->elements()->count();j++){
                        evt->elements()->get(j,&o);
                        if(evt->action()==kEventActionModify){
                            o=o->get_ref();
                        }
                        tp=_gapp->typesMgr()->get(o->getType());
                        if(tp->kind()==kBaseKindPoint){
                            _nodes.get(o->getType(),&tp);
                            if(tp==NULL){
                                continue;
                            }
                            if(o->flag1()){
                                continue;
                            }
                            nods.add(&o);
                            o->set_flag1(true);
                        }
                        else if(tp->kind()==kBaseKindPolyline){
                            _edges.get(o->getType(),&tp);
                            if(tp==NULL){
                                continue;
                            }
                            if(o->flag1()){
                                continue;
                            }
                            edgs.add(&o);
                            o->set_flag1(true);
                        }
                    }
                    break;
            }
        }
        else if(evt->kind()==kEventKindTypeElement){
            switch(evt->action()){
                case kEventActionCreate:
                    tp=NULL;
                    for(long j=1;j<=evt->elements()->count();j++){
                        _nodes.add(&tp);
                        _edges.add(&tp);
                    }
                    break;
                case kEventActionDestroy:
                    /*tp=NULL;
                     for(j=1;j<=evt->elements()->count();j++){
                     evt->elements()->get(j,&tp);
                     k=_nodes.search(&tp,ObjRefComp);
                     _nodes.add(&tp);
                     _edges.add(&tp);
                     }*/
                    break;
            }
        }
    }
    if((nods.count()+edgs.count())>0){
        for(long i=1;i<=nods.count();i++){
            nods.get(i,&o);
            o->set_flag1(false);
        }
        for(long i=1;i<=edgs.count();i++){
            edgs.get(i,&o);
            o->set_flag1(false);
        }
        process_network(nods,edgs);
    }
}
// ---------------------------------------------------------------------------
// Std call
// ------------
void bXMapNetClean::process_network(bool log){
_bTrace_("bXMapNetClean::process_network(bool)",true);
bGenericType*	tp;
bool			badf=false;
char			name[__MESSAGE_STRING_LENGTH_MAX__];
it_prm			iter;
int				fields[_gapp->typesMgr()->count()];
nc_prm			prm;
bArray			nodes(sizeof(bGenericGeoElement*));
bArray			edges(sizeof(bGenericGeoElement*));

    b_message_string(kXMapNetCleanControlField,name,getbundle(),0);
// Liste des itérateurs
    iter.it=0;
    for(long i=1;i<=_nodes.count();i++){
        _nodes.get(i,&tp);
        if(tp){
            iter.tp=tp;
            iter.it=tp->iterator();
            iter.field=tp->fields()->get_index(name);
            _nitr.add(&iter);
            if(!iter.field&&_act_prm.check_nodes){
                badf=true;
            }
        }
    }
    for(long i=1;i<=_edges.count();i++){
        _edges.get(i,&tp);
        if(tp){
            iter.tp=tp;
            iter.it=tp->iterator();
            iter.field=tp->fields()->get_index(name);
            _eitr.add(&iter);
            if(!iter.field&&_act_prm.check_edges){
                badf=true;
            }
        }
    }
    
// Champs controle
    for(long i=1;i<=_gapp->typesMgr()->count();i++){
        fields[i-1]=0;
    }
    
// Listes d'objets
    prm.arr=&nodes;
    for(long i=1;i<=_nitr.count();i++){
        _nitr.get(i,&iter);
        iter.it->iterate(&prm,all_objects);
    }
    prm.arr=&edges;
    for(long i=1;i<=_eitr.count();i++){
        _eitr.get(i,&iter);
        iter.it->iterate(&prm,all_objects);
    }
    
    if(log){
bEventLog	log(_gapp,this);
        if(badf){
            b_message_string(kXMapNetCleanAskAddControlField,name,getbundle(),0);
bAlertWarningYes	alrt(name,"",_silent);
            if(!alrt.result()){
                _act_prm.check_edges=false;
                _act_prm.check_nodes=false;
            }
        }
        init_fields(&_act_prm);
        for(long i=1;i<=_nitr.count();i++){
            _nitr.get(i,&iter);
            fields[iter.tp->index()-1]=iter.field;
        }
        for(long i=1;i<=_eitr.count();i++){
            _eitr.get(i,&iter);
            fields[iter.tp->index()-1]=iter.field;
        }
        process_network(&_act_prm,fields,nodes,edges);
        log.close();
    }
    else{
        if(badf){
            b_message_string(kXMapNetCleanAskAddControlField,name,getbundle(),0);
bAlertWarningYes	alrt(name,"",_silent);
            if(!alrt.result()){
                _te_("coin coin");
                _act_prm.check_edges=false;
                _act_prm.check_nodes=false;
            }
        }
        init_fields(&_act_prm);
        for(long i=1;i<=_nitr.count();i++){
            _nitr.get(i,&iter);
            fields[iter.tp->index()-1]=iter.field;
        }
        for(long i=1;i<=_eitr.count();i++){
            _eitr.get(i,&iter);
            fields[iter.tp->index()-1]=iter.field;
        }
        process_network(&_act_prm,fields,nodes,edges);
    }
    _nitr.reset();
    _eitr.reset();
}
// ---------------------------------------------------------------------------
//
// ------------
bool bXMapNetClean::process(int msg, void* prm){
_bTrace_("bXMapNetClean::process",true);
netcleancfg_prm*	cp;
netcleanact_prm*	ap;
bool				b;
    
    switch(msg){
        case kExtProcessCallFromIntf:
            _silent=false;
            process_network(true);
            break;
        case kExtProcessCallWithParams:
            ap=(netcleanact_prm*)prm;
            _silent=false;
            process_network(false);
            break;
        case kExtProcessCallWithXMLTree:{
            if(countelements()==6){
                init_data();

char                    val[_values_length_max_];
bGenericXMLBaseElement*	elt;
                elt=getelement(1);
                elt->getvalue(val);
                _act_prm.create_nodes=atoi(val);

                if(_act_prm.create_nodes){
                    elt=getelement(2);
                    elt->getvalue(val);
                    _act_prm.cut_edges=atoi(val);
                }
                else{
                    _act_prm.cut_edges=false;
                }

                elt=getelement(3);
                elt->getvalue(val);
                _act_prm.join_on_nodes=atoi(val);

                elt=getelement(4);
                elt->getvalue(val);
                _act_prm.join_on_edges=atoi(val);
                if(_act_prm.join_on_nodes&&_act_prm.join_on_edges){
                    _act_prm.join_on_edges=false;
                }
                
                elt=getelement(5);
                elt->getvalue(val);
                _act_prm.check_nodes=atoi(val);

                elt=getelement(6);
                elt->getvalue(val);
                _act_prm.check_edges=atoi(val);

                _silent=true;
                process_network(false);
                
                _nodes.reset();
                _edges.reset();
            }
            else{
                return(false);
            }
            }
            break;
        case kExtProcessCallGetData:
_tm_("kExtProcessCallGetData");
            cp=(netcleancfg_prm*)prm;
            if(cp->nodes){
                cp->nodes->reset();
                b=(*cp->nodes)+_nodes;
            }
            if(cp->edges){
                cp->edges->reset();
                b=(*cp->edges)+_edges;
            }
            cp->tnod=_cfg_prm.tnod;
            cp->stnod=_cfg_prm.stnod;
            strcpy(cp->name,_cfg_prm.name);
            cp->tbdg=_cfg_prm.tbdg;
            cp->stbdg=_cfg_prm.stbdg;
            cp->dnod=_cfg_prm.dnod;
            cp->dbdg=_cfg_prm.dbdg;
            cp->autoclean=_cfg_prm.autoclean;
            break;
        case kExtProcessCallSetData:
_tm_("kExtProcessCallSetData");
            cp=(netcleancfg_prm*)prm;
            if(cp->nodes){
                _nodes.reset();
                b=_nodes+(*cp->nodes);
            }
            if(cp->edges){
                _edges.reset();
                b=_edges+(*cp->edges);
            }
            _cfg_prm.tnod=cp->tnod;
            _cfg_prm.stnod=cp->stnod;
            strcpy(_cfg_prm.name,cp->name);
            _cfg_prm.tbdg=cp->tbdg;
            _cfg_prm.stbdg=cp->stbdg;
            _cfg_prm.dnod=cp->dnod;
            _cfg_prm.dbdg=cp->dbdg;
            _cfg_prm.autoclean=cp->autoclean;
            write_p();
            break;
        default:
            return(false);
    }
    return(true);
}