X-Git-Url: http://jsfdemo.indexdata.com/?a=blobdiff_plain;f=src%2Fclient.c;h=a3b5eff33c0ec98d141f5f69d0970e22266af575;hb=d5ffc2f6e667c1d849bf7579add8435664e678c5;hp=7e0f72914072e37c26516a951b3e67a620bb2be8;hpb=0bb5b3d39bfed6694315ad99246e2c8177c57225;p=pazpar2-moved-to-github.git diff --git a/src/client.c b/src/client.c index 7e0f729..a3b5eff 100644 --- a/src/client.c +++ b/src/client.c @@ -1,4 +1,4 @@ -/* $Id: client.c,v 1.24 2007-09-20 08:34:50 adam Exp $ +/* $Id: client.c,v 1.29 2007-10-08 13:19:23 adam Exp $ Copyright (c) 2006-2007, Index Data. This file is part of Pazpar2. @@ -84,11 +84,13 @@ struct client { struct show_raw { int active; // whether this request has been sent to the server int position; + int binary; char *syntax; char *esn; void (*error_handler)(void *data, const char *addinfo); void (*record_handler)(void *data, const char *buf, size_t sz); void *data; + struct show_raw *next; }; static const char *client_states[] = { @@ -236,26 +238,37 @@ int client_show_raw_begin(struct client *cl, int position, void *data, void (*error_handler)(void *data, const char *addinfo), void (*record_handler)(void *data, const char *buf, - size_t sz)) + size_t sz), + void **data2, + int binary) { - if (cl->show_raw) + struct show_raw *rr, **rrp; + if (!cl->connection) + { /* the client has no connection */ return -1; - cl->show_raw = xmalloc(sizeof(*cl->show_raw)); - cl->show_raw->position = position; - cl->show_raw->active = 0; - cl->show_raw->data = data; - cl->show_raw->error_handler = error_handler; - cl->show_raw->record_handler = record_handler; + } + rr = xmalloc(sizeof(*rr)); + *data2 = rr; + rr->position = position; + rr->active = 0; + rr->data = data; + rr->error_handler = error_handler; + rr->record_handler = record_handler; + rr->binary = binary; if (syntax) - cl->show_raw->syntax = xstrdup(syntax); + rr->syntax = xstrdup(syntax); else - cl->show_raw->syntax = 0; + rr->syntax = 0; if (esn) - cl->show_raw->esn = xstrdup(esn); + rr->esn = xstrdup(esn); else - cl->show_raw->esn = 0; + rr->esn = 0; + rr->next = 0; + + for (rrp = &cl->show_raw; *rrp; rrp = &(*rrp)->next) + ; + *rrp = rr; - if (cl->state == Client_Failed) { client_show_raw_error(cl, "client failed"); @@ -271,27 +284,42 @@ int client_show_raw_begin(struct client *cl, int position, return 0; } -void client_show_raw_reset(struct client *cl) +void client_show_raw_remove(struct client *cl, void *data) { - xfree(cl->show_raw); - cl->show_raw = 0; + struct show_raw *rr = data; + struct show_raw **rrp = &cl->show_raw; + while (*rrp != rr) + rrp = &(*rrp)->next; + if (*rrp) + { + *rrp = rr->next; + xfree(rr); + } +} + +void client_show_raw_dequeue(struct client *cl) +{ + struct show_raw *rr = cl->show_raw; + + cl->show_raw = rr->next; + xfree(rr); } static void client_show_raw_error(struct client *cl, const char *addinfo) { - if (cl->show_raw) + while (cl->show_raw) { cl->show_raw->error_handler(cl->show_raw->data, addinfo); - client_show_raw_reset(cl); + client_show_raw_dequeue(cl); } } static void client_show_raw_cancel(struct client *cl) { - if (cl->show_raw) + while (cl->show_raw) { cl->show_raw->error_handler(cl->show_raw->data, "cancel"); - client_show_raw_reset(cl); + client_show_raw_dequeue(cl); } } @@ -539,6 +567,21 @@ static void ingest_raw_records(struct client *cl, Z_Records *r) return; } + if (cl->show_raw && cl->show_raw->binary) + { + Z_External *rec = npr->u.databaseRecord; + if (rec->which == Z_External_octet) + { + cl->show_raw->record_handler(cl->show_raw->data, + (const char *) + rec->u.octet_aligned->buf, + rec->u.octet_aligned->len); + client_show_raw_dequeue(cl); + } + else + client_show_raw_error(cl, "no records"); + } + doc = record_to_xml(client_get_database(cl), npr->u.databaseRecord); if (!doc) { @@ -549,12 +592,13 @@ static void ingest_raw_records(struct client *cl, Z_Records *r) xmlDocDumpMemory(doc, &buf_out, &len_out); xmlFreeDoc(doc); - cl->show_raw->record_handler(cl->show_raw->data, - (const char *) buf_out, len_out); - + if (cl->show_raw) + { + cl->show_raw->record_handler(cl->show_raw->data, + (const char *) buf_out, len_out); + client_show_raw_dequeue(cl); + } xmlFree(buf_out); - xfree(cl->show_raw); - cl->show_raw = 0; } static void ingest_records(struct client *cl, Z_Records *r) @@ -893,7 +937,7 @@ void client_set_connection(struct client *cl, struct connection *con) void client_disconnect(struct client *cl) { if (cl->state != Client_Idle) - cl->state = Client_Disconnected; + client_set_state(cl, Client_Disconnected); client_set_connection(cl, 0); } @@ -982,6 +1026,7 @@ int client_is_active(struct client *cl) { if (cl->connection && (cl->state == Client_Continue || cl->state == Client_Connecting || + cl->state == Client_Connected || cl->state == Client_Initializing || cl->state == Client_Searching || cl->state == Client_Presenting))