X-Git-Url: http://git.dolda2000.com/gitweb/?a=blobdiff_plain;f=lib%2Fguile%2Fdolcon%2Fui.scm;h=bf57b06748ee0778b52d93f127c0ff40b03ef258;hb=3af4536f80baf4ff661a577f8206b611ad07bab1;hp=73828df0bc25e97d6a51fa004a65e27da190e321;hpb=d3372da97568d5e1f35fa19787c8ec8af93a0435;p=doldaconnect.git diff --git a/lib/guile/dolcon/ui.scm b/lib/guile/dolcon/ui.scm index 73828df..bf57b06 100644 --- a/lib/guile/dolcon/ui.scm +++ b/lib/guile/dolcon/ui.scm @@ -1,6 +1,23 @@ +; Dolda Connect - Modular multiuser Direct Connect-style client +; Copyright (C) 2007 Fredrik Tolf +; +; 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 + (define-module (dolcon ui)) -(export dc-connect dc-disconnect dc-connected dc-select dc-getresp dc-extract dc-intresp dc-qcmd dc-loginasync dc-lexsexpr) +(export dc-connect dc-disconnect dc-connected dc-select dc-getresp dc-extract dc-intresp dc-qcmd dc-loginasync dc-lexsexpr dc-checkproto) (load-extension "libdolcon-guile" "init_guiledc") @@ -16,15 +33,19 @@ errsym))) (define-public dc-must-connect - (lambda args - (let* ((fd (apply dc-connect args)) (resp (dc-extract (do ((resp (dc-getresp) (dc-getresp))) - ((and resp - (equal? (cdr (assoc 'cmd (dc-extract resp))) ".connect")) - resp) - (dc-select))))) - (if (= (cdr (assoc 'code resp)) 200) - fd + (lambda (host . version) + (let* ((fd (dc-connect host)) + (ores (do ((resp (dc-getresp) (dc-getresp))) + ((and resp + (equal? (cdr (assoc 'cmd (dc-extract resp))) ".connect")) + resp) + (dc-select))) + (resp (dc-extract ores))) + (if (not (= (cdr (assoc 'code resp)) 201)) (throw 'bad-return (cdr (assoc 'code resp)) (cadr (assoc 'resp resp))) + (if (dc-checkproto ores (if (pair? version) (car version) dc-latest)) + fd + (throw 'bad-protocol ores)) ) ) ) @@ -47,9 +68,10 @@ (define-public dc-ecmd (lambda args (let ((tag (dc-qcmd args))) - (do ((resp (dc-getresp tag) (dc-getresp tag))) - (resp resp) - (dc-select)) + (if (>= tag 0) + (do ((resp (dc-getresp tag) (dc-getresp tag))) + (resp resp) + (dc-select))) ) ) )