Files
cdev-1.7.2n/include/cdevElementDefinition.h
2022-12-13 12:44:04 +01:00

261 lines
9.2 KiB
C++

#ifndef _CDEV_ELEMENT_DEFINITION_H_
#define _CDEV_ELEMENT_DEFINITION_H_
#ifndef _CDEV_DIRECTORY_TABLE_H_
#error "You must include cdevDirectoryTable.h to load cdevElementDefinition.h"
#endif
#include <stdio.h>
#include <string.h>
// *****************************************************************************
// * class cdevElementDefinition :
// * This class is used to store the information that describes the contents
// * of a single element of a CDEV DDL class definition (verb, attribute,
// * or message.
// *
// * This class maintains a variety of internal data items for the following
// * purposes...
// *
// * name - This is the name of the verb, attribute, or message that
// * is represented by this element definition.
// * service - This is the service that this element direct the request
// * to.
// * serviceData - These are the values that will be palcded in the tags
// * that were specified in the service definition.
// * nItems - This is the number of tagged data items that were
// * specified in the serviceData.
// * next - This is the next element item in the list. Lists of
// * elements are maintained in the cdevClassDefinition objects
// *****************************************************************************
class cdevElementDefinition
{
private:
cdevElementDefinition * next;
char * name;
cdevServiceDefinition * service;
char ** serviceData;
int nItems;
public:
inline cdevElementDefinition ( cdevElementDefinition *def );
inline cdevElementDefinition ( char * Name = NULL,
cdevServiceDefinition * Service = NULL,
char ** ServiceData = NULL,
int NItems = 0);
inline virtual ~cdevElementDefinition ( void );
inline void asciiDump ( FILE * fp = stdout);
inline void asciiDumpList ( FILE * fp = stdout, char * keyword = "UNKNOWN");
// *********************************************************************
// * Member access methods.
// *********************************************************************
inline char * getName ( void );
inline cdevServiceDefinition * getService ( void );
inline char ** getServiceData ( void );
inline int getDataCnt ( void );
inline cdevElementDefinition * getNext ( void );
inline void setNext ( cdevElementDefinition * Next );
};
// *****************************************************************************
// * cdevElementDefinition::cdevElementDefinition :
// * This is the constructor for the cdevElementDefintion class. This
// * constructor copies the contents from a pre-existing
// * cdevElementDefinition object, and assumes that the data should be
// * deleted by the originating class.
// *****************************************************************************
inline cdevElementDefinition::cdevElementDefinition ( cdevElementDefinition *def )
: next (NULL),
name (def->name),
service (def->service),
serviceData (def->serviceData),
nItems (def->nItems)
{
}
// *****************************************************************************
// * cdevElementDefinition::cdevElementDefinition :
// * This is the constructor for the cdevElementDefinition class and it
// * uses literal values that are provoded by the caller. It assumes that it
// * it responsible for deleteing these data items when the instance of the
// * class is deleted.
// *****************************************************************************
inline cdevElementDefinition::cdevElementDefinition
( char * Name,
cdevServiceDefinition * Service,
char ** ServiceData,
int NItems)
: next (NULL),
name (Name),
service (Service),
serviceData (ServiceData),
nItems (NItems)
{
}
// *****************************************************************************
// * cdevElementDefinition::~cdevElementDefinition :
// * This is the destructor for the cdevElementDefinition class.
// *****************************************************************************
inline cdevElementDefinition::~cdevElementDefinition ( void )
{
if(name) delete name;
while((--nItems)>=0) delete serviceData[nItems];
if(serviceData) delete serviceData;
}
// *****************************************************************************
// * cdevElementDefinition::asciiDump :
// * This method will dump the contents of the cdevElementDefinition class
// * class to the user specified file pointer.
// *****************************************************************************
inline void cdevElementDefinition::asciiDump ( FILE * fp )
{
if(name)
{
fprintf(fp, "\t\t%s", name);
if(service)
{
fprintf(fp, " %s", service->getName());
for(int i=0; i<nItems; i++)
{
if(i==0) fprintf(fp, " {");
fprintf(fp, "%s", serviceData[i]);
if(i<nItems-1) fprintf(fp, ", ");
else fprintf(fp, "}");
}
}
fprintf(fp, ";\n");
}
}
// *****************************************************************************
// * cdevElementDefinition::asciiDumpList :
// * This method dumps the complete contents of the cdevElementDefinition
// * list.
// *****************************************************************************
inline void cdevElementDefinition::asciiDumpList (FILE *fp, char * keyword)
{
cdevElementDefinition * def = this;
int nameLen = 0;
int serviceLen = 0;
for(def = this; def!=NULL; def = def->next)
{
int n = def->name==NULL?0:strlen(def->name);
int s = def->service==NULL?0:strlen(def->service->getName());
if(n>nameLen) nameLen = n;
if(s>serviceLen) serviceLen = s;
}
if(serviceLen)
{
fprintf(fp, "\t%s\n\t\t{\n", keyword);
for(def = this; def!=NULL; def = def->next)
{
if(nameLen>0 && def->service)
fprintf(fp, "\t\t%-*s", nameLen, def->name);
else fprintf(fp, "\t\t%s", def->name);
if(def->service)
{
if(serviceLen>0 && def->nItems)
fprintf(fp, " %-*s", serviceLen, def->service->getName());
else fprintf(fp, " %s", def->service->getName());
for(int i=0; i<def->nItems; i++)
{
if(i==0) fprintf(fp, " {");
fprintf(fp, "%s", def->serviceData[i]);
if(i<def->nItems-1) fprintf(fp, ", ");
else fprintf(fp, "}");
}
}
fprintf(fp, ";\n");
}
fprintf(fp, "\t\t}\n");
}
else {
int cnt = 0;
char prefix[25];
sprintf(prefix, "%s {", keyword);
fprintf(fp, "\t%s", prefix);
for(def = this; def!=NULL; def = def->next, cnt++)
{
if(def->next)
{
fprintf(fp, " %s,", def->name);
if(cnt==3)
{
fprintf(fp, "\n\t%*c", strlen("prefix")+1, 32);
cnt=-1;
}
}
else fprintf(fp, " %s ", def->name);
}
fprintf(fp, "}\n");
}
}
// *****************************************************************************
// * cdevElementDefinition::getName :
// * This method allows the caller to retrieve the name of the element.
// *****************************************************************************
inline char * cdevElementDefinition::getName ( void )
{
return name;
}
// *****************************************************************************
// * cdevElementDefinition::getService :
// * This method allows the caller to retrieve the service definition
// *****************************************************************************
inline cdevServiceDefinition * cdevElementDefinition::getService ( void )
{
return service;
}
// *****************************************************************************
// * cdevElementDefinition::getServiceData :
// * This method allows the caller to retrieve the service data.
// *****************************************************************************
inline char ** cdevElementDefinition::getServiceData ( void )
{
return serviceData;
}
// *****************************************************************************
// * cdevElementDefinition::getDataCnt :
// * This method allows the caller to retrieve the number of strings that
// * are stored in the serviceData.
// *****************************************************************************
inline int cdevElementDefinition::getDataCnt ( void )
{
return nItems;
}
// *****************************************************************************
// * cdevElementDefinition::getNext :
// * This method allows the caller to retrieve the next element in the list.
// *****************************************************************************
inline cdevElementDefinition * cdevElementDefinition::getNext ( void )
{
return next;
}
// *****************************************************************************
// * cdevElementDefinition::setNext :
// * This method allows the caller to set the next element in the list.
// *****************************************************************************
inline void cdevElementDefinition::setNext ( cdevElementDefinition * Next )
{
next = Next;
}
#endif /* _CDEV_ELEMENT_DEFINITION_H_ */