From 84d6db685c4ee5cbce89b4424c68f5d40c2b976b Mon Sep 17 00:00:00 2001
From: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
Date: Wed, 29 Feb 2012 16:59:59 -0800
Subject: [PATCH] visualizer: Adding plugin to display a CCNx FIB state

---
 src/visualizer/visualizer/plugins/ccnx_fib.py |   89 +++++++++++++++++++++++++
 1 file changed, 89 insertions(+)
 create mode 100644 src/visualizer/visualizer/plugins/ccnx_fib.py

diff --git a/src/visualizer/visualizer/plugins/ccnx_fib.py b/src/visualizer/visualizer/plugins/ccnx_fib.py
new file mode 100644
index 0000000..3f09212
--- /dev/null
+++ b/src/visualizer/visualizer/plugins/ccnx_fib.py
@@ -0,0 +1,89 @@
+import gtk
+
+import ns.core
+import ns.network
+import ns.internet
+import ns.NDNabstraction
+
+from visualizer.base import InformationWindow
+
+class ShowCcnxFib(InformationWindow):
+    (
+        COLUMN_PREFIX,
+        COLUMN_FACE
+        ) = range(2)
+
+    def __init__(self, visualizer, node_index):
+        InformationWindow.__init__(self)
+        self.win = gtk.Dialog(parent=visualizer.window,
+                              flags=gtk.DIALOG_DESTROY_WITH_PARENT|gtk.DIALOG_NO_SEPARATOR,
+                              buttons=(gtk.STOCK_CLOSE, gtk.RESPONSE_CLOSE))
+        self.win.connect("response", self._response_cb)
+
+        self.node = ns.network.NodeList.GetNode (node_index)
+        node_name = ns.core.Names.FindName (self.node)
+
+        title = "CCNx FIB for node %i" % node_index
+        if len(node_name) != 0:
+            title += " (" + str(node_name) + ")"
+
+        self.win.set_title (title) 
+        self.visualizer = visualizer
+        self.node_index = node_index
+
+        self.table_model = gtk.ListStore(str, str, int)
+
+        treeview = gtk.TreeView(self.table_model)
+        treeview.show()
+        sw = gtk.ScrolledWindow()
+        sw.set_properties(hscrollbar_policy=gtk.POLICY_AUTOMATIC,
+                          vscrollbar_policy=gtk.POLICY_AUTOMATIC)
+        sw.show()
+        sw.add(treeview)
+        self.win.vbox.add(sw)
+        self.win.set_default_size(600, 300)
+        
+        # Dest.
+        column = gtk.TreeViewColumn('Destination', gtk.CellRendererText(),
+                                    text=self.COLUMN_PREFIX)
+        treeview.append_column(column)
+
+        # Interface
+        column = gtk.TreeViewColumn('faceType[nodeId](routingCost,status,metric)', gtk.CellRendererText(),
+                                    text=self.COLUMN_FACE)
+        treeview.append_column(column)
+
+        self.visualizer.add_information_window(self)
+        self.win.show()
+
+    def _response_cb(self, win, response):
+        self.win.destroy()
+        self.visualizer.remove_information_window(self)
+    
+    def update(self):
+        ccnxFib = self.node.GetObject(ns.NDNabstraction.CcnxFib.GetTypeId())
+        
+        if ccnxFib is None:
+            return
+
+        self.table_model.clear()
+        
+        for fibI in range(ccnxFib.GetCcnxFibEntryCount()):
+            entry = ccnxFib.GetCcnxFibEntry(fibI)
+            tree_iter = self.table_model.append()
+            self.table_model.set(tree_iter,
+                                 self.COLUMN_PREFIX, str(entry.GetPrefix()),
+                                 self.COLUMN_FACE, str(entry))
+
+def populate_node_menu(viz, node, menu):
+    menu_item = gtk.MenuItem("Show CCNx FIB")
+    menu_item.show()
+
+    def _show_ccnx_fib(dummy_menu_item):
+        ShowCcnxFib(viz, node.node_index)
+
+    menu_item.connect("activate", _show_ccnx_fib)
+    menu.add(menu_item)
+
+def register(viz):
+    viz.connect("populate-node-menu", populate_node_menu)
-- 
1.7.10.2

