- Various fixes to make mountaingum work
This commit is contained in:
82
hdbqueue.c
82
hdbqueue.c
@@ -18,6 +18,7 @@
|
||||
/*--------------------------------------------------------------------------*/
|
||||
typedef struct {
|
||||
int iStop;
|
||||
int isRunning;
|
||||
SConnection *pCon;
|
||||
}HdbQueue, *pHdbQueue;
|
||||
/*--------------------------------------------------------------------------*/
|
||||
@@ -155,7 +156,7 @@ static void sequentialNames(pHdb obj,SConnection *pCon){
|
||||
current = work->child;
|
||||
while(current != NULL){
|
||||
snprintf(name,80,"%3.3d",count);
|
||||
if(current != NULL && current->name != NULL){
|
||||
if(current->name != NULL){
|
||||
free(current->name);
|
||||
}
|
||||
current->name = strdup(name);
|
||||
@@ -173,7 +174,14 @@ static void sequentialNames(pHdb obj,SConnection *pCon){
|
||||
static int Dequeue(pSICSOBJ self, SConnection *pCon, pHdb par[], int nPar){
|
||||
pHdb work = NULL;
|
||||
char name[80];
|
||||
pHdbQueue priv = (pHdbQueue)self->pPrivate;
|
||||
|
||||
if(priv->isRunning == 1){
|
||||
SCWrite(pCon,"ERROR: cannot dequeue while running",eError);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
if(nPar < 1){
|
||||
SCWrite(pCon,"ERROR: internal: not enough parameters to Dequeue",eError);
|
||||
return 0;
|
||||
@@ -193,8 +201,13 @@ static int Dequeue(pSICSOBJ self, SConnection *pCon, pHdb par[], int nPar){
|
||||
static int Clean(pSICSOBJ self, SConnection *pCon, pHdb par[], int nPar){
|
||||
int i;
|
||||
pHdb current = NULL, queue = NULL;
|
||||
pHdb currentEntry = NULL, tmp;
|
||||
|
||||
pHdb currentEntry = NULL, tmp = NULL;
|
||||
pHdbQueue priv = (pHdbQueue)self->pPrivate;
|
||||
|
||||
if(priv->isRunning == 1){
|
||||
SCWrite(pCon,"ERROR: cannot clean while running",eError);
|
||||
return 0;
|
||||
}
|
||||
currentEntry = GetHipadabaNode(self->objectNode,"control/currentEntry");
|
||||
queue = GetHipadabaNode(self->objectNode,"queue");
|
||||
current = queue->child;
|
||||
@@ -211,6 +224,31 @@ static int Clean(pSICSOBJ self, SConnection *pCon, pHdb par[], int nPar){
|
||||
NotifyHipadabaPar(currentEntry,pCon);
|
||||
return 1;
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static int CleanAll(pSICSOBJ self, SConnection *pCon, pHdb par[], int nPar){
|
||||
int i;
|
||||
pHdb current = NULL, queue = NULL;
|
||||
pHdb currentEntry = NULL, tmp;
|
||||
pHdbQueue priv = (pHdbQueue)self->pPrivate;
|
||||
|
||||
if(priv->isRunning == 1){
|
||||
SCWrite(pCon,"ERROR: cannot clear queue while executing",eError);
|
||||
return 0;
|
||||
}
|
||||
currentEntry = GetHipadabaNode(self->objectNode,"control/currentEntry");
|
||||
queue = GetHipadabaNode(self->objectNode,"queue");
|
||||
current = queue->child;
|
||||
while(current != NULL){
|
||||
tmp = current->next;
|
||||
DeleteNodeData(current);
|
||||
current = tmp;
|
||||
}
|
||||
queue->child = NULL;
|
||||
currentEntry->value.v.intValue = 0;
|
||||
sequentialNames(self->objectNode, pCon);
|
||||
NotifyHipadabaPar(currentEntry,pCon);
|
||||
return 1;
|
||||
}
|
||||
/*----------------------------------------------------------------------------*/
|
||||
static int QueueTask(void *pData){
|
||||
pSICSOBJ self = (pSICSOBJ)pData;
|
||||
@@ -222,6 +260,7 @@ static int QueueTask(void *pData){
|
||||
pHdbQueue priv = (pHdbQueue)self->pPrivate;
|
||||
|
||||
if(priv->iStop == 1){
|
||||
priv->isRunning = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -238,6 +277,7 @@ static int QueueTask(void *pData){
|
||||
MacroPop();
|
||||
}
|
||||
if(priv->iStop == 1 || SCGetInterrupt(priv->pCon) != eContinue){
|
||||
priv->isRunning = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -245,6 +285,7 @@ static int QueueTask(void *pData){
|
||||
work->value.v.intValue = pos;
|
||||
NotifyHipadabaPar(work,priv->pCon);
|
||||
if(pos >= max->value.v.intValue){
|
||||
priv->isRunning = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -256,6 +297,12 @@ static int Start(pSICSOBJ self, SConnection *pCon, pHdb par[], int nPar){
|
||||
|
||||
priv->iStop = 0;
|
||||
priv->pCon = pCon;
|
||||
|
||||
if(priv->isRunning == 1){
|
||||
SCWrite(pCon,"ERROR: Hdbqueue is already running",eError);
|
||||
return 0;
|
||||
}
|
||||
priv->isRunning = 1;
|
||||
|
||||
TaskRegister(pServ->pTasker,
|
||||
QueueTask,
|
||||
@@ -266,6 +313,19 @@ static int Start(pSICSOBJ self, SConnection *pCon, pHdb par[], int nPar){
|
||||
return 1;
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static int Restart(pSICSOBJ self, SConnection *pCon, pHdb par[], int nPar){
|
||||
pHdbQueue priv = (pHdbQueue)self->pPrivate;
|
||||
pHdb maxCurrent = NULL;
|
||||
|
||||
maxCurrent = GetHipadabaNode(self->objectNode,"control/currentEntry");
|
||||
if(maxCurrent != NULL){
|
||||
maxCurrent->value.v.intValue = 0;
|
||||
NotifyHipadabaPar(maxCurrent,pCon);
|
||||
}
|
||||
|
||||
return Start(self,pCon,par,nPar);
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static int Stop(pSICSOBJ self, SConnection *pCon, pHdb par[], int nPar){
|
||||
pHdbQueue priv = (pHdbQueue)self->pPrivate;
|
||||
|
||||
@@ -279,6 +339,12 @@ static int Move(pSICSOBJ self, SConnection *pCon, pHdb par[], int nPar){
|
||||
pHdb prevNode = NULL, queueNode = NULL;
|
||||
pHdb tmp;
|
||||
char name[80];
|
||||
pHdbQueue priv = (pHdbQueue)self->pPrivate;
|
||||
|
||||
if(priv->isRunning == 1){
|
||||
SCWrite(pCon,"ERROR: cannot move while running",eError);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if(nPar < 2){
|
||||
SCWrite(pCon,"ERROR: internal: not enough parameters to Move",eError);
|
||||
@@ -375,11 +441,21 @@ static void Configure(pSICSOBJ self){
|
||||
AddHipadabaChild(obj,n,NULL);
|
||||
AppendHipadabaCallback(n,HCBSET,MakeSICSFuncCallback(self));
|
||||
|
||||
funcValue = makeHdbData(HIPFUNC,1,CleanAll);
|
||||
n = MakeSICSHdbPar("cleanall",usUser, funcValue);
|
||||
AddHipadabaChild(obj,n,NULL);
|
||||
AppendHipadabaCallback(n,HCBSET,MakeSICSFuncCallback(self));
|
||||
|
||||
funcValue = makeHdbData(HIPFUNC,1,Start);
|
||||
n = MakeSICSHdbPar("start",usUser, funcValue);
|
||||
AddHipadabaChild(obj,n,NULL);
|
||||
AppendHipadabaCallback(n,HCBSET,MakeSICSFuncCallback(self));
|
||||
|
||||
funcValue = makeHdbData(HIPFUNC,1,Restart);
|
||||
n = MakeSICSHdbPar("restart",usUser, funcValue);
|
||||
AddHipadabaChild(obj,n,NULL);
|
||||
AppendHipadabaCallback(n,HCBSET,MakeSICSFuncCallback(self));
|
||||
|
||||
funcValue = makeHdbData(HIPFUNC,1,Stop);
|
||||
n = MakeSICSHdbPar("stop",usUser, funcValue);
|
||||
AddHipadabaChild(obj,n,NULL);
|
||||
|
||||
Reference in New Issue
Block a user