Latest m4
[yazpp-moved-to-github.git] / include / yazpp / socket-manager.h
1 /*
2  * Copyright (c) 1998-2005, Index Data.
3  * See the file LICENSE for details.
4  * 
5  * $Id: socket-manager.h,v 1.1 2006-03-29 13:14:15 adam Exp $
6  */
7
8 #ifndef YAZ_SOCKET_MANAGER_INCLUDED
9 #define YAZ_SOCKET_MANAGER_INCLUDED
10
11 #include <yazpp/socket-observer.h>
12 #include <time.h>
13
14 struct yaz_poll_fd;
15 namespace yazpp_1 {
16
17 /** Simple Socket Manager.
18     Implements a stand-alone simple model that uses select(2) to
19     observe socket events.
20 */
21 class YAZ_EXPORT SocketManager : public ISocketObservable {
22  private:
23     struct SocketEntry {
24         ISocketObserver *observer;
25         int fd;
26         unsigned mask;
27         int timeout;
28         int timeout_this;
29         time_t last_activity;
30         SocketEntry *next;
31     };
32     SocketEntry *m_observers;       // all registered observers
33     struct SocketEvent {
34         ISocketObserver *observer;
35         int event;
36         SocketEvent *next;          // front in queue
37         SocketEvent *prev;          // back in queue
38     };
39     SocketEvent *m_queue_front;
40     SocketEvent *m_queue_back;
41     
42     SocketEntry **lookupObserver
43         (ISocketObserver *observer);
44     SocketEvent *getEvent();
45     void putEvent(SocketEvent *event);
46     void removeEvent(ISocketObserver *observer);
47     int m_log;
48     void inspect_poll_result(int res, struct yaz_poll_fd *fds, int no_fds,
49                              int timeout);
50  public:
51     /// Add an observer
52     virtual void addObserver(int fd, ISocketObserver *observer);
53     /// Delete an observer
54     virtual void deleteObserver(ISocketObserver *observer);
55     /// Delete all observers
56     virtual void deleteObservers();
57     /// Set event mask for observer
58     virtual void maskObserver(ISocketObserver *observer, int mask);
59     /// Set timeout
60     virtual void timeoutObserver(ISocketObserver *observer,
61                                  int timeout);
62     /// Process one event. return > 0 if event could be processed;
63     int processEvent();
64     SocketManager();
65     virtual ~SocketManager();
66 };
67
68 };
69
70 #endif
71 /*
72  * Local variables:
73  * c-basic-offset: 4
74  * indent-tabs-mode: nil
75  * End:
76  * vim: shiftwidth=4 tabstop=8 expandtab
77  */
78