Sun, 04 Jan 2004 22:26:10 +0000
[gaim-migrate @ 8674]
Bugfix by Stefan Esser.
committer: Sean Egan <seanegan@pidgin.im>
| 2086 | 1 | /* |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
2 | * Oscar File transfer (OFT) and Oscar Direct Connect (ODC). |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
3 | * (ODC is also referred to as DirectIM and IM Image.) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
4 | * |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
5 | * There are a few static helper functions at the top, then |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
6 | * ODC stuff, then ft stuff. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
7 | * |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
8 | * I feel like this is a good place to explain OFT, so I'm going to |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
9 | * do just that. Each OFT packet has a header type. I guess this |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
10 | * is pretty similar to the subtype of a SNAC packet. The type |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
11 | * basically tells the other client the meaning of the OFT packet. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
12 | * There are two distinct types of file transfer, which I usually |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
13 | * call "sendfile" and "getfile." Sendfile is when you send a file |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
14 | * to another AIM user. Getfile is when you share a group of files, |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
15 | * and other users request that you send them the files. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
16 | * |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
17 | * A typical sendfile file transfer goes like this: |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
18 | * 1) Sender sends a channel 2 ICBM telling the other user that |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
19 | * we want to send them a file. At the same time, we open a |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
20 | * listener socket (this should be done before sending the |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
21 | * ICBM) on some port, and wait for them to connect to us. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
22 | * The ICBM we sent should contain our IP address and the port |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
23 | * number that we're listening on. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
24 | * 2) The receiver connects to the sender on the given IP address |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
25 | * and port. After the connection is established, the receiver |
|
5146
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
26 | * sends an ICBM signifying that we are ready and waiting. |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
27 | * 3) The sender sends an OFT PROMPT message over the OFT |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
28 | * connection. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
29 | * 4) The receiver of the file sends back an exact copy of this |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
30 | * OFT packet, except the cookie is filled in with the cookie |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
31 | * from the ICBM. I think this might be an attempt to verify |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
32 | * that the user that is connected is actually the guy that |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
33 | * we sent the ICBM to. Oh, I've been calling this the ACK. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
34 | * 5) The sender starts sending raw data across the connection |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
35 | * until the entire file has been sent. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
36 | * 6) The receiver knows the file is finished because the sender |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
37 | * sent the file size in an earlier OFT packet. So then the |
|
5146
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
38 | * receiver sends the DONE thingy (after filling in the |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
39 | * "received" checksum and size) and closes the connection. |
| 2086 | 40 | */ |
| 41 | ||
| 42 | #define FAIM_INTERNAL | |
|
5415
e2d73ea0cda7
[gaim-migrate @ 5791]
Mark Doliner <markdoliner@pidgin.im>
parents:
5414
diff
changeset
|
43 | #ifdef HAVE_CONFIG_H |
|
e2d73ea0cda7
[gaim-migrate @ 5791]
Mark Doliner <markdoliner@pidgin.im>
parents:
5414
diff
changeset
|
44 | #include <config.h> |
|
e2d73ea0cda7
[gaim-migrate @ 5791]
Mark Doliner <markdoliner@pidgin.im>
parents:
5414
diff
changeset
|
45 | #endif |
|
e2d73ea0cda7
[gaim-migrate @ 5791]
Mark Doliner <markdoliner@pidgin.im>
parents:
5414
diff
changeset
|
46 | |
| 2086 | 47 | #include <aim.h> |
| 48 | ||
| 49 | #ifndef _WIN32 | |
| 5927 | 50 | #include <stdio.h> |
| 2086 | 51 | #include <netdb.h> |
| 52 | #include <sys/socket.h> | |
| 53 | #include <netinet/in.h> | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
54 | #include <sys/utsname.h> /* for aim_odc_initiate */ |
| 3630 | 55 | #include <arpa/inet.h> /* for inet_ntoa */ |
|
3960
462a9dbc934a
[gaim-migrate @ 4142]
Mark Doliner <markdoliner@pidgin.im>
parents:
3953
diff
changeset
|
56 | #define G_DIR_SEPARATOR '/' |
|
3646
ebf17642064a
[gaim-migrate @ 3770]
Herman Bloggs <herman@bluedigits.com>
parents:
3630
diff
changeset
|
57 | #endif |
|
ebf17642064a
[gaim-migrate @ 3770]
Herman Bloggs <herman@bluedigits.com>
parents:
3630
diff
changeset
|
58 | |
|
ebf17642064a
[gaim-migrate @ 3770]
Herman Bloggs <herman@bluedigits.com>
parents:
3630
diff
changeset
|
59 | #ifdef _WIN32 |
| 3630 | 60 | #include "win32dep.h" |
| 61 | #endif | |
| 2086 | 62 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
63 | struct aim_odc_intdata { |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
64 | fu8_t cookie[8]; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
65 | char sn[MAXSNLEN+1]; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
66 | char ip[22]; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
67 | }; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
68 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
69 | /** |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
70 | * Convert the directory separator from / (0x2f) to ^A (0x01) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
71 | * |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
72 | * @param name The filename to convert. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
73 | */ |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
74 | static void aim_oft_dirconvert_tostupid(char *name) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
75 | { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
76 | while (name[0]) { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
77 | if (name[0] == 0x01) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
78 | name[0] = G_DIR_SEPARATOR; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
79 | name++; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
80 | } |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
81 | } |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
82 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
83 | /** |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
84 | * Convert the directory separator from ^A (0x01) to / (0x2f) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
85 | * |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
86 | * @param name The filename to convert. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
87 | */ |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
88 | static void aim_oft_dirconvert_fromstupid(char *name) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
89 | { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
90 | while (name[0]) { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
91 | if (name[0] == G_DIR_SEPARATOR) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
92 | name[0] = 0x01; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
93 | name++; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
94 | } |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
95 | } |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
96 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
97 | /** |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
98 | * Calculate oft checksum of buffer |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
99 | * |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
100 | * Prevcheck should be 0xFFFF0000 when starting a checksum of a file. The |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
101 | * checksum is kind of a rolling checksum thing, so each time you get bytes |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
102 | * of a file you just call this puppy and it updates the checksum. You can |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
103 | * calculate the checksum of an entire file by calling this in a while or a |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
104 | * for loop, or something. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
105 | * |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
106 | * Thanks to Graham Booker for providing this improved checksum routine, |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
107 | * which is simpler and should be more accurate than Josh Myer's original |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
108 | * code. -- wtm |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
109 | * |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
110 | * This algorithim works every time I have tried it. The other fails |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
111 | * sometimes. So, AOL who thought this up? It has got to be the weirdest |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
112 | * checksum I have ever seen. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
113 | * |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
114 | * @param buffer Buffer of data to checksum. Man I'd like to buff her... |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
115 | * @param bufsize Size of buffer. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
116 | * @param prevcheck Previous checksum. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
117 | */ |
|
4763
7313e8049f0e
[gaim-migrate @ 5081]
Mark Doliner <markdoliner@pidgin.im>
parents:
4650
diff
changeset
|
118 | faim_export fu32_t aim_oft_checksum_chunk(const fu8_t *buffer, int bufferlen, fu32_t prevcheck) |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
119 | { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
120 | fu32_t check = (prevcheck >> 16) & 0xffff, oldcheck; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
121 | int i; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
122 | unsigned short val; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
123 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
124 | for (i=0; i<bufferlen; i++) { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
125 | oldcheck = check; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
126 | if (i&1) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
127 | val = buffer[i]; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
128 | else |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
129 | val = buffer[i] << 8; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
130 | check -= val; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
131 | /* |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
132 | * The following appears to be necessary.... It happens |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
133 | * every once in a while and the checksum doesn't fail. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
134 | */ |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
135 | if (check > oldcheck) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
136 | check--; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
137 | } |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
138 | check = ((check & 0x0000ffff) + (check >> 16)); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
139 | check = ((check & 0x0000ffff) + (check >> 16)); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
140 | return check << 16; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
141 | } |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
142 | |
|
4650
5b2338bb19fd
[gaim-migrate @ 4961]
Mark Doliner <markdoliner@pidgin.im>
parents:
4646
diff
changeset
|
143 | faim_export fu32_t aim_oft_checksum_file(char *filename) { |
|
5b2338bb19fd
[gaim-migrate @ 4961]
Mark Doliner <markdoliner@pidgin.im>
parents:
4646
diff
changeset
|
144 | FILE *fd; |
|
5b2338bb19fd
[gaim-migrate @ 4961]
Mark Doliner <markdoliner@pidgin.im>
parents:
4646
diff
changeset
|
145 | fu32_t checksum = 0xffff0000; |
|
5b2338bb19fd
[gaim-migrate @ 4961]
Mark Doliner <markdoliner@pidgin.im>
parents:
4646
diff
changeset
|
146 | |
|
5b2338bb19fd
[gaim-migrate @ 4961]
Mark Doliner <markdoliner@pidgin.im>
parents:
4646
diff
changeset
|
147 | if ((fd = fopen(filename, "rb"))) { |
|
5b2338bb19fd
[gaim-migrate @ 4961]
Mark Doliner <markdoliner@pidgin.im>
parents:
4646
diff
changeset
|
148 | int bytes; |
|
4763
7313e8049f0e
[gaim-migrate @ 5081]
Mark Doliner <markdoliner@pidgin.im>
parents:
4650
diff
changeset
|
149 | fu8_t buffer[1024]; |
|
4650
5b2338bb19fd
[gaim-migrate @ 4961]
Mark Doliner <markdoliner@pidgin.im>
parents:
4646
diff
changeset
|
150 | |
|
5b2338bb19fd
[gaim-migrate @ 4961]
Mark Doliner <markdoliner@pidgin.im>
parents:
4646
diff
changeset
|
151 | while ((bytes = fread(buffer, 1, 1024, fd))) |
|
5b2338bb19fd
[gaim-migrate @ 4961]
Mark Doliner <markdoliner@pidgin.im>
parents:
4646
diff
changeset
|
152 | checksum = aim_oft_checksum_chunk(buffer, bytes, checksum); |
|
5b2338bb19fd
[gaim-migrate @ 4961]
Mark Doliner <markdoliner@pidgin.im>
parents:
4646
diff
changeset
|
153 | fclose(fd); |
|
5b2338bb19fd
[gaim-migrate @ 4961]
Mark Doliner <markdoliner@pidgin.im>
parents:
4646
diff
changeset
|
154 | } |
|
5b2338bb19fd
[gaim-migrate @ 4961]
Mark Doliner <markdoliner@pidgin.im>
parents:
4646
diff
changeset
|
155 | |
|
5b2338bb19fd
[gaim-migrate @ 4961]
Mark Doliner <markdoliner@pidgin.im>
parents:
4646
diff
changeset
|
156 | return checksum; |
|
5b2338bb19fd
[gaim-migrate @ 4961]
Mark Doliner <markdoliner@pidgin.im>
parents:
4646
diff
changeset
|
157 | } |
|
5b2338bb19fd
[gaim-migrate @ 4961]
Mark Doliner <markdoliner@pidgin.im>
parents:
4646
diff
changeset
|
158 | |
| 2086 | 159 | /** |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
160 | * Create a listening socket on a given port. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
161 | * |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
162 | * XXX - Give the client author the responsibility of setting up a |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
163 | * listener, then we no longer have a libfaim problem with broken |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
164 | * solaris *innocent smile* -- jbm |
| 2086 | 165 | * |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
166 | * @param portnum The port number to bind to. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
167 | * @return The file descriptor of the listening socket. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
168 | */ |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
169 | static int listenestablish(fu16_t portnum) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
170 | { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
171 | #if HAVE_GETADDRINFO |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
172 | int listenfd; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
173 | const int on = 1; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
174 | struct addrinfo hints, *res, *ressave; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
175 | char serv[5]; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
176 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
177 | snprintf(serv, sizeof(serv), "%d", portnum); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
178 | memset(&hints, 0, sizeof(struct addrinfo)); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
179 | hints.ai_flags = AI_PASSIVE; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
180 | hints.ai_family = AF_UNSPEC; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
181 | hints.ai_socktype = SOCK_STREAM; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
182 | if (getaddrinfo(NULL /* any IP */, serv, &hints, &res) != 0) { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
183 | perror("getaddrinfo"); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
184 | return -1; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
185 | } |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
186 | ressave = res; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
187 | do { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
188 | listenfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
189 | if (listenfd < 0) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
190 | continue; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
191 | setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
192 | if (bind(listenfd, res->ai_addr, res->ai_addrlen) == 0) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
193 | break; /* success */ |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
194 | close(listenfd); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
195 | } while ( (res = res->ai_next) ); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
196 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
197 | if (!res) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
198 | return -1; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
199 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
200 | freeaddrinfo(ressave); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
201 | #else |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
202 | int listenfd; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
203 | const int on = 1; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
204 | struct sockaddr_in sockin; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
205 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
206 | if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
207 | perror("socket"); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
208 | return -1; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
209 | } |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
210 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
211 | if (setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(on)) != 0) { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
212 | perror("setsockopt"); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
213 | close(listenfd); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
214 | return -1; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
215 | } |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
216 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
217 | memset(&sockin, 0, sizeof(struct sockaddr_in)); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
218 | sockin.sin_family = AF_INET; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
219 | sockin.sin_port = htons(portnum); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
220 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
221 | if (bind(listenfd, (struct sockaddr *)&sockin, sizeof(struct sockaddr_in)) != 0) { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
222 | perror("bind"); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
223 | close(listenfd); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
224 | return -1; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
225 | } |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
226 | #endif |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
227 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
228 | if (listen(listenfd, 4) != 0) { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
229 | perror("listen"); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
230 | close(listenfd); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
231 | return -1; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
232 | } |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
233 | fcntl(listenfd, F_SETFL, O_NONBLOCK); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
234 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
235 | return listenfd; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
236 | } |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
237 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
238 | /** |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
239 | * After establishing a listening socket, this is called to accept a connection. It |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
240 | * clones the conn used by the listener, and passes both of these to a signal handler. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
241 | * The signal handler should close the listener conn and keep track of the new conn, |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
242 | * since this is what is used for file transfers and what not. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
243 | * |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
244 | * @param sess The session. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
245 | * @param cur The conn the incoming connection is on. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
246 | * @return Return 0 if no errors, otherwise return the error number. |
| 2086 | 247 | */ |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
248 | faim_export int aim_handlerendconnect(aim_session_t *sess, aim_conn_t *cur) |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
249 | { |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
250 | int acceptfd = 0; |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
251 | struct sockaddr addr; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
252 | socklen_t addrlen = sizeof(addr); |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
253 | int ret = 0; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
254 | aim_conn_t *newconn; |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
255 | char ip[20]; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
256 | int port; |
| 2086 | 257 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
258 | if ((acceptfd = accept(cur->fd, &addr, &addrlen)) == -1) |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
259 | return 0; /* not an error */ |
| 2086 | 260 | |
|
7342
c10bfc560ec3
[gaim-migrate @ 7932]
Mark Doliner <markdoliner@pidgin.im>
parents:
5927
diff
changeset
|
261 | if ((addr.sa_family != AF_INET) && (addr.sa_family != AF_INET6)) { /* just in case IPv6 really is happening */ |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
262 | close(acceptfd); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
263 | aim_conn_close(cur); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
264 | return -1; |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
265 | } |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
266 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
267 | strncpy(ip, inet_ntoa(((struct sockaddr_in *)&addr)->sin_addr), sizeof(ip)); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
268 | port = ntohs(((struct sockaddr_in *)&addr)->sin_port); |
| 2086 | 269 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
270 | if (!(newconn = aim_cloneconn(sess, cur))) { |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
271 | close(acceptfd); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
272 | aim_conn_close(cur); |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
273 | return -ENOMEM; |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
274 | } |
| 2086 | 275 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
276 | newconn->type = AIM_CONN_TYPE_RENDEZVOUS; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
277 | newconn->fd = acceptfd; |
| 2086 | 278 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
279 | if (newconn->subtype == AIM_CONN_SUBTYPE_OFT_DIRECTIM) { |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
280 | aim_rxcallback_t userfunc; |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
281 | struct aim_odc_intdata *priv; |
| 2086 | 282 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
283 | priv = (struct aim_odc_intdata *)(newconn->internal = cur->internal); |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
284 | cur->internal = NULL; |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
285 | snprintf(priv->ip, sizeof(priv->ip), "%s:%u", ip, port); |
| 2086 | 286 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
287 | if ((userfunc = aim_callhandler(sess, newconn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIM_ESTABLISHED))) |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
288 | ret = userfunc(sess, NULL, newconn, cur); |
| 2086 | 289 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
290 | } else if (newconn->subtype == AIM_CONN_SUBTYPE_OFT_GETFILE) { |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
291 | } else if (newconn->subtype == AIM_CONN_SUBTYPE_OFT_SENDFILE) { |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
292 | aim_rxcallback_t userfunc; |
| 2086 | 293 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
294 | if ((userfunc = aim_callhandler(sess, newconn, AIM_CB_FAM_OFT, AIM_CB_OFT_ESTABLISHED))) |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
295 | ret = userfunc(sess, NULL, newconn, cur); |
| 3630 | 296 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
297 | } else { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
298 | faimdprintf(sess, 1,"Got a connection on a listener that's not rendezvous. Closing connection.\n"); |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
299 | aim_conn_close(newconn); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
300 | ret = -1; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
301 | } |
| 2086 | 302 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
303 | return ret; |
| 2086 | 304 | } |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
305 | |
| 2086 | 306 | /** |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
307 | * Send client-to-client typing notification over an established direct connection. |
| 2086 | 308 | * |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
309 | * @param sess The session. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
310 | * @param conn The already-connected ODC connection. |
|
4870
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
311 | * @param typing If 0x0002, sends a "typing" message, 0x0001 sends "typed," and |
|
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
312 | * 0x0000 sends "stopped." |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
313 | * @return Return 0 if no errors, otherwise return the error number. |
| 2086 | 314 | */ |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
315 | faim_export int aim_odc_send_typing(aim_session_t *sess, aim_conn_t *conn, int typing) |
| 2086 | 316 | { |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
317 | struct aim_odc_intdata *intdata = (struct aim_odc_intdata *)conn->internal; |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
318 | aim_frame_t *fr; |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
319 | aim_bstream_t *hdrbs; |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
320 | fu8_t *hdr; |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
321 | int hdrlen = 0x44; |
| 2086 | 322 | |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
323 | if (!sess || !conn || (conn->type != AIM_CONN_TYPE_RENDEZVOUS)) |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
324 | return -EINVAL; |
| 2086 | 325 | |
|
4870
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
326 | if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_OFT, 0x0001, 0))) |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
327 | return -ENOMEM; |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
328 | memcpy(fr->hdr.rend.magic, "ODC2", 4); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
329 | fr->hdr.rend.hdrlen = hdrlen; |
| 2086 | 330 | |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
331 | if (!(hdr = calloc(1, hdrlen))) { |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
332 | aim_frame_destroy(fr); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
333 | return -ENOMEM; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
334 | } |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
335 | |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
336 | hdrbs = &(fr->data); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
337 | aim_bstream_init(hdrbs, hdr, hdrlen); |
| 2086 | 338 | |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
339 | aimbs_put16(hdrbs, 0x0006); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
340 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
341 | aimbs_putraw(hdrbs, intdata->cookie, 8); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
342 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
343 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
344 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
345 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
346 | aimbs_put32(hdrbs, 0x00000000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
347 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
348 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
349 | aimbs_put16(hdrbs, 0x0000); |
| 2086 | 350 | |
|
4870
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
351 | if (typing == 0x0002) |
|
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
352 | aimbs_put16(hdrbs, 0x0002 | 0x0008); |
|
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
353 | else if (typing == 0x0001) |
|
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
354 | aimbs_put16(hdrbs, 0x0002 | 0x0004); |
|
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
355 | else |
|
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
356 | aimbs_put16(hdrbs, 0x0002); |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
357 | |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
358 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
359 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
360 | aimbs_putraw(hdrbs, sess->sn, strlen(sess->sn)); |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
361 | |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
362 | aim_bstream_setpos(hdrbs, 52); /* bleeehh */ |
| 2086 | 363 | |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
364 | aimbs_put8(hdrbs, 0x00); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
365 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
366 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
367 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
368 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
369 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
370 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
371 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
372 | aimbs_put8(hdrbs, 0x00); |
| 2086 | 373 | |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
374 | /* end of hdr */ |
| 2086 | 375 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
376 | aim_tx_enqueue(sess, fr); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
377 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
378 | return 0; |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
379 | } |
| 2086 | 380 | |
| 2993 | 381 | /** |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
382 | * Send client-to-client IM over an established direct connection. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
383 | * Call this just like you would aim_send_im, to send a directim. |
| 2993 | 384 | * |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
385 | * @param sess The session. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
386 | * @param conn The already-connected ODC connection. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
387 | * @param msg Null-terminated string to send. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
388 | * @param len The length of the message to send, including binary data. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
389 | * @param encoding 0 for ascii, 2 for Unicode, 3 for ISO 8859-1. |
|
4870
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
390 | * @param isawaymsg 0 if this is not an auto-response, 1 if it is. |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
391 | * @return Return 0 if no errors, otherwise return the error number. |
| 2993 | 392 | */ |
|
4870
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
393 | faim_export int aim_odc_send_im(aim_session_t *sess, aim_conn_t *conn, const char *msg, int len, int encoding, int isawaymsg) |
| 2993 | 394 | { |
| 395 | aim_frame_t *fr; | |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
396 | aim_bstream_t *hdrbs; |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
397 | struct aim_odc_intdata *intdata = (struct aim_odc_intdata *)conn->internal; |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
398 | int hdrlen = 0x44; |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
399 | fu8_t *hdr; |
| 2993 | 400 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
401 | if (!sess || !conn || (conn->type != AIM_CONN_TYPE_RENDEZVOUS) || !msg) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
402 | return -EINVAL; |
| 2993 | 403 | |
|
4875
3aefead7212b
[gaim-migrate @ 5205]
Mark Doliner <markdoliner@pidgin.im>
parents:
4870
diff
changeset
|
404 | if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_OFT, 0x01, 0))) |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
405 | return -ENOMEM; |
| 2993 | 406 | |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
407 | memcpy(fr->hdr.rend.magic, "ODC2", 4); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
408 | fr->hdr.rend.hdrlen = hdrlen; |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
409 | |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
410 | if (!(hdr = calloc(1, hdrlen + len))) { |
| 2993 | 411 | aim_frame_destroy(fr); |
| 412 | return -ENOMEM; | |
| 413 | } | |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
414 | |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
415 | hdrbs = &(fr->data); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
416 | aim_bstream_init(hdrbs, hdr, hdrlen + len); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
417 | |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
418 | aimbs_put16(hdrbs, 0x0006); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
419 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
420 | aimbs_putraw(hdrbs, intdata->cookie, 8); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
421 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
422 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
423 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
424 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
425 | aimbs_put32(hdrbs, len); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
426 | aimbs_put16(hdrbs, encoding); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
427 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
428 | aimbs_put16(hdrbs, 0x0000); |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
429 | |
|
4870
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
430 | /* flags - used for typing notification and to mark if this is an away message */ |
|
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
431 | aimbs_put16(hdrbs, 0x0000 | isawaymsg); |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
432 | |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
433 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
434 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
435 | aimbs_putraw(hdrbs, sess->sn, strlen(sess->sn)); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
436 | |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
437 | aim_bstream_setpos(hdrbs, 52); /* bleeehh */ |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
438 | |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
439 | aimbs_put8(hdrbs, 0x00); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
440 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
441 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
442 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
443 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
444 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
445 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
446 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
447 | aimbs_put8(hdrbs, 0x00); |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
448 | |
| 2993 | 449 | /* end of hdr2 */ |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
450 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
451 | #if 0 /* XXX - this is how you send buddy icon info... */ |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
452 | aimbs_put16(hdrbs, 0x0008); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
453 | aimbs_put16(hdrbs, 0x000c); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
454 | aimbs_put16(hdrbs, 0x0000); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
455 | aimbs_put16(hdrbs, 0x1466); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
456 | aimbs_put16(hdrbs, 0x0001); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
457 | aimbs_put16(hdrbs, 0x2e0f); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
458 | aimbs_put16(hdrbs, 0x393e); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
459 | aimbs_put16(hdrbs, 0xcac8); |
| 2993 | 460 | #endif |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
461 | aimbs_putraw(hdrbs, msg, len); |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
462 | |
| 2993 | 463 | aim_tx_enqueue(sess, fr); |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
464 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
465 | return 0; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
466 | } |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
467 | |
| 2086 | 468 | /** |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
469 | * Get the screen name of the peer of a direct connection. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
470 | * |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
471 | * @param conn The ODC connection. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
472 | * @return The screen name of the dude, or NULL if there was an anomaly. |
| 2086 | 473 | */ |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
474 | faim_export const char *aim_odc_getsn(aim_conn_t *conn) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
475 | { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
476 | struct aim_odc_intdata *intdata; |
| 3630 | 477 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
478 | if (!conn || !conn->internal) |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
479 | return NULL; |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
480 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
481 | if ((conn->type != AIM_CONN_TYPE_RENDEZVOUS) || |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
482 | (conn->subtype != AIM_CONN_SUBTYPE_OFT_DIRECTIM)) |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
483 | return NULL; |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
484 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
485 | intdata = (struct aim_odc_intdata *)conn->internal; |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
486 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
487 | return intdata->sn; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
488 | } |
| 2086 | 489 | |
| 490 | /** | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
491 | * Find the conn of a direct connection with the given buddy. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
492 | * |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
493 | * @param sess The session. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
494 | * @param sn The screen name of the buddy whose direct connection you want to find. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
495 | * @return The conn for the direct connection with the given buddy, or NULL if no |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
496 | * connection was found. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
497 | */ |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
498 | faim_export aim_conn_t *aim_odc_getconn(aim_session_t *sess, const char *sn) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
499 | { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
500 | aim_conn_t *cur; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
501 | struct aim_odc_intdata *intdata; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
502 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
503 | if (!sess || !sn || !strlen(sn)) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
504 | return NULL; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
505 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
506 | for (cur = sess->connlist; cur; cur = cur->next) { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
507 | if ((cur->type == AIM_CONN_TYPE_RENDEZVOUS) && (cur->subtype == AIM_CONN_SUBTYPE_OFT_DIRECTIM)) { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
508 | intdata = cur->internal; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
509 | if (!aim_sncmp(intdata->sn, sn)) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
510 | return cur; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
511 | } |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
512 | } |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
513 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
514 | return NULL; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
515 | } |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
516 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
517 | /** |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
518 | * For those times when we want to open up the direct connection channel ourselves. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
519 | * |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
520 | * You'll want to set up some kind of watcher on this socket. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
521 | * When the state changes, call aim_handlerendconnection with |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
522 | * the connection returned by this. aim_handlerendconnection |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
523 | * will accept the pending connection and stop listening. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
524 | * |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
525 | * @param sess The session |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
526 | * @param sn The screen name to connect to. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
527 | * @return The new connection. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
528 | */ |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
529 | faim_export aim_conn_t *aim_odc_initiate(aim_session_t *sess, const char *sn) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
530 | { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
531 | aim_conn_t *newconn; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
532 | aim_msgcookie_t *cookie; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
533 | struct aim_odc_intdata *priv; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
534 | int listenfd; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
535 | fu16_t port = 4443; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
536 | fu8_t localip[4]; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
537 | fu8_t ck[8]; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
538 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
539 | if (aim_util_getlocalip(localip) == -1) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
540 | return NULL; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
541 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
542 | if ((listenfd = listenestablish(port)) == -1) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
543 | return NULL; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
544 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
545 | aim_im_sendch2_odcrequest(sess, ck, sn, localip, port); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
546 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
547 | cookie = (aim_msgcookie_t *)calloc(1, sizeof(aim_msgcookie_t)); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
548 | memcpy(cookie->cookie, ck, 8); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
549 | cookie->type = AIM_COOKIETYPE_OFTIM; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
550 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
551 | /* this one is for the cookie */ |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
552 | priv = (struct aim_odc_intdata *)calloc(1, sizeof(struct aim_odc_intdata)); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
553 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
554 | memcpy(priv->cookie, ck, 8); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
555 | strncpy(priv->sn, sn, sizeof(priv->sn)); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
556 | cookie->data = priv; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
557 | aim_cachecookie(sess, cookie); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
558 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
559 | /* XXX - switch to aim_cloneconn()? */ |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
560 | if (!(newconn = aim_newconn(sess, AIM_CONN_TYPE_LISTENER, NULL))) { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
561 | close(listenfd); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
562 | return NULL; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
563 | } |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
564 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
565 | /* this one is for the conn */ |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
566 | priv = (struct aim_odc_intdata *)calloc(1, sizeof(struct aim_odc_intdata)); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
567 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
568 | memcpy(priv->cookie, ck, 8); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
569 | strncpy(priv->sn, sn, sizeof(priv->sn)); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
570 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
571 | newconn->fd = listenfd; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
572 | newconn->subtype = AIM_CONN_SUBTYPE_OFT_DIRECTIM; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
573 | newconn->internal = priv; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
574 | newconn->lastactivity = time(NULL); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
575 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
576 | return newconn; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
577 | } |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
578 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
579 | /** |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
580 | * Connect directly to the given buddy for directim. |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
581 | * |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
582 | * This is a wrapper for aim_newconn. |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
583 | * |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
584 | * If addr is NULL, the socket is not created, but the connection is |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
585 | * allocated and setup to connect. |
| 2086 | 586 | * |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
587 | * @param sess The Godly session. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
588 | * @param sn The screen name we're connecting to. I hope it's a girl... |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
589 | * @param addr Address to connect to. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
590 | * @return The new connection. |
| 2086 | 591 | */ |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
592 | faim_export aim_conn_t *aim_odc_connect(aim_session_t *sess, const char *sn, const char *addr, const fu8_t *cookie) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
593 | { |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
594 | aim_conn_t *newconn; |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
595 | struct aim_odc_intdata *intdata; |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
596 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
597 | if (!sess || !sn) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
598 | return NULL; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
599 | |
|
5146
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
600 | if (!(intdata = calloc(1, sizeof(struct aim_odc_intdata)))) |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
601 | return NULL; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
602 | memcpy(intdata->cookie, cookie, 8); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
603 | strncpy(intdata->sn, sn, sizeof(intdata->sn)); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
604 | if (addr) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
605 | strncpy(intdata->ip, addr, sizeof(intdata->ip)); |
| 2086 | 606 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
607 | /* XXX - verify that non-blocking connects actually work */ |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
608 | if (!(newconn = aim_newconn(sess, AIM_CONN_TYPE_RENDEZVOUS, addr))) { |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
609 | free(intdata); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
610 | return NULL; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
611 | } |
| 2086 | 612 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
613 | newconn->internal = intdata; |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
614 | newconn->subtype = AIM_CONN_SUBTYPE_OFT_DIRECTIM; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
615 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
616 | return newconn; |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
617 | } |
| 2086 | 618 | |
| 619 | /** | |
|
4826
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
620 | * Sometimes you just don't know with these kinds of people. |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
621 | * |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
622 | * @param sess The session. |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
623 | * @param conn The ODC connection of the incoming data. |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
624 | * @param frr The frame allocated for the incoming data. |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
625 | * @param bs It stands for "bologna sandwich." |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
626 | * @return Return 0 if no errors, otherwise return the error number. |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
627 | */ |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
628 | static int handlehdr_odc(aim_session_t *sess, aim_conn_t *conn, aim_frame_t *frr, aim_bstream_t *bs) |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
629 | { |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
630 | aim_frame_t fr; |
|
4870
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
631 | int ret = 0; |
|
4826
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
632 | aim_rxcallback_t userfunc; |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
633 | fu32_t payloadlength; |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
634 | fu16_t flags, encoding; |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
635 | char *snptr = NULL; |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
636 | |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
637 | fr.conn = conn; |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
638 | |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
639 | /* AAA - ugly */ |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
640 | aim_bstream_setpos(bs, 20); |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
641 | payloadlength = aimbs_get32(bs); |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
642 | |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
643 | aim_bstream_setpos(bs, 24); |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
644 | encoding = aimbs_get16(bs); |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
645 | |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
646 | aim_bstream_setpos(bs, 30); |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
647 | flags = aimbs_get16(bs); |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
648 | |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
649 | aim_bstream_setpos(bs, 36); |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
650 | /* XXX - create an aimbs_getnullstr function? */ |
|
4913
c58b53024da4
[gaim-migrate @ 5247]
Mark Doliner <markdoliner@pidgin.im>
parents:
4895
diff
changeset
|
651 | snptr = aimbs_getstr(bs, 32); /* Next 32 bytes contain the sn, padded with null chars */ |
|
4826
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
652 | |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
653 | faimdprintf(sess, 2, "faim: OFT frame: handlehdr_odc: %04x / %04x / %s\n", payloadlength, flags, snptr); |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
654 | |
|
4870
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
655 | if (flags & 0x0008) { |
|
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
656 | if ((userfunc = aim_callhandler(sess, conn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMTYPING))) |
|
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
657 | ret = userfunc(sess, &fr, snptr, 2); |
|
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
658 | } else if (flags & 0x0004) { |
|
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
659 | if ((userfunc = aim_callhandler(sess, conn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMTYPING))) |
|
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
660 | ret = userfunc(sess, &fr, snptr, 1); |
|
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
661 | } else { |
|
4826
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
662 | if ((userfunc = aim_callhandler(sess, conn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMTYPING))) |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
663 | ret = userfunc(sess, &fr, snptr, 0); |
|
4870
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
664 | } |
|
4826
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
665 | |
| 7997 | 666 | if ((payloadlength != 0) && (payloadlength + 1 != 0)) { |
|
4870
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
667 | char *msg; |
|
4826
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
668 | int recvd = 0; |
|
4870
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
669 | int i, isawaymsg; |
|
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
670 | |
|
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
671 | isawaymsg = flags & 0x0001; |
|
4826
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
672 | |
| 4895 | 673 | if (!(msg = calloc(1, payloadlength+1))) { |
| 674 | free(snptr); | |
|
4870
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
675 | return -ENOMEM; |
| 4895 | 676 | } |
|
4870
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
677 | |
|
4826
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
678 | while (payloadlength - recvd) { |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
679 | if (payloadlength - recvd >= 1024) |
|
4870
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
680 | i = aim_recv(conn->fd, &msg[recvd], 1024); |
|
4826
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
681 | else |
|
4870
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
682 | i = aim_recv(conn->fd, &msg[recvd], payloadlength - recvd); |
|
4826
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
683 | if (i <= 0) { |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
684 | free(msg); |
| 4895 | 685 | free(snptr); |
|
4826
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
686 | return -1; |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
687 | } |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
688 | recvd = recvd + i; |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
689 | if ((userfunc = aim_callhandler(sess, conn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_IMAGETRANSFER))) |
|
4870
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
690 | ret = userfunc(sess, &fr, snptr, (double)recvd / payloadlength); |
|
4826
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
691 | } |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
692 | |
|
4870
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
693 | if ((userfunc = aim_callhandler(sess, conn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMINCOMING))) |
|
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
694 | ret = userfunc(sess, &fr, snptr, msg, payloadlength, encoding, isawaymsg); |
|
4826
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
695 | |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
696 | free(msg); |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
697 | } |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
698 | |
| 4895 | 699 | free(snptr); |
| 700 | ||
|
4870
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
701 | return ret; |
|
4826
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
702 | } |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
703 | |
|
5146
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
704 | faim_export struct aim_oft_info *aim_oft_createinfo(aim_session_t *sess, const fu8_t *cookie, const char *sn, const char *ip, fu16_t port, fu32_t size, fu32_t modtime, char *filename) |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
705 | { |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
706 | struct aim_oft_info *new; |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
707 | |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
708 | if (!sess) |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
709 | return NULL; |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
710 | |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
711 | if (!(new = (struct aim_oft_info *)calloc(1, sizeof(struct aim_oft_info)))) |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
712 | return NULL; |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
713 | |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
714 | new->sess = sess; |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
715 | if (cookie) |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
716 | memcpy(new->cookie, cookie, 8); |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
717 | if (ip) |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
718 | new->clientip = strdup(ip); |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
719 | if (sn) |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
720 | new->sn = strdup(sn); |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
721 | new->port = port; |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
722 | new->fh.totfiles = 1; |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
723 | new->fh.filesleft = 1; |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
724 | new->fh.totparts = 1; |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
725 | new->fh.partsleft = 1; |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
726 | new->fh.totsize = size; |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
727 | new->fh.size = size; |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
728 | new->fh.modtime = modtime; |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
729 | new->fh.checksum = 0xffff0000; |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
730 | new->fh.rfrcsum = 0xffff0000; |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
731 | new->fh.rfcsum = 0xffff0000; |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
732 | new->fh.recvcsum = 0xffff0000; |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
733 | strncpy(new->fh.idstring, "OFT_Windows ICBMFT V1.1 32", 31); |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
734 | if (filename) |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
735 | strncpy(new->fh.name, filename, 63); |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
736 | |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
737 | new->next = sess->oft_info; |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
738 | sess->oft_info = new; |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
739 | |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
740 | return new; |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
741 | } |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
742 | |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
743 | /** |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
744 | * Remove the given oft_info struct from the oft_info linked list, and |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
745 | * then free its memory. |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
746 | * |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
747 | * @param sess The session. |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
748 | * @param oft_info The aim_oft_info struct that we're destroying. |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
749 | * @return Return 0 if no errors, otherwise return the error number. |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
750 | */ |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
751 | faim_export int aim_oft_destroyinfo(struct aim_oft_info *oft_info) |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
752 | { |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
753 | aim_session_t *sess; |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
754 | |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
755 | if (!oft_info || !(sess = oft_info->sess)) |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
756 | return -EINVAL; |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
757 | |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
758 | if (sess->oft_info && (sess->oft_info == oft_info)) { |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
759 | sess->oft_info = sess->oft_info->next; |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
760 | } else { |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
761 | struct aim_oft_info *cur; |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
762 | for (cur=sess->oft_info; (cur->next && (cur->next!=oft_info)); cur=cur->next); |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
763 | if (cur->next) |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
764 | cur->next = cur->next->next; |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
765 | } |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
766 | |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
767 | free(oft_info->sn); |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
768 | free(oft_info->proxyip); |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
769 | free(oft_info->clientip); |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
770 | free(oft_info->verifiedip); |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
771 | free(oft_info); |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
772 | |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
773 | return 0; |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
774 | } |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
775 | |
|
4826
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
776 | /** |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
777 | * Creates a listener socket so the other dude can connect to us. |
| 2086 | 778 | * |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
779 | * You'll want to set up some kind of watcher on this socket. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
780 | * When the state changes, call aim_handlerendconnection with |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
781 | * the connection returned by this. aim_handlerendconnection |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
782 | * will accept the pending connection and stop listening. |
| 2086 | 783 | * |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
784 | * @param sess The session. |
|
5146
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
785 | * @param oft_info File transfer information associated with this |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
786 | * connection. |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
787 | * @return Return 0 if no errors, otherwise return the error number. |
| 2086 | 788 | */ |
|
5146
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
789 | faim_export int aim_sendfile_listen(aim_session_t *sess, struct aim_oft_info *oft_info) |
| 2086 | 790 | { |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
791 | int listenfd; |
| 2086 | 792 | |
|
5146
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
793 | if (!oft_info) |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
794 | return -EINVAL; |
| 2086 | 795 | |
|
5146
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
796 | if ((listenfd = listenestablish(oft_info->port)) == -1) |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
797 | return 1; |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
798 | |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
799 | if (!(oft_info->conn = aim_newconn(sess, AIM_CONN_TYPE_LISTENER, NULL))) { |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
800 | close(listenfd); |
|
5146
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
801 | return -ENOMEM; |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
802 | } |
| 3630 | 803 | |
|
5146
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
804 | oft_info->conn->fd = listenfd; |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
805 | oft_info->conn->subtype = AIM_CONN_SUBTYPE_OFT_SENDFILE; |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
806 | oft_info->conn->lastactivity = time(NULL); |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
807 | |
|
5146
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
808 | return 0; |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
809 | } |
| 3630 | 810 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
811 | /** |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
812 | * Extract an &aim_fileheader_t from the given buffer. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
813 | * |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
814 | * @param bs The should be from an incoming rendezvous packet. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
815 | * @return A pointer to new struct on success, or NULL on error. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
816 | */ |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
817 | static struct aim_fileheader_t *aim_oft_getheader(aim_bstream_t *bs) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
818 | { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
819 | struct aim_fileheader_t *fh; |
| 3630 | 820 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
821 | if (!(fh = calloc(1, sizeof(struct aim_fileheader_t)))) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
822 | return NULL; |
| 3630 | 823 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
824 | /* The bstream should be positioned after the hdrtype. */ |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
825 | aimbs_getrawbuf(bs, fh->bcookie, 8); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
826 | fh->encrypt = aimbs_get16(bs); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
827 | fh->compress = aimbs_get16(bs); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
828 | fh->totfiles = aimbs_get16(bs); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
829 | fh->filesleft = aimbs_get16(bs); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
830 | fh->totparts = aimbs_get16(bs); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
831 | fh->partsleft = aimbs_get16(bs); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
832 | fh->totsize = aimbs_get32(bs); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
833 | fh->size = aimbs_get32(bs); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
834 | fh->modtime = aimbs_get32(bs); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
835 | fh->checksum = aimbs_get32(bs); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
836 | fh->rfrcsum = aimbs_get32(bs); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
837 | fh->rfsize = aimbs_get32(bs); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
838 | fh->cretime = aimbs_get32(bs); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
839 | fh->rfcsum = aimbs_get32(bs); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
840 | fh->nrecvd = aimbs_get32(bs); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
841 | fh->recvcsum = aimbs_get32(bs); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
842 | aimbs_getrawbuf(bs, fh->idstring, 32); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
843 | fh->flags = aimbs_get8(bs); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
844 | fh->lnameoffset = aimbs_get8(bs); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
845 | fh->lsizeoffset = aimbs_get8(bs); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
846 | aimbs_getrawbuf(bs, fh->dummy, 69); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
847 | aimbs_getrawbuf(bs, fh->macfileinfo, 16); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
848 | fh->nencode = aimbs_get16(bs); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
849 | fh->nlanguage = aimbs_get16(bs); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
850 | aimbs_getrawbuf(bs, fh->name, 64); /* XXX - filenames longer than 64B */ |
| 2086 | 851 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
852 | return fh; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
853 | } |
| 3630 | 854 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
855 | /** |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
856 | * Fills a buffer with network-order fh data |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
857 | * |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
858 | * @param bs A bstream to fill -- automatically initialized |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
859 | * @param fh A struct aim_fileheader_t to get data from. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
860 | * @return Return non-zero on error. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
861 | */ |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
862 | static int aim_oft_buildheader(aim_bstream_t *bs, struct aim_fileheader_t *fh) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
863 | { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
864 | fu8_t *hdr; |
| 3630 | 865 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
866 | if (!bs || !fh) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
867 | return -EINVAL; |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
868 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
869 | if (!(hdr = (unsigned char *)calloc(1, 0x100 - 8))) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
870 | return -ENOMEM; |
| 3630 | 871 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
872 | aim_bstream_init(bs, hdr, 0x100 - 8); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
873 | aimbs_putraw(bs, fh->bcookie, 8); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
874 | aimbs_put16(bs, fh->encrypt); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
875 | aimbs_put16(bs, fh->compress); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
876 | aimbs_put16(bs, fh->totfiles); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
877 | aimbs_put16(bs, fh->filesleft); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
878 | aimbs_put16(bs, fh->totparts); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
879 | aimbs_put16(bs, fh->partsleft); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
880 | aimbs_put32(bs, fh->totsize); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
881 | aimbs_put32(bs, fh->size); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
882 | aimbs_put32(bs, fh->modtime); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
883 | aimbs_put32(bs, fh->checksum); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
884 | aimbs_put32(bs, fh->rfrcsum); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
885 | aimbs_put32(bs, fh->rfsize); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
886 | aimbs_put32(bs, fh->cretime); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
887 | aimbs_put32(bs, fh->rfcsum); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
888 | aimbs_put32(bs, fh->nrecvd); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
889 | aimbs_put32(bs, fh->recvcsum); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
890 | aimbs_putraw(bs, fh->idstring, 32); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
891 | aimbs_put8(bs, fh->flags); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
892 | aimbs_put8(bs, fh->lnameoffset); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
893 | aimbs_put8(bs, fh->lsizeoffset); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
894 | aimbs_putraw(bs, fh->dummy, 69); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
895 | aimbs_putraw(bs, fh->macfileinfo, 16); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
896 | aimbs_put16(bs, fh->nencode); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
897 | aimbs_put16(bs, fh->nlanguage); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
898 | aimbs_putraw(bs, fh->name, 64); /* XXX - filenames longer than 64B */ |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
899 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
900 | return 0; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
901 | } |
| 2086 | 902 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
903 | /** |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
904 | * Create an OFT packet based on the given information, and send it on its merry way. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
905 | * |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
906 | * @param sess The session. |
|
5146
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
907 | * @param type The subtype of the OFT packet we're sending. |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
908 | * @param oft_info The aim_oft_info struct with the connection and OFT |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
909 | * info we're sending. |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
910 | * @return Return 0 if no errors, otherwise return the error number. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
911 | */ |
|
5146
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
912 | faim_export int aim_oft_sendheader(aim_session_t *sess, fu16_t type, struct aim_oft_info *oft_info) |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
913 | { |
|
5146
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
914 | aim_frame_t *fr; |
| 2086 | 915 | |
|
5146
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
916 | if (!sess || !oft_info || !oft_info->conn || (oft_info->conn->type != AIM_CONN_TYPE_RENDEZVOUS)) |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
917 | return -EINVAL; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
918 | |
|
5146
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
919 | #if 0 |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
920 | /* |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
921 | * If you are receiving a file, the cookie should be null, if you are sending a |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
922 | * file, the cookie should be the same as the one used in the ICBM negotiation |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
923 | * SNACs. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
924 | */ |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
925 | fh->lnameoffset = 0x1a; |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
926 | fh->lsizeoffset = 0x10; |
| 2086 | 927 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
928 | /* apparently 0 is ASCII, 2 is UCS-2 */ |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
929 | /* it is likely that 3 is ISO 8859-1 */ |
|
4826
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
930 | /* I think "nlanguage" might be the same thing as "subenc" in im.c */ |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
931 | fh->nencode = 0x0000; |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
932 | fh->nlanguage = 0x0000; |
|
5146
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
933 | #endif |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
934 | |
|
5146
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
935 | aim_oft_dirconvert_tostupid(oft_info->fh.name); |
| 2086 | 936 | |
|
5146
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
937 | if (!(fr = aim_tx_new(sess, oft_info->conn, AIM_FRAMETYPE_OFT, type, 0))) |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
938 | return -ENOMEM; |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
939 | |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
940 | if (aim_oft_buildheader(&fr->data, &oft_info->fh) == -1) { |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
941 | aim_frame_destroy(fr); |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
942 | return -ENOMEM; |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
943 | } |
| 2086 | 944 | |
|
5146
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
945 | memcpy(fr->hdr.rend.magic, "OFT2", 4); |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
946 | fr->hdr.rend.hdrlen = aim_bstream_curpos(&fr->data); |
| 2086 | 947 | |
|
5146
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
948 | aim_tx_enqueue(sess, fr); |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
949 | |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
950 | return 0; |
| 2086 | 951 | } |
| 952 | ||
| 953 | /** | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
954 | * Handle incoming data on a rendezvous connection. This is analogous to the |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
955 | * consumesnac function in rxhandlers.c, and I really think this should probably |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
956 | * be in rxhandlers.c as well, but I haven't finished cleaning everything up yet. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
957 | * |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
958 | * @param sess The session. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
959 | * @param fr The frame allocated for the incoming data. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
960 | * @return Return 0 if the packet was handled correctly, otherwise return the |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
961 | * error number. |
| 3771 | 962 | */ |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
963 | faim_internal int aim_rxdispatch_rendezvous(aim_session_t *sess, aim_frame_t *fr) |
| 2086 | 964 | { |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
965 | aim_conn_t *conn = fr->conn; |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
966 | int ret = 1; |
| 2086 | 967 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
968 | if (conn->subtype == AIM_CONN_SUBTYPE_OFT_DIRECTIM) { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
969 | if (fr->hdr.rend.type == 0x0001) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
970 | ret = handlehdr_odc(sess, conn, fr, &fr->data); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
971 | else |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
972 | faimdprintf(sess, 0, "faim: ODC directim frame unknown, type is %04x\n", fr->hdr.rend.type); |
| 2086 | 973 | |
|
4826
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
974 | } else { |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
975 | aim_rxcallback_t userfunc; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
976 | struct aim_fileheader_t *header = aim_oft_getheader(&fr->data); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
977 | aim_oft_dirconvert_fromstupid(header->name); /* XXX - This should be client-side */ |
| 3771 | 978 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
979 | if ((userfunc = aim_callhandler(sess, conn, AIM_CB_FAM_OFT, fr->hdr.rend.type))) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
980 | ret = userfunc(sess, fr, conn, header->bcookie, header); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
981 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
982 | free(header); |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
983 | } |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
984 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
985 | if (ret == -1) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
986 | aim_conn_close(conn); |
| 2086 | 987 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
988 | return ret; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
989 | } |