Added GPL notices to the Guile code.
[doldaconnect.git] / lib / guile / dolcon-guile.c
index 9e05753..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,23 +40,22 @@ struct scmcb
 };
 
 static int fd = -1;
-static scm_bits_t resptype;
+static scm_t_bits resptype;
 
-static SCM scm_dc_connect(SCM host, SCM port)
+static SCM scm_dc_connect(SCM host)
 {
-    int cport;
+    char *chost;
     
-    SCM_ASSERT(SCM_STRINGP(host), host, SCM_ARG1, "dc-connect");
-    if(port == SCM_UNDEFINED)
+    if(fd >= 0)
+       dc_disconnect();
+    if((host == SCM_UNDEFINED) || (host == SCM_BOOL_F))
     {
-       cport = -1;
+       chost = NULL;
     } else {
-       SCM_ASSERT(SCM_INUMP(port), port, SCM_ARG2, "dc-connect");
-       cport = SCM_INUM(port);
+       SCM_ASSERT(SCM_STRINGP(host), host, SCM_ARG1, "dc-connect");
+       chost = SCM_STRING_CHARS(host);
     }
-    if(fd >= 0)
-       dc_disconnect();
-    if((fd = dc_connect(SCM_STRING_CHARS(host), cport)) < 0)
+    if((fd = dc_connect(chost)) < 0)
        scm_syserror("dc-connect");
     return(SCM_MAKINUM(fd));
 }
@@ -222,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)
@@ -295,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;
@@ -322,7 +357,7 @@ static int resp_print(SCM respsmob, SCM port, scm_print_state *pstate)
 
 void init_guiledc(void)
 {
-    scm_c_define_gsubr("dc-connect", 1, 1, 0, scm_dc_connect);
+    scm_c_define_gsubr("dc-connect", 0, 1, 0, scm_dc_connect);
     scm_c_define_gsubr("dc-disconnect", 0, 0, 0, scm_dc_disconnect);
     scm_c_define_gsubr("dc-connected", 0, 0, 0, scm_dc_connected);
     scm_c_define_gsubr("dc-select", 0, 1, 0, scm_dc_select);
@@ -332,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);