X-Git-Url: http://dolda2000.com/gitweb/?a=blobdiff_plain;f=lib%2Fguile%2Fdolcon-guile.c;h=23010e6f3f3a52fe5d72f85ebdd3412591712970;hb=5f187798d9d378e2b809d9641ec834a34d2af147;hp=9e0575366eea8200634c35c041588b270a887324;hpb=d3372da97568d5e1f35fa19787c8ec8af93a0435;p=doldaconnect.git diff --git a/lib/guile/dolcon-guile.c b/lib/guile/dolcon-guile.c index 9e05753..23010e6 100644 --- a/lib/guile/dolcon-guile.c +++ b/lib/guile/dolcon-guile.c @@ -1,3 +1,21 @@ +/* + * 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 +*/ #include #include #include @@ -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);