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