blob: 2368e1c3ea446727ef2784b06c05a8ba9f167a0b [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010 - 2013 ACIN
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Ingo Hegny, Alois Zoitl, Monika Wenger
* - initial implementation and rework communication infrastructure
*******************************************************************************/
#ifndef _FORTE_STRUCT_H_
#define _FORTE_STRUCT_H_
#include "forte_any_derived.h"
class CIEC_STRUCT : public CIEC_ANY_DERIVED{
public:
typedef const char* TStructInitialValues;
CIEC_STRUCT(CStringDictionary::TStringId paTypeName, TForteUInt16 paLength, const CStringDictionary::TStringId paElementTypes[],
const CStringDictionary::TStringId paElementNames[], TForteUInt8 paTypeID, TStructInitialValues *paInitialValues = 0);
CIEC_STRUCT(const CIEC_STRUCT& paValue);
virtual ~CIEC_STRUCT();
CIEC_STRUCT& operator =(const CIEC_STRUCT &paValue){
if(this != &paValue) {
setValue(paValue);
}
return *this;
}
/*! \brief Get the Struct's type
*
* With this command the type-ID of the struct can be evaluated.
*
* \param - No parameters necessary.
* \return - the type-ID of the struct.
*/
TForteUInt8 getASN1StructType() const{
return (0 != getSpecs()) ? getSpecs()->mASN1Type : static_cast<TForteUInt8>(0);
}
/*! \brief Get the Struct's size
*
* With this command the size of the struct can be evaluated.
*
* \param - No parameters necessary.
* \return - the size of the struct.
*/
TForteUInt16 getStructSize() const{
return (0 != getSpecs()) ? getSpecs()->mNumberOfElements : static_cast<TForteUInt16>(0);
}
/*! \brief Get the Struct's elementNames
*
* retrieve array of StringIDs of element names.
*
* \param - No parameters necessary.
* \return - pointer to array of StringIds.
*/
const CStringDictionary::TStringId* elementNames() const{
return (0 != getSpecs()) ? getSpecs()->mElementNames : 0;
}
/*! \brief Get the Struct's type name
*
* With this command the type name of the struct can be evaluated.
*
* \param - No parameters necessary.
* \return - StringId of Struct's type name.
*/
CStringDictionary::TStringId getStructTypeNameID() const{
return (0 != getSpecs()) ? getSpecs()->mStructureTypeID : 0;
}
void setValue(const CIEC_ANY& paValue);
virtual EDataTypeID getDataTypeID() const{
return CIEC_ANY::e_STRUCT;
}
/*! \brief Converts array value to data type value
*
* This command implements a conversion function from IEC61131
* data type (array format) to a C++ conform type.
* This function is necessary for communication with a proper engineering system.
* \param paValue string buffer
* \return number of bytes taken used from the buffer
* -1 on on error
*/
virtual int fromString(const char *paValue);
/*! \brief Converts data type value to string
*
* This command implements a conversion function to C++ data type.
* \param paValue Pointer to char-array
* \param paBufferSize Size of the provided buffer
* \return number of bytes used in the buffer
* -1 on error
*/
virtual int toString(char* paValue, size_t paBufferSize) const;
CIEC_ANY *getMembers(){
return (0 != getSpecs()) ? getSpecs()->mMembers : static_cast<CIEC_ANY *>(0);
}
const CIEC_ANY *getMembers() const{
return (0 != getSpecs()) ? getSpecs()->mMembers : static_cast<CIEC_ANY *>(0);
}
/*! \brief Get the struct's member var with the given name id
*
* \param pa_unMemberNameId the string id of the member name
* \return on a valid member name id a pointer to the member var otherwise 0
*/
CIEC_ANY *getMemberNamed(CStringDictionary::TStringId paMemberNameId);
virtual size_t getToStringBufferSize() const;
protected:
/*! \brief helper method for accessing a member by index
*
* Mainly used for the generated accessor-functions.
* Therefore the index is not range checked!
*
* \param paMemberIndex index into the member array
* \return pointer to the member var
*/
CIEC_ANY* getMember(size_t paMemberIndex){
return &getMembers()[paMemberIndex];
}
enum EASN1Tags{
e_UNIVERSAL = 0, e_APPLICATION = 64, e_CONTEXT = 128, e_PRIVATE = 192
};
enum EASN1Encoding{
e_PRIMITIVE = 0, e_CONSTRUCTED = 32
};
//!Function to configure the array if it is created via the typelib
void setup(CStringDictionary::TStringId paTypeName, TForteUInt16 paLength, const CStringDictionary::TStringId paElementTypes[],
const CStringDictionary::TStringId paElementNames[], TForteUInt8 paTypeID, TStructInitialValues *paInitialValues = 0);
private:
class CStructSpecs {
public:
CStructSpecs(CStringDictionary::TStringId paTypeName, TForteUInt16 paLength, const CStringDictionary::TStringId paElementNames[], TForteUInt8 paTypeID) :
mASN1Type(paTypeID), mNumberOfElements(paLength), mStructureTypeID(paTypeName), mElementNames(paElementNames) {
mMembers = new CIEC_ANY[paLength];
}
~CStructSpecs() {
delete[] mMembers;
}
TForteUInt8 mASN1Type;
TForteUInt16 mNumberOfElements;
CStringDictionary::TStringId mStructureTypeID;
const CStringDictionary::TStringId *mElementNames;
CIEC_ANY *mMembers;
private:
//!declared but undefined copy constructor as we don't want these specs to be directly copied.
CStructSpecs(const CStructSpecs&);
};
void clear();
static void findNextNonBlankSpace(const char** paRunner);
bool initializeFromString(int *paLength, CIEC_ANY *paMember, const char** paRunner, bool* paErrorOcurred);
const CStructSpecs* getSpecs() const {
return reinterpret_cast<const CStructSpecs*>(getGenData());
}
CStructSpecs* getSpecs() {
return reinterpret_cast<CStructSpecs*>(getGenData());
}
static CStringDictionary::TStringId parseNextElementId(const char *paRunner, int &paCounter);
};
#endif /*_FORTE_STRUCT_H_*/