Mercurial > cabal
annotate sources/connection.cpp @ 8:ed800eab1c38 tip
fixed the brackets :^)
| author | Vlad Glagolev <enqlave@gmail.com> |
|---|---|
| date | Sun, 20 Apr 2008 13:45:32 +0400 |
| parents | 8d54d9fdeca3 |
| children |
| rev | line source |
|---|---|
| 7 | 1 /** connection.cpp (2007-04-12) |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
2 * |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
3 * -- CABAL -- connection base (servers usage) |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
4 * |
| 2 | 5 * Copyright (c) 2007-2008 Vlad Glagolev <enqlave@gmail.com> |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
6 * All rights reserved. |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
7 * |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
8 * Permission to use, copy, modify, and distribute this software for any |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
9 * purpose with or without fee is hereby granted, provided that the above |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
10 * copyright notice and this permission notice appear in all copies. |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
11 * |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
12 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
13 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
14 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
15 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
16 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
17 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
18 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
19 */ |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
20 |
|
6
9be05a31b7f9
Enqlave IRC Network => Vaygr IRC Network
Vlad Glagolev <enqlave@gmail.com>
parents:
5
diff
changeset
|
21 #include "cabal.hpp" // required: core.hpp |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
22 |
| 2 | 23 Connection::Connection(): |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
24 nick(NICK), |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
25 user(USER), |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
26 name(NAME), |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
27 chan(CHANNEL), |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
28 key(CHANNEL_KEY) |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
29 { |
|
6
9be05a31b7f9
Enqlave IRC Network => Vaygr IRC Network
Vlad Glagolev <enqlave@gmail.com>
parents:
5
diff
changeset
|
30 hosts = current = NULL; |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
31 |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
32 now = CABAL->now; |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
33 |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
34 uptime = 0; |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
35 |
| 7 | 36 if (CABAL->debug) |
| 37 cout << "CONNECTION: opening...\n"; | |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
38 } |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
39 |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
40 Connection::~Connection() |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
41 { |
| 7 | 42 if (CABAL->debug) |
| 43 cout << "CONNECTION: closed\n"; | |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
44 } |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
45 |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
46 void Connection::ircConnect() |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
47 { |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
48 if (!current) |
| 5 | 49 shut("no hosts defined"); |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
50 |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
51 if (!connected && !connecting) { |
| 7 | 52 if (CABAL->debug) |
| 53 cout << "CONNECTION: connecting to server: " << current->host << endl; | |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
54 |
|
4
a7051ac7118b
added primary parser implementation
Vlad Glagolev <enqlave@gmail.com>
parents:
2
diff
changeset
|
55 if (!resolveHost(current->host, &address)) { |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
56 cout << "Error: unable to resolve host " << current->host << endl; |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
57 |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
58 current = current->next; |
|
4
a7051ac7118b
added primary parser implementation
Vlad Glagolev <enqlave@gmail.com>
parents:
2
diff
changeset
|
59 } else if (!activateTCP(current->port, virtualhost)) { |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
60 cout << "Error: unable to open socket\n"; |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
61 |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
62 return; |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
63 } |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
64 } |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
65 |
|
4
a7051ac7118b
added primary parser implementation
Vlad Glagolev <enqlave@gmail.com>
parents:
2
diff
changeset
|
66 if (!openHost()) |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
67 current = current->next; |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
68 |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
69 if (!connected) |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
70 return; |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
71 |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
72 uptime = now; |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
73 |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
74 if (current->password) |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
75 ircPass(current->password); |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
76 |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
77 ircNick(nick); |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
78 ircUser(user, name); |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
79 ircJoin(chan, key); |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
80 } |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
81 |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
82 void Connection::establish() |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
83 { |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
84 if (!connected) { |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
85 ircConnect(); |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
86 |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
87 return; |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
88 } |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
89 |
| 2 | 90 string buffer = receiveMsg(); |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
91 |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
92 if (buffer != "") { |
| 2 | 93 Parser *DATA = new Parser(this, buffer); |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
94 |
|
4
a7051ac7118b
added primary parser implementation
Vlad Glagolev <enqlave@gmail.com>
parents:
2
diff
changeset
|
95 DATA->Parse(this); |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
96 |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
97 delete DATA; |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
98 } |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
99 } |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
100 |
|
6
9be05a31b7f9
Enqlave IRC Network => Vaygr IRC Network
Vlad Glagolev <enqlave@gmail.com>
parents:
5
diff
changeset
|
101 void Connection::ircPass(string p) |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
102 { |
|
6
9be05a31b7f9
Enqlave IRC Network => Vaygr IRC Network
Vlad Glagolev <enqlave@gmail.com>
parents:
5
diff
changeset
|
103 sendMsg("PASS " + p); |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
104 } |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
105 |
|
6
9be05a31b7f9
Enqlave IRC Network => Vaygr IRC Network
Vlad Glagolev <enqlave@gmail.com>
parents:
5
diff
changeset
|
106 void Connection::ircNick(string n) |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
107 { |
|
6
9be05a31b7f9
Enqlave IRC Network => Vaygr IRC Network
Vlad Glagolev <enqlave@gmail.com>
parents:
5
diff
changeset
|
108 sendMsg("NICK " + (n != "" ? n: NICK)); |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
109 } |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
110 |
|
6
9be05a31b7f9
Enqlave IRC Network => Vaygr IRC Network
Vlad Glagolev <enqlave@gmail.com>
parents:
5
diff
changeset
|
111 void Connection::ircUser(string u, string n) |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
112 { |
|
6
9be05a31b7f9
Enqlave IRC Network => Vaygr IRC Network
Vlad Glagolev <enqlave@gmail.com>
parents:
5
diff
changeset
|
113 sendMsg("USER " + u + (virtualhost ? " " + (string)virtualhost + " ": \ |
|
9be05a31b7f9
Enqlave IRC Network => Vaygr IRC Network
Vlad Glagolev <enqlave@gmail.com>
parents:
5
diff
changeset
|
114 " 0 ") + (string)current->host + " :" + n); |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
115 } |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
116 |
|
6
9be05a31b7f9
Enqlave IRC Network => Vaygr IRC Network
Vlad Glagolev <enqlave@gmail.com>
parents:
5
diff
changeset
|
117 void Connection::ircAway(string m) |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
118 { |
|
6
9be05a31b7f9
Enqlave IRC Network => Vaygr IRC Network
Vlad Glagolev <enqlave@gmail.com>
parents:
5
diff
changeset
|
119 sendMsg("AWAY :" + m); |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
120 } |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
121 |
|
6
9be05a31b7f9
Enqlave IRC Network => Vaygr IRC Network
Vlad Glagolev <enqlave@gmail.com>
parents:
5
diff
changeset
|
122 void Connection::ircJoin(string c, string k) |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
123 { |
|
6
9be05a31b7f9
Enqlave IRC Network => Vaygr IRC Network
Vlad Glagolev <enqlave@gmail.com>
parents:
5
diff
changeset
|
124 sendMsg("JOIN " + c + (k != "" ? " " + k: "")); |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
125 } |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
126 |
|
6
9be05a31b7f9
Enqlave IRC Network => Vaygr IRC Network
Vlad Glagolev <enqlave@gmail.com>
parents:
5
diff
changeset
|
127 void Connection::ircPart(string c) |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
128 { |
|
6
9be05a31b7f9
Enqlave IRC Network => Vaygr IRC Network
Vlad Glagolev <enqlave@gmail.com>
parents:
5
diff
changeset
|
129 sendMsg("PART " + c); |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
130 } |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
131 |
|
6
9be05a31b7f9
Enqlave IRC Network => Vaygr IRC Network
Vlad Glagolev <enqlave@gmail.com>
parents:
5
diff
changeset
|
132 void Connection::ircCycle(string c) |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
133 { |
|
6
9be05a31b7f9
Enqlave IRC Network => Vaygr IRC Network
Vlad Glagolev <enqlave@gmail.com>
parents:
5
diff
changeset
|
134 sendMsg("PART " + c); |
|
9be05a31b7f9
Enqlave IRC Network => Vaygr IRC Network
Vlad Glagolev <enqlave@gmail.com>
parents:
5
diff
changeset
|
135 sendMsg("JOIN " + c); |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
136 } |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
137 |
| 5 | 138 Connection::host_type *Connection::addHost(host_type *list, pchar host, \ |
| 139 int port, pchar password) | |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
140 { |
| 2 | 141 if (!list) |
| 142 current = list = new host_type(host, port, password); | |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
143 else if (list->next == current) |
| 2 | 144 list->next = new host_type(host, port, password, current); |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
145 else |
| 2 | 146 return addHost(list->next, host, port, password); |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
147 |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
148 return list; |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
149 } |
