83 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			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);
 | 
						|
}
 |