Hello my name is Axel Pache and i and some kolleges are working on a callcenter solution. We use ICD to manage skill based routing. But now we got some problems integrating FOP, for example FOP doesnt acknowledge the ICD-queues right. I have to use a normal asterisk queue to get FOP working with it. So my question is: Is there any way to get FOP working together with ICD in that case? looking forward to hear from you greetings Axel Pache
Hi,> Hello my name is Axel Pache and i and some kolleges are working on a > callcenter solution. We use ICD to manage skill based routing. But now > we got some problems integrating FOP, for example FOP doesnt > acknowledge the ICD-queues right. I have to use a normal asterisk > queue to get FOP working with it. > > So my question is: > > Is there any way to get FOP working together with ICD in that case?If ICD does not use regular queues, it will require custom development or a clever use of UserEvent in your dialplan. BTW, my rates are cheap.. :) Regards, -- Nicol?s Gudi?o Buenos Aires - Argentina
> Hello my name is Axel Pache and i and some kolleges are working on a > callcenter solution. We use ICD to manage skill based routing. But now > we got some problems integrating FOP, for example FOP doesnt > acknowledge the ICD-queues right. I have to use a normal asterisk > queue to get FOP working with it. > > So my question is: > > Is there any way to get FOP working together with ICD in that case?>If ICD does not use regular queues, it will require custom development >or a clever use of UserEvent in your dialplan. BTW, my rates are >cheap.. :) Regards,ICD has a full blown eventing system we could I guess have a compatablity flag that would fire the same event messages as the regular asterisk q system. This would be a simple task, you just add a new global ICD listener and map the ICD events to the required manager_event calls if you look at the src to app_icd.c you will see that we do invoke manager_event now with icd events so follow this same pattern but raise the same manager_events that q/chan agent does... maybe Nicolas could show us what actual q/agent manager_events FOP looks for In some ways you would be short changing ICD with this solution since ICD event system is much richer than std q/agent if Nick is interested it might be a richer solution to add support of the ICD events direct ...:)
> ICD has a full blown eventing system we could I guess have a compatablity > flag > that would fire the same event messages as the regular asterisk q system. > This would be a simple task, you just add a new global ICD listener > and map the ICD events to the required manager_event calls > if you look at the src to app_icd.c you will see that we do invoke > manager_eventps. In dev code not on icd.sf.net the events that ICD spew are loadable modules now like icd_mod_event_astmgr.c icd_mod_event_cli.c so the new way would be to create a new loadable icd_mod_event_queue.c and make you mapping in that modeule you could use this code as a pattern --------------------------------------- /*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * * published by the Free Software Foundation; either version 2 of the * * License, or (at your option) any later version * * * ***************************************************************************/ #include <icd_module_api.h> /* Private implemenations */ static int module_id = 0; static char *module_name = "event_astmgr"; /* This is the module mask (icd.conf module_mask_astmgr=) for what module events to show in the default icd cli. */ static int module_mask[ICD_MAX_MODULES]; /* This is the event mask (icd.conf event_mask_astmgr=)for what events to show in the default icd cli.*/ static int event_mask[ICD_MAX_EVENTS]; static int icd_module__event_astmgr(void *listener, icd_event * factory_event, void *extra); int icd_module_load(icd_config_registry * registry) { assert(registry != NULL); module_id = icd_event_factory__add_module(module_name); if (module_id == 0) ast_log(LOG_WARNING, "Unable to register Module Name[%s]", module_name); else { icd_event_factory__add_listener(event_factory, queues, icd_module__event_astmgr, NULL); ast_verbose(VERBOSE_PREFIX_3 "Registered ICD Module[%s]!\n",module_name); } return 0; } int icd_module_unload(void) { ast_verbose(VERBOSE_PREFIX_3 "Unloaded ICD Module[%s]!\n", module_name); return 0; } /* This can act as a listener on all events in the system, or on selected events. */ static int icd_module__event_astmgr(void *listener, icd_event * factory_event, void *extra) { char *smsg; icd_caller *caller = NULL; struct ast_channel *chan = NULL; icd_event *event = icd_event__get_extra(factory_event); int module_id = icd_event__get_module_id(event); int event_id = icd_event__get_event_id(event); assert(factory_event != NULL); ast_verbose(VERBOSE_PREFIX_2 "YoYoAPP_ICD:Mod[%d] Event[%d] \n", icd_event__get_module_id(event), icd_event__get_event_id(event) ); /* ast_verbose(VERBOSE_PREFIX_2 "APP_ICD:Mod[%d][%d] Event[%d][%d] \n", icd_event__get_module_id(event), module_mask[icd_event__get_module_id(event)], icd_event__get_event_id(event), event_mask[icd_event__get_event_id(event)] ); */ if (module_mask[module_id] && event_mask[event_id]) { /* filter based on icd.conf events */ smsg = icd_event__get_message(event); switch (event_id) { case ICD_EVENT_STATECHANGE: caller = (icd_caller *) icd_event__get_source(event); chan = icd_caller__get_channel(caller); manager_event(EVENT_FLAG_USER, "icd_state_change", "Module: %s\r\nID: %s\r\nCallerID: %s\r\nMessage: %s\r\n", icd_module_strings[icd_event__get_module_id(event)], icd_caller__get_id(caller), /*icd_caller__get_name(caller), "Module: %s\r\nID: %s\r\nCallerID: %s\r\nCallerName: %s\r\nMessage: %s\r\n", (chan ? chan->name : "unknown"), */ (chan ? chan->cid.cid_num ? chan->cid.cid_num : "unknown" : "unknown"), smsg); break; case ICD_EVENT_READY: break; case ICD_EVENT_DISTRIBUTE: break; case ICD_EVENT_BRIDGED: break; case ICD_EVENT_BRIDGE_END: break; default: if (smsg) manager_event(EVENT_FLAG_USER, "icd_event", "Module: %s\r\nEvent: %s\r\nMessage: %s\r\n", icd_module_strings[icd_event__get_module_id(event)], icd_event_strings[icd_event__get_event_id(event)], smsg); } } /* No veto today, thank you. */ return 0; } /* For Emacs: * Local Variables: * indent-tabs-mode:nil * tab-width:4 * c-basic-offset:4 * End: * For VIM: * vim:set softtabstop=4 shiftwidth=4 tabstop=4 expandtab: */
TC wrote: I just wanted to thank u for your fast reply u really helped me out =)>>ICD has a full blown eventing system we could I guess have a compatablity >>flag >>that would fire the same event messages as the regular asterisk q system. >>This would be a simple task, you just add a new global ICD listener >>and map the ICD events to the required manager_event calls >>if you look at the src to app_icd.c you will see that we do invoke >>manager_event >> >> >ps. In dev code not on icd.sf.net >the events that ICD spew are loadable modules now like >icd_mod_event_astmgr.c >icd_mod_event_cli.c >so the new way would be to create a new loadable >icd_mod_event_queue.c and make you mapping in that modeule >you could use this code as a pattern > --------------------------------------- >/*************************************************************************** > * * > * This program is free software; you can redistribute it and/or modify * > * it under the terms of the GNU Library General Public License as * > * published by the Free Software Foundation; either version 2 of the * > * License, or (at your option) any later version * > * * > >***************************************************************************/ > >#include <icd_module_api.h> > >/* Private implemenations */ >static int module_id = 0; >static char *module_name = "event_astmgr"; > >/* This is the module mask (icd.conf module_mask_astmgr=) >for what module events to show in the default icd cli. >*/ >static int module_mask[ICD_MAX_MODULES]; > >/* This is the event mask (icd.conf event_mask_astmgr=)for what events to >show in the default icd cli.*/ >static int event_mask[ICD_MAX_EVENTS]; > >static int icd_module__event_astmgr(void *listener, icd_event * >factory_event, void *extra); > > >int icd_module_load(icd_config_registry * registry) >{ > > assert(registry != NULL); > > module_id = icd_event_factory__add_module(module_name); > if (module_id == 0) > ast_log(LOG_WARNING, "Unable to register Module Name[%s]", >module_name); > else { > icd_event_factory__add_listener(event_factory, queues, >icd_module__event_astmgr, NULL); > ast_verbose(VERBOSE_PREFIX_3 "Registered ICD >Module[%s]!\n",module_name); > } > return 0; >} > >int icd_module_unload(void) >{ > ast_verbose(VERBOSE_PREFIX_3 "Unloaded ICD Module[%s]!\n", module_name); > return 0; > >} > >/* This can act as a listener on all events in the system, or on selected >events. */ >static int icd_module__event_astmgr(void *listener, icd_event * >factory_event, void *extra) >{ > char *smsg; > icd_caller *caller = NULL; > struct ast_channel *chan = NULL; > > icd_event *event = icd_event__get_extra(factory_event); > int module_id = icd_event__get_module_id(event); > int event_id = icd_event__get_event_id(event); > > assert(factory_event != NULL); > ast_verbose(VERBOSE_PREFIX_2 "YoYoAPP_ICD:Mod[%d] Event[%d] \n", > icd_event__get_module_id(event), > icd_event__get_event_id(event) > ); > /* > ast_verbose(VERBOSE_PREFIX_2 "APP_ICD:Mod[%d][%d] Event[%d][%d] \n", > icd_event__get_module_id(event), > module_mask[icd_event__get_module_id(event)], > icd_event__get_event_id(event), > event_mask[icd_event__get_event_id(event)] > ); > */ > if (module_mask[module_id] && event_mask[event_id]) { > /* filter based on icd.conf events */ > smsg = icd_event__get_message(event); > switch (event_id) { > case ICD_EVENT_STATECHANGE: > caller = (icd_caller *) icd_event__get_source(event); > chan = icd_caller__get_channel(caller); > manager_event(EVENT_FLAG_USER, "icd_state_change", > "Module: %s\r\nID: %s\r\nCallerID: %s\r\nMessage: %s\r\n", > icd_module_strings[icd_event__get_module_id(event)], >icd_caller__get_id(caller), > /*icd_caller__get_name(caller), > "Module: %s\r\nID: %s\r\nCallerID: %s\r\nCallerName: >%s\r\nMessage: %s\r\n", > (chan ? chan->name : "unknown"), > */ > (chan ? chan->cid.cid_num ? chan->cid.cid_num : "unknown" : >"unknown"), > smsg); > > break; > case ICD_EVENT_READY: > break; > case ICD_EVENT_DISTRIBUTE: > break; > case ICD_EVENT_BRIDGED: > break; > case ICD_EVENT_BRIDGE_END: > break; > default: > if (smsg) > manager_event(EVENT_FLAG_USER, "icd_event", > "Module: %s\r\nEvent: %s\r\nMessage: %s\r\n", > icd_module_strings[icd_event__get_module_id(event)], > icd_event_strings[icd_event__get_event_id(event)], > smsg); > > } > } > > /* No veto today, thank you. */ > return 0; > >} > >/* For Emacs: > * Local Variables: > * indent-tabs-mode:nil > * tab-width:4 > * c-basic-offset:4 > * End: > * For VIM: > * vim:set softtabstop=4 shiftwidth=4 tabstop=4 expandtab: > */ > > > > > >_______________________________________________ >Asterisk-Users mailing list >Asterisk-Users@lists.digium.com >http://lists.digium.com/mailman/listinfo/asterisk-users >To UNSUBSCRIBE or update options visit: > http://lists.digium.com/mailman/listinfo/asterisk-users > >