- chnages to new http HM code
This commit is contained in:
192
sinqhttp.c
192
sinqhttp.c
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
This is a histogram mmeory driver for the 2005-6 version of the
|
This is a histogram memory driver for the 2005-6 version of the
|
||||||
histogram mmeory software based on RTAI-Linux and an embedded WWW-server
|
histogram memory software based on RTAI-Linux and an embedded WWW-server
|
||||||
for communications. For all http work the ghttp library from the gnome
|
for communications. For all http work the ghttp library from the gnome
|
||||||
project is used.
|
project is used.
|
||||||
|
|
||||||
@ -27,11 +27,12 @@ extern char *trim(char *);
|
|||||||
====================================================================*/
|
====================================================================*/
|
||||||
static char startdaq[] = {"/sinqhm/startdaq.egi"};
|
static char startdaq[] = {"/sinqhm/startdaq.egi"};
|
||||||
static char stopdaq[] = {"/sinqhm/stopdaq.egi"};
|
static char stopdaq[] = {"/sinqhm/stopdaq.egi"};
|
||||||
static char pausedaq[] = {"/sinqhm/stopdaq.egi"};
|
static char pausedaq[] = {"/sinqhm/pausedaq.egi"};
|
||||||
static char continuedaq[] = {"/sinqhm/continuedaq.egi"};
|
static char continuedaq[] = {"/sinqhm/continuedaq.egi"};
|
||||||
static char statusdaq[] = {"/sinqhm/textstatus.egi"};
|
static char statusdaq[] = {"/sinqhm/textstatus.egi"};
|
||||||
static char gethm[] = {"/sinqhm/readhmdata.egi"};
|
static char gethm[] = {"/sinqhm/readhmdata.egi"};
|
||||||
static char configure[] = {"/sinqhm/configure.egi"};
|
static char configure[] = {"/sinqhm/configure.egi"};
|
||||||
|
static char preset[] = {"/sinqhm/presethm.egi"};
|
||||||
/*====================================================================
|
/*====================================================================
|
||||||
error codes
|
error codes
|
||||||
======================================================================*/
|
======================================================================*/
|
||||||
@ -42,24 +43,32 @@ static char configure[] = {"/sinqhm/configure.egi"};
|
|||||||
#define NOTIMPLEMENTED -705
|
#define NOTIMPLEMENTED -705
|
||||||
#define SERVERERROR -706
|
#define SERVERERROR -706
|
||||||
#define BADSTATUS -707
|
#define BADSTATUS -707
|
||||||
|
#define BADAUTH -708
|
||||||
/*=====================================================================
|
/*=====================================================================
|
||||||
our driver private data structure
|
our driver private data structure
|
||||||
======================================================================*/
|
======================================================================*/
|
||||||
typedef struct {
|
typedef struct {
|
||||||
ghttp_request *syncRequest;
|
ghttp_request *syncRequest;
|
||||||
char hmAddress[512];
|
char hmAddress[512];
|
||||||
|
char userName[132];
|
||||||
|
char passWord[132];
|
||||||
char hmError[512];
|
char hmError[512];
|
||||||
int errorCode;
|
int errorCode;
|
||||||
pStringDict lastStatus;
|
|
||||||
int pause;
|
int pause;
|
||||||
int failCount;
|
int failCount;
|
||||||
|
int asyncRunning;
|
||||||
}sinqHttp, *pSinqHttp;
|
}sinqHttp, *pSinqHttp;
|
||||||
/*-------------------------------------------------------------------*/
|
/*------------------------------------------------------------------*/
|
||||||
static int sinqHttpGet(pSinqHttp self, char *request){
|
static int sinqHttpGetPrepare(pSinqHttp self, char *request){
|
||||||
char url[512];
|
char url[512];
|
||||||
ghttp_status httpStatus;
|
ghttp_status httpStatus;
|
||||||
char *pPtr = NULL;
|
|
||||||
int len;
|
if(self->asyncRunning){
|
||||||
|
while((httpStatus = ghttp_process(self->syncRequest))
|
||||||
|
== ghttp_not_done){
|
||||||
|
}
|
||||||
|
self->asyncRunning = 0;
|
||||||
|
}
|
||||||
|
|
||||||
self->errorCode = 0;
|
self->errorCode = 0;
|
||||||
ghttp_clean(self->syncRequest);
|
ghttp_clean(self->syncRequest);
|
||||||
@ -71,25 +80,59 @@ static int sinqHttpGet(pSinqHttp self, char *request){
|
|||||||
self->errorCode = BADURL;
|
self->errorCode = BADURL;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
ghttp_set_authinfo(self->syncRequest,self->userName,
|
||||||
|
self->passWord);
|
||||||
|
ghttp_set_sync(self->syncRequest,ghttp_sync);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
/*-------------------------------------------------------------------*/
|
||||||
|
static int sinqHttpCheckResponse(pSinqHttp self){
|
||||||
|
char *pPtr = NULL;
|
||||||
|
int len;
|
||||||
|
|
||||||
|
self->failCount = 0;
|
||||||
|
pPtr = ghttp_get_body(self->syncRequest);
|
||||||
|
len = ghttp_get_body_len(self->syncRequest);
|
||||||
|
if(len > 511){
|
||||||
|
len = 510;
|
||||||
|
}
|
||||||
|
if(strstr(pPtr,"ERROR") != NULL){
|
||||||
|
memset(self->hmError,0,512*sizeof(char));
|
||||||
|
strncpy(self->hmError,pPtr, len);
|
||||||
|
self->errorCode = HTTPERROR;
|
||||||
|
return 0;
|
||||||
|
} else if(strstr(pPtr,"Authentication Error") != NULL){
|
||||||
|
memset(self->hmError,0,512*sizeof(char));
|
||||||
|
strncpy(self->hmError,pPtr, len);
|
||||||
|
self->errorCode = BADAUTH;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
/*-------------------------------------------------------------------*/
|
||||||
|
static int sinqHttpGet(pSinqHttp self, char *request){
|
||||||
|
ghttp_status httpStatus;
|
||||||
|
char *pPtr = NULL;
|
||||||
|
|
||||||
|
if(!sinqHttpGetPrepare(self,request)){
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* try two times: a reconnect is no error
|
||||||
|
*/
|
||||||
ghttp_prepare(self->syncRequest);
|
ghttp_prepare(self->syncRequest);
|
||||||
httpStatus = ghttp_process(self->syncRequest);
|
httpStatus = ghttp_process(self->syncRequest);
|
||||||
if(httpStatus != ghttp_done){
|
if(httpStatus != ghttp_done){
|
||||||
strncpy(self->hmError,ghttp_get_error(self->syncRequest), 511);
|
ghttp_close(self->syncRequest);
|
||||||
self->errorCode = SERVERERROR;
|
sinqHttpGetPrepare(self,request);
|
||||||
return 0;
|
httpStatus = ghttp_process(self->syncRequest);
|
||||||
} else {
|
}
|
||||||
self->failCount = 0;
|
if(httpStatus != ghttp_done){
|
||||||
pPtr = ghttp_get_body(self->syncRequest);
|
strncpy(self->hmError,"Reconnect", 511);
|
||||||
len = ghttp_get_body_len(self->syncRequest);
|
self->errorCode = SERVERERROR;
|
||||||
if(len > 511){
|
|
||||||
len = 510;
|
|
||||||
}
|
|
||||||
if(strstr(pPtr,"ERROR") != NULL){
|
|
||||||
memset(self->hmError,0,512*sizeof(char));
|
|
||||||
strncpy(self->hmError,pPtr, len);
|
|
||||||
self->errorCode = HTTPERROR;
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
} else {
|
||||||
|
return sinqHttpCheckResponse(self);
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -117,6 +160,23 @@ static int SinqHttpConfigure(pHistDriver self, SConnection *pCon,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* looser credentials
|
||||||
|
*/
|
||||||
|
if(StringDictGet(pOpt,"username",pPriv->userName, 131) != 1){
|
||||||
|
SCWrite(pCon,
|
||||||
|
"ERROR: required configuration parameter username not found",
|
||||||
|
eError);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if(StringDictGet(pOpt,"password",pPriv->passWord, 131) != 1){
|
||||||
|
SCWrite(pCon,
|
||||||
|
"ERROR: required configuration parameter password not found",
|
||||||
|
eError);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* actual configuration. Check for flag INIT in
|
/* actual configuration. Check for flag INIT in
|
||||||
options. We do not need to configure, if the HM has configured
|
options. We do not need to configure, if the HM has configured
|
||||||
itself already. What is does, these days.
|
itself already. What is does, these days.
|
||||||
@ -161,6 +221,9 @@ static int SinqHttpConfigure(pHistDriver self, SConnection *pCon,
|
|||||||
confData = (char *)Tcl_GetStringResult(pSics->pTcl);
|
confData = (char *)Tcl_GetStringResult(pSics->pTcl);
|
||||||
status = ghttp_set_body(pPriv->syncRequest,confData,
|
status = ghttp_set_body(pPriv->syncRequest,confData,
|
||||||
strlen(confData));
|
strlen(confData));
|
||||||
|
ghttp_set_authinfo(pPriv->syncRequest, pPriv->userName,
|
||||||
|
pPriv->passWord);
|
||||||
|
ghttp_set_sync(pPriv->syncRequest,ghttp_sync);
|
||||||
status = ghttp_prepare(pPriv->syncRequest);
|
status = ghttp_prepare(pPriv->syncRequest);
|
||||||
httpStatus = ghttp_process(pPriv->syncRequest);
|
httpStatus = ghttp_process(pPriv->syncRequest);
|
||||||
confData = (char *)ghttp_get_body(pPriv->syncRequest);
|
confData = (char *)ghttp_get_body(pPriv->syncRequest);
|
||||||
@ -176,6 +239,11 @@ static int SinqHttpConfigure(pHistDriver self, SConnection *pCon,
|
|||||||
SCWrite(pCon,confCommand,eError);
|
SCWrite(pCon,confCommand,eError);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
if(strstr(confData,"Authentication Error") != NULL){
|
||||||
|
snprintf(confCommand,511,"%s",confData);
|
||||||
|
SCWrite(pCon,confCommand,eError);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -240,10 +308,15 @@ static int SinqHttpContinue(pHistDriver self, SConnection *pCon){
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
/*--------------------------------------------------------------------*/
|
/*--------------------------------------------------------------------*/
|
||||||
static int readStatus(pSinqHttp self){
|
static int readStatus(pHistDriver pDriv){
|
||||||
char *pPtr = NULL, *pLinePtr;
|
char *pPtr = NULL, *pLinePtr;
|
||||||
char line[132];
|
char line[132];
|
||||||
char name[80], value[80];
|
char name[80], value[80];
|
||||||
|
pSinqHttp self = NULL;
|
||||||
|
char *daqPtr = NULL, *daqValPtr = NULL;
|
||||||
|
|
||||||
|
self = (pSinqHttp)pDriv->pPriv;
|
||||||
|
assert(self != NULL);
|
||||||
|
|
||||||
pPtr = ghttp_get_body(self->syncRequest);
|
pPtr = ghttp_get_body(self->syncRequest);
|
||||||
if(pPtr == NULL){
|
if(pPtr == NULL){
|
||||||
@ -256,10 +329,11 @@ static int readStatus(pSinqHttp self){
|
|||||||
pLinePtr = line;
|
pLinePtr = line;
|
||||||
pLinePtr = stptok(pLinePtr,name,80,":");
|
pLinePtr = stptok(pLinePtr,name,80,":");
|
||||||
pLinePtr = stptok(pLinePtr,value,80,":");
|
pLinePtr = stptok(pLinePtr,value,80,":");
|
||||||
if(StringDictExists(self->lastStatus,trim(name)) == 1){
|
strtolower(name);
|
||||||
StringDictUpdate(self->lastStatus,trim(name),trim(value));
|
if(StringDictExists(pDriv->pOption,trim(name)) == 1){
|
||||||
|
StringDictUpdate(pDriv->pOption,trim(name),trim(value));
|
||||||
} else {
|
} else {
|
||||||
StringDictAddPair(self->lastStatus,trim(name),trim(value));
|
StringDictAddPair(pDriv->pOption,trim(name),trim(value));
|
||||||
}
|
}
|
||||||
pPtr = stptok(pPtr,line,131,"\n");
|
pPtr = stptok(pPtr,line,131,"\n");
|
||||||
}
|
}
|
||||||
@ -268,6 +342,7 @@ static int readStatus(pSinqHttp self){
|
|||||||
/*---------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------*/
|
||||||
static int SinqHttpStatus(pHistDriver self,SConnection *pCon){
|
static int SinqHttpStatus(pHistDriver self,SConnection *pCon){
|
||||||
pSinqHttp pPriv = NULL;
|
pSinqHttp pPriv = NULL;
|
||||||
|
ghttp_status httpStatus;
|
||||||
char daqStatus[20];
|
char daqStatus[20];
|
||||||
int status, len;
|
int status, len;
|
||||||
char *pPtr = NULL;
|
char *pPtr = NULL;
|
||||||
@ -279,17 +354,48 @@ static int SinqHttpStatus(pHistDriver self,SConnection *pCon){
|
|||||||
return HWPause;
|
return HWPause;
|
||||||
}
|
}
|
||||||
|
|
||||||
status = sinqHttpGet(pPriv,statusdaq);
|
if(pPriv->asyncRunning == 0){
|
||||||
|
status = sinqHttpGetPrepare(pPriv,statusdaq);
|
||||||
|
ghttp_set_sync(pPriv->syncRequest,ghttp_async);
|
||||||
|
ghttp_prepare(pPriv->syncRequest);
|
||||||
|
if(status != 1){
|
||||||
|
return HWFault;
|
||||||
|
}
|
||||||
|
pPriv->asyncRunning = 1;
|
||||||
|
}
|
||||||
|
httpStatus = ghttp_process(pPriv->syncRequest);
|
||||||
|
switch(httpStatus){
|
||||||
|
case ghttp_error:
|
||||||
|
ghttp_close(pPriv->syncRequest);
|
||||||
|
sinqHttpGetPrepare(pPriv,statusdaq);
|
||||||
|
ghttp_prepare(pPriv->syncRequest);
|
||||||
|
httpStatus = ghttp_process(pPriv->syncRequest);
|
||||||
|
if(httpStatus != ghttp_done){
|
||||||
|
strncpy(pPriv->hmError,"Reconnect", 511);
|
||||||
|
pPriv->errorCode = SERVERERROR;
|
||||||
|
return HWFault;
|
||||||
|
pPriv->asyncRunning = 0;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case ghttp_not_done:
|
||||||
|
return HWBusy;
|
||||||
|
break;
|
||||||
|
case ghttp_done:
|
||||||
|
pPriv->asyncRunning = 0;
|
||||||
|
status = sinqHttpCheckResponse(pPriv);
|
||||||
|
if(status != 1){
|
||||||
|
return HWFault;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
status = readStatus(self);
|
||||||
if(status != 1){
|
if(status != 1){
|
||||||
return HWFault;
|
return HWFault;
|
||||||
}
|
}
|
||||||
|
|
||||||
status = readStatus(pPriv);
|
if(StringDictGet(self->pOption,"daq",daqStatus,20) != 1){
|
||||||
if(status != 1){
|
|
||||||
return HWFault;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(StringDictGet(pPriv->lastStatus,"DAQ",daqStatus,20) != 1){
|
|
||||||
pPriv->errorCode = BADSTATUS;
|
pPriv->errorCode = BADSTATUS;
|
||||||
strncpy(pPriv->hmError,"ERROR: status does not contain DAQ field",511);
|
strncpy(pPriv->hmError,"ERROR: status does not contain DAQ field",511);
|
||||||
return HWFault;
|
return HWFault;
|
||||||
@ -403,6 +509,18 @@ static float SinqHttpGetTime(pHistDriver self, SConnection *pCon){
|
|||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------*/
|
||||||
static int SinqHttpPreset(pHistDriver self, SConnection *pCon, int val){
|
static int SinqHttpPreset(pHistDriver self, SConnection *pCon, int val){
|
||||||
|
pSinqHttp pPriv = NULL;
|
||||||
|
int status;
|
||||||
|
char command[512];
|
||||||
|
|
||||||
|
pPriv = (pSinqHttp)self->pPriv;
|
||||||
|
assert(pPriv != NULL);
|
||||||
|
|
||||||
|
snprintf(command,512,"%s?value=%d",preset,val);
|
||||||
|
status = sinqHttpGet(pPriv,command);
|
||||||
|
if(status != 1){
|
||||||
|
return HWFault;
|
||||||
|
}
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------*/
|
||||||
@ -414,9 +532,6 @@ static int SinqHttpFreePrivate(pHistDriver self){
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(pPriv->lastStatus != NULL){
|
|
||||||
DeleteStringDict(pPriv->lastStatus);
|
|
||||||
}
|
|
||||||
if(pPriv->syncRequest != NULL){
|
if(pPriv->syncRequest != NULL){
|
||||||
ghttp_request_destroy(pPriv->syncRequest);
|
ghttp_request_destroy(pPriv->syncRequest);
|
||||||
}
|
}
|
||||||
@ -446,9 +561,8 @@ pHistDriver CreateSinqHttpDriver(pStringDict pOption){
|
|||||||
}
|
}
|
||||||
memset(pInternal,0,sizeof(sinqHttp));
|
memset(pInternal,0,sizeof(sinqHttp));
|
||||||
pNew->pPriv = pInternal;
|
pNew->pPriv = pInternal;
|
||||||
pInternal->lastStatus = CreateStringDict();
|
|
||||||
pInternal->syncRequest = ghttp_request_new();
|
pInternal->syncRequest = ghttp_request_new();
|
||||||
if(pInternal->lastStatus == NULL && pInternal->syncRequest == NULL){
|
if(pInternal->syncRequest == NULL){
|
||||||
free(pNew);
|
free(pNew);
|
||||||
free(pInternal);
|
free(pInternal);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
Reference in New Issue
Block a user