32 #include "gwensignal_p.h"
33 #include <gwenhywfar/misc.h>
34 #include <gwenhywfar/debug.h>
35 #include <gwenhywfar/inherit.h>
50 so->signalList=GWEN_Signal_List2_new();
51 so->slotList=GWEN_Slot_List2_new();
78 GWEN_SIGNAL_LIST2_ITERATOR *sit;
83 sit=GWEN_Signal_List2_First(so->signalList);
87 sig=GWEN_Signal_List2Iterator_Data(sit);
94 if (strcasecmp(s, name)==0 &&
95 (typeId1==0 || typeId1==sig->typeOfArg1) &&
96 (typeId2==0 || typeId2==sig->typeOfArg2)) {
97 GWEN_Signal_List2Iterator_free(sit);
100 sig=GWEN_Signal_List2Iterator_Next(sit);
102 GWEN_Signal_List2Iterator_free(sit);
112 const char *typeOfArg1,
113 const char *typeOfArg2) {
130 GWEN_SLOT_LIST2_ITERATOR *sit;
135 sit=GWEN_Slot_List2_First(so->slotList);
139 slot=GWEN_Slot_List2Iterator_Data(sit);
146 if (strcasecmp(s, name)==0 &&
147 (typeId1==0 || typeId1==slot->typeOfArg1) &&
148 (typeId2==0 || typeId2==slot->typeOfArg2)) {
149 GWEN_Slot_List2Iterator_free(sit);
152 slot=GWEN_Slot_List2Iterator_Next(sit);
154 GWEN_Slot_List2Iterator_free(sit);
164 const char *typeOfArg1,
165 const char *typeOfArg2) {
183 "Signal \"%s\" already exists",
188 sig->signalObject=so;
189 GWEN_Signal_List2_PushBack(so->signalList, sig);
201 "Slot \"%s\" already exists",
205 slot->signalObject=so;
206 GWEN_Slot_List2_PushBack(so->slotList, slot);
214 const char *derivedType) {
216 GWEN_SLOT_LIST2_ITERATOR *slotIt;
217 GWEN_SIGNAL_LIST2_ITERATOR *sigIt;
223 slotIt=GWEN_Slot_List2_First(so->slotList);
227 slot=GWEN_Slot_List2Iterator_Data(slotIt);
234 if (typeId==0 || slot->derivedParentType==typeId) {
235 GWEN_Slot_List2_Erase(so->slotList, slotIt);
238 slot=GWEN_Slot_List2Iterator_Data(slotIt);
241 slot=GWEN_Slot_List2Iterator_Next(slotIt);
243 GWEN_Slot_List2Iterator_free(slotIt);
246 sigIt=GWEN_Signal_List2_First(so->signalList);
250 sig=GWEN_Signal_List2Iterator_Data(sigIt);
257 if (typeId==0 || sig->derivedParentType==typeId) {
258 GWEN_Signal_List2_Erase(so->signalList, sigIt);
261 sig=GWEN_Signal_List2Iterator_Data(sigIt);
264 sig=GWEN_Signal_List2Iterator_Next(sigIt);
266 GWEN_Signal_List2Iterator_free(sigIt);
275 const char *derivedType,
277 const char *typeOfArg1,
278 const char *typeOfArg2) {
285 sig->connectedSlots=GWEN_Slot_List2_new();
286 sig->name=strdup(name);
306 assert(sig->_refCount);
307 if (sig->_refCount==1) {
308 GWEN_SLOT_LIST2_ITERATOR *sit;
311 sit=GWEN_Slot_List2_First(sig->connectedSlots);
315 slot=GWEN_Slot_List2Iterator_Data(sit);
320 next=GWEN_Slot_List2Iterator_Next(sit);
322 "Disconnecting signal \"%s\" from slot \"%s\"",
323 sig->name, slot->name);
324 GWEN_Signal_List2_Remove(slot->connectedSignals, sig);
327 GWEN_Slot_List2Iterator_free(sit);
329 GWEN_Slot_List2_free(sig->connectedSlots);
344 assert(sig->_refCount);
359 GWEN_Signal_List2_free(slist);
366 if ((
void*)sig==user_data)
385 return sig->signalObject;
393 if (sig->typeOfArg1!=slot->typeOfArg1) {
395 "Signal \"%s\" and slot \"%s\" use different types for "
397 sig->name, slot->name);
400 if (sig->typeOfArg2!=slot->typeOfArg2) {
402 "Signal \"%s\" and slot \"%s\" use different types for "
404 sig->name, slot->name);
409 "Signal \"%s\" and slot \"%s\" already connected",
410 sig->name, slot->name);
416 "Signal \"%s\" and slot \"%s\" already connected",
417 sig->name, slot->name);
421 GWEN_Signal_List2_PushBack(slot->connectedSignals, sig);
422 GWEN_Slot_List2_PushBack(sig->connectedSlots, slot);
434 "Signal \"%s\" and slot \"%s\" are not connected",
435 sig->name, slot->name);
441 "Signal \"%s\" and slot \"%s\" are not connected",
442 sig->name, slot->name);
446 GWEN_Signal_List2_Remove(slot->connectedSignals, sig);
447 GWEN_Slot_List2_Remove(sig->connectedSlots, slot);
455 void *pArg1,
void *pArg2,
int iArg3,
int iArg4) {
456 GWEN_SLOT_LIST2_ITERATOR *sit;
460 sit=GWEN_Slot_List2_First(sig->connectedSlots);
464 slot=GWEN_Slot_List2Iterator_Data(sit);
471 "Sending signal \"%s\" to slot \"%s\" (%p)",
472 sig->name, slot->name, slot);
473 rv=slot->func(slot, slot->userData, pArg1, pArg2, iArg3, iArg4);
476 "Slot \"%s\" (%p) returned an error (%d)",
477 slot->name, slot, rv);
481 slot=GWEN_Slot_List2Iterator_Next(sit);
483 GWEN_Slot_List2Iterator_free(sit);
495 const char *derivedType,
497 const char *typeOfArg1,
498 const char *typeOfArg2,
506 slot->connectedSignals=GWEN_Signal_List2_new();
507 slot->name=strdup(name);
515 slot->userData=userData;
529 assert(slot->_refCount);
530 if (slot->_refCount==1) {
531 GWEN_SIGNAL_LIST2_ITERATOR *sit;
534 sit=GWEN_Signal_List2_First(slot->connectedSignals);
538 sig=GWEN_Signal_List2Iterator_Data(sit);
542 "Disconnecting slot \"%s\" from signal \"%s\"",
543 slot->name, sig->name);
544 GWEN_Slot_List2_Remove(sig->connectedSlots, slot);
545 sig=GWEN_Signal_List2Iterator_Next(sit);
547 GWEN_Signal_List2Iterator_free(sit);
549 GWEN_Signal_List2_free(slot->connectedSignals);
564 assert(slot->_refCount);
579 GWEN_Slot_List2_free(slist);
586 if ((
void*)slot==user_data)
605 return slot->signalObject;
struct GWEN_SIGNALOBJECT GWEN_SIGNALOBJECT
GWEN_SLOT * GWEN_Slot__List2_hasSlot_cb(GWEN_SLOT *slot, void *user_data)
GWEN_SIGNAL * GWEN_SignalObject_FindSignal(const GWEN_SIGNALOBJECT *so, const char *name, const char *typeOfArg1, const char *typeOfArg2)
#define GWEN_ERROR_INVALID
GWEN_SIGNALOBJECT * GWEN_Signal_GetSignalObject(const GWEN_SIGNAL *sig)
void GWEN_Signal_List2_freeAll(GWEN_SIGNAL_LIST2 *slist)
#define GWEN_FREE_OBJECT(varname)
GWEN_SIGNAL * GWEN_Signal__List2_hasSignal_cb(GWEN_SIGNAL *sig, void *user_data)
void GWEN_Slot_free(GWEN_SLOT *slot)
void GWEN_Slot_List2_freeAll(GWEN_SLOT_LIST2 *slist)
GWEN_SIGNAL * GWEN_SignalObject__findSignal(const GWEN_SIGNALOBJECT *so, const char *name, uint32_t typeId1, uint32_t typeId2)
GWEN_SIGNALOBJECT * GWEN_SignalObject_new(void)
GWEN_SIGNALOBJECT * GWEN_Slot_GetSignalObject(const GWEN_SLOT *slot)
uint32_t GWEN_Inherit_MakeId(const char *typeName)
int GWEN_SignalObject_AddSlot(GWEN_SIGNALOBJECT *so, GWEN_SLOT *slot)
int GWENHYWFAR_CB(* GWEN_SLOT_FUNCTION)(GWEN_SLOT *slot, void *userData, void *pArg1, void *pArg2, int iArg3, int iArg4)
#define GWEN_NEW_OBJECT(typ, varname)
#define DBG_DEBUG(dbg_logger, format, args...)
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)
GWEN_SLOT * GWEN_Slot__List2_freeAll_cb(GWEN_SLOT *slot, GWEN_UNUSED void *user_data)
struct GWEN_SIGNAL GWEN_SIGNAL
void GWEN_SignalObject_free(GWEN_SIGNALOBJECT *so)
GWEN_SLOT * GWEN_SignalObject_FindSlot(const GWEN_SIGNALOBJECT *so, const char *name, const char *typeOfArg1, const char *typeOfArg2)
GWEN_LIST2_FUNCTIONS(TYPEMAKER2_TYPE, Typemaker2_Type)
int GWEN_Signal_Connect(GWEN_SIGNAL *sig, GWEN_SLOT *slot)
GWEN_SIGNAL * GWEN_Signal__List2_freeAll_cb(GWEN_SIGNAL *sig, GWEN_UNUSED void *user_data)
#define DBG_ERROR(dbg_logger, format, args...)
void GWEN_Signal_free(GWEN_SIGNAL *sig)
int GWEN_Signal_List2_HasSignal(GWEN_SIGNAL_LIST2 *slist, const GWEN_SIGNAL *sig)
int GWEN_Signal_Emit(GWEN_SIGNAL *sig, void *pArg1, void *pArg2, int iArg3, int iArg4)
GWEN_SIGNAL * GWEN_Signal_new(GWEN_SIGNALOBJECT *so, const char *derivedType, const char *name, const char *typeOfArg1, const char *typeOfArg2)
struct GWEN_SLOT GWEN_SLOT
void GWEN_SignalObject_RemoveForDerivedType(GWEN_SIGNALOBJECT *so, const char *derivedType)
#define DBG_INFO(dbg_logger, format, args...)
uint32_t GWEN_SignalObject_MkTypeId(const char *typeName)
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, const GWEN_SLOT *slot)
int GWEN_SignalObject_AddSignal(GWEN_SIGNALOBJECT *so, GWEN_SIGNAL *sig)
void GWEN_Slot_Attach(GWEN_SLOT *slot)
int GWEN_Signal_Disconnect(GWEN_SIGNAL *sig, GWEN_SLOT *slot)
void GWEN_Signal_Attach(GWEN_SIGNAL *sig)