/*
* IR toolkit for tcl/tk
* (c) Index Data 1995
+ * Sebastian Hammer, Adam Dickmeiss
*
* $Log: ir-tcl.c,v $
- * Revision 1.11 1995-03-16 17:54:03 adam
+ * Revision 1.14 1995-03-20 08:53:22 adam
+ * Event loop in tclmain.c rewritten. New method searchStatus.
+ *
+ * Revision 1.13 1995/03/17 18:26:17 adam
+ * Non-blocking i/o used now. Database names popup as cascade items.
+ *
+ * Revision 1.12 1995/03/17 15:45:00 adam
+ * Improved target/database setup.
+ *
+ * Revision 1.11 1995/03/16 17:54:03 adam
* Minor changes really.
*
* Revision 1.10 1995/03/15 16:14:50 adam
char *buf_in;
int len_in;
+ char *sbuf;
+ int slen;
+
ODR odr_in;
ODR odr_out;
ODR odr_pr;
typedef struct IRSetObj_ {
IRObj *parent;
+ int searchStatus;
int resultCount;
int start;
int number;
Z_APDU apdu, *apdup;
IRObj *p = obj;
Z_InitRequest req;
- char *sbuf;
- int slen;
+ int r;
req.referenceId = 0;
req.options = &p->options;
odr_reset (p->odr_out);
return TCL_ERROR;
}
- sbuf = odr_getbuf (p->odr_out, &slen);
- if (cs_put (p->cs_link, sbuf, slen) < 0)
- {
+ p->sbuf = odr_getbuf (p->odr_out, &p->slen);
+ if ((r=cs_put (p->cs_link, p->sbuf, p->slen)) < 0)
+ {
interp->result = "cs_put failed in init";
return TCL_ERROR;
}
- printf("Sent initializeRequest (%d bytes).\n", slen);
+ else if (r == 1)
+ {
+ ir_select_add_write (cs_fileno(p->cs_link), p);
+ printf("Sent part of initializeRequest (%d bytes).\n", p->slen);
+ }
+ else
+ printf("Sent whole initializeRequest (%d bytes).\n", p->slen);
return TCL_OK;
}
if (cs_type (p->cs_link) == tcpip_type)
{
cs_close (p->cs_link);
- p->cs_link = cs_create (tcpip_type, 1);
+ p->cs_link = cs_create (tcpip_type, 0);
}
else if (cs_type (p->cs_link) == mosi_type)
{
cs_close (p->cs_link);
- p->cs_link = cs_create (mosi_type, 1);
+ p->cs_link = cs_create (mosi_type, 0);
}
else
{
char *cs_type = NULL;
if (argc == 3)
{
+ cs_close (((IRObj*) obj)->cs_link);
if (!strcmp (argv[2], "tcpip"))
- ((IRObj *)obj)->cs_link = cs_create (tcpip_type, 1);
+ ((IRObj *)obj)->cs_link = cs_create (tcpip_type, 0);
else if (!strcmp (argv[2], "mosi"))
- ((IRObj *)obj)->cs_link = cs_create (mosi_type, 1);
+ ((IRObj *)obj)->cs_link = cs_create (mosi_type, 0);
else
{
interp->result = "wrong comstack type";
if (argc < 3)
{
- interp->result = "wrong # args";
- return TCL_ERROR;
+ for (i=0; i<p->num_databaseNames; i++)
+ Tcl_AppendElement (interp, p->databaseNames[i]);
+ return TCL_OK;
}
if (p->databaseNames)
{
{ 0, "init", do_init_request },
{ 0, "disconnect", do_disconnect },
{ 0, "callback", do_callback },
- { 0, "databaseNames", do_databaseNames},
+ { 1, "databaseNames", do_databaseNames},
{ 1, "query", do_query },
{ 0, NULL, NULL}
};
}
if (!(obj = ir_malloc (interp, sizeof(*obj))))
return TCL_ERROR;
- obj->cs_link = cs_create (tcpip_type, 1);
+ obj->cs_link = cs_create (tcpip_type, 0);
obj->maximumRecordSize = 32768;
obj->preferredMessageSize = 4096;
Odr_oct ccl_query;
IRSetObj *obj = o;
IRObj *p = obj->parent;
- char *sbuf;
- int slen;
+ int r;
p->child = o;
if (argc != 3)
odr_reset (p->odr_out);
return TCL_ERROR;
}
- sbuf = odr_getbuf (p->odr_out, &slen);
- if (cs_put (p->cs_link, sbuf, slen) < 0)
+ p->sbuf = odr_getbuf (p->odr_out, &p->slen);
+ if ((r=cs_put (p->cs_link, p->sbuf, p->slen)) < 0)
{
interp->result = "cs_put failed in init";
return TCL_ERROR;
}
- printf ("Search request\n");
+ else if (r == 1)
+ {
+ ir_select_add_write (cs_fileno(p->cs_link), p);
+ printf("Sent part of searchRequest (%d bytes).\n", p->slen);
+ }
+ else
+ {
+ printf ("Whole search request\n");
+ }
return TCL_OK;
}
}
/*
+ * do_searchStatus: Get search status (after search response)
+ */
+static int do_searchStatus (void *o, Tcl_Interp *interp,
+ int argc, char **argv)
+{
+ IRSetObj *obj = o;
+
+ sprintf (interp->result, "%d", obj->searchStatus);
+ return TCL_OK;
+}
+
+/*
* do_numberOfRecordsReturned: Get number of records returned
*/
static int do_numberOfRecordsReturned (void *o, Tcl_Interp *interp,
Z_PresentRequest req;
int start;
int number;
- char *sbuf;
- int slen;
+ int r;
if (argc >= 3)
{
odr_reset (p->odr_out);
return TCL_ERROR;
}
- sbuf = odr_getbuf (p->odr_out, &slen);
- if (cs_put (p->cs_link, sbuf, slen) < 0)
+ p->sbuf = odr_getbuf (p->odr_out, &p->slen);
+ if ((r=cs_put (p->cs_link, p->sbuf, p->slen)) < 0)
{
interp->result = "cs_put failed in init";
return TCL_ERROR;
}
- printf ("Present request, start=%d, num=%d\n", start, number);
+ else if (r == 1)
+ {
+ ir_select_add_write (cs_fileno(p->cs_link), p);
+ printf ("Part of present request, start=%d, num=%d (%d bytes)\n",
+ start, number, p->slen);
+ }
+ else
+ {
+ printf ("Whole present request, start=%d, num=%d (%d bytes)\n",
+ start, number, p->slen);
+ }
return TCL_OK;
}
{
static IRMethod tab[] = {
{ 0, "search", do_search },
+ { 0, "searchStatus", do_searchStatus },
{ 0, "resultCount", do_resultCount },
{ 0, "numberOfRecordsReturned", do_numberOfRecordsReturned },
{ 0, "present", do_present },
IRSetObj *obj = p->child;
if (obj)
+ {
+ obj->searchStatus = searchrs->searchStatus ? 1 : 0;
obj->resultCount = *searchrs->resultCount;
- if (searchrs->searchStatus)
- printf("Search was a success.\n");
+ printf ("Search response %d, %d hits\n",
+ obj->searchStatus, obj->resultCount);
+ }
else
- printf("Search was a bloomin' failure.\n");
- printf("Number of hits: %d\n", *searchrs->resultCount);
+ printf ("Search response, no object!\n");
}
static void ir_initResponse (void *obj, Z_InitResponse *initrs)
printf("Name : %s\n", initrs->implementationName);
if (initrs->implementationVersion)
printf("Version: %s\n", initrs->implementationVersion);
+ if (initrs->maximumRecordSize)
+ printf ("MaximumRecordSize=%d\n", *initrs->maximumRecordSize);
+ if (initrs->preferredMessageSize)
+ printf ("PreferredMessageSize=%d\n", *initrs->preferredMessageSize);
#if 0
if (initrs->userInformationField)
{
}
}
-void ir_select_proc (ClientData clientData)
+/*
+ * ir_select_read: handle incoming packages
+ */
+void ir_select_read (ClientData clientData)
{
IRObj *p = clientData;
Z_APDU *apdu;
} while (cs_more (p->cs_link));
}
+/*
+ * ir_select_write: handle outgoing packages - not yet written.
+ */
+void ir_select_write (ClientData clientData)
+{
+ IRObj *p = clientData;
+ int r;
+
+ if ((r=cs_put (p->cs_link, p->sbuf, p->slen)) < 0)
+ {
+ printf ("select write fail\n");
+ cs_close (p->cs_link);
+ }
+ else if (r == 0) /* remove select bit */
+ {
+ ir_select_remove_write (cs_fileno (p->cs_link), p);
+ }
+}
+
/* ------------------------------------------------------- */
/*
(ClientData) NULL, (Tcl_CmdDeleteProc *) NULL);
return TCL_OK;
}
+
+