- allow scriptcontext objects to be dynamic
- enhancements in scriptcontext (error messages stored as properties)
This commit is contained in:
57
sicsobj.c
57
sicsobj.c
@ -17,7 +17,11 @@
|
||||
#include "initializer.h"
|
||||
#include "splitter.h"
|
||||
|
||||
extern int decodeSICSPriv(char *txt); /* from access.c */
|
||||
typedef struct {
|
||||
char *name;
|
||||
char *class;
|
||||
} NameClass;
|
||||
|
||||
/*--------------------------------------------------------------------------*/
|
||||
void DefaultKill(void *data)
|
||||
{
|
||||
@ -74,6 +78,42 @@ int SaveSICSOBJ(void *data, char *name, FILE * fd)
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static void KillSICSOBJfromNode(void *userData)
|
||||
{
|
||||
NameClass *nameClass = userData;
|
||||
SICSOBJ *sicsobj;
|
||||
|
||||
sicsobj = FindCommandData(pServ->pSics, nameClass->name, nameClass->class);
|
||||
if (sicsobj) {
|
||||
sicsobj->objectNode = NULL; /* do not call RemoveHdbNodeFromParent in KillSICSOBJ */
|
||||
sicsobj->pDes->parNode = NULL; /* do not free the node twice in KillSICSOBJ/DeleteDescriptor */
|
||||
RemoveCommand(pServ->pSics, nameClass->name);
|
||||
}
|
||||
free(nameClass->name);
|
||||
free(nameClass->class);
|
||||
free(nameClass);
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static hdbCallbackReturn DummyCallback(Hdb *node, void *userData,
|
||||
hdbMessage *msg)
|
||||
{
|
||||
return hdbContinue;
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
void RegisterSICSOBJKillCmd(pSICSOBJ sicsobj, char *name)
|
||||
{
|
||||
hdbCallback *cb;
|
||||
NameClass *nameClass;
|
||||
|
||||
nameClass = calloc(1, sizeof(*nameClass));
|
||||
nameClass->name = strdup(name);
|
||||
nameClass->class = strdup(sicsobj->pDes->name);
|
||||
/* use only the kill function */
|
||||
cb = MakeHipadabaCallback(DummyCallback, nameClass, KillSICSOBJfromNode);
|
||||
assert(cb);
|
||||
AppendHipadabaCallback(sicsobj->objectNode, cb);
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
pSICSOBJ MakeSICSOBJv(char *name, char *class, int type, int priv)
|
||||
{
|
||||
@ -119,8 +159,11 @@ void KillSICSOBJ(void *data)
|
||||
if (self->KillPrivate != NULL && self->pPrivate != NULL) {
|
||||
self->KillPrivate(self->pPrivate);
|
||||
}
|
||||
RemoveHdbNodeFromParent(self->objectNode, pServ->dummyCon);
|
||||
if (self->objectNode != NULL) {
|
||||
RemoveHdbNodeFromParent(self->objectNode, pServ->dummyCon);
|
||||
}
|
||||
if (self->pDes != NULL) {
|
||||
self->objectNode = NULL; /* inhibit SICSOBJcallback from deleting twice */
|
||||
DeleteDescriptor(self->pDes); /* kill descriptor including node */
|
||||
}
|
||||
free(self);
|
||||
@ -412,11 +455,11 @@ int InterInvokeSICSOBJ(SConnection * pCon, SicsInterp * pSics, void *pData,
|
||||
if (status == -1) {
|
||||
status = 0;
|
||||
if (argc > 1) {
|
||||
snprintf(buffer, 131,
|
||||
"ERROR: no command or parameter found for key: %s",
|
||||
argv[1]);
|
||||
snprintf(buffer, sizeof buffer,
|
||||
"ERROR: %s %s not found",
|
||||
argv[0], argv[1]);
|
||||
} else {
|
||||
snprintf(buffer, 131, "ERROR: no argument found");
|
||||
snprintf(buffer, sizeof buffer, "ERROR: no argument found");
|
||||
}
|
||||
SCWrite(pCon, buffer, eError);
|
||||
status = 0;
|
||||
@ -444,7 +487,6 @@ pSICSOBJ SetupSICSOBJ(SConnection * pCon, SicsInterp * pSics, void *pData,
|
||||
/* convert privilege */
|
||||
priv = decodeSICSPriv(argv[3]);
|
||||
/* convert datatype */
|
||||
strtolower(argv[4]);
|
||||
type = convertHdbType(argv[4]);
|
||||
if (type > HIPFLOAT) {
|
||||
SCWrite(pCon,
|
||||
@ -464,6 +506,7 @@ pSICSOBJ SetupSICSOBJ(SConnection * pCon, SicsInterp * pSics, void *pData,
|
||||
SetDescriptorKey(pNew->pDes, "creationCommand", "0");
|
||||
}
|
||||
|
||||
SetHdbProperty(pNew->objectNode, "objectName", argv[1]);
|
||||
status = AddCommand(pSics,
|
||||
argv[1], InterInvokeSICSOBJ, KillSICSOBJ, pNew);
|
||||
if (status != 1) {
|
||||
|
Reference in New Issue
Block a user