This document describes
For general information about creating plug-ins, refer to How to Write a Plug-In.
OpenAccess uses library definition files to establish a mapping between a logical library name and a physical file system pathname to that library. OpenAccess provides a default plug-in that manages the interactions between OpenAccess and library definition files. A plug-in developer can create an alternative library definition file plug-in that extends the syntax or symantics of the default OpenAccess plug-in. OpenAccess provides the infrastructure and plug-in interfaces for this purpose.
OpenAccess interacts with a library definition file plug-in through APIs and the ILibDef plug-in interface.
The following example shows an application calling oaLibDefList::openLibs to open all the libraries in the specified library definition file. The plug-in interface provides the infrastructure for the interaction between the application, OpenAccess, and the plug-in.

In addition, an application can call the oaLibDefList APIs to interact with the library definition file through the plug-in. The following example shows an application getting a pointer to an existing oaLibDefList, adding an oaLibDef and an oaLibDefListRef to that list, then issuing the oaLibDefList::open command:

And here is a sample flow for an application calling oaLibDefList::save:

Before starting this project, you might want to read How to Write a Plug-In, which is a more generic document describing the general concept of plug-ins and how they work.
You can create a library definition file plug-in by creating a shared library that is loaded by OpenAccess at runtime. The shared library must do the following:
In addition, you must Create a plug-in registration file.
OpenAccess provides the oaCommon::Factory<T> templated class for defining a factory object for a plug-in. The factory object is used to create instances of a plug-in. Each plug-in has a classID, which is stored in a factory table. When OpenAccess needs to create an instance of a plug-in, it uses the classID to find the factory for the plug-in. For more information about creating a plug-in factory, see Understanding the Plug-in Factory in How to Write a Plug-in.
You must also implement the getClassObject entry point function. When called, this function returns a pointer to the plug-in factory. For more information about implementing the getClassObject entry point function, see Implementing the Entry Point Function in How to Write a Plug-in.
To create a library definition file plug-in, you must define a new class derived from the PlugInBase<ILibDef> class. The new class must implement all virtual functions of the ILibDef class. Refer to the API documentation for ILibDef for a detailed description about these virtual functions.
The plug-in registration file registers the plug-in shared library. The registration file can be installed in $(OA_HOME)/data/plugins when the plug-in shared library is installed. Alternatively, the OA_PLUGIN_PATH environment variable can be used to reference a .plg file outside of $(OA_HOME)/data/plugins. Refer to Writing the Plug-In Registration File in How to Write a Plug-In for more information.
OpenAccess always uses the oaLibDefSystem.plg file to locate the library file plug-in to use. It points to a second file called oaLibDef.plg that refers to the default library definition file plug-in for OpenAccess (liboaLibDef.so). A different library definition file plug-in can be specified with these two files.
A plug-in is a shared library that is installed in the OpenAccess installation hierarchy in the $(OA_HOME)/data/plugins directory. Applications load the plug-in at runtime to select a customized implementation. The following describes the steps for creating a plug-in.
extern "C" long
getClassObject(const char *classID, const Guid &interfaceID, void **ptr);
long
getClassObject(const char *classID,
const Guid &interfaceID,
void **ptr)
{
return FactoryBase::getClassObject(classId, interfaceID, ptr);
}
class myLibDefPlugin : public PlugInBase<ILibDef>,
PlugInBase<ICompatibility>,
private oaObserver<oaLibDefListMem> {
public:
virtual oaLibDefList *open();
virtual oaLibDefList *open(const oaString &filePath,
oaBoolean openReferences);
virtual void save(const oaLibDefList *libList);
virtual void saveAs(const oaLibDefList *libList,
const oaString &path);
virtual void getDefaultPath(oaString &defaultPath);
virtual void getDefaultFileName(oaString &filename);
virtual oaBoolean hasPath() const;
virtual oaBoolean hasWritePath() const;
virtual void getLibPath(const oaLibDef *libDef,
oaString &libPath);
virtual void getLibWritePath(const oaLibDef *libDef,
oaString &libWritepath);
virtual void init(ILibDefAccess *libDefAccess);
static IFactory *getFactory();
static const oa::oaString &getComponentName();
virtual long queryInterface(const Guid &idIn,
void **iPtr);
};
virtual bool validate();
class myLibDefPlugin : public oaCommon::PlugInBase<oaPlugIn::ILibDef> {
.
.
.
private:
static
oaCommon::Factory<myLibDefPlugin> myFactory;
};Factory<myLibDefPlugin> myLibDefPlugin::myFactory("myLibDefPlugin")
myLibDefPlugin.plg with the
following contents:
<?xml version="1.0" encoding="utf-8" ?> <plugIn lib="myLibDefPlugin"/>The registration file can be installed in $(OA_HOME)/data/plugins when the plug-in shared library is installed. Alternatively, the OA_PLUGIN_PATH environment variable can be used to reference a .plg file outside of $(OA_HOME)/data/plugins. Refer to Writing the Plug-In Registration File in How to Write a Plug-In for more information.
<?xml version="1.0" encoding="utf-8" ?> <plugIn treatAs="myLibDefPlugin"/>
Return to Programmers Guide topics

Copyright © 2001-2010 Cadence Design Systems, Inc.
All rights reserved.