|
Lines 126-132
int cobex_disconnect(obex_t *self, void
|
Link Here
|
|---|
|
/* Called from OBEX-lib when data needs to be written */ | /* Called from OBEX-lib when data needs to be written */ |
int cobex_write(obex_t *self, void *data, uint8_t *buffer, int length) | int cobex_write(obex_t *self, void *data, uint8_t *buffer, int length) |
{ | { |
int actual; |
int written; |
cobex_t *c; | cobex_t *c; |
return_val_if_fail (self != NULL, -1); | return_val_if_fail (self != NULL, -1); |
return_val_if_fail (data != NULL, -1); | return_val_if_fail (data != NULL, -1); |
|
Lines 137-160
int cobex_write(obex_t *self, void *data
|
Link Here
|
|---|
|
DEBUG(3, "%s() Data %d bytes\n", __func__, length); | DEBUG(3, "%s() Data %d bytes\n", __func__, length); |
| |
if (c->type == CT_ERICSSON || c->type == CT_SIEMENS) { | if (c->type == CT_ERICSSON || c->type == CT_SIEMENS) { |
actual = write(c->fd, buffer, length); |
written = write(c->fd, buffer, length); |
if (actual < length) { |
if (written < length) |
DEBUG(1, "Error writing to port (%d expected %d)\n", actual, length); |
{ |
return actual; /* or -1? */ |
DEBUG(1, "Error writing to port: %d written, expected %d; retrying...\n", written, length); |
|
int i, retval=-1, oldretval, fail = 0; |
|
for (i = 0;written < length;++i) |
|
{ |
|
usleep(1); // This mysteriously avoids a resource not available error on write() |
|
oldretval = retval; |
|
retval = write(c->fd, buffer+written, length-written); |
|
if (retval < 0) |
|
{ |
|
DEBUG(1, "%sError writing to port: %s\n", oldretval>=0?"\n":"",strerror(errno)); |
|
++fail; |
|
if (fail == 100) // to avoid infinite looping if something is really wrong |
|
{ |
|
return written; |
|
} |
|
} |
|
else |
|
{ |
|
written += retval; |
|
DEBUG(1, "Wrote %d bytes out of %d in %d retries%s\r", written,length, i+1, written==length?" - success!\n":""); |
|
} |
|
} |
} | } |
return actual; |
|
|
return written; |
} | } |
| |
if (c->seq == 0){ | if (c->seq == 0){ |
actual = bfb_send_first(c->fd, buffer, length); |
written = bfb_send_first(c->fd, buffer, length); |
DEBUG(2, "%s() Wrote %d first packets (%d bytes)\n", __func__, actual, length); |
DEBUG(2, "%s() Wrote %d first packets (%d bytes)\n", __func__, written, length); |
} else { | } else { |
actual = bfb_send_next(c->fd, buffer, length, c->seq); |
written = bfb_send_next(c->fd, buffer, length, c->seq); |
DEBUG(2, "%s() Wrote %d packets (%d bytes)\n", __func__, actual, length); |
DEBUG(2, "%s() Wrote %d packets (%d bytes)\n", __func__, written, length); |
} | } |
c->seq++; | c->seq++; |
| |
return actual; |
return written; |
} | } |
| |
/* Called when input data is needed */ | /* Called when input data is needed */ |