32#include "gwensignal_p.h"
33#include <gwenhywfar/misc.h>
34#include <gwenhywfar/debug.h>
35#include <gwenhywfar/inherit.h>
51 so->signalList=GWEN_Signal_List2_new();
52 so->slotList=GWEN_Slot_List2_new();
82 GWEN_SIGNAL_LIST2_ITERATOR *sit;
87 sit=GWEN_Signal_List2_First(so->signalList);
91 sig=GWEN_Signal_List2Iterator_Data(sit);
98 if (strcasecmp(s, name)==0 &&
99 (typeId1==0 || typeId1==sig->typeOfArg1) &&
100 (typeId2==0 || typeId2==sig->typeOfArg2)) {
101 GWEN_Signal_List2Iterator_free(sit);
104 sig=GWEN_Signal_List2Iterator_Next(sit);
106 GWEN_Signal_List2Iterator_free(sit);
116 const char *typeOfArg1,
117 const char *typeOfArg2)
136 GWEN_SLOT_LIST2_ITERATOR *sit;
141 sit=GWEN_Slot_List2_First(so->slotList);
145 slot=GWEN_Slot_List2Iterator_Data(sit);
152 if (strcasecmp(s, name)==0 &&
153 (typeId1==0 || typeId1==slot->typeOfArg1) &&
154 (typeId2==0 || typeId2==slot->typeOfArg2)) {
155 GWEN_Slot_List2Iterator_free(sit);
158 slot=GWEN_Slot_List2Iterator_Next(sit);
160 GWEN_Slot_List2Iterator_free(sit);
170 const char *typeOfArg1,
171 const char *typeOfArg2)
191 "Signal \"%s\" already exists",
196 sig->signalObject=so;
197 GWEN_Signal_List2_PushBack(so->signalList, sig);
210 "Slot \"%s\" already exists",
214 slot->signalObject=so;
215 GWEN_Slot_List2_PushBack(so->slotList, slot);
223 const char *derivedType)
226 GWEN_SLOT_LIST2_ITERATOR *slotIt;
227 GWEN_SIGNAL_LIST2_ITERATOR *sigIt;
233 slotIt=GWEN_Slot_List2_First(so->slotList);
237 slot=GWEN_Slot_List2Iterator_Data(slotIt);
244 if (typeId==0 || slot->derivedParentType==typeId) {
245 GWEN_Slot_List2_Erase(so->slotList, slotIt);
248 slot=GWEN_Slot_List2Iterator_Data(slotIt);
251 slot=GWEN_Slot_List2Iterator_Next(slotIt);
253 GWEN_Slot_List2Iterator_free(slotIt);
256 sigIt=GWEN_Signal_List2_First(so->signalList);
260 sig=GWEN_Signal_List2Iterator_Data(sigIt);
267 if (typeId==0 || sig->derivedParentType==typeId) {
268 GWEN_Signal_List2_Erase(so->signalList, sigIt);
271 sig=GWEN_Signal_List2Iterator_Data(sigIt);
274 sig=GWEN_Signal_List2Iterator_Next(sigIt);
276 GWEN_Signal_List2Iterator_free(sigIt);
285 const char *derivedType,
287 const char *typeOfArg1,
288 const char *typeOfArg2)
296 sig->connectedSlots=GWEN_Slot_List2_new();
297 sig->name=strdup(name);
318 assert(sig->_refCount);
319 if (sig->_refCount==1) {
320 GWEN_SLOT_LIST2_ITERATOR *sit;
323 sit=GWEN_Slot_List2_First(sig->connectedSlots);
327 slot=GWEN_Slot_List2Iterator_Data(sit);
332 next=GWEN_Slot_List2Iterator_Next(sit);
334 "Disconnecting signal \"%s\" from slot \"%s\"",
335 sig->name, slot->name);
336 GWEN_Signal_List2_Remove(slot->connectedSignals, sig);
339 GWEN_Slot_List2Iterator_free(sit);
341 GWEN_Slot_List2_free(sig->connectedSlots);
357 assert(sig->_refCount);
374 GWEN_Signal_List2_free(slist);
381 if ((
void *)sig==user_data)
401 return sig->signalObject;
410 if (sig->typeOfArg1!=slot->typeOfArg1) {
412 "Signal \"%s\" and slot \"%s\" use different types for "
414 sig->name, slot->name);
417 if (sig->typeOfArg2!=slot->typeOfArg2) {
419 "Signal \"%s\" and slot \"%s\" use different types for "
421 sig->name, slot->name);
426 "Signal \"%s\" and slot \"%s\" already connected",
427 sig->name, slot->name);
433 "Signal \"%s\" and slot \"%s\" already connected",
434 sig->name, slot->name);
438 GWEN_Signal_List2_PushBack(slot->connectedSignals, sig);
439 GWEN_Slot_List2_PushBack(sig->connectedSlots, slot);
452 "Signal \"%s\" and slot \"%s\" are not connected",
453 sig->name, slot->name);
459 "Signal \"%s\" and slot \"%s\" are not connected",
460 sig->name, slot->name);
464 GWEN_Signal_List2_Remove(slot->connectedSignals, sig);
465 GWEN_Slot_List2_Remove(sig->connectedSlots, slot);
473 void *pArg1,
void *pArg2,
int iArg3,
int iArg4)
475 GWEN_SLOT_LIST2_ITERATOR *sit;
479 sit=GWEN_Slot_List2_First(sig->connectedSlots);
483 slot=GWEN_Slot_List2Iterator_Data(sit);
490 "Sending signal \"%s\" to slot \"%s\" (%p)",
491 sig->name, slot->name, slot);
492 rv=slot->func(slot, slot->userData, pArg1, pArg2, iArg3, iArg4);
495 "Slot \"%s\" (%p) returned an error (%d)",
496 slot->name, slot, rv);
500 slot=GWEN_Slot_List2Iterator_Next(sit);
502 GWEN_Slot_List2Iterator_free(sit);
514 const char *derivedType,
516 const char *typeOfArg1,
517 const char *typeOfArg2,
526 slot->connectedSignals=GWEN_Signal_List2_new();
527 slot->name=strdup(name);
535 slot->userData=userData;
550 assert(slot->_refCount);
551 if (slot->_refCount==1) {
552 GWEN_SIGNAL_LIST2_ITERATOR *sit;
555 sit=GWEN_Signal_List2_First(slot->connectedSignals);
559 sig=GWEN_Signal_List2Iterator_Data(sit);
563 "Disconnecting slot \"%s\" from signal \"%s\"",
564 slot->name, sig->name);
565 GWEN_Slot_List2_Remove(sig->connectedSlots, slot);
566 sig=GWEN_Signal_List2Iterator_Next(sit);
568 GWEN_Signal_List2Iterator_free(sit);
570 GWEN_Signal_List2_free(slot->connectedSignals);
586 assert(slot->_refCount);
603 GWEN_Slot_List2_free(slist);
611 if ((
void *)slot==user_data)
630 return slot->signalObject;
#define DBG_INFO(dbg_logger, format,...)
#define DBG_ERROR(dbg_logger, format,...)
#define DBG_DEBUG(dbg_logger, format,...)
#define GWEN_ERROR_INVALID
int GWEN_SignalObject_AddSlot(GWEN_SIGNALOBJECT *so, GWEN_SLOT *slot)
GWEN_SLOT * GWEN_SignalObject__findSlot(const GWEN_SIGNALOBJECT *so, const char *name, uint32_t typeId1, uint32_t typeId2)
int GWEN_Slot_List2_HasSlot(GWEN_SLOT_LIST2 *slist, GWEN_SLOT *slot)
GWEN_SLOT * GWEN_Slot__List2_hasSlot_cb(GWEN_SLOT *slot, void *user_data)
void GWEN_SignalObject_free(GWEN_SIGNALOBJECT *so)
int GWEN_Signal_Connect(GWEN_SIGNAL *sig, GWEN_SLOT *slot)
GWEN_SLOT * GWEN_SignalObject_FindSlot(const GWEN_SIGNALOBJECT *so, const char *name, const char *typeOfArg1, const char *typeOfArg2)
int GWEN_Signal_Emit(GWEN_SIGNAL *sig, void *pArg1, void *pArg2, int iArg3, int iArg4)
GWEN_SIGNALOBJECT * GWEN_Signal_GetSignalObject(const GWEN_SIGNAL *sig)
void GWEN_Slot_List2_freeAll(GWEN_SLOT_LIST2 *slist)
GWEN_SLOT * GWEN_Slot__List2_freeAll_cb(GWEN_SLOT *slot, GWEN_UNUSED void *user_data)
void GWEN_Signal_free(GWEN_SIGNAL *sig)
int GWEN_Signal_List2_HasSignal(GWEN_SIGNAL_LIST2 *slist, GWEN_SIGNAL *sig)
GWEN_SIGNAL * GWEN_Signal__List2_hasSignal_cb(GWEN_SIGNAL *sig, void *user_data)
void GWEN_Signal_List2_freeAll(GWEN_SIGNAL_LIST2 *slist)
GWEN_SIGNAL * GWEN_SignalObject__findSignal(const GWEN_SIGNALOBJECT *so, const char *name, uint32_t typeId1, uint32_t typeId2)
uint32_t GWEN_SignalObject_MkTypeId(const char *typeName)
GWEN_SIGNALOBJECT * GWEN_SignalObject_new(void)
GWEN_SIGNAL * GWEN_Signal_new(GWEN_SIGNALOBJECT *so, const char *derivedType, const char *name, const char *typeOfArg1, const char *typeOfArg2)
void GWEN_Signal_Attach(GWEN_SIGNAL *sig)
GWEN_SIGNAL * GWEN_Signal__List2_freeAll_cb(GWEN_SIGNAL *sig, GWEN_UNUSED void *user_data)
void GWEN_Slot_Attach(GWEN_SLOT *slot)
GWEN_SIGNAL * GWEN_SignalObject_FindSignal(const GWEN_SIGNALOBJECT *so, const char *name, const char *typeOfArg1, const char *typeOfArg2)
void GWEN_Slot_free(GWEN_SLOT *slot)
GWEN_SIGNALOBJECT * GWEN_Slot_GetSignalObject(const GWEN_SLOT *slot)
GWEN_SLOT * GWEN_Slot_new(GWEN_SIGNALOBJECT *so, const char *derivedType, const char *name, const char *typeOfArg1, const char *typeOfArg2, GWEN_SLOT_FUNCTION fn, void *userData)
void GWEN_SignalObject_RemoveForDerivedType(GWEN_SIGNALOBJECT *so, const char *derivedType)
int GWEN_Signal_Disconnect(GWEN_SIGNAL *sig, GWEN_SLOT *slot)
int GWEN_SignalObject_AddSignal(GWEN_SIGNALOBJECT *so, GWEN_SIGNAL *sig)
struct GWEN_SIGNALOBJECT GWEN_SIGNALOBJECT
struct GWEN_SIGNAL GWEN_SIGNAL
int GWENHYWFAR_CB(* GWEN_SLOT_FUNCTION)(GWEN_SLOT *slot, void *userData, void *pArg1, void *pArg2, int iArg3, int iArg4)
struct GWEN_SLOT GWEN_SLOT
uint32_t GWEN_Inherit_MakeId(const char *typeName)
#define GWEN_LIST2_FUNCTIONS(t, pr)
#define GWEN_FREE_OBJECT(varname)
#define GWEN_NEW_OBJECT(typ, varname)