blob: 34229fbf958b8270fe72ffabded5094a48fe812b [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005 - 2013 Profactor GmbH, ACIN, nxtControl GmbH
* 2018 TU Wien/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:
* Thomas Strasser, Ingomar Müller, Alois Zoitl, Ingo Hegny, Stanislav Meduna
* Martin Melik Merkumians, Matthias Plasch, Monika Wenger
* - initial implementation and rework communication infrastructure
* Martin Melik Merkumians
* - fixes behavior for getToStringBufferSize
*******************************************************************************/
#ifndef _FORTE_WSTRING_H_
#define _FORTE_WSTRING_H_
#include "forte_any_string.h"
#ifdef FORTE_USE_WSTRING_DATATYPE
/*!\ingroup COREDTS \brief CIEC_WSTRING represents the wide string data type according to IEC 61131.
*
* "wstring" is implemented like the "string" - the following first implementation
* "typedef std::basic_string<wchar_t> TWSTRING; didn't work well"
*/
class CIEC_WSTRING : public CIEC_ANY_STRING{
DECLARE_FIRMWARE_DATATYPE(WSTRING)
public:
CIEC_WSTRING(){
}
CIEC_WSTRING(const CIEC_WSTRING& pa_roValue) :
CIEC_ANY_STRING(){
(*this) = pa_roValue.getValue();
}
CIEC_WSTRING(const char* pa_pacValue){
(*this) = pa_pacValue;
}
virtual ~CIEC_WSTRING(){
}
CIEC_WSTRING &operator =(const char* const pa_pacValue){
CIEC_ANY_STRING::operator =(pa_pacValue);
return *this;
}
/*! \brief Converts a UTF-8 encoded string to a WSTRING (ISO 10646 Row 00 internally)
*
* This command implements a conversion function from a UTF-8
* encoded string (found e.g. in XML to the internal
* ISO 10646 Row 00 encoding.
* \param pa_pacBuffer Reference to the given UTF-8 encoded byte array
* \param pa_nLen Length to read (-1 for null-terminated)
* \param pa_bUnescape Handle $-escapes and delimiter characters at the beginning and end
* \return number of bytes used from srcString
* -1 on error
*/
virtual int fromUTF8(const char *pa_pacValue, int pa_nLen, bool pa_bUnescape);
/*! \brief Converts the WSTRING to a UTF-8 representation
*
* This command implements a conversion function from a WSTRING
* to a UTF-8 encoding, usable e.g. for the serialization.
* \param pa_pacBuffer Reference to the output buffer. If 0, only the needed size will be computed.
* \param pa_nBufferSize Size of the provided buffer.
* \param pa_bEscape Produce $-escapes and delimiter characters at the beginning and end
* \return number of bytes used in the buffer
* -1 on error
*/
virtual int toUTF8(char* paBuffer, size_t paBufferSize, bool paEscape) const;
/*! \brief Converts a UTF-16 encoded string to a WSTRING (UTF-8 internally)
*
* This command implements a conversion function from a UTF-16
* encoded string (found e.g. in serialized WSTRING type) to the internal
* UTF-8 encoding.
* \param pa_pacBuffer Reference to the given UTF-16 encoded byte array
* \param pa_nBufferLen Length of the provided byte array
* \return Can be the following response:
* - false....conversion was not successful - something went wrong!
* - true....conversion was successful.
*/
bool fromUTF16(const TForteByte *pa_pacBuffer, unsigned int pa_nBufferLen);
/*! \brief Converts the WSTRING to a UTF-16 representation
*
* This command implements a conversion function from a WSTRING
* to a big-endian UTF-16 encoding, usable e.g. for the serialization.
* \param pa_pacBuffer Reference to the output buffer. If 0, only the needed size will be computed.
* \param pa_nBufferSize Size of the provided buffer.
* \return number of bytes used in the buffer
* -1 on error
*/
int toUTF16(TForteByte* pa_pacBuffer, unsigned int pa_nBufferSize) const;
virtual EDataTypeID getDataTypeID() const{
return CIEC_ANY::e_WSTRING;
}
virtual void setValue(const CIEC_ANY& pa_roValue){
if(pa_roValue.getDataTypeID() == CIEC_ANY::e_WSTRING){
const CIEC_WSTRING &roSrc(static_cast<const CIEC_WSTRING &>(pa_roValue));
this->assign(roSrc.getValue(), roSrc.length());
}
}
/*! \brief Converts string value to data type value
*
* This command implements a conversion function from IEC61131
* data type (string format) to a C++ conform type.
* This function is necessary for communication with a proper engineering system.
* It is expecting a UTF-8 string and will check whether its content is constrained
* to the basic multilingual plane.
* \param pa_pacValue string buffer
* \return number of bytes taken used from the buffer
* -1 on on error
*/
virtual int fromString(const char *pa_pacValue);
/*! \brief Converts data type value to string
*
* This command implements a conversion function from C++ data type
* to IEC61131 conform data type (string format).
* This function is necessary for communication with a proper engineering system.
* \param pa_acValue Pointer to char-array for the result
* \param pa_nBufferSize Size of the buffer
* \return number of bytes used in the buffer without trailing 0x00
* -1 on error
*/
virtual int toString(char* paValue, size_t paBufferSize) const;
/*! \brief Returns the amount of bytes needed to create the IEC 61131 literal string
*
* IEC 61131 literal strings needs to delimit all non Common_Char_Value literals and special
* symbols, like line-feed, into escaped symbol sequences. For single byte strings the special
* symbols are represented as dollar escaped strings followed by two hex digits. For double byte strings
* is is dollar followed by four hex digits, according to the IEC 61131 standard and its EBNF.
*
* \return Needed buffer size for literal string without type delarator e.g., WSTRING#
*/
virtual size_t getToStringBufferSize() const;
protected:
private:
};
inline
bool operator ==(const CIEC_WSTRING &pa_roLeft, const CIEC_WSTRING &pa_roRight){
return (0 == strcmp(pa_roLeft.getValue(), pa_roRight.getValue()));
}
inline
bool operator !=(const CIEC_WSTRING &pa_roLeft, const CIEC_WSTRING &pa_roRight){
return !(pa_roLeft == pa_roRight);
}
#endif
#endif /*_FORTE_WSTRING_H_*/