Skip to content
Snippets Groups Projects
Select Git revision
  • f0f0b9f0ef4da0427debae3dbf904f80c8eabfc9
  • main default protected
  • Kelvinrr-patch-3
  • radius_update
  • revert-616-apollo_pan
  • vims
  • 0.10
  • Kelvinrr-patch-2
  • revert-563-minirf_fix
  • Kelvinrr-patch-1
  • 0.9
  • acpaquette-patch-3
  • acpaquette-patch-2
  • acpaquette-patch-1
  • spiceql
  • ci-coverage
  • 0.10.0
  • 0.9.1
  • 0.9.0
  • 0.8.7
  • 0.8.8
  • 0.8.6
  • 0.8.3
  • 0.8.4
  • 0.8.5
  • 0.8.2
  • 0.8.1
  • 0.8.0
  • 0.7.3
  • 0.7.2
  • 0.7.1
  • 0.7.0
  • 0.6.5
  • 0.6.4
  • 0.6.3
  • 0.6.2
36 results

rotation.rst

Blame
    • acpaquette's avatar
      f0f0b9f0
      Docs! (#365) · f0f0b9f0
      acpaquette authored
      * File renames
      
      * Small spacing consistencies for doc strings
      
      * Fixes doc build warnings for lro_drivers
      
      * Large documentation update. Adds a bunch of new doc pages and fixes various doc strings within the code base.
      
      * Small change to the formatter and error message
      
      * Potential fix to account for framers in the ISD object
      
      * Changed angular_velocity keyword in ISDS to angular_velocities
      
      * Updated ISD test with new expected error message
      f0f0b9f0
      History
      Docs! (#365)
      acpaquette authored
      * File renames
      
      * Small spacing consistencies for doc strings
      
      * Fixes doc build warnings for lro_drivers
      
      * Large documentation update. Adds a bunch of new doc pages and fixes various doc strings within the code base.
      
      * Small change to the formatter and error message
      
      * Potential fix to account for framers in the ISD object
      
      * Changed angular_velocity keyword in ISDS to angular_velocities
      
      * Updated ISD test with new expected error message
    MetadataExporterClass.cpp 28.26 KiB
    /*----- PROTECTED REGION ID(MetadataExporterClass.cpp) ENABLED START -----*/
    static const char *TagName    = "$Name:  $";
    static const char *CvsPath    = "$Source:  $";
    static const char *SvnPath    = "$HeadURL:  $";
    static const char *HttpServer = "http://www.esrf.eu/computing/cs/tango/tango_doc/ds_doc/";
    //=============================================================================
    //
    // file :        MetadataExporterClass.cpp
    //
    // description : C++ source for the MetadataExporterClass.
    //               A singleton class derived from DeviceClass.
    //               It implements the command and attribute list
    //               and all properties and methods required
    //               by the MetadataExporter once per process.
    //
    // project :     Metadata exporter device server
    //
    // This file is part of Tango device class.
    //
    // Tango is free software: you can redistribute it and/or modify
    // it under the terms of the GNU Lesser General Public License as published by
    // the Free Software Foundation, either version 3 of the License, or
    // (at your option) any later version.
    //
    // Tango is distributed in the hope that it will be useful,
    // but WITHOUT ANY WARRANTY; without even the implied warranty of
    // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    // GNU Lesser General Public License for more details.
    //
    // You should have received a copy of the GNU Lesser General Public License
    // along with Tango.  If not, see <http://www.gnu.org/licenses/>.
    //
    // $Author:  $
    //
    // $Revision:  $
    // $Date:  $
    //
    // $HeadURL:  $
    //
    //=============================================================================
    //                This file is generated by POGO
    //        (Program Obviously used to Generate tango Object)
    //=============================================================================
    
    
    #include <MetadataExporterClass.h>
    
    /*----- PROTECTED REGION END -----*/	//	MetadataExporterClass.cpp
    
    //-------------------------------------------------------------------
    /**
     *	Create MetadataExporterClass singleton and
     *	return it in a C function for Python usage
     */
    //-------------------------------------------------------------------
    extern "C" {
    #ifdef _TG_WINDOWS_
    
    __declspec(dllexport)
    
    #endif
    
    	Tango::DeviceClass *_create_MetadataExporter_class(const char *name) {
    		return MetadataExporter_ns::MetadataExporterClass::init(name);
    	}
    }
    
    namespace MetadataExporter_ns
    {
    //===================================================================
    //	Initialize pointer for singleton pattern
    //===================================================================
    MetadataExporterClass *MetadataExporterClass::_instance = NULL;
    
    //--------------------------------------------------------
    /**
     * method : 		MetadataExporterClass::MetadataExporterClass(string &s)
     * description : 	constructor for the MetadataExporterClass
     *
     * @param s	The class name
     */
    //--------------------------------------------------------
    MetadataExporterClass::MetadataExporterClass(string &s):Tango::DeviceClass(s)
    {
    	cout2 << "Entering MetadataExporterClass constructor" << endl;
    	set_default_property();
    	get_class_property();
    	write_class_property();
    
    	/*----- PROTECTED REGION ID(MetadataExporterClass::constructor) ENABLED START -----*/
    
    	/*----- PROTECTED REGION END -----*/	//	MetadataExporterClass::constructor
    
    	cout2 << "Leaving MetadataExporterClass constructor" << endl;
    }
    
    //--------------------------------------------------------
    /**
     * method : 		MetadataExporterClass::~MetadataExporterClass()
     * description : 	destructor for the MetadataExporterClass
     */
    //--------------------------------------------------------
    MetadataExporterClass::~MetadataExporterClass()
    {
    	/*----- PROTECTED REGION ID(MetadataExporterClass::destructor) ENABLED START -----*/
    
    	/*----- PROTECTED REGION END -----*/	//	MetadataExporterClass::destructor
    
    	_instance = NULL;
    }
    
    
    //--------------------------------------------------------
    /**
     * method : 		MetadataExporterClass::init
     * description : 	Create the object if not already done.
     *                  Otherwise, just return a pointer to the object
     *
     * @param	name	The class name
     */
    //--------------------------------------------------------
    MetadataExporterClass *MetadataExporterClass::init(const char *name)
    {
    	if (_instance == NULL)
    	{
    		try
    		{
    			string s(name);
    			_instance = new MetadataExporterClass(s);
    		}
    		catch (bad_alloc &)
    		{
    			throw;
    		}		
    	}		
    	return _instance;
    }
    
    //--------------------------------------------------------
    /**
     * method : 		MetadataExporterClass::instance
     * description : 	Check if object already created,
     *                  and return a pointer to the object
     */
    //--------------------------------------------------------
    MetadataExporterClass *MetadataExporterClass::instance()
    {
    	if (_instance == NULL)
    	{
    		cerr << "Class is not initialised !!" << endl;
    		exit(-1);
    	}
    	return _instance;
    }
    
    
    
    //===================================================================
    //	Command execution method calls
    //===================================================================
    //--------------------------------------------------------
    /**
     * method : 		OnClass::execute()
     * description : 	method to trigger the execution of the command.
     *
     * @param	device	The device on which the command must be executed
     * @param	in_any	The command input data
     *
     *	returns The command output data (packed in the Any object)
     */
    //--------------------------------------------------------
    CORBA::Any *OnClass::execute(Tango::DeviceImpl *device, TANGO_UNUSED(const CORBA::Any &in_any))
    {
    	cout2 << "OnClass::execute(): arrived" << endl;
    	((static_cast<MetadataExporter *>(device))->on());
    	return new CORBA::Any();
    }
    
    //--------------------------------------------------------
    /**
     * method : 		OffClass::execute()
     * description : 	method to trigger the execution of the command.
     *
     * @param	device	The device on which the command must be executed
     * @param	in_any	The command input data
     *
     *	returns The command output data (packed in the Any object)
     */
    //--------------------------------------------------------
    CORBA::Any *OffClass::execute(Tango::DeviceImpl *device, TANGO_UNUSED(const CORBA::Any &in_any))
    {
    	cout2 << "OffClass::execute(): arrived" << endl;
    	((static_cast<MetadataExporter *>(device))->off());
    	return new CORBA::Any();
    }
    
    
    //===================================================================
    //	Properties management
    //===================================================================
    //--------------------------------------------------------
    /**
     *	Method      : MetadataExporterClass::get_class_property()
     *	Description : Get the class property for specified name.
     */
    //--------------------------------------------------------
    Tango::DbDatum MetadataExporterClass::get_class_property(string &prop_name)
    {
    	for (unsigned int i=0 ; i<cl_prop.size() ; i++)
    		if (cl_prop[i].name == prop_name)
    			return cl_prop[i];
    	//	if not found, returns  an empty DbDatum
    	return Tango::DbDatum(prop_name);
    }
    
    //--------------------------------------------------------
    /**
     *	Method      : MetadataExporterClass::get_default_device_property()
     *	Description : Return the default value for device property.
     */
    //--------------------------------------------------------
    Tango::DbDatum MetadataExporterClass::get_default_device_property(string &prop_name)
    {
    	for (unsigned int i=0 ; i<dev_def_prop.size() ; i++)
    		if (dev_def_prop[i].name == prop_name)
    			return dev_def_prop[i];
    	//	if not found, return  an empty DbDatum
    	return Tango::DbDatum(prop_name);
    }
    
    //--------------------------------------------------------
    /**
     *	Method      : MetadataExporterClass::get_default_class_property()
     *	Description : Return the default value for class property.
     */
    //--------------------------------------------------------
    Tango::DbDatum MetadataExporterClass::get_default_class_property(string &prop_name)
    {
    	for (unsigned int i=0 ; i<cl_def_prop.size() ; i++)
    		if (cl_def_prop[i].name == prop_name)
    			return cl_def_prop[i];
    	//	if not found, return  an empty DbDatum
    	return Tango::DbDatum(prop_name);
    }
    
    //--------------------------------------------------------
    /**
     *	Method      : MetadataExporterClass::get_class_property()
     *	Description : Read database to initialize class property data members.
     */
    //--------------------------------------------------------
    void MetadataExporterClass::get_class_property()
    {
    	/*----- PROTECTED REGION ID(MetadataExporterClass::get_class_property_before) ENABLED START -----*/
    
    	//	Initialize class property data members
    
    	/*----- PROTECTED REGION END -----*/	//	MetadataExporterClass::get_class_property_before
    	//	Read class properties from database.
    	cl_prop.push_back(Tango::DbDatum("CertificateFile"));
    	cl_prop.push_back(Tango::DbDatum("PrivateKeyFile"));
    	cl_prop.push_back(Tango::DbDatum("DHTempFile"));
    	cl_prop.push_back(Tango::DbDatum("ExportedTables"));
    	cl_prop.push_back(Tango::DbDatum("AuthorisedUsers"));
    	
    	//	Call database and extract values
    	if (Tango::Util::instance()->_UseDb==true)
    		get_db_class()->get_property(cl_prop);
    	Tango::DbDatum	def_prop;
    	int	i = -1;
    
    	//	Try to extract CertificateFile value
    	if (cl_prop[++i].is_empty()==false)	cl_prop[i]  >>  certificateFile;
    	else
    	{
    		//	Check default value for CertificateFile
    		def_prop = get_default_class_property(cl_prop[i].name);
    		if (def_prop.is_empty()==false)
    		{
    			def_prop    >>  certificateFile;
    			cl_prop[i]  <<  certificateFile;
    		}
    	}
    	//	Try to extract PrivateKeyFile value
    	if (cl_prop[++i].is_empty()==false)	cl_prop[i]  >>  privateKeyFile;
    	else
    	{
    		//	Check default value for PrivateKeyFile
    		def_prop = get_default_class_property(cl_prop[i].name);
    		if (def_prop.is_empty()==false)
    		{
    			def_prop    >>  privateKeyFile;
    			cl_prop[i]  <<  privateKeyFile;
    		}
    	}
    	//	Try to extract DHTempFile value
    	if (cl_prop[++i].is_empty()==false)	cl_prop[i]  >>  dHTempFile;
    	else
    	{
    		//	Check default value for DHTempFile
    		def_prop = get_default_class_property(cl_prop[i].name);
    		if (def_prop.is_empty()==false)
    		{
    			def_prop    >>  dHTempFile;
    			cl_prop[i]  <<  dHTempFile;
    		}
    	}
    	//	Try to extract ExportedTables value
    	if (cl_prop[++i].is_empty()==false)	cl_prop[i]  >>  exportedTables;
    	else
    	{
    		//	Check default value for ExportedTables
    		def_prop = get_default_class_property(cl_prop[i].name);
    		if (def_prop.is_empty()==false)
    		{
    			def_prop    >>  exportedTables;
    			cl_prop[i]  <<  exportedTables;
    		}
    	}
    	//	Try to extract AuthorisedUsers value
    	if (cl_prop[++i].is_empty()==false)	cl_prop[i]  >>  authorisedUsers;
    	else
    	{
    		//	Check default value for AuthorisedUsers
    		def_prop = get_default_class_property(cl_prop[i].name);
    		if (def_prop.is_empty()==false)
    		{
    			def_prop    >>  authorisedUsers;
    			cl_prop[i]  <<  authorisedUsers;
    		}
    	}
    	/*----- PROTECTED REGION ID(MetadataExporterClass::get_class_property_after) ENABLED START -----*/
    
    	//	Check class property data members init
    
    	/*----- PROTECTED REGION END -----*/	//	MetadataExporterClass::get_class_property_after
    
    }
    
    //--------------------------------------------------------
    /**
     *	Method      : MetadataExporterClass::set_default_property()
     *	Description : Set default property (class and device) for wizard.
     *                For each property, add to wizard property name and description.
     *                If default value has been set, add it to wizard property and
     *                store it in a DbDatum.
     */
    //--------------------------------------------------------
    void MetadataExporterClass::set_default_property()
    {
    	string	prop_name;
    	string	prop_desc;
    	string	prop_def;
    	vector<string>	vect_data;
    
    	//	Set Default Class Properties
    	prop_name = "CertificateFile";
    	prop_desc = "Absolute path to certificate chain file";
    	prop_def  = "";
    	vect_data.clear();
    	if (prop_def.length()>0)
    	{
    		Tango::DbDatum	data(prop_name);
    		data << vect_data ;
    		cl_def_prop.push_back(data);
    		add_wiz_class_prop(prop_name, prop_desc,  prop_def);
    	}
    	else
    		add_wiz_class_prop(prop_name, prop_desc);
    	prop_name = "PrivateKeyFile";
    	prop_desc = "Absolute path to private key file";
    	prop_def  = "";
    	vect_data.clear();
    	if (prop_def.length()>0)
    	{
    		Tango::DbDatum	data(prop_name);
    		data << vect_data ;
    		cl_def_prop.push_back(data);
    		add_wiz_class_prop(prop_name, prop_desc,  prop_def);
    	}
    	else
    		add_wiz_class_prop(prop_name, prop_desc);
    	prop_name = "DHTempFile";
    	prop_desc = "Absolute path to Diffie Hellman temporary file";
    	prop_def  = "";
    	vect_data.clear();
    	if (prop_def.length()>0)
    	{
    		Tango::DbDatum	data(prop_name);
    		data << vect_data ;
    		cl_def_prop.push_back(data);
    		add_wiz_class_prop(prop_name, prop_desc,  prop_def);
    	}
    	else
    		add_wiz_class_prop(prop_name, prop_desc);
    	prop_name = "ExportedTables";
    	prop_desc = "Tables exporter from database: one table per row\n[schema table]";
    	prop_def  = "";
    	vect_data.clear();
    	if (prop_def.length()>0)
    	{
    		Tango::DbDatum	data(prop_name);
    		data << vect_data ;
    		cl_def_prop.push_back(data);
    		add_wiz_class_prop(prop_name, prop_desc,  prop_def);
    	}
    	else
    		add_wiz_class_prop(prop_name, prop_desc);
    	prop_name = "AuthorisedUsers";
    	prop_desc = "Authorised user list: one user per row\n[username password]";
    	prop_def  = "";
    	vect_data.clear();
    	if (prop_def.length()>0)
    	{
    		Tango::DbDatum	data(prop_name);
    		data << vect_data ;
    		cl_def_prop.push_back(data);
    		add_wiz_class_prop(prop_name, prop_desc,  prop_def);
    	}
    	else
    		add_wiz_class_prop(prop_name, prop_desc);
    
    	//	Set Default device Properties
    	prop_name = "CertificateFile";
    	prop_desc = "Absolute path to certificate chain file";
    	prop_def  = "";
    	vect_data.clear();
    	if (prop_def.length()>0)
    	{
    		Tango::DbDatum	data(prop_name);
    		data << vect_data ;
    		dev_def_prop.push_back(data);
    		add_wiz_dev_prop(prop_name, prop_desc,  prop_def);
    	}
    	else
    		add_wiz_dev_prop(prop_name, prop_desc);
    	prop_name = "PrivateKeyFile";
    	prop_desc = "Absolute path to private key file";
    	prop_def  = "";
    	vect_data.clear();
    	if (prop_def.length()>0)
    	{
    		Tango::DbDatum	data(prop_name);
    		data << vect_data ;
    		dev_def_prop.push_back(data);
    		add_wiz_dev_prop(prop_name, prop_desc,  prop_def);
    	}
    	else
    		add_wiz_dev_prop(prop_name, prop_desc);
    	prop_name = "DHTempFile";
    	prop_desc = "Absolute path to Diffie Hellman temporary file";
    	prop_def  = "";
    	vect_data.clear();
    	if (prop_def.length()>0)
    	{
    		Tango::DbDatum	data(prop_name);
    		data << vect_data ;
    		dev_def_prop.push_back(data);
    		add_wiz_dev_prop(prop_name, prop_desc,  prop_def);
    	}
    	else
    		add_wiz_dev_prop(prop_name, prop_desc);
    	prop_name = "LocalHost";
    	prop_desc = "Local host address for incoming connection";
    	prop_def  = "";
    	vect_data.clear();
    	if (prop_def.length()>0)
    	{
    		Tango::DbDatum	data(prop_name);
    		data << vect_data ;
    		dev_def_prop.push_back(data);
    		add_wiz_dev_prop(prop_name, prop_desc,  prop_def);
    	}
    	else
    		add_wiz_dev_prop(prop_name, prop_desc);
    	prop_name = "LocalPort";
    	prop_desc = "Local port for wait incoming connection";
    	prop_def  = "";
    	vect_data.clear();
    	if (prop_def.length()>0)
    	{
    		Tango::DbDatum	data(prop_name);
    		data << vect_data ;
    		dev_def_prop.push_back(data);
    		add_wiz_dev_prop(prop_name, prop_desc,  prop_def);
    	}
    	else
    		add_wiz_dev_prop(prop_name, prop_desc);
    	prop_name = "WorkerNumber";
    	prop_desc = "Number of threads that call io service run methods";
    	prop_def  = "8";
    	vect_data.clear();
    	vect_data.push_back("8");
    	if (prop_def.length()>0)
    	{
    		Tango::DbDatum	data(prop_name);
    		data << vect_data ;
    		dev_def_prop.push_back(data);
    		add_wiz_dev_prop(prop_name, prop_desc,  prop_def);
    	}
    	else
    		add_wiz_dev_prop(prop_name, prop_desc);
    	prop_name = "EnableSSL";
    	prop_desc = "Enable or disable SSL connections";
    	prop_def  = "0";
    	vect_data.clear();
    	vect_data.push_back("0");
    	if (prop_def.length()>0)
    	{
    		Tango::DbDatum	data(prop_name);
    		data << vect_data ;
    		dev_def_prop.push_back(data);
    		add_wiz_dev_prop(prop_name, prop_desc,  prop_def);
    	}
    	else
    		add_wiz_dev_prop(prop_name, prop_desc);
    	prop_name = "DatabaseHost";
    	prop_desc = "Metadata database host";
    	prop_def  = "";
    	vect_data.clear();
    	if (prop_def.length()>0)
    	{
    		Tango::DbDatum	data(prop_name);
    		data << vect_data ;
    		dev_def_prop.push_back(data);
    		add_wiz_dev_prop(prop_name, prop_desc,  prop_def);
    	}
    	else
    		add_wiz_dev_prop(prop_name, prop_desc);
    	prop_name = "DatabasePort";
    	prop_desc = "Metadata database port";
    	prop_def  = "";
    	vect_data.clear();
    	if (prop_def.length()>0)
    	{
    		Tango::DbDatum	data(prop_name);
    		data << vect_data ;
    		dev_def_prop.push_back(data);
    		add_wiz_dev_prop(prop_name, prop_desc,  prop_def);
    	}
    	else
    		add_wiz_dev_prop(prop_name, prop_desc);
    	prop_name = "DatabaseUsername";
    	prop_desc = "Metadata database login username";
    	prop_def  = "";
    	vect_data.clear();
    	if (prop_def.length()>0)
    	{
    		Tango::DbDatum	data(prop_name);
    		data << vect_data ;
    		dev_def_prop.push_back(data);
    		add_wiz_dev_prop(prop_name, prop_desc,  prop_def);
    	}
    	else
    		add_wiz_dev_prop(prop_name, prop_desc);
    	prop_name = "DatabasePassword";
    	prop_desc = "Metadata database login password";
    	prop_def  = "";
    	vect_data.clear();
    	if (prop_def.length()>0)
    	{
    		Tango::DbDatum	data(prop_name);
    		data << vect_data ;
    		dev_def_prop.push_back(data);
    		add_wiz_dev_prop(prop_name, prop_desc,  prop_def);
    	}
    	else
    		add_wiz_dev_prop(prop_name, prop_desc);
    	prop_name = "DatabaseConnectionNumber";
    	prop_desc = "Number of database connection created";
    	prop_def  = "2";
    	vect_data.clear();
    	vect_data.push_back("2");
    	if (prop_def.length()>0)
    	{
    		Tango::DbDatum	data(prop_name);
    		data << vect_data ;
    		dev_def_prop.push_back(data);
    		add_wiz_dev_prop(prop_name, prop_desc,  prop_def);
    	}
    	else
    		add_wiz_dev_prop(prop_name, prop_desc);
    	prop_name = "ExportedTables";
    	prop_desc = "Tables exporter from database: one table per row\n[schema table]";
    	prop_def  = "";
    	vect_data.clear();
    	if (prop_def.length()>0)
    	{
    		Tango::DbDatum	data(prop_name);
    		data << vect_data ;
    		dev_def_prop.push_back(data);
    		add_wiz_dev_prop(prop_name, prop_desc,  prop_def);
    	}
    	else
    		add_wiz_dev_prop(prop_name, prop_desc);
    	prop_name = "AuthorisedUsers";
    	prop_desc = "Authorised user list: one user per row\n[username password]";
    	prop_def  = "";
    	vect_data.clear();
    	if (prop_def.length()>0)
    	{
    		Tango::DbDatum	data(prop_name);
    		data << vect_data ;
    		dev_def_prop.push_back(data);
    		add_wiz_dev_prop(prop_name, prop_desc,  prop_def);
    	}
    	else
    		add_wiz_dev_prop(prop_name, prop_desc);
    }
    
    //--------------------------------------------------------
    /**
     *	Method      : MetadataExporterClass::write_class_property()
     *	Description : Set class description fields as property in database
     */
    //--------------------------------------------------------
    void MetadataExporterClass::write_class_property()
    {
    	//	First time, check if database used
    	if (Tango::Util::_UseDb == false)
    		return;
    
    	Tango::DbData	data;
    	string	classname = get_name();
    	string	header;
    	string::size_type	start, end;
    
    	//	Put title
    	Tango::DbDatum	title("ProjectTitle");
    	string	str_title("Metadata exporter device server");
    	title << str_title;
    	data.push_back(title);
    
    	//	Put Description
    	Tango::DbDatum	description("Description");
    	vector<string>	str_desc;
    	str_desc.push_back("Metadata exporter device server");
    	description << str_desc;
    	data.push_back(description);
    
    	//	put cvs or svn location
    	string	filename("MetadataExporter");
    	filename += "Class.cpp";
    
    	// check for cvs information
    	string	src_path(CvsPath);
    	start = src_path.find("/");
    	if (start!=string::npos)
    	{
    		end   = src_path.find(filename);
    		if (end>start)
    		{
    			string	strloc = src_path.substr(start, end-start);
    			//	Check if specific repository
    			start = strloc.find("/cvsroot/");
    			if (start!=string::npos && start>0)
    			{
    				string	repository = strloc.substr(0, start);
    				if (repository.find("/segfs/")!=string::npos)
    					strloc = "ESRF:" + strloc.substr(start, strloc.length()-start);
    			}
    			Tango::DbDatum	cvs_loc("cvs_location");
    			cvs_loc << strloc;
    			data.push_back(cvs_loc);
    		}
    	}
    
    	// check for svn information
    	else
    	{
    		string	src_path(SvnPath);
    		start = src_path.find("://");
    		if (start!=string::npos)
    		{
    			end = src_path.find(filename);
    			if (end>start)
    			{
    				header = "$HeadURL: ";
    				start = header.length();
    				string	strloc = src_path.substr(start, (end-start));
    				
    				Tango::DbDatum	svn_loc("svn_location");
    				svn_loc << strloc;
    				data.push_back(svn_loc);
    			}
    		}
    	}
    
    	//	Get CVS or SVN revision tag
    	
    	// CVS tag
    	string	tagname(TagName);
    	header = "$Name: ";
    	start = header.length();
    	string	endstr(" $");
    	
    	end   = tagname.find(endstr);
    	if (end!=string::npos && end>start)
    	{
    		string	strtag = tagname.substr(start, end-start);
    		Tango::DbDatum	cvs_tag("cvs_tag");
    		cvs_tag << strtag;
    		data.push_back(cvs_tag);
    	}
    	
    	// SVN tag
    	string	svnpath(SvnPath);
    	header = "$HeadURL: ";
    	start = header.length();
    	
    	end   = svnpath.find(endstr);
    	if (end!=string::npos && end>start)
    	{
    		string	strloc = svnpath.substr(start, end-start);
    		
    		string tagstr ("/tags/");
    		start = strloc.find(tagstr);
    		if ( start!=string::npos )
    		{
    			start = start + tagstr.length();
    			end   = strloc.find(filename);
    			string	strtag = strloc.substr(start, end-start-1);
    			
    			Tango::DbDatum	svn_tag("svn_tag");
    			svn_tag << strtag;
    			data.push_back(svn_tag);
    		}
    	}
    
    	//	Get URL location
    	string	httpServ(HttpServer);
    	if (httpServ.length()>0)
    	{
    		Tango::DbDatum	db_doc_url("doc_url");
    		db_doc_url << httpServ;
    		data.push_back(db_doc_url);
    	}
    
    	//  Put inheritance
    	Tango::DbDatum	inher_datum("InheritedFrom");
    	vector<string> inheritance;
    	inheritance.push_back("TANGO_BASE_CLASS");
    	inher_datum << inheritance;
    	data.push_back(inher_datum);
    
    	//	Call database and and values
    	get_db_class()->put_property(data);
    }
    
    //===================================================================
    //	Factory methods
    //===================================================================
    
    //--------------------------------------------------------
    /**
     *	Method      : MetadataExporterClass::device_factory()
     *	Description : Create the device object(s)
     *                and store them in the device list
     */
    //--------------------------------------------------------
    void MetadataExporterClass::device_factory(const Tango::DevVarStringArray *devlist_ptr)
    {
    	/*----- PROTECTED REGION ID(MetadataExporterClass::device_factory_before) ENABLED START -----*/
    
    	//	Add your own code
    
    	/*----- PROTECTED REGION END -----*/	//	MetadataExporterClass::device_factory_before
    
    	//	Create devices and add it into the device list
    	for (unsigned long i=0 ; i<devlist_ptr->length() ; i++)
    	{
    		cout4 << "Device name : " << (*devlist_ptr)[i].in() << endl;
    		device_list.push_back(new MetadataExporter(this, (*devlist_ptr)[i]));							 
    	}
    
    	//	Manage dynamic attributes if any
    	erase_dynamic_attributes(devlist_ptr, get_class_attr()->get_attr_list());
    
    	//	Export devices to the outside world
    	for (unsigned long i=1 ; i<=devlist_ptr->length() ; i++)
    	{
    		//	Add dynamic attributes if any
    		MetadataExporter *dev = static_cast<MetadataExporter *>(device_list[device_list.size()-i]);
    		dev->add_dynamic_attributes();
    
    		//	Check before if database used.
    		if ((Tango::Util::_UseDb == true) && (Tango::Util::_FileDb == false))
    			export_device(dev);
    		else
    			export_device(dev, dev->get_name().c_str());
    	}
    
    	/*----- PROTECTED REGION ID(MetadataExporterClass::device_factory_after) ENABLED START -----*/
    
    	//	Add your own code
    
    	/*----- PROTECTED REGION END -----*/	//	MetadataExporterClass::device_factory_after
    }
    //--------------------------------------------------------
    /**
     *	Method      : MetadataExporterClass::attribute_factory()
     *	Description : Create the attribute object(s)
     *                and store them in the attribute list
     */
    //--------------------------------------------------------
    void MetadataExporterClass::attribute_factory(vector<Tango::Attr *> &att_list)
    {
    	/*----- PROTECTED REGION ID(MetadataExporterClass::attribute_factory_before) ENABLED START -----*/
    
    	//	Add your own code
    
    	/*----- PROTECTED REGION END -----*/	//	MetadataExporterClass::attribute_factory_before
    	//	Create a list of static attributes
    	create_static_attribute_list(get_class_attr()->get_attr_list());
    	/*----- PROTECTED REGION ID(MetadataExporterClass::attribute_factory_after) ENABLED START -----*/
    
    	//	Add your own code
    
    	/*----- PROTECTED REGION END -----*/	//	MetadataExporterClass::attribute_factory_after
    }
    //--------------------------------------------------------
    /**
     *	Method      : MetadataExporterClass::command_factory()
     *	Description : Create the command object(s)
     *                and store them in the command list
     */
    //--------------------------------------------------------
    void MetadataExporterClass::command_factory()
    {
    	/*----- PROTECTED REGION ID(MetadataExporterClass::command_factory_before) ENABLED START -----*/
    
    	//	Add your own code
    
    	/*----- PROTECTED REGION END -----*/	//	MetadataExporterClass::command_factory_before
    
    
    	//	Command On
    	OnClass	*pOnCmd =
    		new OnClass("On",
    			Tango::DEV_VOID, Tango::DEV_VOID,
    			"",
    			"",
    			Tango::OPERATOR);
    	command_list.push_back(pOnCmd);
    
    	//	Command Off
    	OffClass	*pOffCmd =
    		new OffClass("Off",
    			Tango::DEV_VOID, Tango::DEV_VOID,
    			"",
    			"",
    			Tango::OPERATOR);
    	command_list.push_back(pOffCmd);
    
    	/*----- PROTECTED REGION ID(MetadataExporterClass::command_factory_after) ENABLED START -----*/
    
    	//	Add your own code
    
    	/*----- PROTECTED REGION END -----*/	//	MetadataExporterClass::command_factory_after
    }
    
    //===================================================================
    //	Dynamic attributes related methods
    //===================================================================
    
    //--------------------------------------------------------
    /**
     * method : 		MetadataExporterClass::create_static_attribute_list
     * description : 	Create the a list of static attributes
     *
     * @param	att_list	the ceated attribute list 
     */
    //--------------------------------------------------------
    void MetadataExporterClass::create_static_attribute_list(vector<Tango::Attr *> &att_list)
    {
    	for (unsigned long i=0 ; i<att_list.size() ; i++)
    	{
    		string att_name(att_list[i]->get_name());
    		transform(att_name.begin(), att_name.end(), att_name.begin(), ::tolower);
    		defaultAttList.push_back(att_name);
    	}
    
    	cout2 << defaultAttList.size() << " attributes in default list" << endl;
    
    	/*----- PROTECTED REGION ID(MetadataExporterClass::create_static_att_list) ENABLED START -----*/
    
    	/*----- PROTECTED REGION END -----*/	//	MetadataExporterClass::create_static_att_list
    }
    
    
    //--------------------------------------------------------
    /**
     * method : 		MetadataExporterClass::erase_dynamic_attributes
     * description : 	delete the dynamic attributes if any.
     *
     * @param	devlist_ptr	the device list pointer
     * @param	list of all attributes
     */
    //--------------------------------------------------------
    void MetadataExporterClass::erase_dynamic_attributes(const Tango::DevVarStringArray *devlist_ptr, vector<Tango::Attr *> &att_list)
    {
    	Tango::Util *tg = Tango::Util::instance();
    
    	for (unsigned long i=0 ; i<devlist_ptr->length() ; i++)
    	{	
    		Tango::DeviceImpl *dev_impl = tg->get_device_by_name(((string)(*devlist_ptr)[i]).c_str());
    		MetadataExporter *dev = static_cast<MetadataExporter *> (dev_impl);
    		
    		vector<Tango::Attribute *> &dev_att_list = dev->get_device_attr()->get_attribute_list();
    		vector<Tango::Attribute *>::iterator ite_att;
    		for (ite_att=dev_att_list.begin() ; ite_att != dev_att_list.end() ; ++ite_att)
    		{
    			string att_name((*ite_att)->get_name_lower());
    			if ((att_name == "state") || (att_name == "status"))
    				continue;
    			vector<string>::iterator ite_str = find(defaultAttList.begin(), defaultAttList.end(), att_name);
    			if (ite_str == defaultAttList.end())
    			{
    				cout2 << att_name << " is a UNWANTED dynamic attribute for device " << (*devlist_ptr)[i] << endl;
    				Tango::Attribute &att = dev->get_device_attr()->get_attr_by_name(att_name.c_str());
    				dev->remove_attribute(att_list[att.get_attr_idx()], true, false);
    				--ite_att;
    			}
    		}
    	}
    	/*----- PROTECTED REGION ID(MetadataExporterClass::erase_dynamic_attributes) ENABLED START -----*/
    
    	/*----- PROTECTED REGION END -----*/	//	MetadataExporterClass::erase_dynamic_attributes
    }
    
    //--------------------------------------------------------
    /**
     *	Method      : MetadataExporterClass::get_attr_by_name()
     *	Description : returns Tango::Attr * object found by name
     */
    //--------------------------------------------------------
    Tango::Attr *MetadataExporterClass::get_attr_object_by_name(vector<Tango::Attr *> &att_list, string attname)
    {
    	vector<Tango::Attr *>::iterator it;
    	for (it=att_list.begin() ; it<att_list.end() ; it++)
    		if ((*it)->get_name()==attname)
    			return (*it);
    	//	Attr does not exist
    	return NULL;
    }
    
    
    /*----- PROTECTED REGION ID(MetadataExporterClass::Additional Methods) ENABLED START -----*/
    
    /*----- PROTECTED REGION END -----*/	//	MetadataExporterClass::Additional Methods
    } //	namespace