servlib/discovery/Discovery.h
changeset 0 2b3e5ec03512
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/servlib/discovery/Discovery.h	Thu Apr 21 14:57:45 2011 +0100
@@ -0,0 +1,142 @@
+/*
+ *    Copyright 2006 Baylor University
+ * 
+ *    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 _DISCOVERY_H_
+#define _DISCOVERY_H_
+
+#include <oasys/debug/Log.h>
+#include <string>
+#include <list>
+#include "naming/EndpointID.h"
+#include "Announce.h"
+
+namespace dtn {
+
+/**
+ * Abstraction of neighbor discovery agent.
+ *
+ * Much like Interface, Discovery is generally created by the
+ * configuration file / console. Derived classes (such as 
+ * IPDiscovery) typically bind to a UDP socket to listen for
+ * neighbor beacons.  Bluetooth has built-in discovery mechanisms,
+ * so BluetoothDiscovery polls via Inquiry instead of listen()ing
+ * on a socket.
+ *
+ * To advertise a local convergence layer, register its local address
+ * (and port) by calling "discovery add_cl".  For each registered CL,
+ * Discovery will advertise (outbound) the CL's presence to neighbors,
+ * and distribute (inbound) each event of neighbor discovery to each CL.
+ */
+class Discovery : public oasys::Logger {
+public:
+
+    /**
+     * Name of this Discovery instance
+     */
+    const std::string& name() const { return name_; }
+
+    /**
+     * Address family represented by this Discovery instance
+     */
+    const std::string& af() const { return af_; }
+
+    /**
+     * Outbound address of advertisements sent by this Discovery instance
+     */
+    const std::string& to_addr() const { return to_addr_; }
+
+    /**
+     * Local address on which to listen for advertisements
+     */
+    const std::string& local_addr() const { return local_; }
+
+    /**
+     * Factory method for instantiating objects from the appropriate
+     * derived class
+     */
+    static Discovery* create_discovery(const std::string& name,
+                                       const std::string& afname,
+                                       int argc, const char* argv[],
+                                       const char** error);
+    /**
+     * Append snapshot of object state to StringBuffer
+     */
+    void dump(oasys::StringBuffer* buf);
+
+    /**
+     * Close down listening socket and stop the thread.  Derived classes
+     * should NOT auto-delete.
+     */
+    virtual void shutdown() = 0;
+
+    /**
+     * Register an Announce to advertise a local convergence
+     * layer and to respond to advertisements from neighbors
+     */
+    bool announce(const char* name, int argc, const char* argv[]);
+
+    /**
+     * Remove registration for named announce object 
+     */
+    bool remove(const char* name);
+
+    /**
+     * Handle neighbor discovery out to registered DiscoveryInfo objects
+     */
+    void handle_neighbor_discovered(const std::string& cl_type,
+                                    const std::string& cl_addr,
+                                    const EndpointID& remote_eid);
+
+    virtual ~Discovery();
+protected:
+    typedef std::list<Announce*> List;
+    typedef std::list<Announce*>::iterator iterator;
+
+    /**
+     * Constructor
+     */
+    Discovery(const std::string& name,
+              const std::string& af);
+
+    /**
+     * Configure this Discovery instance
+     */
+    virtual bool configure(int argc, const char* argv[]) = 0;
+
+    /**
+     * Optional handler for new Announce registration
+     */
+    virtual void handle_announce() {}
+
+    /**
+     * Find a registration by name
+     */
+    bool find(const char *name, iterator* iter);
+
+    std::string name_;    ///< name of discovery agent
+    std::string af_;      ///< address family
+    std::string to_addr_; ///< outbound address of advertisements sent
+    std::string local_;   ///< address of beacon listener
+    List list_; 	  ///< registered Announce objects
+private:
+    Discovery(const Discovery&)
+        : oasys::Logger("Discovery","/no/loggy/here")
+    {}
+}; // class Discovery
+
+}; // namespace dtn
+
+#endif // _DISCOVERY_H_