#ifndef BASESERVER_CONTAINER_HXX
#define BASESERVER_CONTAINER_HXX
/* ====================================================================
* The Vovida Software License, Version 1.0
*
* Copyright (c) 2000 Vovida Networks, Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The names "VOCAL", "Vovida Open Communication Application Library",
* and "Vovida Open Communication Application Library (VOCAL)" must
* not be used to endorse or promote products derived from this
* software without prior written permission. For written
* permission, please contact vocal@vovida.org.
*
* 4. Products derived from this software may not be called "VOCAL", nor
* may "VOCAL" appear in their name, without prior written
* permission of Vovida Networks, Inc.
*
* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND
* NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL VOVIDA
* NETWORKS, INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT DAMAGES
* IN EXCESS OF $1,000, NOR FOR ANY INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
* DAMAGE.
*
* ====================================================================
*
* This software consists of voluntary contributions made by Vovida
* Networks, Inc. and many individuals on behalf of Vovida Networks,
* Inc. For more information on Vovida Networks, Inc., please see
* <http://www.vovida.org/>.
*
*/
static const char* const BaseServerContainerVersion
= "$Id: BaseServerContainer.hxx,v 1.20 2002/11/09 02:02:30 derekm Exp $";
#include <map>
#include <vector>
#include "Data.hxx"
#include "Server.hxx"
#include "Sptr.hxx"
#include "VRWLock.hxx"
/**
* This class defines a base container of Servers
*/
class BaseServerContainer
{
public:
/// Default Constructor
BaseServerContainer();
/**
* Copy Constructor
* @param rhs Element to be copied
*/
BaseServerContainer( const BaseServerContainer& rhs );
/**
* Assignment operator
* @param rhs Element contains data to copy
* @return This element
*/
BaseServerContainer& operator=( const BaseServerContainer& rhs );
/**
* Destructor
*/
virtual ~BaseServerContainer();
/**
* Get the server type using the key
* @param key ip address
* @return server type
*/
ServerType getType( const Data& key);
/**
* Get the status of a particular server using the key
* @param key ip address
* @return server status
*/
ServerStatus getStatus( const Data& key);
/**
* Check if HeartbeatDebug flag is On
* @return true/false
*/
bool isHeartbeatDebugOn();
/**
* Turn HeartbeatDebug flag On
*/
void turnHeartbeatDebugOn();
/**
* Add a new server to the container
* @param key ip address
* @param serverType type of server
*/
void addServer( const Data& key, const ServerType serverType);
/**
* Add a new server to the container (for applications that do not get data from provisioning)
* @param key ip address
* @param serverType type of server
* @param maxMissedHB maximum # of heartbeats missed allowed before a server is considered dead.
*/
virtual void addServer( const Data& key, const ServerType serverType, const int maxMissedHB);
/**
* Remove a server from the Container.
* @param key ip address
*/
void remove( const Data& key);
/**
* Return the Server object which corresponds to the key
* @param key ip address
* @param server server object
* @return true/false
*/
bool search( const Data& key, Sptr < Server > & server );
/**
* Update the heartbeat data
*/
virtual bool processHeartbeat( const Data& key) = 0;
/**
* Do HouseKeeping: clear the heartbeat count if received;
* otherwise, mark missed heartbeat
*/
virtual void doHouseKeeping() = 0;
/**
* Get list of Active Servers specified by ServerType
*/
virtual void getListofActive( const ServerType type,
Sptr < std::vector < Data > > & listofActiveServers) = 0;
/**
* Display attributes of a server given the key
* @param key ip address
*/
void display( const Data& key);
/**
* Display attributes of a server given the server object
* @param server server object
*/
virtual void displayServer( const Server& server);
/**
* Display the list of all servers
*/
virtual void displayLists() = 0;
protected:
///
void addServer(const Data& key, Sptr < Server > server);
typedef map < Data, Sptr < Server > > Table;
typedef Table::iterator TableIter;
/// Data member instance of the map
mutable Table serverList;
/// tableLock
VRWLock tableLock;
/// heartbeat debug flag
bool heartbeatDebug;
private:
/**
* Copy data from an element into self
* @param rhs Element contains data to copy
*/
void copyRhsToThis( const BaseServerContainer& rhs );
};
#endif // BASESERVER_CONTAINER_HXX
syntax highlighted by Code2HTML, v. 0.9.1