Fri, 14 Mar 2003 03:09:54 +0000
[gaim-migrate @ 5076]
This caches ICQ remote nicks in your local blist.xml file. It's really
not a great thing to do, but it's better than what we do currently.
I want to make Gaim request the remote nick every now and then to see
if it's changed.
Anyhow, like all things I've done recently, it's slightly ugly.
And I can't test the get-alias-when-adding-icq-buddy thing until
Sean commits his buddy list editing stuff later tonight, but it should
work like a charm.
| 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 |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
26 | * sends another ICBM signifying that we are ready and waiting. |
|
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 |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
38 | * receiver sends the DONE thingy and closes the connection. |
| 2086 | 39 | */ |
| 40 | ||
| 41 | #define FAIM_INTERNAL | |
| 2931 | 42 | |
|
2711
48250db2892e
[gaim-migrate @ 2724]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2675
diff
changeset
|
43 | #ifdef HAVE_CONFIG_H |
|
48250db2892e
[gaim-migrate @ 2724]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2675
diff
changeset
|
44 | #include <config.h> |
|
48250db2892e
[gaim-migrate @ 2724]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2675
diff
changeset
|
45 | #endif |
| 2086 | 46 | #include <aim.h> |
| 47 | ||
| 48 | #ifndef _WIN32 | |
| 49 | #include <netdb.h> | |
| 50 | #include <sys/socket.h> | |
| 51 | #include <netinet/in.h> | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
52 | #include <sys/utsname.h> /* for aim_odc_initiate */ |
| 3630 | 53 | #include <arpa/inet.h> /* for inet_ntoa */ |
|
3960
462a9dbc934a
[gaim-migrate @ 4142]
Mark Doliner <markdoliner@pidgin.im>
parents:
3953
diff
changeset
|
54 | #define G_DIR_SEPARATOR '/' |
|
3646
ebf17642064a
[gaim-migrate @ 3770]
Herman Bloggs <herman@bluedigits.com>
parents:
3630
diff
changeset
|
55 | #endif |
|
ebf17642064a
[gaim-migrate @ 3770]
Herman Bloggs <herman@bluedigits.com>
parents:
3630
diff
changeset
|
56 | |
|
ebf17642064a
[gaim-migrate @ 3770]
Herman Bloggs <herman@bluedigits.com>
parents:
3630
diff
changeset
|
57 | #ifdef _WIN32 |
| 3630 | 58 | #include "win32dep.h" |
| 59 | #endif | |
| 2086 | 60 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
61 | struct aim_odc_intdata { |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
62 | fu8_t cookie[8]; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
63 | char sn[MAXSNLEN+1]; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
64 | char ip[22]; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
65 | }; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
66 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
67 | /** |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
68 | * Convert the directory separator from / (0x2f) to ^A (0x01) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
69 | * |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
70 | * @param name The filename to convert. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
71 | */ |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
72 | static void aim_oft_dirconvert_tostupid(char *name) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
73 | { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
74 | while (name[0]) { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
75 | if (name[0] == 0x01) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
76 | name[0] = G_DIR_SEPARATOR; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
77 | name++; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
78 | } |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
79 | } |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
80 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
81 | /** |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
82 | * Convert the directory separator from ^A (0x01) to / (0x2f) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
83 | * |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
84 | * @param name The filename to convert. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
85 | */ |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
86 | static void aim_oft_dirconvert_fromstupid(char *name) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
87 | { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
88 | while (name[0]) { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
89 | if (name[0] == G_DIR_SEPARATOR) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
90 | name[0] = 0x01; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
91 | name++; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
92 | } |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
93 | } |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
94 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
95 | /** |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
96 | * Calculate oft checksum of buffer |
|
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 | * 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
|
99 | * 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
|
100 | * 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
|
101 | * 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
|
102 | * for loop, or something. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
103 | * |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
104 | * Thanks to Graham Booker for providing this improved checksum routine, |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
105 | * 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
|
106 | * code. -- wtm |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
107 | * |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
108 | * This algorithim works every time I have tried it. The other fails |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
109 | * 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
|
110 | * checksum I have ever seen. |
|
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 | * @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
|
113 | * @param bufsize Size of buffer. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
114 | * @param prevcheck Previous checksum. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
115 | */ |
|
4650
5b2338bb19fd
[gaim-migrate @ 4961]
Mark Doliner <markdoliner@pidgin.im>
parents:
4646
diff
changeset
|
116 | faim_export fu32_t aim_oft_checksum_chunk(const unsigned char *buffer, int bufferlen, fu32_t prevcheck) |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
117 | { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
118 | fu32_t check = (prevcheck >> 16) & 0xffff, oldcheck; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
119 | int i; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
120 | unsigned short val; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
121 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
122 | for (i=0; i<bufferlen; i++) { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
123 | oldcheck = check; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
124 | if (i&1) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
125 | val = buffer[i]; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
126 | else |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
127 | val = buffer[i] << 8; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
128 | check -= val; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
129 | /* |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
130 | * The following appears to be necessary.... It happens |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
131 | * every once in a while and the checksum doesn't fail. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
132 | */ |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
133 | if (check > oldcheck) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
134 | check--; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
135 | } |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
136 | check = ((check & 0x0000ffff) + (check >> 16)); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
137 | check = ((check & 0x0000ffff) + (check >> 16)); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
138 | return check << 16; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
139 | } |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
140 | |
|
4650
5b2338bb19fd
[gaim-migrate @ 4961]
Mark Doliner <markdoliner@pidgin.im>
parents:
4646
diff
changeset
|
141 | faim_export fu32_t aim_oft_checksum_file(char *filename) { |
|
5b2338bb19fd
[gaim-migrate @ 4961]
Mark Doliner <markdoliner@pidgin.im>
parents:
4646
diff
changeset
|
142 | FILE *fd; |
|
5b2338bb19fd
[gaim-migrate @ 4961]
Mark Doliner <markdoliner@pidgin.im>
parents:
4646
diff
changeset
|
143 | fu32_t checksum = 0xffff0000; |
|
5b2338bb19fd
[gaim-migrate @ 4961]
Mark Doliner <markdoliner@pidgin.im>
parents:
4646
diff
changeset
|
144 | |
|
5b2338bb19fd
[gaim-migrate @ 4961]
Mark Doliner <markdoliner@pidgin.im>
parents:
4646
diff
changeset
|
145 | if ((fd = fopen(filename, "rb"))) { |
|
5b2338bb19fd
[gaim-migrate @ 4961]
Mark Doliner <markdoliner@pidgin.im>
parents:
4646
diff
changeset
|
146 | int bytes; |
|
5b2338bb19fd
[gaim-migrate @ 4961]
Mark Doliner <markdoliner@pidgin.im>
parents:
4646
diff
changeset
|
147 | char buffer[1024]; |
|
5b2338bb19fd
[gaim-migrate @ 4961]
Mark Doliner <markdoliner@pidgin.im>
parents:
4646
diff
changeset
|
148 | |
|
5b2338bb19fd
[gaim-migrate @ 4961]
Mark Doliner <markdoliner@pidgin.im>
parents:
4646
diff
changeset
|
149 | while ((bytes = fread(buffer, 1, 1024, fd))) |
|
5b2338bb19fd
[gaim-migrate @ 4961]
Mark Doliner <markdoliner@pidgin.im>
parents:
4646
diff
changeset
|
150 | checksum = aim_oft_checksum_chunk(buffer, bytes, checksum); |
|
5b2338bb19fd
[gaim-migrate @ 4961]
Mark Doliner <markdoliner@pidgin.im>
parents:
4646
diff
changeset
|
151 | fclose(fd); |
|
5b2338bb19fd
[gaim-migrate @ 4961]
Mark Doliner <markdoliner@pidgin.im>
parents:
4646
diff
changeset
|
152 | } |
|
5b2338bb19fd
[gaim-migrate @ 4961]
Mark Doliner <markdoliner@pidgin.im>
parents:
4646
diff
changeset
|
153 | |
|
5b2338bb19fd
[gaim-migrate @ 4961]
Mark Doliner <markdoliner@pidgin.im>
parents:
4646
diff
changeset
|
154 | return checksum; |
|
5b2338bb19fd
[gaim-migrate @ 4961]
Mark Doliner <markdoliner@pidgin.im>
parents:
4646
diff
changeset
|
155 | } |
|
5b2338bb19fd
[gaim-migrate @ 4961]
Mark Doliner <markdoliner@pidgin.im>
parents:
4646
diff
changeset
|
156 | |
| 2086 | 157 | /** |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
158 | * Create a listening socket on a given port. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
159 | * |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
160 | * XXX - Give the client author the responsibility of setting up a |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
161 | * listener, then we no longer have a libfaim problem with broken |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
162 | * solaris *innocent smile* -- jbm |
| 2086 | 163 | * |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
164 | * @param portnum The port number to bind to. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
165 | * @return The file descriptor of the listening socket. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
166 | */ |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
167 | static int listenestablish(fu16_t portnum) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
168 | { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
169 | #if HAVE_GETADDRINFO |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
170 | int listenfd; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
171 | const int on = 1; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
172 | struct addrinfo hints, *res, *ressave; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
173 | char serv[5]; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
174 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
175 | snprintf(serv, sizeof(serv), "%d", portnum); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
176 | memset(&hints, 0, sizeof(struct addrinfo)); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
177 | hints.ai_flags = AI_PASSIVE; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
178 | hints.ai_family = AF_UNSPEC; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
179 | hints.ai_socktype = SOCK_STREAM; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
180 | if (getaddrinfo(NULL /* any IP */, serv, &hints, &res) != 0) { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
181 | perror("getaddrinfo"); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
182 | return -1; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
183 | } |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
184 | ressave = res; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
185 | do { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
186 | listenfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
187 | if (listenfd < 0) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
188 | continue; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
189 | setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
190 | if (bind(listenfd, res->ai_addr, res->ai_addrlen) == 0) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
191 | break; /* success */ |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
192 | close(listenfd); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
193 | } while ( (res = res->ai_next) ); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
194 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
195 | if (!res) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
196 | return -1; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
197 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
198 | freeaddrinfo(ressave); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
199 | #else |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
200 | int listenfd; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
201 | const int on = 1; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
202 | struct sockaddr_in sockin; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
203 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
204 | if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
205 | perror("socket"); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
206 | return -1; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
207 | } |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
208 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
209 | if (setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(on)) != 0) { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
210 | perror("setsockopt"); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
211 | close(listenfd); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
212 | return -1; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
213 | } |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
214 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
215 | memset(&sockin, 0, sizeof(struct sockaddr_in)); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
216 | sockin.sin_family = AF_INET; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
217 | sockin.sin_port = htons(portnum); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
218 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
219 | if (bind(listenfd, (struct sockaddr *)&sockin, sizeof(struct sockaddr_in)) != 0) { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
220 | perror("bind"); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
221 | close(listenfd); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
222 | return -1; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
223 | } |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
224 | #endif |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
225 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
226 | if (listen(listenfd, 4) != 0) { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
227 | perror("listen"); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
228 | close(listenfd); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
229 | return -1; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
230 | } |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
231 | fcntl(listenfd, F_SETFL, O_NONBLOCK); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
232 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
233 | return listenfd; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
234 | } |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
235 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
236 | /** |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
237 | * 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
|
238 | * 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
|
239 | * 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
|
240 | * 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
|
241 | * |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
242 | * @param sess The session. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
243 | * @param cur The conn the incoming connection is on. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
244 | * @return Return 0 if no errors, otherwise return the error number. |
| 2086 | 245 | */ |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
246 | 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
|
247 | { |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
248 | int acceptfd = 0; |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
249 | struct sockaddr addr; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
250 | socklen_t addrlen = sizeof(addr); |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
251 | int ret = 0; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
252 | aim_conn_t *newconn; |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
253 | char ip[20]; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
254 | int port; |
| 2086 | 255 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
256 | if ((acceptfd = accept(cur->fd, &addr, &addrlen)) == -1) |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
257 | return 0; /* not an error */ |
| 2086 | 258 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
259 | if (addr.sa_family != AF_INET) { /* just in case IPv6 really is happening */ |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
260 | close(acceptfd); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
261 | aim_conn_close(cur); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
262 | return -1; |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
263 | } |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
264 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
265 | 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
|
266 | port = ntohs(((struct sockaddr_in *)&addr)->sin_port); |
| 2086 | 267 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
268 | if (!(newconn = aim_cloneconn(sess, cur))) { |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
269 | close(acceptfd); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
270 | aim_conn_close(cur); |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
271 | return -ENOMEM; |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
272 | } |
| 2086 | 273 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
274 | newconn->type = AIM_CONN_TYPE_RENDEZVOUS; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
275 | newconn->fd = acceptfd; |
| 2086 | 276 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
277 | if (newconn->subtype == AIM_CONN_SUBTYPE_OFT_DIRECTIM) { |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
278 | aim_rxcallback_t userfunc; |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
279 | struct aim_odc_intdata *priv; |
| 2086 | 280 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
281 | priv = (struct aim_odc_intdata *)(newconn->internal = cur->internal); |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
282 | cur->internal = NULL; |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
283 | snprintf(priv->ip, sizeof(priv->ip), "%s:%u", ip, port); |
| 2086 | 284 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
285 | 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
|
286 | ret = userfunc(sess, NULL, newconn, cur); |
| 2086 | 287 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
288 | } else if (newconn->subtype == AIM_CONN_SUBTYPE_OFT_GETFILE) { |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
289 | } else if (newconn->subtype == AIM_CONN_SUBTYPE_OFT_SENDFILE) { |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
290 | aim_rxcallback_t userfunc; |
| 2086 | 291 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
292 | 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
|
293 | ret = userfunc(sess, NULL, newconn, cur); |
| 3630 | 294 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
295 | } else { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
296 | 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
|
297 | aim_conn_close(newconn); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
298 | ret = -1; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
299 | } |
| 2086 | 300 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
301 | return ret; |
| 2086 | 302 | } |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
303 | |
| 2086 | 304 | /** |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
305 | * Send client-to-client typing notification over an established direct connection. |
| 2086 | 306 | * |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
307 | * @param sess The session. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
308 | * @param conn The already-connected ODC connection. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
309 | * @param typing If true, notify user has started typing; if false, notify user has stopped. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
310 | * @return Return 0 if no errors, otherwise return the error number. |
| 2086 | 311 | */ |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
312 | faim_export int aim_odc_send_typing(aim_session_t *sess, aim_conn_t *conn, int typing) |
| 2086 | 313 | { |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
314 | 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
|
315 | aim_frame_t *fr; |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
316 | aim_bstream_t *hdrbs; |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
317 | fu8_t *hdr; |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
318 | int hdrlen = 0x44; |
| 2086 | 319 | |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
320 | if (!sess || !conn || (conn->type != AIM_CONN_TYPE_RENDEZVOUS)) |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
321 | return -EINVAL; |
| 2086 | 322 | |
| 2993 | 323 | if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_OFT, 0x01, 0))) |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
324 | return -ENOMEM; |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
325 | memcpy(fr->hdr.rend.magic, "ODC2", 4); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
326 | fr->hdr.rend.hdrlen = hdrlen; |
| 2086 | 327 | |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
328 | if (!(hdr = calloc(1, hdrlen))) { |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
329 | aim_frame_destroy(fr); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
330 | return -ENOMEM; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
331 | } |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
332 | |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
333 | hdrbs = &(fr->data); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
334 | aim_bstream_init(hdrbs, hdr, hdrlen); |
| 2086 | 335 | |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
336 | aimbs_put16(hdrbs, 0x0006); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
337 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
338 | aimbs_putraw(hdrbs, intdata->cookie, 8); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
339 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
340 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
341 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
342 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
343 | aimbs_put32(hdrbs, 0x00000000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
344 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
345 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
346 | aimbs_put16(hdrbs, 0x0000); |
| 2086 | 347 | |
| 2993 | 348 | /* flags -- 0x000e for "started typing", 0x0002 for "stopped typing */ |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
349 | aimbs_put16(hdrbs, ( typing ? 0x000e : 0x0002)); |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
350 | |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
351 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
352 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
353 | aimbs_putraw(hdrbs, sess->sn, strlen(sess->sn)); |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
354 | |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
355 | aim_bstream_setpos(hdrbs, 52); /* bleeehh */ |
| 2086 | 356 | |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
357 | aimbs_put8(hdrbs, 0x00); |
|
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_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
362 | aimbs_put16(hdrbs, 0x0000); |
|
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); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
365 | aimbs_put8(hdrbs, 0x00); |
| 2086 | 366 | |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
367 | /* end of hdr */ |
| 2086 | 368 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
369 | aim_tx_enqueue(sess, fr); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
370 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
371 | return 0; |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
372 | } |
| 2086 | 373 | |
| 2993 | 374 | /** |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
375 | * Send client-to-client IM over an established direct connection. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
376 | * Call this just like you would aim_send_im, to send a directim. |
| 2993 | 377 | * |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
378 | * @param sess The session. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
379 | * @param conn The already-connected ODC connection. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
380 | * @param msg Null-terminated string to send. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
381 | * @param len The length of the message to send, including binary data. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
382 | * @param encoding 0 for ascii, 2 for Unicode, 3 for ISO 8859-1. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
383 | * @return Return 0 if no errors, otherwise return the error number. |
| 2993 | 384 | */ |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
385 | faim_export int aim_odc_send_im(aim_session_t *sess, aim_conn_t *conn, const char *msg, int len, int encoding) |
| 2993 | 386 | { |
| 387 | aim_frame_t *fr; | |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
388 | aim_bstream_t *hdrbs; |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
389 | 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
|
390 | int hdrlen = 0x44; |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
391 | fu8_t *hdr; |
| 2993 | 392 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
393 | if (!sess || !conn || (conn->type != AIM_CONN_TYPE_RENDEZVOUS) || !msg) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
394 | return -EINVAL; |
| 2993 | 395 | |
| 3033 | 396 | if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_OFT, 0x01, len))) |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
397 | return -ENOMEM; |
| 2993 | 398 | |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
399 | memcpy(fr->hdr.rend.magic, "ODC2", 4); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
400 | fr->hdr.rend.hdrlen = hdrlen; |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
401 | |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
402 | if (!(hdr = calloc(1, hdrlen + len))) { |
| 2993 | 403 | aim_frame_destroy(fr); |
| 404 | return -ENOMEM; | |
| 405 | } | |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
406 | |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
407 | hdrbs = &(fr->data); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
408 | aim_bstream_init(hdrbs, hdr, hdrlen + len); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
409 | |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
410 | aimbs_put16(hdrbs, 0x0006); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
411 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
412 | aimbs_putraw(hdrbs, intdata->cookie, 8); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
413 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
414 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
415 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
416 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
417 | aimbs_put32(hdrbs, len); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
418 | aimbs_put16(hdrbs, encoding); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
419 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
420 | aimbs_put16(hdrbs, 0x0000); |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
421 | |
| 2993 | 422 | /* flags -- 0x000e for "started typing", 0x0002 for "stopped typing, 0x0000 for message */ |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
423 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
424 | |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
425 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
426 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
427 | aimbs_putraw(hdrbs, sess->sn, strlen(sess->sn)); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
428 | |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
429 | aim_bstream_setpos(hdrbs, 52); /* bleeehh */ |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
430 | |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
431 | aimbs_put8(hdrbs, 0x00); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
432 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
433 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
434 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
435 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
436 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
437 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
438 | aimbs_put16(hdrbs, 0x0000); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
439 | aimbs_put8(hdrbs, 0x00); |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
440 | |
| 2993 | 441 | /* end of hdr2 */ |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
442 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
443 | #if 0 /* XXX - this is how you send buddy icon info... */ |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
444 | aimbs_put16(hdrbs, 0x0008); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
445 | aimbs_put16(hdrbs, 0x000c); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
446 | aimbs_put16(hdrbs, 0x0000); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
447 | aimbs_put16(hdrbs, 0x1466); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
448 | aimbs_put16(hdrbs, 0x0001); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
449 | aimbs_put16(hdrbs, 0x2e0f); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
450 | aimbs_put16(hdrbs, 0x393e); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
451 | aimbs_put16(hdrbs, 0xcac8); |
| 2993 | 452 | #endif |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
453 | aimbs_putraw(hdrbs, msg, len); |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
454 | |
| 2993 | 455 | aim_tx_enqueue(sess, fr); |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
456 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
457 | return 0; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
458 | } |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
459 | |
| 2086 | 460 | /** |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
461 | * Get the screen name of the peer of a direct connection. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
462 | * |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
463 | * @param conn The ODC connection. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
464 | * @return The screen name of the dude, or NULL if there was an anomaly. |
| 2086 | 465 | */ |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
466 | faim_export const char *aim_odc_getsn(aim_conn_t *conn) |
|
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 | struct aim_odc_intdata *intdata; |
| 3630 | 469 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
470 | if (!conn || !conn->internal) |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
471 | return NULL; |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
472 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
473 | if ((conn->type != AIM_CONN_TYPE_RENDEZVOUS) || |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
474 | (conn->subtype != AIM_CONN_SUBTYPE_OFT_DIRECTIM)) |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
475 | return NULL; |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
476 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
477 | intdata = (struct aim_odc_intdata *)conn->internal; |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
478 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
479 | return intdata->sn; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
480 | } |
| 2086 | 481 | |
| 482 | /** | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
483 | * Find the conn of a direct connection with the given buddy. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
484 | * |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
485 | * @param sess The session. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
486 | * @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
|
487 | * @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
|
488 | * connection was found. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
489 | */ |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
490 | 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
|
491 | { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
492 | aim_conn_t *cur; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
493 | struct aim_odc_intdata *intdata; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
494 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
495 | if (!sess || !sn || !strlen(sn)) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
496 | return NULL; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
497 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
498 | for (cur = sess->connlist; cur; cur = cur->next) { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
499 | 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
|
500 | intdata = cur->internal; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
501 | if (!aim_sncmp(intdata->sn, sn)) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
502 | return cur; |
|
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 | } |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
505 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
506 | return NULL; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
507 | } |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
508 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
509 | /** |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
510 | * 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
|
511 | * |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
512 | * 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
|
513 | * When the state changes, call aim_handlerendconnection with |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
514 | * the connection returned by this. aim_handlerendconnection |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
515 | * will accept the pending connection and stop listening. |
|
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 | * @param sess The session |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
518 | * @param conn The BOS conn. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
519 | * @param priv A dummy priv value (we'll let it get filled in later) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
520 | * (if you pass a %NULL, we alloc one). |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
521 | * @param sn The screen name to connect to. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
522 | * @return The new connection. |
|
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 | faim_export aim_conn_t *aim_odc_initiate(aim_session_t *sess, const char *sn) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
525 | { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
526 | aim_conn_t *newconn; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
527 | aim_msgcookie_t *cookie; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
528 | struct aim_odc_intdata *priv; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
529 | int listenfd; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
530 | fu16_t port = 4443; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
531 | fu8_t localip[4]; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
532 | fu8_t ck[8]; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
533 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
534 | if (aim_util_getlocalip(localip) == -1) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
535 | return NULL; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
536 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
537 | if ((listenfd = listenestablish(port)) == -1) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
538 | return NULL; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
539 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
540 | aim_im_sendch2_odcrequest(sess, ck, sn, localip, port); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
541 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
542 | cookie = (aim_msgcookie_t *)calloc(1, sizeof(aim_msgcookie_t)); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
543 | memcpy(cookie->cookie, ck, 8); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
544 | cookie->type = AIM_COOKIETYPE_OFTIM; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
545 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
546 | /* this one is for the cookie */ |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
547 | 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
|
548 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
549 | memcpy(priv->cookie, ck, 8); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
550 | strncpy(priv->sn, sn, sizeof(priv->sn)); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
551 | cookie->data = priv; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
552 | aim_cachecookie(sess, cookie); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
553 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
554 | /* XXX - switch to aim_cloneconn()? */ |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
555 | if (!(newconn = aim_newconn(sess, AIM_CONN_TYPE_LISTENER, NULL))) { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
556 | close(listenfd); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
557 | return NULL; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
558 | } |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
559 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
560 | /* this one is for the conn */ |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
561 | 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
|
562 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
563 | memcpy(priv->cookie, ck, 8); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
564 | strncpy(priv->sn, sn, sizeof(priv->sn)); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
565 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
566 | newconn->fd = listenfd; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
567 | newconn->subtype = AIM_CONN_SUBTYPE_OFT_DIRECTIM; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
568 | newconn->internal = priv; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
569 | newconn->lastactivity = time(NULL); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
570 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
571 | return newconn; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
572 | } |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
573 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
574 | /** |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
575 | * Connect directly to the given buddy for directim. |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
576 | * |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
577 | * This is a wrapper for aim_newconn. |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
578 | * |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
579 | * 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
|
580 | * allocated and setup to connect. |
| 2086 | 581 | * |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
582 | * @param sess The Godly session. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
583 | * @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
|
584 | * @param addr Address to connect to. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
585 | * @return The new connection. |
| 2086 | 586 | */ |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
587 | 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
|
588 | { |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
589 | aim_conn_t *newconn; |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
590 | struct aim_odc_intdata *intdata; |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
591 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
592 | if (!sess || !sn) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
593 | return NULL; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
594 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
595 | if (!(intdata = malloc(sizeof(struct aim_odc_intdata)))) |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
596 | return NULL; |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
597 | memset(intdata, 0, sizeof(struct aim_odc_intdata)); |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
598 | memcpy(intdata->cookie, cookie, 8); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
599 | strncpy(intdata->sn, sn, sizeof(intdata->sn)); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
600 | if (addr) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
601 | strncpy(intdata->ip, addr, sizeof(intdata->ip)); |
| 2086 | 602 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
603 | /* XXX - verify that non-blocking connects actually work */ |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
604 | if (!(newconn = aim_newconn(sess, AIM_CONN_TYPE_RENDEZVOUS, addr))) { |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
605 | free(intdata); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
606 | return NULL; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
607 | } |
| 2086 | 608 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
609 | newconn->internal = intdata; |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
610 | newconn->subtype = AIM_CONN_SUBTYPE_OFT_DIRECTIM; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
611 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
612 | return newconn; |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
613 | } |
| 2086 | 614 | |
| 615 | /** | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
616 | * Creates a listener socket so the other dude can connect to us. |
| 2086 | 617 | * |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
618 | * 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
|
619 | * When the state changes, call aim_handlerendconnection with |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
620 | * the connection returned by this. aim_handlerendconnection |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
621 | * will accept the pending connection and stop listening. |
| 2086 | 622 | * |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
623 | * @param sess The session. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
624 | * @param cookie This better be Mrs. Fields or I'm going to be pissed. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
625 | * @param ip Should be 4 bytes, each byte is 1 quartet of the IP address. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
626 | * @param port Ye olde port number to listen on. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
627 | * @return Return the new conn if everything went as planned. Otherwise, |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
628 | * return NULL. |
| 2086 | 629 | */ |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
630 | faim_export aim_conn_t *aim_sendfile_listen(aim_session_t *sess, const fu8_t *cookie, const fu8_t *ip, fu16_t port) |
| 2086 | 631 | { |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
632 | aim_conn_t *newconn; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
633 | int listenfd; |
| 2086 | 634 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
635 | if ((listenfd = listenestablish(port)) == -1) |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
636 | return NULL; |
| 2086 | 637 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
638 | if (!(newconn = aim_newconn(sess, AIM_CONN_TYPE_LISTENER, NULL))) { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
639 | close(listenfd); |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
640 | return NULL; |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
641 | } |
| 3630 | 642 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
643 | newconn->fd = listenfd; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
644 | newconn->subtype = AIM_CONN_SUBTYPE_OFT_SENDFILE; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
645 | newconn->lastactivity = time(NULL); |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
646 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
647 | return newconn; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
648 | } |
| 3630 | 649 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
650 | /** |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
651 | * Extract an &aim_fileheader_t from the given buffer. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
652 | * |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
653 | * @param bs The should be from an incoming rendezvous packet. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
654 | * @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
|
655 | */ |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
656 | 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
|
657 | { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
658 | struct aim_fileheader_t *fh; |
| 3630 | 659 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
660 | if (!(fh = calloc(1, sizeof(struct aim_fileheader_t)))) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
661 | return NULL; |
| 3630 | 662 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
663 | /* The bstream should be positioned after the hdrtype. */ |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
664 | aimbs_getrawbuf(bs, fh->bcookie, 8); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
665 | fh->encrypt = aimbs_get16(bs); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
666 | fh->compress = aimbs_get16(bs); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
667 | fh->totfiles = aimbs_get16(bs); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
668 | fh->filesleft = aimbs_get16(bs); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
669 | fh->totparts = aimbs_get16(bs); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
670 | fh->partsleft = aimbs_get16(bs); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
671 | fh->totsize = aimbs_get32(bs); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
672 | fh->size = aimbs_get32(bs); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
673 | fh->modtime = aimbs_get32(bs); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
674 | fh->checksum = aimbs_get32(bs); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
675 | fh->rfrcsum = aimbs_get32(bs); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
676 | fh->rfsize = aimbs_get32(bs); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
677 | fh->cretime = aimbs_get32(bs); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
678 | fh->rfcsum = aimbs_get32(bs); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
679 | fh->nrecvd = aimbs_get32(bs); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
680 | fh->recvcsum = aimbs_get32(bs); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
681 | aimbs_getrawbuf(bs, fh->idstring, 32); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
682 | fh->flags = aimbs_get8(bs); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
683 | fh->lnameoffset = aimbs_get8(bs); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
684 | fh->lsizeoffset = aimbs_get8(bs); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
685 | aimbs_getrawbuf(bs, fh->dummy, 69); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
686 | aimbs_getrawbuf(bs, fh->macfileinfo, 16); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
687 | fh->nencode = aimbs_get16(bs); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
688 | fh->nlanguage = aimbs_get16(bs); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
689 | aimbs_getrawbuf(bs, fh->name, 64); /* XXX - filenames longer than 64B */ |
| 2086 | 690 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
691 | return fh; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
692 | } |
| 3630 | 693 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
694 | /** |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
695 | * Fills a buffer with network-order fh data |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
696 | * |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
697 | * @param bs A bstream to fill -- automatically initialized |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
698 | * @param fh A struct aim_fileheader_t to get data from. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
699 | * @return Return non-zero on error. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
700 | */ |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
701 | 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
|
702 | { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
703 | fu8_t *hdr; |
| 3630 | 704 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
705 | if (!bs || !fh) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
706 | return -EINVAL; |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
707 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
708 | if (!(hdr = (unsigned char *)calloc(1, 0x100 - 8))) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
709 | return -ENOMEM; |
| 3630 | 710 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
711 | aim_bstream_init(bs, hdr, 0x100 - 8); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
712 | aimbs_putraw(bs, fh->bcookie, 8); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
713 | aimbs_put16(bs, fh->encrypt); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
714 | aimbs_put16(bs, fh->compress); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
715 | aimbs_put16(bs, fh->totfiles); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
716 | aimbs_put16(bs, fh->filesleft); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
717 | aimbs_put16(bs, fh->totparts); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
718 | aimbs_put16(bs, fh->partsleft); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
719 | aimbs_put32(bs, fh->totsize); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
720 | aimbs_put32(bs, fh->size); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
721 | aimbs_put32(bs, fh->modtime); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
722 | aimbs_put32(bs, fh->checksum); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
723 | aimbs_put32(bs, fh->rfrcsum); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
724 | aimbs_put32(bs, fh->rfsize); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
725 | aimbs_put32(bs, fh->cretime); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
726 | aimbs_put32(bs, fh->rfcsum); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
727 | aimbs_put32(bs, fh->nrecvd); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
728 | aimbs_put32(bs, fh->recvcsum); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
729 | aimbs_putraw(bs, fh->idstring, 32); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
730 | aimbs_put8(bs, fh->flags); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
731 | aimbs_put8(bs, fh->lnameoffset); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
732 | aimbs_put8(bs, fh->lsizeoffset); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
733 | aimbs_putraw(bs, fh->dummy, 69); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
734 | aimbs_putraw(bs, fh->macfileinfo, 16); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
735 | aimbs_put16(bs, fh->nencode); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
736 | aimbs_put16(bs, fh->nlanguage); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
737 | 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
|
738 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
739 | return 0; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
740 | } |
| 2086 | 741 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
742 | /** |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
743 | * 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
|
744 | * |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
745 | * @param sess The session. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
746 | * @param conn The already-connected OFT connection. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
747 | * @param cookie The cookie associated with this file transfer. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
748 | * @param filename The filename. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
749 | * @param filesdone Number of files already transferred. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
750 | * @param numfiles Total number of files. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
751 | * @param size Size in bytes of this file. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
752 | * @param totsize Size in bytes of all files combined. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
753 | * @param checksum Funky checksum of this file. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
754 | * @param flags Any flags you want, baby. Send 0x21 when sending the |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
755 | * "AIM_CB_OFT_DONE" message, and "0x02" for everything else. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
756 | * @return Return 0 if no errors, otherwise return the error number. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
757 | */ |
|
4646
80da370910f2
[gaim-migrate @ 4956]
Mark Doliner <markdoliner@pidgin.im>
parents:
4618
diff
changeset
|
758 | faim_export int aim_oft_sendheader(aim_session_t *sess, aim_conn_t *conn, fu16_t type, const fu8_t *cookie, const char *filename, fu16_t filesdone, fu16_t numfiles, fu32_t size, fu32_t totsize, fu32_t modtime, fu32_t checksum, fu8_t flags, fu32_t bytesreceived, fu32_t recvcsum) |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
759 | { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
760 | aim_frame_t *newoft; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
761 | struct aim_fileheader_t *fh; |
| 2086 | 762 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
763 | if (!sess || !conn || (conn->type != AIM_CONN_TYPE_RENDEZVOUS) || !filename) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
764 | return -EINVAL; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
765 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
766 | if (!(fh = (struct aim_fileheader_t *)calloc(1, sizeof(struct aim_fileheader_t)))) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
767 | return -ENOMEM; |
|
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 | /* |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
770 | * 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
|
771 | * 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
|
772 | * SNACs. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
773 | */ |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
774 | if (cookie) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
775 | memcpy(fh->bcookie, cookie, 8); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
776 | fh->totfiles = numfiles; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
777 | fh->filesleft = numfiles - filesdone; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
778 | fh->totparts = 0x0001; /* set to 0x0002 sending Mac resource forks */ |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
779 | fh->partsleft = 0x0001; |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
780 | fh->totsize = totsize; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
781 | fh->size = size; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
782 | fh->modtime = modtime; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
783 | fh->checksum = checksum; |
|
4646
80da370910f2
[gaim-migrate @ 4956]
Mark Doliner <markdoliner@pidgin.im>
parents:
4618
diff
changeset
|
784 | fh->nrecvd = bytesreceived; |
|
80da370910f2
[gaim-migrate @ 4956]
Mark Doliner <markdoliner@pidgin.im>
parents:
4618
diff
changeset
|
785 | fh->recvcsum = recvcsum; |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
786 | |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
787 | strncpy(fh->idstring, "OFT_Windows ICBMFT V1.1 32", sizeof(fh->idstring)); |
|
4646
80da370910f2
[gaim-migrate @ 4956]
Mark Doliner <markdoliner@pidgin.im>
parents:
4618
diff
changeset
|
788 | fh->flags = flags; |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
789 | fh->lnameoffset = 0x1a; |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
790 | fh->lsizeoffset = 0x10; |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
791 | memset(fh->dummy, 0, sizeof(fh->dummy)); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
792 | memset(fh->macfileinfo, 0, sizeof(fh->macfileinfo)); |
| 2086 | 793 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
794 | /* apparently 0 is ASCII, 2 is UCS-2 */ |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
795 | /* it is likely that 3 is ISO 8859-1 */ |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
796 | fh->nencode = 0x0000; |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
797 | fh->nlanguage = 0x0000; |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
798 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
799 | strncpy(fh->name, filename, sizeof(fh->name)); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
800 | aim_oft_dirconvert_tostupid(fh->name); |
| 2086 | 801 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
802 | if (!(newoft = aim_tx_new(sess, conn, AIM_FRAMETYPE_OFT, type, 0))) { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
803 | free(fh); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
804 | return -ENOMEM; |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
805 | } |
| 2086 | 806 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
807 | if (aim_oft_buildheader(&newoft->data, fh) == -1) { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
808 | aim_frame_destroy(newoft); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
809 | free(fh); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
810 | return -ENOMEM; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
811 | } |
| 2086 | 812 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
813 | memcpy(newoft->hdr.rend.magic, "OFT2", 4); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
814 | newoft->hdr.rend.hdrlen = aim_bstream_curpos(&newoft->data); |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
815 | |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
816 | aim_tx_enqueue(sess, newoft); |
| 2086 | 817 | |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
818 | free(fh); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
819 | |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
820 | return 0; |
| 2086 | 821 | } |
| 822 | ||
| 823 | /** | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
824 | * Sometimes you just don't know with these kinds of people. |
| 2086 | 825 | * |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
826 | * @param sess The session. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
827 | * @param conn The ODC connection of the incoming data. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
828 | * @param frr The frame allocated for the incoming data. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
829 | * @param bs It stands for "bologna sandwich." |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
830 | * @return Return 0 if no errors, otherwise return the error number. |
| 2086 | 831 | */ |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
832 | static int handlehdr_odc(aim_session_t *sess, aim_conn_t *conn, aim_frame_t *frr, aim_bstream_t *bs) |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
833 | { |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
834 | aim_frame_t fr; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
835 | aim_rxcallback_t userfunc; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
836 | fu32_t payloadlength; |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
837 | fu16_t flags, encoding; |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
838 | char *snptr = NULL; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
839 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
840 | fr.conn = conn; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
841 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
842 | /* AAA - ugly */ |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
843 | aim_bstream_setpos(bs, 20); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
844 | payloadlength = aimbs_get32(bs); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
845 | |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
846 | aim_bstream_setpos(bs, 24); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
847 | encoding = aimbs_get16(bs); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
848 | |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
849 | aim_bstream_setpos(bs, 30); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
850 | flags = aimbs_get16(bs); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
851 | |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
852 | aim_bstream_setpos(bs, 36); |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
853 | /* XXX - create an aimbs_getnullstr function? */ |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
854 | snptr = aimbs_getstr(bs, MAXSNLEN); |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
855 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
856 | faimdprintf(sess, 2, "faim: OFT frame: handlehdr_odc: %04x / %04x / %s\n", payloadlength, flags, snptr); |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
857 | |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
858 | if (flags & 0x0002) { |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
859 | int ret = 0; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
860 | |
| 4002 | 861 | if (flags & 0x000c) { |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
862 | if ((userfunc = aim_callhandler(sess, conn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMTYPING))) |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
863 | ret = userfunc(sess, &fr, snptr, 1); |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
864 | return ret; |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
865 | } |
| 2993 | 866 | |
| 867 | if ((userfunc = aim_callhandler(sess, conn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMTYPING))) | |
| 868 | ret = userfunc(sess, &fr, snptr, 0); | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
869 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
870 | return ret; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
871 | |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
872 | } else if (((flags & 0x000f) == 0x0000) && payloadlength) { |
| 2993 | 873 | char *msg, *msg2; |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
874 | int ret = 0; |
| 2993 | 875 | int recvd = 0; |
| 876 | int i; | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
877 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
878 | if (!(msg = calloc(1, payloadlength+1))) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
879 | return -1; |
| 2993 | 880 | msg2 = msg; |
| 881 | ||
| 882 | while (payloadlength - recvd) { | |
| 883 | if (payloadlength - recvd >= 1024) | |
| 884 | i = aim_recv(conn->fd, msg2, 1024); | |
| 885 | else | |
| 886 | i = aim_recv(conn->fd, msg2, payloadlength - recvd); | |
| 3012 | 887 | if (i <= 0) { |
| 2993 | 888 | free(msg); |
| 889 | return -1; | |
| 890 | } | |
| 891 | recvd = recvd + i; | |
| 892 | msg2 = msg2 + i; | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
893 | if ((userfunc = aim_callhandler(sess, conn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_IMAGETRANSFER))) |
| 2993 | 894 | userfunc(sess, &fr, snptr, (double)recvd / payloadlength); |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
895 | } |
| 2993 | 896 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
897 | if ( (userfunc = aim_callhandler(sess, conn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMINCOMING)) ) |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
898 | ret = userfunc(sess, &fr, snptr, msg, payloadlength, encoding); |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
899 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
900 | free(msg); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
901 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
902 | return ret; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
903 | } |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
904 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
905 | return 0; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
906 | } |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
907 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
908 | /** |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
909 | * 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
|
910 | * 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
|
911 | * 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
|
912 | * |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
913 | * @param sess The session. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
914 | * @param fr The frame allocated for the incoming data. |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
915 | * @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
|
916 | * error number. |
| 3771 | 917 | */ |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
918 | faim_internal int aim_rxdispatch_rendezvous(aim_session_t *sess, aim_frame_t *fr) |
| 2086 | 919 | { |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3771
diff
changeset
|
920 | aim_conn_t *conn = fr->conn; |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
921 | int ret = 1; |
| 2086 | 922 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
923 | if (conn->subtype == AIM_CONN_SUBTYPE_OFT_DIRECTIM) { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
924 | if (fr->hdr.rend.type == 0x0001) |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
925 | ret = handlehdr_odc(sess, conn, fr, &fr->data); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
926 | else |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
927 | faimdprintf(sess, 0, "faim: ODC directim frame unknown, type is %04x\n", fr->hdr.rend.type); |
| 2086 | 928 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
929 | } else if (conn->subtype == AIM_CONN_SUBTYPE_OFT_GETFILE) { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
930 | switch (fr->hdr.rend.type) { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
931 | case 0x1108: /* getfile listing.txt incoming tx->rx */ |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
932 | break; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
933 | case 0x1209: /* get file listing ack rx->tx */ |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
934 | break; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
935 | case 0x120b: /* get file listing rx confirm */ |
| 3630 | 936 | break; |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
937 | case 0x120c: /* getfile request */ |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
938 | break; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
939 | case 0x0101: /* getfile sending data */ |
| 3630 | 940 | break; |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
941 | case 0x0202: /* getfile recv data */ |
| 3630 | 942 | break; |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
943 | case 0x0204: /* getfile finished */ |
| 3630 | 944 | break; |
| 945 | default: | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
946 | faimdprintf(sess, 2, "faim: OFT getfile frame uknown, type is %04x\n", fr->hdr.rend.type); |
| 3630 | 947 | break; |
| 948 | } | |
| 949 | ||
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
950 | } else if (conn->subtype == AIM_CONN_SUBTYPE_OFT_SENDFILE) { |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
951 | aim_rxcallback_t userfunc; |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
952 | struct aim_fileheader_t *header = aim_oft_getheader(&fr->data); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
953 | aim_oft_dirconvert_fromstupid(header->name); /* XXX - This should be client-side */ |
| 3771 | 954 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
955 | 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
|
956 | ret = userfunc(sess, fr, conn, header->bcookie, header); |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
957 | |
|
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
958 | free(header); |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
959 | } |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
4002
diff
changeset
|
960 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
961 | if (ret == -1) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
962 | aim_conn_close(conn); |
| 2086 | 963 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
964 | return ret; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
965 | } |