//===========================================================================// // File: m_plug.cc // // Project: MUNGA Brick: Connection Library // // Contents: Implementation details for plugs and their iterators // //---------------------------------------------------------------------------// // Date Who Modification // // -------- --- -----------------------------------------------------------// // 09/82/94 ECH Initial coding. // // 10/20/94 JMA Fixed style stuff, merged PLGITR.CPP, added Remove() to // // PlugIterator // // 10/23/94 ECH Added greater deletion safety // // 10/28/94 JMA Made compatible with SGI CC // // 11/02/94 ECH Restored base ReceivePlugCommand // // 11/03/94 ECH Made compatible with BC4.0 // // 11/03/94 JMA Made constructor/destructor out-of-line, moved the // // ReleasePlugLink into the virtual data, made compatible // // with GNU C++ // // 11/08/94 ECH Made compatible with BC4.0 // // 12/01/94 JMA Made compatible with SGI CC // // 12/12/94 ECH Removed release handler // // 02/16/95 ECH Removed m_plug commands, added node command // // 06/07/96 ECH Implemented m_socket based remove functionality // //---------------------------------------------------------------------------// // Copyright (C) 1994-1995, Virtual World Entertainment, Inc. // // All Rights reserved worldwide // // This unpublished sourcecode is PROPRIETARY and CONFIDENTIAL // //===========================================================================// #include "StuffHeaders.hpp" //############################################################################# //############################### Plug ################################## //############################################################################# Plug::ClassData* Plug::DefaultData = NULL; HGOSHEAP Stuff::g_ConnectionEngineHeap = NULL; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // void Plug::InitializeClass() { Verify(!g_ConnectionEngineHeap); g_ConnectionEngineHeap = gos_CreateMemoryHeap("ConnectionEngine", 0, Stuff::g_LibraryHeap); Check_Pointer(g_ConnectionEngineHeap); Verify(!DefaultData); DefaultData = new ClassData( PlugClassID, "Stuff::Plug", RegisteredClass::DefaultData ); Register_Object(DefaultData); } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // void Plug::TerminateClass() { Check_Object(DefaultData); delete DefaultData; DefaultData = NULL; Check_Pointer(g_ConnectionEngineHeap); gos_DestroyMemoryHeap(g_ConnectionEngineHeap); g_ConnectionEngineHeap = NULL; } // //########################################################################### // ~Plug //########################################################################### // Plug::~Plug() { DESTRUCTOR("Plug"); Check_Object(this); Link *link = m_linkHead; while (link) { DESTRUCTOR("Plug::Link"); Check_Object(link); Link *next = link->m_nextPlugLink; Check_Object(link); link->Remove(this); if (link == next) break; link = next; } ChainLink *clink = m_chainLinkHead; while (clink) { DESTRUCTOR("Plug::CLink"); Check_Object(clink); ChainLink *next = clink->m_nextPlugLink; Check_Object(clink); delete clink; if (clink == next) break; clink = next; } } // //########################################################################### // TestInstance //########################################################################### // void Plug::TestInstance() const { Verify(IsDerivedFrom(DefaultData)); if (m_linkHead != NULL) { Check_Object(m_linkHead); } } // //############################################################################# // GetSocketCount //############################################################################# // unsigned Plug::GetSocketCount() { Check_Object(this); Link *link = m_linkHead; if (!link) return 0; unsigned socket_count = 0; do { Check_Object(link); ++socket_count; link = link->m_nextPlugLink; } while (link != m_linkHead); return socket_count; } // //############################################################################# // RemoveSocket //############################################################################# // void Plug::RemoveSocket(Socket *m_socket) { Check_Object(this); Check_Object(m_socket); Link *link = m_linkHead; if (!link) return; do { Check_Object(link); if (link->GetSocket() == m_socket) { link->Remove(this); return; } link = link->m_nextPlugLink; } while (link != m_linkHead); } // //############################################################################# // RemoveSockets //############################################################################# // void Plug::RemoveAllSockets() { Check_Object(this); Link *link = m_linkHead; while (link) { Check_Object(link); Link *next = link->m_nextPlugLink; Check_Object(link); link->Remove(this); if (link == next) break; link = next; } } // //############################################################################# // IsSocketMember //############################################################################# // bool Plug::IsSocketMember(Socket *m_socket) { Check_Object(this); Check_Object(m_socket); Link *link = m_linkHead; if (!link) return false; do { Check_Object(link); if (link->GetSocket() == m_socket) return true; link = link->m_nextPlugLink; } while (link != m_linkHead); return false; } // //############################################################################# // RemoveSockets //############################################################################# // void Plug::RemoveAllChains() { Check_Object(this); ChainLink *clink = m_chainLinkHead; while (clink) { Check_Object(clink); ChainLink *next = clink->m_nextPlugLink; Check_Object(clink); delete clink; if (clink == next) break; clink = next; } } // //############################################################################# // RemoveChain //############################################################################# // void Plug::RemoveChain(Chain *m_chain) { Check_Object(this); Check_Object(m_chain); ChainLink *link = m_chainLinkHead; if (!link) return; do { Check_Object(link); if (link->GetChain() == m_chain) { delete link; return; } link = link->m_nextPlugLink; } while (link != m_chainLinkHead); } // //############################################################################# // IsChainMember //############################################################################# // bool Plug::IsChainMember(Chain *m_chain) { Check_Object(this); Check_Object(m_chain); ChainLink *link = m_chainLinkHead; if (!link) return false; do { Check_Object(link); if (link->GetChain() == m_chain) return true; link = link->m_nextPlugLink; } while (link != m_chainLinkHead); return false; } // //############################################################################# // GetSocketCount //############################################################################# // unsigned Plug::GetChainCount() { Check_Object(this); ChainLink *link = m_chainLinkHead; if (!link) return 0; unsigned count=0; do { Check_Object(link); ++count; link = link->m_nextPlugLink; } while (link != m_chainLinkHead); return count; }