Run ghttp_process in async mode, call TaskYield and add an abort action

This commit is contained in:
Douglas Clowes
2013-07-26 09:39:46 +10:00
parent 6242b5f282
commit 606e73b221

View File

@@ -79,12 +79,48 @@ typedef struct {
pICallBack pCall;
}anstoHttp, *pAnstoHttp;
/*------------------------------------------------------------------*/
static ghttp_status anstoLocalProcess(pAnstoHttp self) {
ghttp_status httpStatus;
pTaskMan pTasker = GetTasker();
if(self->asyncRunning) {
httpStatus = ghttp_process(self->syncRequest);
/*
* Service other SICS tasks while we wait,
* but do not run the taskloop during initialisation
*/
if (pTasker == NULL)
pTasker = GetTasker();
if (pTasker && (pServ->dummyCon != NULL))
TaskYield(pTasker);
return httpStatus;
} else {
ghttp_set_sync(self->syncRequest, ghttp_async);
do {
httpStatus = ghttp_process(self->syncRequest);
if (httpStatus != ghttp_not_done)
break;
/*
* Service other SICS tasks while we wait,
* but do not run the taskloop during initialisation
*/
if (pTasker == NULL)
pTasker = GetTasker();
if (pTasker && (pServ->dummyCon != NULL))
TaskYield(pTasker);
} while(1);
ghttp_set_sync(self->syncRequest, ghttp_sync);
return httpStatus;
}
}
/*------------------------------------------------------------------*/
static int anstoHttpGetPrepare(pAnstoHttp self, char *request){
char url[512];
ghttp_status httpStatus;
if(self->asyncRunning){
while((httpStatus = ghttp_process(self->syncRequest))
while((httpStatus = anstoLocalProcess(self))
== ghttp_not_done){
}
self->asyncRunning = 0;
@@ -147,13 +183,13 @@ static int anstoHttpGet(pAnstoHttp self, char *request){
* try two times: a reconnect is no error
*/
ghttp_prepare(self->syncRequest);
httpStatus = ghttp_process(self->syncRequest);
httpStatus = anstoLocalProcess(self);
if(httpStatus != ghttp_done){
ghttp_close(self->syncRequest);
if (!anstoHttpGetPrepare(self,request))
return 0; // MJL return here if failed
ghttp_prepare(self->syncRequest); // MJL be sure to call ghttp_prepare before each ghttp_process
httpStatus = ghttp_process(self->syncRequest);
httpStatus = anstoLocalProcess(self);
}
if(httpStatus != ghttp_done){
strncpy(self->hmError,"Reconnect", 511);
@@ -254,7 +290,7 @@ static int AnstoHttpConfigure(pHistDriver self, SConnection *pCon,
pPriv->passWord);
ghttp_set_sync(pPriv->syncRequest,ghttp_sync);
status = ghttp_prepare(pPriv->syncRequest);
httpStatus = ghttp_process(pPriv->syncRequest);
httpStatus = anstoLocalProcess(pPriv);
confData = (char *)ghttp_get_body(pPriv->syncRequest);
if(httpStatus != ghttp_done){
/* we may need to reconnect.....
@@ -409,14 +445,14 @@ static int AnstoHttpStatus_Base(pHistDriver self,SConnection *pCon,int *pextrast
}
pPriv->asyncRunning = 1;
}
httpStatus = ghttp_process(pPriv->syncRequest);
httpStatus = anstoLocalProcess(pPriv);
switch(httpStatus){
case ghttp_error:
ghttp_close(pPriv->syncRequest);
pPriv->asyncRunning = 0; // MJL bug fix 9/03/07 moved by DFC
anstoHttpGetPrepare(pPriv,statusdaq);
ghttp_prepare(pPriv->syncRequest);
httpStatus = ghttp_process(pPriv->syncRequest);
httpStatus = anstoLocalProcess(pPriv);
if(httpStatus != ghttp_done){
strncpy(pPriv->hmError,"Reconnect", 511);
pPriv->errorCode = SERVERERROR;
@@ -991,6 +1027,16 @@ pHistDriver CreateAnstoHttpDriver(pStringDict pOption){
SCSendOK(pCon);
return 1;
}
if(strcmp(argv[1],"abort") == 0) {
pAnstoHttp pPriv = NULL;
if(!SCMatchRights(pCon,usUser)) {
return 0;
}
pPriv = (pAnstoHttp)self->pDriv->pPriv;
ghttp_close(pPriv->syncRequest);
SCSendOK(pCon);
return 1;
}
return HistAction(pCon, pSics, pData, argc, argv);
}