servlib/reg/RegistrationTable.h
changeset 0 2b3e5ec03512
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/servlib/reg/RegistrationTable.h	Thu Apr 21 14:57:45 2011 +0100
@@ -0,0 +1,130 @@
+/*
+ *    Copyright 2004-2006 Intel Corporation
+ * 
+ *    Licensed under the Apache License, Version 2.0 (the "License");
+ *    you may not use this file except in compliance with the License.
+ *    You may obtain a copy of the License at
+ * 
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ *    Unless required by applicable law or agreed to in writing, software
+ *    distributed under the License is distributed on an "AS IS" BASIS,
+ *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *    See the License for the specific language governing permissions and
+ *    limitations under the License.
+ */
+
+#ifndef _REGISTRATION_TABLE_H_
+#define _REGISTRATION_TABLE_H_
+
+#include <string>
+#include <oasys/debug/DebugUtils.h>
+#include <oasys/util/StringBuffer.h>
+
+#include "Registration.h"
+
+namespace dtn {
+
+/**
+ * Class for the in-memory registration table. All changes to the
+ * table are made persistent via the RegistrationStore.
+ */
+class RegistrationTable : public oasys::Logger {
+public:
+    /**
+     * Constructor
+     */
+    RegistrationTable();
+
+    /**
+     * Destructor
+     */
+    virtual ~RegistrationTable();
+
+    /**
+     * Add a new registration to the database. Returns true if the
+     * registration is successfully added, false if there's another
+     * registration with the same {endpoint,regid}.
+     *
+     * The flag controls whether or not the registration is added to
+     * the persistent store, which is only done for registrations
+     * added from the RPC interface.
+     */
+    bool add(Registration* reg, bool add_to_store = true);
+
+    /**
+     * Look up a matching registration.
+     */
+    Registration* get(u_int32_t regid) const;
+
+    /**
+     * Look up the first matching registration for the exact endpoint
+     * id pattern given.
+     */
+    Registration* get(const EndpointIDPattern& eid) const;
+
+    /**
+     * Remove the registration from the database, returns true if
+     * successful, false if the registration didn't exist.
+     */
+    bool del(u_int32_t regid);
+    
+    /**
+     * Update the registration in the database. Returns true on
+     * success, false on error.
+     */
+    bool update(Registration* reg);
+    
+    /**
+     * Populate the given reglist with all registrations with an
+     * endpoint id that matches the bundle demux string.
+     *
+     * Returns the count of matching registrations.
+     */
+    int get_matching(const EndpointID& eid, RegistrationList* reg_list) const;
+    
+    /**
+     * Delete any expired registrations
+     *
+     * (was sweepOldRegistrations)
+     */
+    int delete_expired(const time_t now);
+
+    /**
+     * Dump out the registration database.
+     */
+    void dump(oasys::StringBuffer* buf) const;
+
+    /**
+     * Return the routing table.  Asserts that the RegistrationTable
+     * spin lock is held by the caller.
+     */
+    const RegistrationList *reg_list() const;
+
+    /**
+     * Accessor for the RouteTable internal lock.
+     */
+    oasys::Lock* lock() const { return &lock_; }
+
+protected:
+    /**
+     * Internal method to find the location of the given registration.
+     */
+    bool find(u_int32_t regid, RegistrationList::iterator* iter);
+
+    /**
+     * All registrations are tabled in-memory in a flat list. It's
+     * non-obvious what else would be better since we need to do a
+     * prefix match on demux strings in matching_registrations.
+     */
+    RegistrationList reglist_;
+
+    /**
+     * Lock to protect internal data structures.
+     */
+    mutable oasys::SpinLock lock_;
+};
+
+} // namespace dtn
+
+#endif /* _REGISTRATION_TABLE_H_ */