Optimized the DC qcommand queue structure.
[doldaconnect.git] / daemon / filenet.h
1 /*
2  *  Dolda Connect - Modular multiuser Direct Connect-style client
3  *  Copyright (C) 2004 Fredrik Tolf <fredrik@dolda2000.com>
4  *  
5  *  This program is free software; you can redistribute it and/or modify
6  *  it under the terms of the GNU General Public License as published by
7  *  the Free Software Foundation; either version 2 of the License, or
8  *  (at your option) any later version.
9  *  
10  *  This program is distributed in the hope that it will be useful,
11  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  *  GNU General Public License for more details.
14  *  
15  *  You should have received a copy of the GNU General Public License
16  *  along with this program; if not, write to the Free Software
17  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18 */
19 #ifndef _FILENET_H
20 #define _FILENET_H
21
22 #include <wchar.h>
23 #include "net.h"
24 #include "utils.h"
25 #include "search.h"
26
27 #define FNN_SYN 0
28 #define FNN_HS 1
29 #define FNN_EST 2
30 #define FNN_DEAD 3
31
32 #define FNNS_PUB 0
33 #define FNNS_REG 1
34 #define FNNS_OP 2
35
36 #define FNPD_INT 0
37 #define FNPD_LL 1
38 #define FNPD_STR 2
39
40 struct fnetnode;
41 struct fnetpeer;
42
43 struct fnet
44 {
45     struct fnet *next;
46     wchar_t *name;
47     void (*connect)(struct fnetnode *fn, struct socket *sk);
48     void (*destroy)(struct fnetnode *fn);
49     void (*kill)(struct fnetnode *fn);
50     int (*setnick)(struct fnetnode *fn, wchar_t *newnick);
51     int (*reqconn)(struct fnetpeer *peer);
52     int (*sendchat)(struct fnetnode *fn, int public, wchar_t *to, wchar_t *string);
53     int (*search)(struct fnetnode *fn, struct search *srch, struct srchfnnlist *ln);
54     wchar_t *(*filebasename)(wchar_t *filename);
55 };
56
57 struct fnetpeerdatum
58 {
59     struct fnetpeerdatum *next, *prev;
60     int refcount;
61     wchar_t *id;
62     int datatype;
63 };
64
65 struct fnetpeerdi
66 {
67     struct fnetpeerdatum *datum;
68     union
69     {
70         int num;
71         long long lnum;
72         wchar_t *str;
73     } data;
74 };
75
76 struct fnetpeer
77 {
78     struct fnetnode *fn;
79     wchar_t *id;
80     wchar_t *nick;
81     union
82     {
83         struct
84         {
85             int delete:1;
86             int op:1;
87         } b;
88         int w;
89     } flags;
90     int dinum;
91     struct fnetpeerdi *peerdi;
92 };
93
94 struct fnetnode
95 {
96     struct fnetnode *next, *prev;
97     int refcount;
98     int id;
99     int state;
100     int linked;
101     int regstatus;
102     int connected;
103     time_t srchwait, lastsrch;
104     wchar_t *name, *pubid;
105     wchar_t *mynick;
106     wchar_t *owner;
107     struct fnet *fnet;
108     struct fnetpeerdatum *peerdata;
109     struct btree *peers;
110     struct wcspair *args;
111     int numpeers;
112     void *data;
113     CBCHAIN(fnetnode_ac, struct fnetnode *fn, wchar_t *attrib);
114     CBCHAIN(fnetnode_chat, struct fnetnode *fn, int public, wchar_t *name, wchar_t *peer, wchar_t *string);
115     CBCHAIN(fnetnode_unlink, struct fnetnode *fn);
116     CBCHAIN(fnetnode_destroy, struct fnetnode *fn);
117     CBCHAIN(fnetpeer_new, struct fnetnode *fn, struct fnetpeer *peer);
118     CBCHAIN(fnetpeer_del, struct fnetnode *fn, struct fnetpeer *peer);
119     CBCHAIN(fnetpeer_chdi, struct fnetnode *fn, struct fnetpeer *peer, struct fnetpeerdi *di);
120 };
121
122 void regfnet(struct fnet *fnet);
123 void fnetsetname(struct fnetnode *fn, wchar_t *newname);
124 void fnetsetstate(struct fnetnode *fn, int newstate);
125 int fnetsetnick(struct fnetnode *fn, wchar_t *newnick);
126 struct fnet *findfnet(wchar_t *name);
127 struct fnetnode *fnetinitconnect(wchar_t *name, wchar_t *owner, char *addr, struct wcspair *args);
128 void linkfnetnode(struct fnetnode *fn);
129 void unlinkfnetnode(struct fnetnode *fn);
130 void getfnetnode(struct fnetnode *fn);
131 void putfnetnode(struct fnetnode *fn);
132 void killfnetnode(struct fnetnode *fn);
133 struct fnetpeer *fnetaddpeer(struct fnetnode *fn, wchar_t *id, wchar_t *nick);
134 void fnetdelpeer(struct fnetpeer *peer);
135 void fnetpeerdm(struct fnetnode *fn);
136 struct fnetpeer *fnetfindpeer(struct fnetnode *fn, wchar_t *id);
137 void fnetpeersetstr(struct fnetpeer *peer, wchar_t *id, wchar_t *value);
138 void fnetpeersetnum(struct fnetpeer *peer, wchar_t *id, int value);
139 void fnetpeersetlnum(struct fnetpeer *peer, wchar_t *id, long long value);
140 void fnetpeerunset(struct fnetpeer *peer, wchar_t *id);
141 struct fnetnode *findfnetnode(int id);
142 void fnethandlechat(struct fnetnode *fn, int public, wchar_t *name, wchar_t *peer, wchar_t *chat);
143 int fnetsendchat(struct fnetnode *fn, int public, wchar_t *to, wchar_t *string);
144 int fnetsearch(struct fnetnode *fn, struct search *srch, struct srchfnnlist *ln);
145
146 extern struct fnetnode *fnetnodes;
147 EGCBCHAIN(newfncb, struct fnetnode *);
148
149 #endif