| 1 | #ifdef HAVE_CONFIG_H |
| 2 | #include <config.h> |
| 3 | #endif |
| 4 | #include <string.h> |
| 5 | #include <stdlib.h> |
| 6 | #include <errno.h> |
| 7 | #include <doldaconnect/utils.h> |
| 8 | #include <panel-applet.h> |
| 9 | #include <time.h> |
| 10 | |
| 11 | #include "conduit.h" |
| 12 | |
| 13 | void (*cb_condstate)(struct conduit *conduit, void *data) = NULL; |
| 14 | void (*cb_trsize)(struct transfer *transfer, void *data) = NULL; |
| 15 | void (*cb_trpos)(struct transfer *transfer, void *data) = NULL; |
| 16 | void (*cb_trnew)(struct transfer *transfer, void *data) = NULL; |
| 17 | void (*cb_trfree)(struct transfer *transfer, void *data) = NULL; |
| 18 | |
| 19 | struct transfer *findtransferbytag(struct conduit *conduit, char *tag) |
| 20 | { |
| 21 | struct transfer *transfer; |
| 22 | |
| 23 | for(transfer = conduit->transfers; transfer != NULL; transfer = transfer->next) |
| 24 | { |
| 25 | if((transfer->tag != NULL) && !strcmp(transfer->tag, tag)) |
| 26 | break; |
| 27 | } |
| 28 | return(transfer); |
| 29 | } |
| 30 | |
| 31 | void transfersetsize(struct transfer *transfer, int size) |
| 32 | { |
| 33 | transfer->size = size; |
| 34 | cb_trsize(transfer, transfer->conduit->udata); |
| 35 | } |
| 36 | |
| 37 | void transfersetpos(struct transfer *transfer, int pos) |
| 38 | { |
| 39 | transfer->pos = pos; |
| 40 | cb_trpos(transfer, transfer->conduit->udata); |
| 41 | } |
| 42 | |
| 43 | static gboolean trupdatetime(struct transfer *transfer) |
| 44 | { |
| 45 | time_t now; |
| 46 | |
| 47 | if((transfer->size == -1) || (transfer->pos == -1)) |
| 48 | return(TRUE); |
| 49 | now = time(NULL); |
| 50 | if(now - transfer->ckptime >= 10) |
| 51 | { |
| 52 | transfer->cmptime = transfer->ckptime; |
| 53 | transfer->cmpsize = transfer->ckpsize; |
| 54 | transfer->ckptime = 0; |
| 55 | } |
| 56 | if(transfer->ckptime == 0) |
| 57 | { |
| 58 | transfer->ckptime = now; |
| 59 | transfer->ckpsize = transfer->pos; |
| 60 | } |
| 61 | return(TRUE); |
| 62 | } |
| 63 | |
| 64 | struct transfer *newtransfer(struct conduit *conduit, char *tag, int size, int pos) |
| 65 | { |
| 66 | struct transfer *transfer; |
| 67 | |
| 68 | transfer = smalloc(sizeof(*transfer)); |
| 69 | memset(transfer, 0, sizeof(*transfer)); |
| 70 | if(tag != NULL) |
| 71 | transfer->tag = sstrdup(tag); |
| 72 | transfer->size = size; |
| 73 | transfer->pos = pos; |
| 74 | transfer->timeout = g_timeout_add(1000, (gboolean (*)(gpointer))trupdatetime, transfer); |
| 75 | transfer->next = conduit->transfers; |
| 76 | transfer->conduit = conduit; |
| 77 | if(conduit->transfers != NULL) |
| 78 | conduit->transfers->prev = transfer; |
| 79 | conduit->transfers = transfer; |
| 80 | cb_trnew(transfer, conduit->udata); |
| 81 | return(transfer); |
| 82 | } |
| 83 | |
| 84 | void freetransfer(struct transfer *transfer) |
| 85 | { |
| 86 | if(transfer->next != NULL) |
| 87 | transfer->next->prev = transfer->prev; |
| 88 | if(transfer->prev != NULL) |
| 89 | transfer->prev->next = transfer->next; |
| 90 | if(transfer->conduit->transfers == transfer) |
| 91 | transfer->conduit->transfers = transfer->next; |
| 92 | cb_trfree(transfer, transfer->conduit->udata); |
| 93 | g_source_remove(transfer->timeout); |
| 94 | if(transfer->tag != NULL) |
| 95 | free(transfer->tag); |
| 96 | free(transfer); |
| 97 | } |
| 98 | |
| 99 | struct conduit *newconduit(struct conduitiface *iface, void *udata) |
| 100 | { |
| 101 | struct conduit *conduit; |
| 102 | |
| 103 | conduit = smalloc(sizeof(*conduit)); |
| 104 | memset(conduit, 0, sizeof(*conduit)); |
| 105 | conduit->iface = iface; |
| 106 | conduit->udata = udata; |
| 107 | if(iface->init(conduit)) |
| 108 | { |
| 109 | free(conduit); |
| 110 | return(NULL); |
| 111 | } |
| 112 | return(conduit); |
| 113 | } |
| 114 | |
| 115 | void freeconduit(struct conduit *conduit) |
| 116 | { |
| 117 | conduit->iface->destroy(conduit); |
| 118 | while(conduit->transfers != NULL) |
| 119 | freetransfer(conduit->transfers); |
| 120 | free(conduit); |
| 121 | } |
| 122 | |
| 123 | int condtryconn(struct conduit *conduit) |
| 124 | { |
| 125 | if(conduit->state != CNDS_IDLE) |
| 126 | return(-1); |
| 127 | if(conduit->iface->connect(conduit)) |
| 128 | return(-1); |
| 129 | conduit->state = CNDS_SYN; |
| 130 | return(0); |
| 131 | } |
| 132 | |
| 133 | void conddisconn(struct conduit *conduit) |
| 134 | { |
| 135 | while(conduit->transfers != NULL) |
| 136 | freetransfer(conduit->transfers); |
| 137 | conduit->state = CNDS_IDLE; |
| 138 | cb_condstate(conduit, conduit->udata); |
| 139 | } |
| 140 | |
| 141 | void condconnected(struct conduit *conduit) |
| 142 | { |
| 143 | conduit->state = CNDS_EST; |
| 144 | cb_condstate(conduit, conduit->udata); |
| 145 | } |