Changed IPDU_Observer's interface WRT close.
[yazpp-moved-to-github.git] / include / yazpp / z-server.h
1 /*
2  * Copyright (c) 2000-2007, Index Data.
3  * See the file LICENSE for details.
4  * 
5  * $Id: z-server.h,v 1.4 2007-05-08 12:04:50 adam Exp $
6  */
7
8 #include <yazpp/z-assoc.h>
9
10 namespace yazpp_1 {
11
12 class Z_Server;
13
14 class YAZ_EXPORT Z_ServerUtility {
15  public:
16     void create_databaseRecord (ODR odr, Z_NamePlusRecord *rec,
17                                 const char *dbname, const Odr_oid *format,
18                                 const void *buf, int len);
19     void create_surrogateDiagnostics(ODR odr, Z_NamePlusRecord *rec,
20                                      const char *dbname, int error,
21                                      char *const addinfo);
22     
23     Z_Records *create_nonSurrogateDiagnostics (ODR odr, int error,
24                                                const char *addinfo);
25
26     void create_diagnostics (
27         ODR odr, int error, const char *addinfo,
28         Z_DiagRec ***dreca, int *num);
29
30     virtual ~Z_ServerUtility() = 0;
31 };
32
33 class YAZ_EXPORT IServer_Facility {
34  public:
35     virtual int init(Z_Server *server,
36                      Z_InitRequest *initRequest,
37                      Z_InitResponse *initResponse) = 0;
38     virtual int recv(Z_Server *server, Z_APDU *apdu) = 0;
39
40     virtual ~IServer_Facility() = 0;
41 };
42
43 class YAZ_EXPORT Yaz_Facility_ILL : public IServer_Facility {
44  public:
45     virtual void ill_service (Z_ExtendedServicesRequest *req,
46                               Z_ItemOrder *io,
47                               Z_ExtendedServicesResponse *res) = 0;
48
49     int init(Z_Server *server,
50              Z_InitRequest *initRequest,
51              Z_InitResponse *initResponse);
52     int recv(Z_Server *server, Z_APDU *apdu);
53 };
54
55 class YAZ_EXPORT Yaz_Facility_Update : public IServer_Facility {
56  public:
57     virtual void update_service (Z_ExtendedServicesRequest *req,
58                                  Z_IUUpdate *io,
59                                  Z_ExtendedServicesResponse *res) = 0;
60
61     virtual void update_service0 (Z_ExtendedServicesRequest *req,
62                                  Z_IU0Update *io,
63                                  Z_ExtendedServicesResponse *res) = 0;
64
65     int init(Z_Server *server,
66              Z_InitRequest *initRequest,
67              Z_InitResponse *initResponse);
68     int recv(Z_Server *server, Z_APDU *apdu);
69 };
70
71
72 class YAZ_EXPORT Yaz_Facility_Retrieval : public IServer_Facility,
73     public Z_ServerUtility {
74  public:
75
76     virtual int sr_init (Z_InitRequest *initRequest,
77                          Z_InitResponse *initResponse) = 0;
78     virtual void sr_search (Z_SearchRequest *searchRequest,
79                             Z_SearchResponse *searchResponse) = 0;
80     virtual void sr_present (Z_PresentRequest *presentRequest,
81                              Z_PresentResponse *presentResponse) = 0;
82     virtual void sr_record (const char *resultSetName,
83                             int position,
84                             Odr_oid *format,
85                             Z_RecordComposition *comp,
86                             Z_NamePlusRecord *namePlusRecord,
87                             Z_Records *diagnostics) = 0;
88     int init(Z_Server *server,
89              Z_InitRequest *initRequest,
90              Z_InitResponse *initResponse);
91     int recv(Z_Server *server, Z_APDU *apdu);
92
93     ODR odr_encode();
94     ODR odr_decode();
95  private:
96     Z_Records *pack_records (Z_Server *s,
97                              const char *resultSetName,
98                              int start, int num,
99                              Z_RecordComposition *comp,
100                              int *next, int *pres,
101                              Odr_oid *oid);
102
103     void fetch_via_piggyback (Z_Server *s,
104                               Z_SearchRequest *searchRequest,
105                               Z_SearchResponse *searchResponse);
106     void fetch_via_present (Z_Server *s,
107                             Z_PresentRequest *req, Z_PresentResponse *res);
108
109     int m_preferredMessageSize;
110     int m_maximumRecordSize;
111     ODR m_odr_encode;
112     ODR m_odr_decode;
113 };
114
115 class YAZ_EXPORT Z_Server_Facility_Info {
116     friend class Z_Server;
117     IServer_Facility *m_facility;
118     char *m_name;
119     Z_Server_Facility_Info *m_next;
120 };
121
122
123
124 class YAZ_EXPORT Z_Server : public Z_Assoc {
125 public:
126     Z_Server(IPDU_Observable *the_PDU_Observable);
127     virtual ~Z_Server();
128     void recv_Z_PDU(Z_APDU *apdu, int len);
129     virtual void recv_GDU(Z_GDU *apdu, int len);
130     void facility_add(IServer_Facility *facility, const char *name);
131     void facility_reset ();
132
133
134  private:
135     Z_Server_Facility_Info *m_facilities;
136 };
137
138 class YAZ_EXPORT Yaz_USMARC {
139  public:
140     const char *get_record(size_t position);
141 };
142 };
143 /*
144  * Local variables:
145  * c-basic-offset: 4
146  * indent-tabs-mode: nil
147  * End:
148  * vim: shiftwidth=4 tabstop=8 expandtab
149  */
150