// 
// Copyright (C) 2006 SIPfoundry Inc.
// Licensed by SIPfoundry under the LGPL license.
// 
// Copyright (C) 2006 Pingtel Corp.
// Licensed to SIPfoundry under a Contributor Agreement.
// 
// $$
//////////////////////////////////////////////////////////////////////////////
#ifndef CALLERALIASDB_H
#define CALLERALIASDB_H

// SYSTEM INCLUDES

// APPLICATION INCLUDES
#include "os/OsMutex.h"
#include "utl/UtlString.h"

// DEFINES

// MACROS
// EXTERNAL FUNCTIONS
// EXTERNAL VARIABLES
// CONSTANTS
// STRUCTS
// TYPEDEFS
// FORWARD DECLARATIONS
template<class T> class dbCursor;
class dbDatabase;
class dbFieldDescriptor;
class dbQuery;
class RegistrationRow;
class Url;

/// Database of all information acquired through REGISTER messages
class CallerAliasDB
{
  public:
   static const UtlString DbName;

   // Singleton Accessor
   static CallerAliasDB* getInstance( const UtlString& name = DbName );

   /// releaseInstance - cleans up the singleton (for use at exit)
   static void releaseInstance();

   /// Add a single mapping to the database.
   void insertRow(const UtlString identity, ///< identity of caller in 'user@domain' form (no scheme) 
                  const UtlString domain,   /**< domain and optional port for target
                                             *  ( 'example.com' or 'example.com:5099' ) */
                  const UtlString alias     /// returned alias
                  );
   /**<
    * The identity value may be the null string; this is a wildcard entry that matches
    * any caller to the given domain.
    */
   
   /// Get the caller alias for this combination of caller identity and target domain.
   bool getCallerAlias (
      const UtlString& identity, ///< identity of caller in 'user@domain' form (no scheme)
      const UtlString& domain,   /**< domain and optional port for target
                                  *  ( 'example.com' or 'example.com:5099' ) */
      UtlString& callerAlias     /// returned alias
                        ) const;
   /**<
    * @returns true if an alias was found for this caller, false if not
    *
    * This looks in the database for an exact match of identity and domain
    * The caller must decide whether or not to pass a null identity for wildcards.
    * If no match is found, callerAlias is set to the null string.
    */

   // Clear out all rows in the database.
   void removeAllRows ();

   // Write the current rows to the persistent store.
   OsStatus store();

  protected:
   // Fast DB instance
   static dbDatabase* spDBInstance;

   // Fast DB instance
   dbDatabase* mpFastDB;

   // There is only one singleton in this design
   static CallerAliasDB* spInstance;

   // Singleton and Serialization mutex
   static OsMutex sLockMutex;

   // The persistent filename for loading/saving
   static const UtlString DatabaseName;

   // Implicitly called when constructed - reads data from persistent store.
   OsStatus load();

   /// Utility method for dumping all rows
   void getAllRows ( ResultSet& rResultSet ) const;

   // Singleton Constructor is private
   CallerAliasDB(const UtlString& name);

   static const UtlString IdentityKey;
   static const UtlString DomainKey;
   static const UtlString AliasKey;

  private:
   /// No destructor, no no no
   ~CallerAliasDB();

   static UtlString nullString;
};

#endif //CALLERALIASDB_H


syntax highlighted by Code2HTML, v. 0.9.1