campo-sirio/include/spies.cpp
alex 00aa150b32 *** empty log message ***
git-svn-id: svn://10.65.10.50/trunk@11845 c028cbd2-c16b-5b4b-a496-9718f37d4682
2004-03-12 15:41:25 +00:00

83 lines
1.4 KiB
C++
Executable File

#include <spies.h>
///////////////////////////////////////////////////////////
// TSpy_target
///////////////////////////////////////////////////////////
void TSpy_target::notify(TSpy_message msg, void* pJolly)
{
for (int i = _spies.last(); i >= 0; i = _spies.pred(i))
{
TSpy* spy = (TSpy*)_spies.objptr(i);
spy->notify(msg, pJolly);
}
}
bool TSpy_target::add_spy(TSpy* spy)
{
#ifdef DBG
for (int i = _spies.last(); i >= 0; i--)
{
TSpy* s = (TSpy*)_spies.objptr(i);
if (s == spy)
{
NFCHECK("Double spy");
return FALSE;
}
}
#endif
_spies.add(spy);
return TRUE;
}
bool TSpy_target::kill_spy(const TSpy* spy)
{
int i;
for (i = _spies.last(); i >= 0; i--)
{
TSpy* s = (TSpy*)_spies.objptr(i);
if (s == spy)
{
_spies.destroy(i, TRUE);
break;
}
}
#ifdef DBG
if (i < 0)
NFCHECK("Spy not found");
#endif
return i >= 0;
}
TSpy_target::~TSpy_target()
{
notify(spy_delete, NULL);
}
///////////////////////////////////////////////////////////
// TSpy
///////////////////////////////////////////////////////////
void TSpy::spy(TSpy_target* t)
{
if (_target)
_target->kill_spy(this);
_target = t;
if (_target)
_target->add_spy(this);
}
void TSpy::notify(TSpy_message msg, void* pJolly)
{
CHECK (_target, "Unemployed spy notified");
if (_notify)
_notify(*this, msg, pJolly);
if (msg == spy_delete)
spy(NULL);
}
TSpy::~TSpy()
{
spy(NULL);
}