00001
00002
00003
00004
00005
00011 #include <string.h>
00012 #include <yaz/odr.h>
00013 #include <yaz/zgdu.h>
00014
00015 int z_GDU (ODR o, Z_GDU **p, int opt, const char *name)
00016 {
00017 if (o->direction == ODR_DECODE) {
00018 *p = (Z_GDU *) odr_malloc(o, sizeof(**p));
00019 if (o->size > 10 && !memcmp(o->buf, "HTTP/", 5))
00020 {
00021 (*p)->which = Z_GDU_HTTP_Response;
00022 return yaz_decode_http_response(o, &(*p)->u.HTTP_Response);
00023
00024 }
00025 else if (o->size > 5 &&
00026 o->buf[0] >= 0x20 && o->buf[0] < 0x7f
00027 && o->buf[1] >= 0x20 && o->buf[1] < 0x7f
00028 && o->buf[2] >= 0x20 && o->buf[2] < 0x7f
00029 && o->buf[3] >= 0x20 && o->buf[3] < 0x7f)
00030 {
00031 (*p)->which = Z_GDU_HTTP_Request;
00032 return yaz_decode_http_request(o, &(*p)->u.HTTP_Request);
00033 }
00034 else
00035 {
00036 (*p)->which = Z_GDU_Z3950;
00037 return z_APDU(o, &(*p)->u.z3950, opt, 0);
00038 }
00039 }
00040 else
00041 {
00042 switch((*p)->which)
00043 {
00044 case Z_GDU_HTTP_Response:
00045 return yaz_encode_http_response(o, (*p)->u.HTTP_Response);
00046 case Z_GDU_HTTP_Request:
00047 return yaz_encode_http_request(o, (*p)->u.HTTP_Request);
00048 case Z_GDU_Z3950:
00049 return z_APDU(o, &(*p)->u.z3950, opt, 0);
00050 }
00051 }
00052 return 0;
00053 }
00054
00055
00056
00057
00058
00059
00060
00061
00062