Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • protocols/purple/ft.c

    rea90275 r98d46d5  
    4242        char *fn, *handle;
    4343        gboolean ui_wants_data;
    44         int timeout;
    4544};
    4645
     
    6564        struct prpl_xfer_data *px = ft->data;
    6665
    67         if (px->xfer) {
    68                 if (!purple_xfer_is_completed(px->xfer) && !purple_xfer_is_canceled(px->xfer)) {
    69                         purple_xfer_cancel_local(px->xfer);
    70                 }
    71                 px->xfer->ui_data = NULL;
    72                 purple_xfer_unref(px->xfer);
    73                 px->xfer = NULL;
    74         }
    75 }
    76 
    77 static void prpl_xfer_free(struct file_transfer *ft)
    78 {
    79         struct prpl_xfer_data *px = ft->data;
    80         struct purple_data *pd = px->ic->proto_data;
    81 
    82         pd->filetransfers = g_slist_remove(pd->filetransfers, px);
    83 
    84         if (px->xfer) {
    85                 px->xfer->ui_data = NULL;
    86                 purple_xfer_unref(px->xfer);
    87         }
    88 
    89         if (px->timeout) {
    90                 b_event_remove(px->timeout);
    91         }
    92 
    93         g_free(px->fn);
    94         g_free(px->handle);
    95         if (px->fd >= 0) {
    96                 close(px->fd);
    97         }
    98         g_free(px);
     66        purple_xfer_request_denied(px->xfer);
    9967}
    10068
    10169static void prplcb_xfer_new(PurpleXfer *xfer)
    10270{
    103         purple_xfer_ref(xfer);
    104 
    10571        if (purple_xfer_get_type(xfer) == PURPLE_XFER_RECEIVE) {
    10672                struct prpl_xfer_data *px = g_new0(struct prpl_xfer_data, 1);
    107                 struct purple_data *pd;
    10873
    10974                xfer->ui_data = px;
     
    11378                px->ic = purple_ic_by_pa(xfer->account);
    11479
    115                 pd = px->ic->proto_data;
    116                 pd->filetransfers = g_slist_prepend(pd->filetransfers, px);
    117 
    11880                purple_xfer_set_local_filename(xfer, px->fn);
    11981
     
    150112        px->ft->accept = prpl_xfer_accept;
    151113        px->ft->canceled = prpl_xfer_canceled;
    152         px->ft->free = prpl_xfer_free;
    153114        px->ft->write_request = prpl_xfer_write_request;
    154115
     
    203164
    204165
     166/* Generic (IM<>UI): */
    205167static void prplcb_xfer_destroy(PurpleXfer *xfer)
    206168{
    207169        struct prpl_xfer_data *px = xfer->ui_data;
    208170
    209         if (px) {
    210                 px->xfer = NULL;
    211         }
     171        g_free(px->fn);
     172        g_free(px->handle);
     173        if (px->fd >= 0) {
     174                close(px->fd);
     175        }
     176        g_free(px);
    212177}
    213178
     
    259224        struct prpl_xfer_data *px = xfer->ui_data;
    260225
    261         if (px && px->ft) {
     226        if (px->ft) {
    262227                imcb_file_canceled(px->ic, px->ft, "Canceled by remote end");
    263         } else if (px) {
     228        } else {
    264229                /* px->ft == NULL for sends, because of the two stages. :-/ */
    265230                imcb_error(px->ic, "File transfer cancelled by remote end");
     
    275240{
    276241        struct prpl_xfer_data *px = g_new0(struct prpl_xfer_data, 1);
    277         struct purple_data *pd;
    278242        char *dir, *basename;
    279243
    280244        ft->data = px;
    281245        px->ft = ft;
    282         px->ft->free = prpl_xfer_free;
    283246
    284247        dir = g_strdup("/tmp/bitlbee-purple-ft.XXXXXX");
     
    309272        px->handle = g_strdup(handle);
    310273
    311         pd = px->ic->proto_data;
    312         pd->filetransfers = g_slist_prepend(pd->filetransfers, px);
    313 
    314274        imcb_log(ic,
    315275                 "Due to libpurple limitations, the file has to be cached locally before proceeding with the actual file transfer. Please wait...");
    316276
    317         px->timeout = b_timeout_add(0, purple_transfer_request_cb, ft);
     277        b_timeout_add(0, purple_transfer_request_cb, ft);
    318278}
    319279
     
    335295        struct prpl_xfer_data *px = ft->data;
    336296
    337         px->timeout = 0;
    338 
    339297        if (ft->write == NULL) {
    340298                ft->write = prpl_xfer_write;
     
    364322                px->ft = NULL;
    365323        } else {
    366                 px->timeout = b_timeout_add(0, purple_transfer_request_cb, ft);
     324                b_timeout_add(0, purple_transfer_request_cb, ft);
    367325        }
    368326
    369327        return TRUE;
    370 }
    371 
    372 void purple_transfer_cancel_all(struct im_connection *ic)
    373 {
    374         struct purple_data *pd = ic->proto_data;
    375 
    376         while (pd->filetransfers) {
    377                 struct prpl_xfer_data *px = pd->filetransfers->data;
    378 
    379                 if (px->ft) {
    380                         imcb_file_canceled(ic, px->ft, "Logging out");
    381                 }
    382 
    383                 pd->filetransfers = g_slist_remove(pd->filetransfers, px);
    384         }
    385328}
    386329
Note: See TracChangeset for help on using the changeset viewer.