Sun, 22 Aug 2004 17:59:17 +0000
[gaim-migrate @ 10697]
Kevin pointed out that the error message for AIM when you couldn't send
a message to someone could be better. So I made it better.
Also renamed AIM_IMCHARSET_bleh to AIM_CHARSET_bleh, since they're used
in direct connect stuff, too.
| 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 */ |
| 8080 | 56 | #include <limits.h> /* for UINT_MAX */ |
|
3960
462a9dbc934a
[gaim-migrate @ 4142]
Mark Doliner <markdoliner@pidgin.im>
parents:
3953
diff
changeset
|
57 | #define G_DIR_SEPARATOR '/' |
|
3646
ebf17642064a
[gaim-migrate @ 3770]
Herman Bloggs <herman@bluedigits.com>
parents:
3630
diff
changeset
|
58 | #endif |
|
ebf17642064a
[gaim-migrate @ 3770]
Herman Bloggs <herman@bluedigits.com>
parents:
3630
diff
changeset
|
59 | |
|
ebf17642064a
[gaim-migrate @ 3770]
Herman Bloggs <herman@bluedigits.com>
parents:
3630
diff
changeset
|
60 | #ifdef _WIN32 |
| 3630 | 61 | #include "win32dep.h" |
| 62 | #endif | |
| 2086 | 63 | |
|
9430
f2d8ecbfc3d0
[gaim-migrate @ 10250]
Mark Doliner <markdoliner@pidgin.im>
parents:
9070
diff
changeset
|
64 | /* |
|
f2d8ecbfc3d0
[gaim-migrate @ 10250]
Mark Doliner <markdoliner@pidgin.im>
parents:
9070
diff
changeset
|
65 | * I really want to switch all our networking code to using IPv6 only, |
|
f2d8ecbfc3d0
[gaim-migrate @ 10250]
Mark Doliner <markdoliner@pidgin.im>
parents:
9070
diff
changeset
|
66 | * but that really isn't a good idea at all. Evan S. of Adium says |
|
f2d8ecbfc3d0
[gaim-migrate @ 10250]
Mark Doliner <markdoliner@pidgin.im>
parents:
9070
diff
changeset
|
67 | * OS X sets all connections as "AF_INET6/PF_INET6," even if there is |
|
f2d8ecbfc3d0
[gaim-migrate @ 10250]
Mark Doliner <markdoliner@pidgin.im>
parents:
9070
diff
changeset
|
68 | * nothing inherently IPv6 about them. And I feel like Linux kernel |
|
f2d8ecbfc3d0
[gaim-migrate @ 10250]
Mark Doliner <markdoliner@pidgin.im>
parents:
9070
diff
changeset
|
69 | * 2.6.5 is doing the same thing. So we REALLY should accept |
|
f2d8ecbfc3d0
[gaim-migrate @ 10250]
Mark Doliner <markdoliner@pidgin.im>
parents:
9070
diff
changeset
|
70 | * connections if they're showing up as IPv6. Old OSes (Solaris?) |
|
f2d8ecbfc3d0
[gaim-migrate @ 10250]
Mark Doliner <markdoliner@pidgin.im>
parents:
9070
diff
changeset
|
71 | * that might not have full IPv6 support yet will fail if we try |
|
f2d8ecbfc3d0
[gaim-migrate @ 10250]
Mark Doliner <markdoliner@pidgin.im>
parents:
9070
diff
changeset
|
72 | * to use PF_INET6 but it isn't defined. --Mark Doliner |
|
f2d8ecbfc3d0
[gaim-migrate @ 10250]
Mark Doliner <markdoliner@pidgin.im>
parents:
9070
diff
changeset
|
73 | */ |
|
f2d8ecbfc3d0
[gaim-migrate @ 10250]
Mark Doliner <markdoliner@pidgin.im>
parents:
9070
diff
changeset
|
74 | #ifndef PF_INET6 |
|
f2d8ecbfc3d0
[gaim-migrate @ 10250]
Mark Doliner <markdoliner@pidgin.im>
parents:
9070
diff
changeset
|
75 | #define PF_INET6 PF_INET |
|
f2d8ecbfc3d0
[gaim-migrate @ 10250]
Mark Doliner <markdoliner@pidgin.im>
parents:
9070
diff
changeset
|
76 | #endif |
|
f2d8ecbfc3d0
[gaim-migrate @ 10250]
Mark Doliner <markdoliner@pidgin.im>
parents:
9070
diff
changeset
|
77 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
78 | struct aim_odc_intdata { |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
79 | fu8_t cookie[8]; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
80 | char sn[MAXSNLEN+1]; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
81 | char ip[22]; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
82 | }; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
83 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
84 | /** |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
85 | * Convert the directory separator from / (0x2f) to ^A (0x01) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
86 | * |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
87 | * @param name The filename to convert. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
88 | */ |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
89 | static void aim_oft_dirconvert_tostupid(char *name) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
90 | { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
91 | while (name[0]) { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
92 | if (name[0] == 0x01) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
93 | name[0] = G_DIR_SEPARATOR; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
94 | name++; |
|
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 | /** |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
99 | * Convert the directory separator from ^A (0x01) to / (0x2f) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
100 | * |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
101 | * @param name The filename to convert. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
102 | */ |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
103 | static void aim_oft_dirconvert_fromstupid(char *name) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
104 | { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
105 | while (name[0]) { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
106 | if (name[0] == G_DIR_SEPARATOR) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
107 | name[0] = 0x01; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
108 | name++; |
|
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 | } |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
111 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
112 | /** |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
113 | * Calculate oft checksum of buffer |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
114 | * |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
115 | * 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
|
116 | * 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
|
117 | * 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
|
118 | * 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
|
119 | * for loop, or something. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
120 | * |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
121 | * Thanks to Graham Booker for providing this improved checksum routine, |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
122 | * 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
|
123 | * code. -- wtm |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
124 | * |
|
8735
01248ea222d3
[gaim-migrate @ 9490]
Jonathan Champ <royanee@users.sourceforge.net>
parents:
8610
diff
changeset
|
125 | * This algorithm works every time I have tried it. The other fails |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
126 | * 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
|
127 | * checksum I have ever seen. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
128 | * |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
129 | * @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
|
130 | * @param bufsize Size of buffer. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
131 | * @param prevcheck Previous checksum. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
132 | */ |
|
4763
7313e8049f0e
[gaim-migrate @ 5081]
Mark Doliner <markdoliner@pidgin.im>
parents:
4650
diff
changeset
|
133 | 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
|
134 | { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
135 | fu32_t check = (prevcheck >> 16) & 0xffff, oldcheck; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
136 | int i; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
137 | unsigned short val; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
138 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
139 | for (i=0; i<bufferlen; i++) { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
140 | oldcheck = check; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
141 | if (i&1) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
142 | val = buffer[i]; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
143 | else |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
144 | val = buffer[i] << 8; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
145 | check -= val; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
146 | /* |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
147 | * The following appears to be necessary.... It happens |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
148 | * every once in a while and the checksum doesn't fail. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
149 | */ |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
150 | if (check > oldcheck) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
151 | check--; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
152 | } |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
153 | check = ((check & 0x0000ffff) + (check >> 16)); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
154 | check = ((check & 0x0000ffff) + (check >> 16)); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
155 | return check << 16; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
156 | } |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
157 | |
|
4650
5b2338bb19fd
[gaim-migrate @ 4961]
Mark Doliner <markdoliner@pidgin.im>
parents:
4646
diff
changeset
|
158 | faim_export fu32_t aim_oft_checksum_file(char *filename) { |
|
5b2338bb19fd
[gaim-migrate @ 4961]
Mark Doliner <markdoliner@pidgin.im>
parents:
4646
diff
changeset
|
159 | FILE *fd; |
|
5b2338bb19fd
[gaim-migrate @ 4961]
Mark Doliner <markdoliner@pidgin.im>
parents:
4646
diff
changeset
|
160 | fu32_t checksum = 0xffff0000; |
|
5b2338bb19fd
[gaim-migrate @ 4961]
Mark Doliner <markdoliner@pidgin.im>
parents:
4646
diff
changeset
|
161 | |
|
5b2338bb19fd
[gaim-migrate @ 4961]
Mark Doliner <markdoliner@pidgin.im>
parents:
4646
diff
changeset
|
162 | if ((fd = fopen(filename, "rb"))) { |
|
5b2338bb19fd
[gaim-migrate @ 4961]
Mark Doliner <markdoliner@pidgin.im>
parents:
4646
diff
changeset
|
163 | int bytes; |
|
4763
7313e8049f0e
[gaim-migrate @ 5081]
Mark Doliner <markdoliner@pidgin.im>
parents:
4650
diff
changeset
|
164 | fu8_t buffer[1024]; |
|
4650
5b2338bb19fd
[gaim-migrate @ 4961]
Mark Doliner <markdoliner@pidgin.im>
parents:
4646
diff
changeset
|
165 | |
|
5b2338bb19fd
[gaim-migrate @ 4961]
Mark Doliner <markdoliner@pidgin.im>
parents:
4646
diff
changeset
|
166 | while ((bytes = fread(buffer, 1, 1024, fd))) |
|
5b2338bb19fd
[gaim-migrate @ 4961]
Mark Doliner <markdoliner@pidgin.im>
parents:
4646
diff
changeset
|
167 | checksum = aim_oft_checksum_chunk(buffer, bytes, checksum); |
|
5b2338bb19fd
[gaim-migrate @ 4961]
Mark Doliner <markdoliner@pidgin.im>
parents:
4646
diff
changeset
|
168 | fclose(fd); |
|
5b2338bb19fd
[gaim-migrate @ 4961]
Mark Doliner <markdoliner@pidgin.im>
parents:
4646
diff
changeset
|
169 | } |
|
5b2338bb19fd
[gaim-migrate @ 4961]
Mark Doliner <markdoliner@pidgin.im>
parents:
4646
diff
changeset
|
170 | |
|
5b2338bb19fd
[gaim-migrate @ 4961]
Mark Doliner <markdoliner@pidgin.im>
parents:
4646
diff
changeset
|
171 | return checksum; |
|
5b2338bb19fd
[gaim-migrate @ 4961]
Mark Doliner <markdoliner@pidgin.im>
parents:
4646
diff
changeset
|
172 | } |
|
5b2338bb19fd
[gaim-migrate @ 4961]
Mark Doliner <markdoliner@pidgin.im>
parents:
4646
diff
changeset
|
173 | |
| 2086 | 174 | /** |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
175 | * 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
|
176 | * 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
|
177 | * 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
|
178 | * 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
|
179 | * |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
180 | * @param sess The session. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
181 | * @param cur The conn the incoming connection is on. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
182 | * @return Return 0 if no errors, otherwise return the error number. |
| 2086 | 183 | */ |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
184 | 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
|
185 | { |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
186 | int acceptfd = 0; |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
187 | struct sockaddr addr; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
188 | socklen_t addrlen = sizeof(addr); |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
189 | int ret = 0; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
190 | aim_conn_t *newconn; |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
191 | char ip[20]; |
|
8880
15b365a0a7fe
[gaim-migrate @ 9649]
Mark Doliner <markdoliner@pidgin.im>
parents:
8735
diff
changeset
|
192 | unsigned short port; |
| 2086 | 193 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
194 | if ((acceptfd = accept(cur->fd, &addr, &addrlen)) == -1) |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
195 | return 0; /* not an error */ |
| 2086 | 196 | |
|
9430
f2d8ecbfc3d0
[gaim-migrate @ 10250]
Mark Doliner <markdoliner@pidgin.im>
parents:
9070
diff
changeset
|
197 | if ((addr.sa_family != PF_INET) && (addr.sa_family != PF_INET6)) { |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
198 | close(acceptfd); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
199 | aim_conn_close(cur); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
200 | return -1; |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
201 | } |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
202 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
203 | 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
|
204 | port = ntohs(((struct sockaddr_in *)&addr)->sin_port); |
| 2086 | 205 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
206 | if (!(newconn = aim_cloneconn(sess, cur))) { |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
207 | close(acceptfd); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
208 | aim_conn_close(cur); |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
209 | return -ENOMEM; |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
210 | } |
| 2086 | 211 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
212 | newconn->type = AIM_CONN_TYPE_RENDEZVOUS; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
213 | newconn->fd = acceptfd; |
| 2086 | 214 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
215 | if (newconn->subtype == AIM_CONN_SUBTYPE_OFT_DIRECTIM) { |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
216 | aim_rxcallback_t userfunc; |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
217 | struct aim_odc_intdata *priv; |
| 2086 | 218 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
219 | priv = (struct aim_odc_intdata *)(newconn->internal = cur->internal); |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
220 | cur->internal = NULL; |
| 8446 | 221 | snprintf(priv->ip, sizeof(priv->ip), "%s:%hu", ip, port); |
| 2086 | 222 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
223 | 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
|
224 | ret = userfunc(sess, NULL, newconn, cur); |
| 2086 | 225 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
226 | } else if (newconn->subtype == AIM_CONN_SUBTYPE_OFT_GETFILE) { |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
227 | } else if (newconn->subtype == AIM_CONN_SUBTYPE_OFT_SENDFILE) { |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
228 | aim_rxcallback_t userfunc; |
| 2086 | 229 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
230 | 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
|
231 | ret = userfunc(sess, NULL, newconn, cur); |
| 3630 | 232 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
233 | } else { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
234 | 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
|
235 | aim_conn_close(newconn); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
236 | ret = -1; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
237 | } |
| 2086 | 238 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
239 | return ret; |
| 2086 | 240 | } |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
241 | |
| 2086 | 242 | /** |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
243 | * Send client-to-client typing notification over an established direct connection. |
| 2086 | 244 | * |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
245 | * @param sess The session. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
246 | * @param conn The already-connected ODC connection. |
|
4870
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
247 | * @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
|
248 | * 0x0000 sends "stopped." |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
249 | * @return Return 0 if no errors, otherwise return the error number. |
| 2086 | 250 | */ |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
251 | faim_export int aim_odc_send_typing(aim_session_t *sess, aim_conn_t *conn, int typing) |
| 2086 | 252 | { |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
253 | 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
|
254 | aim_frame_t *fr; |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
255 | aim_bstream_t *hdrbs; |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
256 | fu8_t *hdr; |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
257 | int hdrlen = 0x44; |
| 2086 | 258 | |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
259 | if (!sess || !conn || (conn->type != AIM_CONN_TYPE_RENDEZVOUS)) |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
260 | return -EINVAL; |
| 2086 | 261 | |
|
4870
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
262 | 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
|
263 | return -ENOMEM; |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
264 | memcpy(fr->hdr.rend.magic, "ODC2", 4); |
|
8934
f642719b9ffc
[gaim-migrate @ 9704]
Mark Doliner <markdoliner@pidgin.im>
parents:
8880
diff
changeset
|
265 | fr->hdr.rend.hdrlen = hdrlen + 8; |
| 2086 | 266 | |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
267 | if (!(hdr = calloc(1, hdrlen))) { |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
268 | aim_frame_destroy(fr); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
269 | return -ENOMEM; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
270 | } |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
271 | |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
272 | hdrbs = &(fr->data); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
273 | aim_bstream_init(hdrbs, hdr, hdrlen); |
| 2086 | 274 | |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
275 | aimbs_put16(hdrbs, 0x0006); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
276 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
277 | aimbs_putraw(hdrbs, intdata->cookie, 8); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
278 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
279 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
280 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
281 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
282 | aimbs_put32(hdrbs, 0x00000000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
283 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
284 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
285 | aimbs_put16(hdrbs, 0x0000); |
| 2086 | 286 | |
|
4870
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
287 | if (typing == 0x0002) |
|
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
288 | aimbs_put16(hdrbs, 0x0002 | 0x0008); |
|
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
289 | else if (typing == 0x0001) |
|
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
290 | aimbs_put16(hdrbs, 0x0002 | 0x0004); |
|
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
291 | else |
|
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
292 | aimbs_put16(hdrbs, 0x0002); |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
293 | |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
294 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
295 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
296 | aimbs_putraw(hdrbs, sess->sn, strlen(sess->sn)); |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
297 | |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
298 | aim_bstream_setpos(hdrbs, 52); /* bleeehh */ |
| 2086 | 299 | |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
300 | aimbs_put8(hdrbs, 0x00); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
301 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
302 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
303 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
304 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
305 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
306 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
307 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
308 | aimbs_put8(hdrbs, 0x00); |
| 2086 | 309 | |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
310 | /* end of hdr */ |
| 2086 | 311 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
312 | aim_tx_enqueue(sess, fr); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
313 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
314 | return 0; |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
315 | } |
| 2086 | 316 | |
| 2993 | 317 | /** |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
318 | * Send client-to-client IM over an established direct connection. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
319 | * Call this just like you would aim_send_im, to send a directim. |
| 2993 | 320 | * |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
321 | * @param sess The session. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
322 | * @param conn The already-connected ODC connection. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
323 | * @param msg Null-terminated string to send. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
324 | * @param len The length of the message to send, including binary data. |
|
9826
8fd989d134e0
[gaim-migrate @ 10697]
Mark Doliner <markdoliner@pidgin.im>
parents:
9430
diff
changeset
|
325 | * @param encoding See the AIM_CHARSET_* defines in aim.h |
|
4870
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
326 | * @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
|
327 | * @return Return 0 if no errors, otherwise return the error number. |
| 2993 | 328 | */ |
|
4870
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
329 | 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 | 330 | { |
| 331 | aim_frame_t *fr; | |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
332 | aim_bstream_t *hdrbs; |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
333 | 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
|
334 | int hdrlen = 0x44; |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
335 | fu8_t *hdr; |
| 2993 | 336 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
337 | if (!sess || !conn || (conn->type != AIM_CONN_TYPE_RENDEZVOUS) || !msg) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
338 | return -EINVAL; |
| 2993 | 339 | |
|
4875
3aefead7212b
[gaim-migrate @ 5205]
Mark Doliner <markdoliner@pidgin.im>
parents:
4870
diff
changeset
|
340 | 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
|
341 | return -ENOMEM; |
| 2993 | 342 | |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
343 | memcpy(fr->hdr.rend.magic, "ODC2", 4); |
|
8934
f642719b9ffc
[gaim-migrate @ 9704]
Mark Doliner <markdoliner@pidgin.im>
parents:
8880
diff
changeset
|
344 | fr->hdr.rend.hdrlen = hdrlen + 8; |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
345 | |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
346 | if (!(hdr = calloc(1, hdrlen + len))) { |
| 2993 | 347 | aim_frame_destroy(fr); |
| 348 | return -ENOMEM; | |
| 349 | } | |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
350 | |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
351 | hdrbs = &(fr->data); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
352 | aim_bstream_init(hdrbs, hdr, hdrlen + len); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
353 | |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
354 | aimbs_put16(hdrbs, 0x0006); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
355 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
356 | aimbs_putraw(hdrbs, intdata->cookie, 8); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
357 | aimbs_put16(hdrbs, 0x0000); |
|
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_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
361 | aimbs_put32(hdrbs, len); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
362 | aimbs_put16(hdrbs, encoding); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
363 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
364 | aimbs_put16(hdrbs, 0x0000); |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
365 | |
|
4870
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
366 | /* 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
|
367 | aimbs_put16(hdrbs, 0x0000 | isawaymsg); |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
368 | |
|
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_putraw(hdrbs, sess->sn, strlen(sess->sn)); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
372 | |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
373 | aim_bstream_setpos(hdrbs, 52); /* bleeehh */ |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
374 | |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
375 | aimbs_put8(hdrbs, 0x00); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
376 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
377 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
378 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
379 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
380 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
381 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
382 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
383 | aimbs_put8(hdrbs, 0x00); |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
384 | |
| 2993 | 385 | /* end of hdr2 */ |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
386 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
387 | #if 0 /* XXX - this is how you send buddy icon info... */ |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
388 | aimbs_put16(hdrbs, 0x0008); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
389 | aimbs_put16(hdrbs, 0x000c); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
390 | aimbs_put16(hdrbs, 0x0000); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
391 | aimbs_put16(hdrbs, 0x1466); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
392 | aimbs_put16(hdrbs, 0x0001); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
393 | aimbs_put16(hdrbs, 0x2e0f); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
394 | aimbs_put16(hdrbs, 0x393e); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
395 | aimbs_put16(hdrbs, 0xcac8); |
| 2993 | 396 | #endif |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
397 | aimbs_putraw(hdrbs, msg, len); |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
398 | |
| 2993 | 399 | aim_tx_enqueue(sess, fr); |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
400 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
401 | return 0; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
402 | } |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
403 | |
| 2086 | 404 | /** |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
405 | * Get the screen name of the peer of a direct connection. |
| 8983 | 406 | * |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
407 | * @param conn The ODC connection. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
408 | * @return The screen name of the dude, or NULL if there was an anomaly. |
| 2086 | 409 | */ |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
410 | faim_export const char *aim_odc_getsn(aim_conn_t *conn) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
411 | { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
412 | struct aim_odc_intdata *intdata; |
| 3630 | 413 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
414 | if (!conn || !conn->internal) |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
415 | return NULL; |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
416 | |
| 8983 | 417 | if ((conn->type != AIM_CONN_TYPE_RENDEZVOUS) || |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
418 | (conn->subtype != AIM_CONN_SUBTYPE_OFT_DIRECTIM)) |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
419 | return NULL; |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
420 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
421 | intdata = (struct aim_odc_intdata *)conn->internal; |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
422 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
423 | return intdata->sn; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
424 | } |
| 2086 | 425 | |
| 426 | /** | |
| 8983 | 427 | * Get the cookie of a direct connection. |
| 428 | * | |
| 429 | * @param conn The ODC connection. | |
| 430 | * @return The cookie, an 8 byte unterminated string, or NULL if there was an anomaly. | |
| 431 | */ | |
| 432 | faim_export const char *aim_odc_getcookie(aim_conn_t *conn) | |
| 433 | { | |
| 434 | struct aim_odc_intdata *intdata; | |
| 435 | ||
| 436 | if (!conn || !conn->internal) | |
| 437 | return NULL; | |
| 438 | ||
| 439 | intdata = (struct aim_odc_intdata *)conn->internal; | |
| 440 | ||
| 441 | return intdata->cookie; | |
| 442 | } | |
| 443 | ||
| 444 | /** | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
445 | * Find the conn of a direct connection with the given buddy. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
446 | * |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
447 | * @param sess The session. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
448 | * @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
|
449 | * @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
|
450 | * connection was found. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
451 | */ |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
452 | 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
|
453 | { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
454 | aim_conn_t *cur; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
455 | struct aim_odc_intdata *intdata; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
456 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
457 | if (!sess || !sn || !strlen(sn)) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
458 | return NULL; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
459 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
460 | for (cur = sess->connlist; cur; cur = cur->next) { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
461 | 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
|
462 | intdata = cur->internal; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
463 | if (!aim_sncmp(intdata->sn, sn)) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
464 | return cur; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
465 | } |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
466 | } |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
467 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
468 | return NULL; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
469 | } |
|
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 | /** |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
472 | * 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
|
473 | * |
| 8982 | 474 | * You'll want to set up some kind of watcher on this socket. |
| 475 | * When the state changes, call aim_handlerendconnection with | |
| 476 | * the connection returned by this. aim_handlerendconnection | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
477 | * will accept the pending connection and stop listening. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
478 | * |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
479 | * @param sess The session |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
480 | * @param sn The screen name to connect to. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
481 | * @return The new connection. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
482 | */ |
| 8982 | 483 | faim_export aim_conn_t *aim_odc_initiate(aim_session_t *sess, const char *sn, int listenfd, |
| 484 | const fu8_t *localip, fu16_t port, const fu8_t *mycookie) | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
485 | { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
486 | aim_conn_t *newconn; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
487 | aim_msgcookie_t *cookie; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
488 | struct aim_odc_intdata *priv; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
489 | fu8_t ck[8]; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
490 | |
| 8982 | 491 | if (!localip) |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
492 | return NULL; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
493 | |
| 8982 | 494 | if (mycookie) { |
| 495 | memcpy(ck, mycookie, 8); | |
| 496 | aim_im_sendch2_odcrequest(sess, ck, TRUE, sn, localip, port); | |
| 497 | } else | |
| 498 | aim_im_sendch2_odcrequest(sess, ck, FALSE, sn, localip, port); | |
|
4617
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 | cookie = (aim_msgcookie_t *)calloc(1, sizeof(aim_msgcookie_t)); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
501 | memcpy(cookie->cookie, ck, 8); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
502 | cookie->type = AIM_COOKIETYPE_OFTIM; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
503 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
504 | /* this one is for the cookie */ |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
505 | 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
|
506 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
507 | memcpy(priv->cookie, ck, 8); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
508 | strncpy(priv->sn, sn, sizeof(priv->sn)); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
509 | cookie->data = priv; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
510 | aim_cachecookie(sess, cookie); |
|
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 | /* XXX - switch to aim_cloneconn()? */ |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
513 | if (!(newconn = aim_newconn(sess, AIM_CONN_TYPE_LISTENER, NULL))) { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
514 | close(listenfd); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
515 | return NULL; |
|
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 | /* this one is for the conn */ |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
519 | 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
|
520 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
521 | memcpy(priv->cookie, ck, 8); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
522 | strncpy(priv->sn, sn, sizeof(priv->sn)); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
523 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
524 | newconn->fd = listenfd; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
525 | newconn->subtype = AIM_CONN_SUBTYPE_OFT_DIRECTIM; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
526 | newconn->internal = priv; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
527 | newconn->lastactivity = time(NULL); |
|
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 | return newconn; |
|
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 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
532 | /** |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
533 | * Connect directly to the given buddy for directim. |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
534 | * |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
535 | * This is a wrapper for aim_newconn. |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
536 | * |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
537 | * 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
|
538 | * allocated and setup to connect. |
| 2086 | 539 | * |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
540 | * @param sess The Godly session. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
541 | * @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
|
542 | * @param addr Address to connect to. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
543 | * @return The new connection. |
| 2086 | 544 | */ |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
545 | 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
|
546 | { |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
547 | aim_conn_t *newconn; |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
548 | struct aim_odc_intdata *intdata; |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
549 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
550 | if (!sess || !sn) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
551 | return NULL; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
552 | |
|
5146
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
553 | if (!(intdata = calloc(1, sizeof(struct aim_odc_intdata)))) |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
554 | return NULL; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
555 | memcpy(intdata->cookie, cookie, 8); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
556 | strncpy(intdata->sn, sn, sizeof(intdata->sn)); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
557 | if (addr) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
558 | strncpy(intdata->ip, addr, sizeof(intdata->ip)); |
| 2086 | 559 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
560 | /* XXX - verify that non-blocking connects actually work */ |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
561 | if (!(newconn = aim_newconn(sess, AIM_CONN_TYPE_RENDEZVOUS, addr))) { |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
562 | free(intdata); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
563 | return NULL; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
564 | } |
| 2086 | 565 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
566 | newconn->internal = intdata; |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
567 | newconn->subtype = AIM_CONN_SUBTYPE_OFT_DIRECTIM; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
568 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
569 | return newconn; |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
570 | } |
| 2086 | 571 | |
| 572 | /** | |
|
4826
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
573 | * Sometimes you just don't know with these kinds of people. |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
574 | * |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
575 | * @param sess The session. |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
576 | * @param conn The ODC connection of the incoming data. |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
577 | * @param frr The frame allocated for the incoming data. |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
578 | * @param bs It stands for "bologna sandwich." |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
579 | * @return Return 0 if no errors, otherwise return the error number. |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
580 | */ |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
581 | 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
|
582 | { |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
583 | aim_frame_t fr; |
|
4870
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
584 | int ret = 0; |
|
4826
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
585 | aim_rxcallback_t userfunc; |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
586 | fu32_t payloadlength; |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
587 | fu16_t flags, encoding; |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
588 | char *snptr = NULL; |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
589 | |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
590 | fr.conn = conn; |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
591 | |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
592 | /* AAA - ugly */ |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
593 | aim_bstream_setpos(bs, 20); |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
594 | payloadlength = aimbs_get32(bs); |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
595 | |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
596 | aim_bstream_setpos(bs, 24); |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
597 | encoding = aimbs_get16(bs); |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
598 | |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
599 | aim_bstream_setpos(bs, 30); |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
600 | flags = aimbs_get16(bs); |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
601 | |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
602 | aim_bstream_setpos(bs, 36); |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
603 | /* XXX - create an aimbs_getnullstr function? */ |
|
4913
c58b53024da4
[gaim-migrate @ 5247]
Mark Doliner <markdoliner@pidgin.im>
parents:
4895
diff
changeset
|
604 | 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
|
605 | |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
606 | 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
|
607 | |
|
4870
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
608 | if (flags & 0x0008) { |
|
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
609 | 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
|
610 | ret = userfunc(sess, &fr, snptr, 2); |
|
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
611 | } else if (flags & 0x0004) { |
|
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
612 | 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
|
613 | ret = userfunc(sess, &fr, snptr, 1); |
|
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
614 | } else { |
|
4826
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
615 | 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
|
616 | ret = userfunc(sess, &fr, snptr, 0); |
|
4870
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
617 | } |
|
4826
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
618 | |
| 8000 | 619 | if ((payloadlength != 0) && (payloadlength != UINT_MAX)) { |
|
4870
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
620 | char *msg; |
|
4826
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
621 | int recvd = 0; |
|
4870
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
622 | int i, isawaymsg; |
|
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
623 | |
|
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
624 | isawaymsg = flags & 0x0001; |
|
4826
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
625 | |
| 4895 | 626 | if (!(msg = calloc(1, payloadlength+1))) { |
| 627 | free(snptr); | |
|
4870
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
628 | return -ENOMEM; |
| 4895 | 629 | } |
|
4870
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
630 | |
|
4826
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
631 | while (payloadlength - recvd) { |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
632 | if (payloadlength - recvd >= 1024) |
|
4870
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
633 | i = aim_recv(conn->fd, &msg[recvd], 1024); |
|
4826
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
634 | else |
|
4870
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
635 | i = aim_recv(conn->fd, &msg[recvd], payloadlength - recvd); |
|
4826
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
636 | if (i <= 0) { |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
637 | free(msg); |
| 4895 | 638 | free(snptr); |
|
4826
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
639 | return -1; |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
640 | } |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
641 | recvd = recvd + i; |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
642 | 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
|
643 | ret = userfunc(sess, &fr, snptr, (double)recvd / payloadlength); |
|
4826
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
644 | } |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
645 | |
|
4870
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
646 | 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
|
647 | ret = userfunc(sess, &fr, snptr, msg, payloadlength, encoding, isawaymsg); |
|
4826
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 | free(msg); |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
650 | } |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
651 | |
| 4895 | 652 | free(snptr); |
| 653 | ||
|
4870
50dac8774e21
[gaim-migrate @ 5200]
Mark Doliner <markdoliner@pidgin.im>
parents:
4832
diff
changeset
|
654 | return ret; |
|
4826
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
655 | } |
|
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
656 | |
|
5146
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
657 | 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
|
658 | { |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
659 | struct aim_oft_info *new; |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
660 | |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
661 | if (!sess) |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
662 | return NULL; |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
663 | |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
664 | 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
|
665 | return NULL; |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
666 | |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
667 | new->sess = sess; |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
668 | if (cookie) |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
669 | memcpy(new->cookie, cookie, 8); |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
670 | if (ip) |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
671 | new->clientip = strdup(ip); |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
672 | if (sn) |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
673 | new->sn = strdup(sn); |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
674 | new->port = port; |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
675 | new->fh.totfiles = 1; |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
676 | new->fh.filesleft = 1; |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
677 | new->fh.totparts = 1; |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
678 | new->fh.partsleft = 1; |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
679 | new->fh.totsize = size; |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
680 | new->fh.size = size; |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
681 | new->fh.modtime = modtime; |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
682 | new->fh.checksum = 0xffff0000; |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
683 | new->fh.rfrcsum = 0xffff0000; |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
684 | new->fh.rfcsum = 0xffff0000; |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
685 | new->fh.recvcsum = 0xffff0000; |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
686 | strncpy(new->fh.idstring, "OFT_Windows ICBMFT V1.1 32", 31); |
| 8446 | 687 | if (filename) { |
|
5146
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
688 | strncpy(new->fh.name, filename, 63); |
| 8446 | 689 | new->fh.name[63] = '\0'; |
| 690 | } | |
|
5146
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
691 | |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
692 | new->next = sess->oft_info; |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
693 | sess->oft_info = new; |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
694 | |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
695 | return new; |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
696 | } |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
697 | |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
698 | /** |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
699 | * 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
|
700 | * then free its memory. |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
701 | * |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
702 | * @param sess The session. |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
703 | * @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
|
704 | * @return Return 0 if no errors, otherwise return the error number. |
|
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 | 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
|
707 | { |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
708 | aim_session_t *sess; |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
709 | |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
710 | if (!oft_info || !(sess = oft_info->sess)) |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
711 | return -EINVAL; |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
712 | |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
713 | if (sess->oft_info && (sess->oft_info == oft_info)) { |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
714 | sess->oft_info = sess->oft_info->next; |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
715 | } else { |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
716 | struct aim_oft_info *cur; |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
717 | 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
|
718 | if (cur->next) |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
719 | cur->next = cur->next->next; |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
720 | } |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
721 | |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
722 | free(oft_info->sn); |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
723 | free(oft_info->proxyip); |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
724 | free(oft_info->clientip); |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
725 | free(oft_info->verifiedip); |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
726 | free(oft_info); |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
727 | |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
728 | return 0; |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
729 | } |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
730 | |
|
4826
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
731 | /** |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
732 | * Creates a listener socket so the other dude can connect to us. |
| 2086 | 733 | * |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
734 | * 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
|
735 | * When the state changes, call aim_handlerendconnection with |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
736 | * the connection returned by this. aim_handlerendconnection |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
737 | * will accept the pending connection and stop listening. |
| 2086 | 738 | * |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
739 | * @param sess The session. |
|
5146
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
740 | * @param oft_info File transfer information associated with this |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
741 | * connection. |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
742 | * @return Return 0 if no errors, otherwise return the error number. |
| 2086 | 743 | */ |
|
8240
2e5f97ed575d
[gaim-migrate @ 8963]
Mark Doliner <markdoliner@pidgin.im>
parents:
8080
diff
changeset
|
744 | faim_export int aim_sendfile_listen(aim_session_t *sess, struct aim_oft_info *oft_info, int listenfd) |
| 2086 | 745 | { |
|
5146
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
746 | if (!oft_info) |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
747 | return -EINVAL; |
| 2086 | 748 | |
|
5146
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
749 | 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
|
750 | close(listenfd); |
|
5146
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
751 | return -ENOMEM; |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
752 | } |
| 3630 | 753 | |
|
5146
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
754 | oft_info->conn->fd = listenfd; |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
755 | oft_info->conn->subtype = AIM_CONN_SUBTYPE_OFT_SENDFILE; |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
756 | oft_info->conn->lastactivity = time(NULL); |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
757 | |
|
5146
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
758 | return 0; |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
759 | } |
| 3630 | 760 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
761 | /** |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
762 | * Extract an &aim_fileheader_t from the given buffer. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
763 | * |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
764 | * @param bs The should be from an incoming rendezvous packet. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
765 | * @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
|
766 | */ |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
767 | 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
|
768 | { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
769 | struct aim_fileheader_t *fh; |
| 3630 | 770 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
771 | if (!(fh = calloc(1, sizeof(struct aim_fileheader_t)))) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
772 | return NULL; |
| 3630 | 773 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
774 | /* The bstream should be positioned after the hdrtype. */ |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
775 | aimbs_getrawbuf(bs, fh->bcookie, 8); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
776 | fh->encrypt = aimbs_get16(bs); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
777 | fh->compress = aimbs_get16(bs); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
778 | fh->totfiles = aimbs_get16(bs); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
779 | fh->filesleft = aimbs_get16(bs); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
780 | fh->totparts = aimbs_get16(bs); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
781 | fh->partsleft = aimbs_get16(bs); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
782 | fh->totsize = aimbs_get32(bs); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
783 | fh->size = aimbs_get32(bs); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
784 | fh->modtime = aimbs_get32(bs); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
785 | fh->checksum = aimbs_get32(bs); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
786 | fh->rfrcsum = aimbs_get32(bs); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
787 | fh->rfsize = aimbs_get32(bs); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
788 | fh->cretime = aimbs_get32(bs); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
789 | fh->rfcsum = aimbs_get32(bs); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
790 | fh->nrecvd = aimbs_get32(bs); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
791 | fh->recvcsum = aimbs_get32(bs); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
792 | aimbs_getrawbuf(bs, fh->idstring, 32); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
793 | fh->flags = aimbs_get8(bs); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
794 | fh->lnameoffset = aimbs_get8(bs); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
795 | fh->lsizeoffset = aimbs_get8(bs); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
796 | aimbs_getrawbuf(bs, fh->dummy, 69); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
797 | aimbs_getrawbuf(bs, fh->macfileinfo, 16); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
798 | fh->nencode = aimbs_get16(bs); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
799 | fh->nlanguage = aimbs_get16(bs); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
800 | aimbs_getrawbuf(bs, fh->name, 64); /* XXX - filenames longer than 64B */ |
| 8446 | 801 | fh->name[63] = '\0'; |
| 2086 | 802 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
803 | return fh; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
804 | } |
| 3630 | 805 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
806 | /** |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
807 | * Fills a buffer with network-order fh data |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
808 | * |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
809 | * @param bs A bstream to fill -- automatically initialized |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
810 | * @param fh A struct aim_fileheader_t to get data from. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
811 | * @return Return non-zero on error. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
812 | */ |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
813 | 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
|
814 | { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
815 | fu8_t *hdr; |
| 3630 | 816 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
817 | if (!bs || !fh) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
818 | return -EINVAL; |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
819 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
820 | if (!(hdr = (unsigned char *)calloc(1, 0x100 - 8))) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
821 | return -ENOMEM; |
| 3630 | 822 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
823 | aim_bstream_init(bs, hdr, 0x100 - 8); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
824 | aimbs_putraw(bs, fh->bcookie, 8); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
825 | aimbs_put16(bs, fh->encrypt); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
826 | aimbs_put16(bs, fh->compress); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
827 | aimbs_put16(bs, fh->totfiles); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
828 | aimbs_put16(bs, fh->filesleft); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
829 | aimbs_put16(bs, fh->totparts); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
830 | aimbs_put16(bs, fh->partsleft); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
831 | aimbs_put32(bs, fh->totsize); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
832 | aimbs_put32(bs, fh->size); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
833 | aimbs_put32(bs, fh->modtime); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
834 | aimbs_put32(bs, fh->checksum); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
835 | aimbs_put32(bs, fh->rfrcsum); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
836 | aimbs_put32(bs, fh->rfsize); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
837 | aimbs_put32(bs, fh->cretime); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
838 | aimbs_put32(bs, fh->rfcsum); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
839 | aimbs_put32(bs, fh->nrecvd); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
840 | aimbs_put32(bs, fh->recvcsum); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
841 | aimbs_putraw(bs, fh->idstring, 32); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
842 | aimbs_put8(bs, fh->flags); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
843 | aimbs_put8(bs, fh->lnameoffset); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
844 | aimbs_put8(bs, fh->lsizeoffset); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
845 | aimbs_putraw(bs, fh->dummy, 69); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
846 | aimbs_putraw(bs, fh->macfileinfo, 16); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
847 | aimbs_put16(bs, fh->nencode); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
848 | aimbs_put16(bs, fh->nlanguage); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
849 | 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
|
850 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
851 | return 0; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
852 | } |
| 2086 | 853 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
854 | /** |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
855 | * 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
|
856 | * |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
857 | * @param sess The session. |
|
5146
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
858 | * @param type The subtype of the OFT packet we're sending. |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
859 | * @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
|
860 | * info we're sending. |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
861 | * @return Return 0 if no errors, otherwise return the error number. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
862 | */ |
|
5146
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
863 | 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
|
864 | { |
|
5146
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
865 | aim_frame_t *fr; |
| 2086 | 866 | |
|
5146
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
867 | 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
|
868 | return -EINVAL; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
869 | |
|
5146
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
870 | #if 0 |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
871 | /* |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
872 | * 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
|
873 | * 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
|
874 | * SNACs. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
875 | */ |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
876 | fh->lnameoffset = 0x1a; |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
877 | fh->lsizeoffset = 0x10; |
| 2086 | 878 | |
|
9826
8fd989d134e0
[gaim-migrate @ 10697]
Mark Doliner <markdoliner@pidgin.im>
parents:
9430
diff
changeset
|
879 | /* These should be the same as charset and charsubset in ICBMs */ |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
880 | fh->nencode = 0x0000; |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
881 | fh->nlanguage = 0x0000; |
|
5146
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
882 | #endif |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
883 | |
|
5146
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
884 | aim_oft_dirconvert_tostupid(oft_info->fh.name); |
| 2086 | 885 | |
|
5146
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
886 | 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
|
887 | return -ENOMEM; |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
888 | |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
889 | if (aim_oft_buildheader(&fr->data, &oft_info->fh) == -1) { |
|
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
890 | aim_frame_destroy(fr); |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
891 | return -ENOMEM; |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
892 | } |
| 2086 | 893 | |
|
5146
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
894 | memcpy(fr->hdr.rend.magic, "OFT2", 4); |
|
8426
751d16369a92
[gaim-migrate @ 9156]
Mark Doliner <markdoliner@pidgin.im>
parents:
8240
diff
changeset
|
895 | fr->hdr.rend.hdrlen = aim_bstream_curpos(&fr->data) + 8; |
| 2086 | 896 | |
|
5146
56b1615ba288
[gaim-migrate @ 5510]
Mark Doliner <markdoliner@pidgin.im>
parents:
4913
diff
changeset
|
897 | aim_tx_enqueue(sess, fr); |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
898 | |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
899 | return 0; |
| 2086 | 900 | } |
| 901 | ||
| 902 | /** | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
903 | * 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
|
904 | * 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
|
905 | * 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
|
906 | * |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
907 | * @param sess The session. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
908 | * @param fr The frame allocated for the incoming data. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
909 | * @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
|
910 | * error number. |
| 3771 | 911 | */ |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
912 | faim_internal int aim_rxdispatch_rendezvous(aim_session_t *sess, aim_frame_t *fr) |
| 2086 | 913 | { |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
914 | aim_conn_t *conn = fr->conn; |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
915 | int ret = 1; |
| 2086 | 916 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
917 | if (conn->subtype == AIM_CONN_SUBTYPE_OFT_DIRECTIM) { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
918 | if (fr->hdr.rend.type == 0x0001) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
919 | ret = handlehdr_odc(sess, conn, fr, &fr->data); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
920 | else |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
921 | faimdprintf(sess, 0, "faim: ODC directim frame unknown, type is %04x\n", fr->hdr.rend.type); |
| 2086 | 922 | |
|
4826
ce211ce6a336
[gaim-migrate @ 5151]
Mark Doliner <markdoliner@pidgin.im>
parents:
4763
diff
changeset
|
923 | } else { |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
924 | aim_rxcallback_t userfunc; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
925 | struct aim_fileheader_t *header = aim_oft_getheader(&fr->data); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
926 | aim_oft_dirconvert_fromstupid(header->name); /* XXX - This should be client-side */ |
| 3771 | 927 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
928 | 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
|
929 | ret = userfunc(sess, fr, conn, header->bcookie, header); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
930 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
931 | free(header); |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
932 | } |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
933 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
934 | if (ret == -1) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
935 | aim_conn_close(conn); |
| 2086 | 936 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
937 | return ret; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
938 | } |