Revision 684381cc
Von aquamaniac vor etwa 20 Jahren hinzugefügt
src/net/netconnection.c | ||
---|---|---|
#define GWEN_EXTEND_NETCONNECTION
|
||
|
||
#include "netconnection_p.h"
|
||
#include "i18n_l.h"
|
||
#include <gwenhywfar/misc.h>
|
||
#include <gwenhywfar/debug.h>
|
||
#include <gwenhywfar/waitcallback.h>
|
||
... | ... | |
distance=750;
|
||
}
|
||
|
||
GWEN_WaitCallback_Enter(GWEN_NETCONNECTION_CBID_IO);
|
||
GWEN_WaitCallback_EnterWithText(GWEN_WAITCALLBACK_ID_FAST,
|
||
I18N("Reading from network..."),
|
||
I18N("second(s)"),
|
||
0);
|
||
GWEN_WaitCallback_SetProgressTotal(GWEN_WAITCALLBACK_PROGRESS_NONE);
|
||
|
||
lastHadNoWaitFlags=0;
|
||
for (count=0;;) {
|
||
/* actually try to read */
|
||
... | ... | |
|
||
for (;;count++) {
|
||
GWEN_TYPE_UINT32 waitFlags;
|
||
double d;
|
||
|
||
if (GWEN_WaitCallback()==GWEN_WaitCallbackResult_Abort) {
|
||
DBG_ERROR(GWEN_LOGDOMAIN, "User aborted via waitcallback");
|
||
... | ... | |
/* found activity, break */
|
||
break;
|
||
|
||
d=difftime(time(0), startt);
|
||
GWEN_WaitCallback_SetProgressPos((GWEN_TYPE_UINT64)d);
|
||
|
||
/* check timeout */
|
||
if (timeout!=GWEN_NETCONNECTION_TIMEOUT_FOREVER) {
|
||
if (timeout==GWEN_NETCONNECTION_TIMEOUT_NONE ||
|
||
difftime(time(0), startt)>timeout) {
|
||
DBG_INFO(GWEN_LOGDOMAIN, "Could not read within %d seconds, giving up",
|
||
timeout);
|
||
if (timeout==GWEN_NETCONNECTION_TIMEOUT_NONE ||
|
||
d>timeout) {
|
||
DBG_INFO(GWEN_LOGDOMAIN,
|
||
"Could not read within %d seconds, giving up",
|
||
timeout);
|
||
GWEN_WaitCallback_Leave();
|
||
return 1;
|
||
}
|
||
return 1;
|
||
}
|
||
GWEN_WaitCallback_SetProgressPos((GWEN_TYPE_UINT64)d);
|
||
}
|
||
} /* for */
|
||
|
||
... | ... | |
distance=750;
|
||
}
|
||
|
||
GWEN_WaitCallback_Enter(GWEN_NETCONNECTION_CBID_IO);
|
||
GWEN_WaitCallback_EnterWithText(GWEN_WAITCALLBACK_ID_FAST,
|
||
I18N("Writing to network..."),
|
||
I18N("second(s)"),
|
||
0);
|
||
GWEN_WaitCallback_SetProgressTotal(GWEN_WAITCALLBACK_PROGRESS_NONE);
|
||
lastHadNoWaitFlags=0;
|
||
for (count=0;;) {
|
||
/* actually try to write */
|
||
... | ... | |
|
||
for (;;count++) {
|
||
GWEN_TYPE_UINT32 waitFlags;
|
||
double d;
|
||
|
||
if (GWEN_WaitCallback()==GWEN_WaitCallbackResult_Abort) {
|
||
DBG_ERROR(GWEN_LOGDOMAIN, "User aborted via waitcallback");
|
||
... | ... | |
/* found activity, break */
|
||
break;
|
||
|
||
d=difftime(time(0), startt);
|
||
GWEN_WaitCallback_SetProgressPos((GWEN_TYPE_UINT64)d);
|
||
|
||
/* check timeout */
|
||
if (timeout!=GWEN_NETCONNECTION_TIMEOUT_FOREVER) {
|
||
if (timeout==GWEN_NETCONNECTION_TIMEOUT_NONE ||
|
||
difftime(time(0), startt)>timeout) {
|
||
if (timeout==GWEN_NETCONNECTION_TIMEOUT_NONE ||
|
||
d>timeout) {
|
||
DBG_INFO(GWEN_LOGDOMAIN, "Could not read within %d seconds, giving up",
|
||
timeout);
|
||
GWEN_WaitCallback_Leave();
|
||
... | ... | |
distance=750;
|
||
}
|
||
|
||
GWEN_WaitCallback_Enter(GWEN_NETCONNECTION_CBID_IO);
|
||
GWEN_WaitCallback_EnterWithText(GWEN_WAITCALLBACK_ID_FAST,
|
||
I18N("Flushing connection data..."),
|
||
I18N("second(s)"),
|
||
0);
|
||
GWEN_WaitCallback_SetProgressTotal(GWEN_WAITCALLBACK_PROGRESS_NONE);
|
||
|
||
for (count=0;;) {
|
||
/* let the connection work */
|
||
rv=GWEN_NetConnection_Work(conn);
|
||
... | ... | |
for (;;count++) {
|
||
GWEN_TYPE_UINT32 waitFlags;
|
||
GWEN_NETTRANSPORT_STATUS st;
|
||
double d;
|
||
|
||
st=GWEN_NetTransport_GetStatus(conn->transportLayer);
|
||
if (st==GWEN_NetTransportStatusUnconnected ||
|
||
... | ... | |
/* found activity, break */
|
||
break;
|
||
|
||
d=difftime(time(0), startt);
|
||
GWEN_WaitCallback_SetProgressPos((GWEN_TYPE_UINT64)d);
|
||
|
||
/* check timeout */
|
||
if (timeout!=GWEN_NETCONNECTION_TIMEOUT_FOREVER) {
|
||
if (timeout==GWEN_NETCONNECTION_TIMEOUT_NONE ||
|
||
difftime(time(0), startt)>timeout) {
|
||
d>timeout) {
|
||
DBG_INFO(GWEN_LOGDOMAIN, "Could not write within %d seconds, giving up (%d)",
|
||
waitFlags,
|
||
timeout);
|
||
... | ... | |
distance=750;
|
||
}
|
||
|
||
GWEN_WaitCallback_Enter(GWEN_NETCONNECTION_CBID_IO);
|
||
for (count=0;;) {
|
||
GWEN_WaitCallback_EnterWithText(GWEN_WAITCALLBACK_ID_FAST,
|
||
I18N("Waiting for connection status change..."),
|
||
I18N("second(s)"),
|
||
0);
|
||
GWEN_WaitCallback_SetProgressTotal(GWEN_WAITCALLBACK_PROGRESS_NONE);
|
||
|
||
for (count=0;;) {
|
||
/* let the connection work */
|
||
rv=GWEN_NetConnection_Work(conn);
|
||
if (rv==GWEN_NetConnectionWorkResult_Error) {
|
||
... | ... | |
for (;;count++) {
|
||
GWEN_TYPE_UINT32 waitFlags;
|
||
GWEN_NETTRANSPORT_STATUS st;
|
||
double d;
|
||
|
||
st=GWEN_NetConnection_GetStatus(conn);
|
||
if (GWEN_WaitCallback()==GWEN_WaitCallbackResult_Abort) {
|
||
... | ... | |
/* found activity, break */
|
||
break;
|
||
|
||
d=difftime(time(0), startt);
|
||
GWEN_WaitCallback_SetProgressPos((GWEN_TYPE_UINT64)d);
|
||
|
||
/* check timeout */
|
||
if (timeout!=GWEN_NETCONNECTION_TIMEOUT_FOREVER) {
|
||
if (timeout==GWEN_NETCONNECTION_TIMEOUT_NONE ||
|
||
difftime(time(0), startt)>timeout) {
|
||
if (timeout==GWEN_NETCONNECTION_TIMEOUT_NONE ||
|
||
d>timeout) {
|
||
DBG_INFO(GWEN_LOGDOMAIN,
|
||
"Timeout (%d) while waiting for status %d, giving up (%d)",
|
||
timeout,
|
||
... | ... | |
distance=750;
|
||
}
|
||
|
||
GWEN_WaitCallback_Enter(GWEN_NETCONNECTION_CBID_IO);
|
||
GWEN_WaitCallback_EnterWithText(GWEN_WAITCALLBACK_ID_FAST,
|
||
I18N("Waiting for incoming messages..."),
|
||
I18N("second(s)"),
|
||
0);
|
||
GWEN_WaitCallback_SetProgressTotal(GWEN_WAITCALLBACK_PROGRESS_NONE);
|
||
|
||
for (count=0;;) {
|
||
for (;;count++) {
|
||
GWEN_TYPE_UINT32 waitFlags;
|
||
double d;
|
||
|
||
if (GWEN_WaitCallback()==GWEN_WaitCallbackResult_Abort) {
|
||
DBG_ERROR(GWEN_LOGDOMAIN, "User aborted via waitcallback");
|
||
... | ... | |
/* found activity, break */
|
||
break;
|
||
|
||
d=difftime(time(0), startt);
|
||
GWEN_WaitCallback_SetProgressPos((GWEN_TYPE_UINT64)d);
|
||
|
||
/* check timeout */
|
||
if (timeout!=GWEN_NETCONNECTION_TIMEOUT_FOREVER) {
|
||
if (timeout==GWEN_NETCONNECTION_TIMEOUT_NONE ||
|
||
difftime(time(0), startt)>timeout) {
|
||
if (timeout==GWEN_NETCONNECTION_TIMEOUT_NONE ||
|
||
d>timeout) {
|
||
DBG_INFO(GWEN_LOGDOMAIN, "Timeout while waiting for connection, giving up");
|
||
GWEN_WaitCallback_Leave();
|
||
return 0;
|
||
... | ... | |
return 0;
|
||
}
|
||
|
||
GWEN_WaitCallback_Enter(GWEN_NETCONNECTION_CBID_IO);
|
||
GWEN_WaitCallback_EnterWithText(GWEN_WAITCALLBACK_ID_FAST,
|
||
I18N("Waiting for incoming message..."),
|
||
I18N("second(s)"),
|
||
0);
|
||
GWEN_WaitCallback_SetProgressTotal(GWEN_WAITCALLBACK_PROGRESS_NONE);
|
||
|
||
for (count=0;;) {
|
||
for (;;count++) {
|
||
GWEN_TYPE_UINT32 waitFlags;
|
||
double d;
|
||
|
||
if (GWEN_WaitCallback()==GWEN_WaitCallbackResult_Abort) {
|
||
DBG_ERROR(GWEN_LOGDOMAIN, "User aborted via waitcallback");
|
||
... | ... | |
break;
|
||
#endif
|
||
|
||
d=difftime(time(0), startt);
|
||
GWEN_WaitCallback_SetProgressPos((GWEN_TYPE_UINT64)d);
|
||
|
||
/* check timeout */
|
||
if (timeout!=GWEN_NETCONNECTION_TIMEOUT_FOREVER) {
|
||
if (timeout==GWEN_NETCONNECTION_TIMEOUT_NONE ||
|
||
difftime(time(0), startt)>timeout) {
|
||
d>timeout) {
|
||
DBG_INFO(GWEN_LOGDOMAIN, "Timeout while waiting for connection, giving up");
|
||
GWEN_WaitCallback_Leave();
|
||
return 0;
|
||
... | ... | |
int distance;
|
||
int count;
|
||
GWEN_NETCONNECTION_WORKRESULT rv;
|
||
time_t startt;
|
||
|
||
t0=GWEN_CurrentTime();
|
||
assert(t0);
|
||
|
||
GWEN_WaitCallback_Enter(GWEN_NETCONNECTION_CBID_IO);
|
||
startt=time(0);
|
||
|
||
GWEN_WaitCallback_EnterWithText(GWEN_WAITCALLBACK_ID_FAST,
|
||
I18N("Waiting for network traffic..."),
|
||
I18N("second(s)"),
|
||
0);
|
||
GWEN_WaitCallback_SetProgressTotal(GWEN_WAITCALLBACK_PROGRESS_NONE);
|
||
|
||
if (timeout==GWEN_NETCONNECTION_TIMEOUT_NONE)
|
||
distance=GWEN_NETCONNECTION_TIMEOUT_NONE;
|
||
... | ... | |
GWEN_Time_free(t1);
|
||
|
||
if (d>=timeout) {
|
||
DBG_DEBUG(GWEN_LOGDOMAIN, "Could not walk within %d milliseconds, giving up",
|
||
DBG_DEBUG(GWEN_LOGDOMAIN,
|
||
"Could not walk within %d milliseconds, giving up",
|
||
timeout);
|
||
GWEN_Time_free(t0);
|
||
GWEN_WaitCallback_Leave();
|
||
return GWEN_NetConnectionWorkResult_NoChange;
|
||
}
|
||
GWEN_WaitCallback_SetProgressPos((GWEN_TYPE_UINT64)d);
|
||
}
|
||
else {
|
||
double d;
|
||
|
||
d=difftime(time(0), startt);
|
||
GWEN_WaitCallback_SetProgressPos((GWEN_TYPE_UINT64)d);
|
||
}
|
||
}
|
||
} /* for */
|
Auch abrufbar als: Unified diff
- GWEN_WAITCALLBACK:
- added text field to waitcallback
- added function/macro GWEN_WaitCallback_EnterWithText
- fixed GWEN_WaitCallback: If any previously activated callback returns
GWEN_WaitCallbackResult_Abort then all following callbacks will return
this code as well. Also the condition of returning this code is stored.
- introduced GWEN_WAITCALLBACK_ID_SIMPLE_PROGRESS
- introduced GWEN_WAITCALLBACK_ID_FAST
- introduced flags:
- defined flag GWEN_WAITCALLBACK_FLAGS_NO_REUSE
- defined depth level GWEN_WAITCALLBACK_LEVEL_REUSED
- replaced GWEN_BUFFEREDIO_CBID_IO with GWEN_WAITCALLBACK_ID_FAST
- replaced GWEN_NETCONNECTION_CBID_IO with GWEN_WAITCALLBACK_ID_FAST
- replaced GWEN_FSLOCK_CBID_IO with GWEN_WAITCALLBACK_ID_FAST
- README: Added listing of waitcallback ids
- added "LL" to GWEN_WAITCALLBACK_PROGRESS_NONE.
FIXME: We should better define a MAXVALUE, like GWEN_MAXVAL_UINT64 and
let configure determine this type (like the other stuff), because the
suffix "LL" tells the compiler that this is a "long long" value, which isn't
necessarily the case for 64 bit architectures...
git-svn-id: https://devel.aqbanking.de/svn/gwenhywfar/trunk@810 70169cfe-8b10-0410-8925-dcb4b91034d8