Added object Yaz_Z_Assoc. Much more functional client.
[yazpp-moved-to-github.git] / include / yaz-socket-manager.h
1 /*
2  * Copyright (c) 1998-1999, Index Data.
3  * See the file LICENSE for details.
4  * Sebastian Hammer, Adam Dickmeiss
5  * 
6  * $Log: yaz-socket-manager.h,v $
7  * Revision 1.3  1999-03-23 14:17:57  adam
8  * More work on timeout handling. Work on yaz-client.
9  *
10  * Revision 1.2  1999/02/02 14:01:16  adam
11  * First WIN32 port of YAZ++.
12  *
13  * Revision 1.1.1.1  1999/01/28 09:41:07  adam
14  * First implementation of YAZ++.
15  *
16  */
17
18 #include <yaz-socket-observer.h>
19 #include <time.h>
20
21 /** Simple Socket Manager.
22     Implements a stand-alone simple model that uses select(2) to
23     observe socket events.
24 */
25 class YAZ_EXPORT Yaz_SocketManager : public IYazSocketObservable {
26  private:
27     struct YazSocketEntry {
28         IYazSocketObserver *observer;
29         int fd;
30         unsigned mask;
31         unsigned timeout;
32         time_t last_activity;
33         YazSocketEntry *next;
34     };
35     YazSocketEntry *m_observers;       // all registered observers
36     struct YazSocketEvent {
37         IYazSocketObserver *observer;
38         int event;
39         YazSocketEvent *next;          // front in queue
40         YazSocketEvent *prev;          // back in queue
41     };
42     YazSocketEvent *m_queue_front;
43     YazSocketEvent *m_queue_back;
44     
45     YazSocketEntry **Yaz_SocketManager::lookupObserver
46         (IYazSocketObserver *observer);
47     YazSocketEvent *Yaz_SocketManager::getEvent();
48     void putEvent(YazSocketEvent *event);
49     void removeEvent(IYazSocketObserver *observer);
50  public:
51     /// Add an observer
52     virtual void addObserver(int fd, IYazSocketObserver *observer);
53     /// Delete an observer
54     virtual void deleteObserver(IYazSocketObserver *observer);
55     /// Delete all observers
56     virtual void deleteObservers();
57     /// Set event mask for observer
58     virtual void maskObserver(IYazSocketObserver *observer, int mask);
59     /// Set timeout
60     virtual void timeoutObserver(IYazSocketObserver *observer,
61                                  unsigned timeout);
62     /// Process one event. return > 0 if event could be processed;
63     int Yaz_SocketManager::processEvent();
64     Yaz_SocketManager();
65     virtual ~Yaz_SocketManager();
66 };
67