This chapter discusses the following topics to help you create a KcsIO class derivative that is dynamically loadable at runtime:
External entry points with an example
Member function override rules
Pointer to the KcsSolarisFile class source code to use as an example of a KcsIO derivative
Figure 4-1 shows the relationship of the KcsIO class to the parent classes in the KCMS class hierarchy. See Figure 1-2 for an illustration of all the relevant KCMS classes.
The KCMS framework uses external entry points to load your derivative as an executable. The mandatory and optional entry points are described.
When you derive from a KcsIO class, the mandatory external entry points are:
extern long KcsDLOpenIOCount; KcsIO *KcsCreateIO(KcsStatus *aStat, const KcsProfileDesc *aDesc); |
The KcsCreateIO() method creates an instance of a KcsIO derivative. The instance is determined by aDesc->type, which contains the derivative portion of the class identifier (see "Creating OWconfig File Entries").
When you derive from a KcsIO class, the optional external entry points are:
KcsStatusId KcsInitIO(); KcsStatusId KcsCleanupIO(); |
The following example shows you how to use the entry points when creating a KcsIO derivative.
/* External loadable interface */ extern "C" extern long KcsDLOpenIOCount; KcsStatus KcsInitIO(); KcsIO *KcsCreateIO(KcsStatus *aStatus, const KcsProfileDesc *aDesc); KcsStatus KcsCleanupIO(); //Loadable stuff //external DL open count to support runtime derivation extern long KcsDLOpenIOCount = 0; /* Runtime derivable routine */ KcsIO * KcsCreateIO(KcsStatus *aStat, const KcsProfileDesc *Desc) { //Create the new derivative return(new KcsSolarisFile(aStat, aDesc->desc.solarisFile.fileName, aDesc->desc.solarisFile.hostName, aDesc->desc.solarisFile.oflag, aDesc->desc.solarisFile.mode); } KcsStatus KcsInitIO(long libMajor, long libMinor, long *myMajor, long *myMinor) { // Set up the return values *myMajor = KCS_MAJOR_VERSION; *myMinor = KCS_MINOR_VERSION; //Check the major version if (libMajor != KCS_MAJOR_VERSION) return (KCS_CMM_MAJOR_VERSION_MISMATCH); //Currently, if minor version of library is less than the KCMS // minor version, return an error. if (libMinor != KCS_MINOR_VERSION) return (KCS_CMM_MINOR_VERSION_MISMATCH); //Library guarantees if your minor version number is greater than //KCMS minor version number, it will handle it. No more init. return(KCS_SUCCESS); } KcsStatus KcsCleanupIO() { /* Clean up is performed in the destructor */ return (KCS_SUCCESS); }
The following table tells you which KcsIO member functions you must override and can override when deriving from this class. The member functions indicated with an "X" in the Must column are required to successfully derive from this base class. All of these member functions are defined in the kcsio.h header file and the KCMS CMM Reference Manual.
Table 4-1 KcsIO Member Function Override Rules
Member Function |
Override Rules |
|
---|---|---|
Must |
Can |
|
getEOF() |
X |
|
getType() |
X |
|
isEqual() |
X |
|
KcsIO() |
X |
|
~KcsIO() |
|
X |
relRead() |
X |
|
relWrite() |
X |
|
setCursorPos() |
X |
|
setEOF() |
X |
|
setOffset() |
|
X |
The KcsSolarisFile class is a derivative of the KcsIO class. You can use any of the KcsSolarisFile files (or any of the other KcsIO derivatives) as good sources of example code for creating your KcsIO derivative. You can find the files on-line in /usr/opt/SUNWddk/kcms/src. The kcssolfi.cc and kcssolfi.h files in this directory are actual SunSoft source code that supports enhanced file access on Solaris. This source code is directly tied into the kcstypes.h header file. The kcssolfitest.h header file explains how to include this derivative without changing the KCMS header file.