Updated mustconnect and cnl to the new dc_connect API.
[doldaconnect.git] / lib / python / dolcon / __init__.py
index 11cb6d4..c007e01 100644 (file)
@@ -1,3 +1,20 @@
+#  Dolda Connect - Modular multiuser Direct Connect-style client
+#  Copyright (C) 2007 Fredrik Tolf <fredrik@dolda2000.com>
+#  
+#  This program is free software; you can redistribute it and/or modify
+#  it under the terms of the GNU General Public License as published by
+#  the Free Software Foundation; either version 2 of the License, or
+#  (at your option) any later version.
+#  
+#  This program is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#  GNU General Public License for more details.
+#  
+#  You should have received a copy of the GNU General Public License
+#  along with this program; if not, write to the Free Software
+#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
 from dolmod import *
 import os
 
 from dolmod import *
 import os
 
@@ -25,7 +42,7 @@ def login(useauthless = True, **kw):
         select()
     return result[0]
 
         select()
     return result[0]
 
-def mustconnect(host, port = -1):
+def mustconnect(host, revision = latest):
     """A convenience function for connect.
 
     This function will connect to the given host, perform a select
     """A convenience function for connect.
 
     This function will connect to the given host, perform a select
@@ -33,29 +50,29 @@ def mustconnect(host, port = -1):
     any of these steps fail, an exception is raised. If successful,
     the file descriptor for the server connection is returned.
     """
     any of these steps fail, an exception is raised. If successful,
     the file descriptor for the server connection is returned.
     """
-    fd = connect(host, port)
+    if host is None:
+        fd = connect()
+    else:
+        fd = connect(host)
     while True:
         resp = getresp()
         if resp is not None and resp.getcmd() == u".connect":
             break
         select()
     while True:
         resp = getresp()
         if resp is not None and resp.getcmd() == u".connect":
             break
         select()
-    if resp.getcode() != 200:
+    if resp.getcode() != 201:
         raise RuntimeError, resp.intresp()[0][0]
         raise RuntimeError, resp.intresp()[0][0]
+    if not checkproto(resp, revision):
+        raise RuntimeError, resp
     return fd
 
     return fd
 
-def cnl(host = None, port = -1, useauthless = True, **kw):
+def cnl(host = None, useauthless = True, revision = latest, **kw):
     """A convenience function for connect and loginasync.
 
     """A convenience function for connect and loginasync.
 
-    This function will connect to the given server, or the server in
-    the environment variable $DCSERVER if none is given, and
-    authenticate to the server. If any of the steps fail, an exception
-    is raised.
+    This function will connect to the given server, or try the default
+    servers if none given, and authenticate to the server. If any of
+    the steps fail, an exception is raised.
     """
     """
-    if host is None:
-        host = os.getenv("DCSERVER")
-    if host is None:
-        raise ValueError, "No DC host to connect to"
-    fd = mustconnect(host, port)
+    fd = mustconnect(host, revision)
     err, reason = login(useauthless, **kw)
     if err != "success":
         raise RuntimeError, (err, reason)
     err, reason = login(useauthless, **kw)
     if err != "success":
         raise RuntimeError, (err, reason)
@@ -88,3 +105,25 @@ def ecmda(code, *args):
     if resp.getcode() != code:
         raise ValueError, resp.getcode()
     return resp
     if resp.getcode() != code:
         raise ValueError, resp.getcode()
     return resp
+
+def ecmds(*args):
+    """Another convenience function for ecmd.
+
+    Like ecmda, but will fail on all 5xx codes, and succeed on all
+    others.
+    """
+    resp = ecmd(*args)
+    if resp.getcode() >= 500 and resp.getcode() < 600:
+        raise ValueError, tuple(resp.extract()[0])
+    return resp
+
+def getresps():
+    """A generator function which will iterate over all responses from
+    getresp.
+    """
+    while True:
+        resp = getresp()
+        if resp is None:
+            break
+        else:
+            yield resp