infocalypse
 
(Steve Dougherty)
2013-08-09: Add support for new connection exchange.

Add support for new connection exchange.

diff --git a/infocalypse/plugin_connect.py b/infocalypse/plugin_connect.py
--- a/infocalypse/plugin_connect.py
+++ b/infocalypse/plugin_connect.py
@@ -9,17 +9,32 @@ PLUGIN_NAME = "org.freenetproject.plugin
 def connect(ui, repo):
     node = fcp.FCPNode()
 
-    # TODO: Should I be using this? Looks internal. The identifier needs to
-    # be consistent though.
-    fcp_id = node._getUniqueId()
+    ui.status("Connecting.\n")
 
-    ui.status("Connecting as '%s'.\n" % fcp_id)
+    # TODO: Would it be worthwhile to have a wrapper that includes PLUGIN_NAME?
+    # TODO: Where to document the spec? devnotes.txt? How to format?
+    hi_there = node.fcpPluginMessage(plugin_name=PLUGIN_NAME,
+                                     plugin_params={'Message': 'Hello',
+                                                    'GetRepoList': 'true'})[0]
+
+    if hi_there['header'] == 'Error':
+        raise util.Abort("The DVCS web UI plugin is not loaded.")
+
+    if hi_there['Replies.Message'] == 'Error':
+        raise util.Abort("Another VCS instance is already connected.")
+
+    print "Connected."
+    import sys
+    sys.exit()
 
     def ping():
-        pong = node.fcpPluginMessage(plugin_name=PLUGIN_NAME, id=fcp_id,
+        pong = node.fcpPluginMessage(plugin_name=PLUGIN_NAME,
                                      plugin_params={'Message': 'Ping'})[0]
         if pong['Replies.Message'] == 'Error':
             raise util.Abort(pong['Replies.Description'])
+        elif pong['Replies.Message'] != 'Pong':
+            ui.warn("Got unrecognized Ping reply '{0}'.\n".format(pong[
+                    'Replies.Message']))
         # Must be faster than the timeout threshold. (5 seconds)
         threading.Timer(4.0, ping).start()
 
@@ -36,7 +51,7 @@ def connect(ui, repo):
         # everything waits on the completion of the current operation.
         # Asynchronous code would require changes on the plugin side but
         # potentially have much lower latency.
-        command = node.fcpPluginMessage(plugin_name=PLUGIN_NAME, id=fcp_id,
+        command = node.fcpPluginMessage(plugin_name=PLUGIN_NAME,
                                         plugin_params=
                                         {'Message': 'ClearToSend',
                                          'SequenceID': sequenceID})[0]