| 1 /* -*- Mode: C; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ |
1 /* -*- Mode: C; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ |
| 2 /* |
2 /* |
| 3 $Id: tcpfilehandle.c 1319 2000-12-19 10:08:29Z warmenhoven $ |
3 $Id: tcpfilehandle.c 1442 2001-01-28 01:52:27Z warmenhoven $ |
| 4 $Log$ |
4 $Log$ |
| 5 Revision 1.2 2000/12/19 10:08:29 warmenhoven |
5 Revision 1.3 2001/01/28 01:52:27 warmenhoven |
| 6 Yay, new icqlib |
6 icqlib 1.1.5 |
| |
7 |
| |
8 Revision 1.16 2001/01/17 01:29:17 bills |
| |
9 Rework chat and file session interfaces; implement socket notifications. |
| 7 |
10 |
| 8 Revision 1.15 2000/07/24 03:10:08 bills |
11 Revision 1.15 2000/07/24 03:10:08 bills |
| 9 added support for real nickname during TCP transactions like file and |
12 added support for real nickname during TCP transactions like file and |
| 10 chat, instead of using Bill all the time (hmm, where'd I get that from? :) |
13 chat, instead of using Bill all the time (hmm, where'd I get that from? :) |
| 11 |
14 |
| 134 name=icq_PacketReadString(p); |
138 name=icq_PacketReadString(p); |
| 135 psession->total_files=num_files; |
139 psession->total_files=num_files; |
| 136 psession->total_bytes=total_bytes; |
140 psession->total_bytes=total_bytes; |
| 137 psession->current_speed=speed; |
141 psession->current_speed=speed; |
| 138 icq_FileSessionSetHandle(psession, name); |
142 icq_FileSessionSetHandle(psession, name); |
| 139 icq_FileSessionSetStatus(psession, FILE_STATUS_INITIALIZED); |
143 icq_FileSessionSetStatus(psession, FILE_STATUS_INITIALIZING); |
| 140 |
144 |
| 141 /* respond */ |
145 /* respond */ |
| 142 presponse=icq_TCPCreateFile01Packet(speed, plink->icqlink->icq_Nick); |
146 presponse=icq_TCPCreateFile01Packet(speed, icqlink->icq_Nick); |
| 143 |
147 |
| 144 icq_TCPLinkSend(plink, presponse); |
148 icq_TCPLinkSend(plink, presponse); |
| 145 #ifdef TCP_PACKET_TRACE |
149 #ifdef TCP_PACKET_TRACE |
| 146 printf("file 01 packet sent to uin %lu\n", plink->remote_uin); |
150 printf("file 01 packet sent to uin %lu\n", plink->remote_uin); |
| 147 #endif |
151 #endif |
| 151 case 0x01: |
155 case 0x01: |
| 152 speed=icq_PacketRead32(p); |
156 speed=icq_PacketRead32(p); |
| 153 name=icq_PacketReadString(p); |
157 name=icq_PacketReadString(p); |
| 154 psession->current_speed=speed; |
158 psession->current_speed=speed; |
| 155 icq_FileSessionSetHandle(psession, name); |
159 icq_FileSessionSetHandle(psession, name); |
| 156 icq_FileSessionSetStatus(psession, FILE_STATUS_INITIALIZED); |
160 icq_FileSessionSetStatus(psession, FILE_STATUS_INITIALIZING); |
| 157 |
161 |
| 158 /* respond */ |
162 /* respond */ |
| 159 icq_FileSessionPrepareNextFile(psession); |
163 icq_FileSessionPrepareNextFile(psession); |
| 160 presponse=icq_TCPCreateFile02Packet(psession->current_file, |
164 presponse=icq_TCPCreateFile02Packet(psession->current_file, |
| 161 psession->current_file_size, psession->current_speed); |
165 psession->current_file_size, psession->current_speed); |
| 191 icq_TCPLinkSend(plink, presponse); |
195 icq_TCPLinkSend(plink, presponse); |
| 192 #ifdef TCP_PACKET_TRACE |
196 #ifdef TCP_PACKET_TRACE |
| 193 printf("file 03 packet sent to uin %lu\n", plink->remote_uin); |
197 printf("file 03 packet sent to uin %lu\n", plink->remote_uin); |
| 194 #endif |
198 #endif |
| 195 break; |
199 break; |
| 196 |
200 |
| 197 case 0x03: |
201 case 0x03: |
| 198 filesize=icq_PacketRead32(p); |
202 filesize=icq_PacketRead32(p); |
| 199 (void)icq_PacketRead32(p); |
203 (void)icq_PacketRead32(p); |
| 200 speed=icq_PacketRead32(p); |
204 speed=icq_PacketRead32(p); |
| 201 psession->current_file_progress=filesize; |
205 psession->current_file_progress=filesize; |
| 206 icq_FileSessionSetStatus(psession, FILE_STATUS_SENDING); |
210 icq_FileSessionSetStatus(psession, FILE_STATUS_SENDING); |
| 207 break; |
211 break; |
| 208 |
212 |
| 209 case 0x04: |
213 case 0x04: |
| 210 (void)icq_PacketRead32(p); |
214 (void)icq_PacketRead32(p); |
| 211 icq_FileSessionSetStatus(psession, FILE_STATUS_STOP_FILE); |
215 invoke_callback(icqlink, icq_FileNotify)(psession, |
| |
216 FILE_NOTIFY_STOP_FILE, 0, NULL); |
| 212 break; |
217 break; |
| 213 |
218 |
| 214 case 0x05: |
219 case 0x05: |
| 215 speed=icq_PacketRead32(p); |
220 speed=icq_PacketRead32(p); |
| 216 psession->current_speed=speed; |
221 psession->current_speed=speed; |
| 217 if(plink->icqlink->icq_RequestNotify) |
222 invoke_callback(icqlink, icq_FileNotify)(psession, |
| 218 (*plink->icqlink->icq_RequestNotify)(plink->icqlink, plink->id, |
223 FILE_NOTIFY_NEW_SPEED, speed, NULL); |
| 219 ICQ_NOTIFY_FILE, FILE_STATUS_NEW_SPEED, 0); |
|
| 220 break; |
224 break; |
| 221 |
225 |
| 222 case 0x06: |
226 case 0x06: |
| 223 if(plink->icqlink->icq_RequestNotify) |
227 { |
| 224 (*plink->icqlink->icq_RequestNotify)(plink->icqlink, plink->id, ICQ_NOTIFY_FILEDATA, |
228 void *data = p->data+sizeof(BYTE); |
| 225 p->length-sizeof(BYTE), p->data+sizeof(BYTE)); |
229 int length = p->length-sizeof(BYTE); |
| |
230 |
| |
231 invoke_callback(icqlink, icq_FileNotify)(psession, |
| |
232 FILE_NOTIFY_DATAPACKET, length, data); |
| 226 icq_FileSessionSetStatus(psession, FILE_STATUS_RECEIVING); |
233 icq_FileSessionSetStatus(psession, FILE_STATUS_RECEIVING); |
| 227 result=write(psession->current_fd, p->data+sizeof(BYTE), p->length-sizeof(BYTE)); |
234 result=write(psession->current_fd, data, length); |
| 228 psession->current_file_progress+=p->length-sizeof(BYTE); |
235 psession->current_file_progress+=length; |
| 229 psession->total_transferred_bytes+=p->length-sizeof(BYTE); |
236 psession->total_transferred_bytes+=length; |
| 230 break; |
237 break; |
| |
238 } |
| 231 |
239 |
| 232 default: |
240 default: |
| 233 icq_FmtLog(plink->icqlink, ICQ_LOG_WARNING, "unknown file packet type %d!\n", type); |
241 icq_FmtLog(icqlink, ICQ_LOG_WARNING, "unknown file packet type %d!\n", type); |
| 234 |
242 |
| 235 } |
243 } |
| 236 } |
244 } |
| 237 |
245 |
| 238 void icq_HandleFileHello(icq_TCPLink *plink) |
246 void icq_HandleFileHello(icq_TCPLink *plink) |
| 264 { |
272 { |
| 265 icq_TCPLink *pfilelink; |
273 icq_TCPLink *pfilelink; |
| 266 icq_FileSession *pfile; |
274 icq_FileSession *pfile; |
| 267 icq_Packet *p2; |
275 icq_Packet *p2; |
| 268 |
276 |
| 269 if(plink->icqlink->icq_RequestNotify) |
277 invoke_callback(plink->icqlink, icq_RequestNotify)(plink->icqlink, |
| 270 (*plink->icqlink->icq_RequestNotify)(plink->icqlink, p->id, ICQ_NOTIFY_ACK, 0, 0); |
278 p->id, ICQ_NOTIFY_ACK, 0, NULL); |
| |
279 |
| 271 pfilelink=icq_TCPLinkNew(plink->icqlink); |
280 pfilelink=icq_TCPLinkNew(plink->icqlink); |
| 272 pfilelink->type=TCP_LINK_FILE; |
281 pfilelink->type=TCP_LINK_FILE; |
| 273 pfilelink->id=p->id; |
282 pfilelink->id=p->id; |
| 274 |
283 |
| 275 /* once the ack packet has been processed, link up with the file session */ |
284 /* once the ack packet has been processed, link up with the file session */ |
| 276 pfile=icq_FindFileSession(plink->icqlink, plink->remote_uin, 0); |
285 pfile=icq_FindFileSession(plink->icqlink, plink->remote_uin, 0); |
| 277 |
286 |
| 278 pfile->tcplink=pfilelink; |
287 pfile->tcplink=pfilelink; |
| 279 pfilelink->id=pfile->id; |
288 pfilelink->id=pfile->id; |
| 280 |
289 |
| 281 if (plink->icqlink->icq_RequestNotify) |
290 invoke_callback(plink->icqlink, icq_RequestNotify)(plink->icqlink, |
| 282 (*plink->icqlink->icq_RequestNotify)(plink->icqlink, pfile->id, |
291 pfile->id, ICQ_NOTIFY_FILESESSION, sizeof(icq_FileSession), pfile); |
| 283 ICQ_NOTIFY_FILESESSION, sizeof(icq_FileSession), pfile); |
292 invoke_callback(plink->icqlink, icq_RequestNotify)(plink->icqlink, |
| |
293 pfile->id, ICQ_NOTIFY_SUCCESS, 0, NULL); |
| 284 |
294 |
| 285 icq_FileSessionSetStatus(pfile, FILE_STATUS_CONNECTING); |
295 icq_FileSessionSetStatus(pfile, FILE_STATUS_CONNECTING); |
| 286 icq_TCPLinkConnect(pfilelink, plink->remote_uin, port); |
296 icq_TCPLinkConnect(pfilelink, plink->remote_uin, port); |
| 287 |
297 |
| 288 pfilelink->session=pfile; |
298 pfilelink->session=pfile; |