00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #include "xrb_signalhandler.hpp"
00012
00013 namespace Xrb
00014 {
00015
00016
00017
00018
00019
00020 SignalSenderBase::SignalSenderBase (SignalHandler *const owner)
00021 {
00022 ASSERT1(owner != NULL);
00023 m_owner = owner;
00024 m_owner->AddSender(this);
00025 m_is_blocking = false;
00026 }
00027
00028
00029
00030
00031
00032 void SignalSender0::Signal ()
00033 {
00034
00035
00036
00037 if (Owner()->IsBlockingSenders() || IsBlocking())
00038 return;
00039
00040
00041
00042 FetchFirstIteratorAttachment();
00043 while (IsIteratorAttachmentValid())
00044 {
00045 Attachment<SignalReceiver0, TransformationSet0 > const &attachment =
00046 IteratorAttachment();
00047
00048 ASSERT1(attachment.m_receiver != NULL);
00049
00050
00051
00052
00053 if (!Owner()->IsBlockingSenders() && !IsBlocking())
00054 {
00055
00056
00057 if (!attachment.m_receiver->Owner()->IsBlockingReceivers() &&
00058 !attachment.m_receiver->IsBlocking())
00059 {
00060 (attachment.m_receiver->Owner()->*attachment.m_receiver->m_callback)();
00061 }
00062 }
00063
00064 else
00065 return;
00066
00067 FetchNextIteratorAttachment();
00068 }
00069 }
00070
00071
00072
00073
00074
00075 SignalReceiverBase::SignalReceiverBase (SignalHandler *const owner)
00076 {
00077 ASSERT1(owner != NULL);
00078 m_owner = owner;
00079 m_owner->AddReceiver(this);
00080 m_is_blocking = false;
00081 }
00082
00083
00084
00085
00086
00087 SignalHandler::SignalHandler ()
00088 {
00089 m_is_blocking_senders = false;
00090 m_is_blocking_receivers = false;
00091 }
00092
00093 SignalHandler::~SignalHandler ()
00094 {
00095 m_sender_list.clear();
00096 m_receiver_list.clear();
00097 }
00098
00099 void SignalHandler::DetachAll ()
00100 {
00101 for (SignalSenderList::iterator it = m_sender_list.begin(),
00102 it_end = m_sender_list.end();
00103 it != it_end;
00104 ++it)
00105 {
00106 SignalSenderBase const *sender = *it;
00107 ASSERT1(sender != NULL);
00108 sender->DetachAll();
00109 }
00110
00111 for (SignalReceiverList::iterator it = m_receiver_list.begin(),
00112 it_end = m_receiver_list.end();
00113 it != it_end;
00114 ++it)
00115 {
00116 SignalReceiverBase const *receiver = *it;
00117 ASSERT1(receiver != NULL);
00118 receiver->DetachAll();
00119 }
00120 }
00121
00122 void SignalHandler::AddSender (SignalSenderBase const *sender)
00123 {
00124 ASSERT1(sender != NULL);
00125 m_sender_list.push_back(sender);
00126 }
00127
00128 void SignalHandler::AddReceiver (SignalReceiverBase const *receiver)
00129 {
00130 ASSERT1(receiver != NULL);
00131 m_receiver_list.push_back(receiver);
00132 }
00133
00134 }