Added GPL notices to the Guile code.
[doldaconnect.git] / lib / guile / dolcon-guile.c
index 3ad21ff..23010e6 100644 (file)
@@ -1,3 +1,21 @@
+/*
+ *  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
+*/
 #include <stdlib.h>
 #include <stdio.h>
 #include <sys/poll.h>
@@ -22,7 +40,7 @@ struct scmcb
 };
 
 static int fd = -1;
-static scm_bits_t resptype;
+static scm_t_bits resptype;
 
 static SCM scm_dc_connect(SCM host)
 {
@@ -221,11 +239,11 @@ static SCM scm_dc_qcmd(SCM argv, SCM callback)
     addtobuf(toks, NULL);
     if(callback == SCM_UNDEFINED)
     {
-       tag = dc_queuecmd(NULL, NULL, cmd, L"%%a", toks, NULL);
+       tag = dc_queuecmd(NULL, NULL, cmd, L"%a", toks, NULL);
     } else {
        scmcb = scm_must_malloc(sizeof(*scmcb), "scmcb");
        scm_gc_protect_object(scmcb->subr = callback);
-       tag = dc_queuecmd(qcmd_scmcb, scmcb, cmd, L"%%a", toks, NULL);
+       tag = dc_queuecmd(qcmd_scmcb, scmcb, cmd, L"%a", toks, NULL);
     }
     dc_freewcsarr(toks);
     if(cmd != NULL)
@@ -294,6 +312,24 @@ static SCM scm_dc_lexsexpr(SCM sexpr)
     return(scm_reverse(ret));
 }
 
+static SCM scm_dc_checkproto(SCM resp, SCM version)
+{
+    int ver;
+    
+    SCM_ASSERT(SCM_SMOB_PREDICATE(resptype, resp), resp, SCM_ARG1, "dc-checkproto");
+    if(version == SCM_UNDEFINED)
+    {
+       ver = DC_LATEST;
+    } else {
+       SCM_ASSERT(SCM_INUMP(version), version, SCM_ARG2, "dc-checkproto");
+       ver = SCM_INUM(version);
+    }
+    if(dc_checkprotocol(((struct respsmob *)SCM_SMOB_DATA(resp))->resp, ver))
+       return(SCM_BOOL_F);
+    else
+       return(SCM_BOOL_T);
+}
+
 static size_t resp_free(SCM respsmob)
 {
     struct respsmob *data;
@@ -331,6 +367,8 @@ void init_guiledc(void)
     scm_c_define_gsubr("dc-qcmd", 1, 1, 0, scm_dc_qcmd);
     scm_c_define_gsubr("dc-loginasync", 2, 1, 0, scm_dc_loginasync);
     scm_c_define_gsubr("dc-lexsexpr", 1, 0, 0, scm_dc_lexsexpr);
+    scm_c_define_gsubr("dc-checkproto", 1, 1, 0, scm_dc_checkproto);
+    scm_c_define("dc-latest", SCM_MAKINUM(DC_LATEST));
     resptype = scm_make_smob_type("dc-resp", sizeof(struct respsmob));
     scm_set_smob_free(resptype, resp_free);
     scm_set_smob_print(resptype, resp_print);