Skip to content

Commit 7d8f290

Browse files
Fix error messages in C++-Impl
1 parent bde70ce commit 7d8f290

File tree

34 files changed

+915
-342
lines changed

34 files changed

+915
-342
lines changed

Examples/Calculator/Calculator.xml

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@
6161
</method>
6262
</class>
6363

64-
<global baseclassname="Base" releasemethod="ReleaseInstance" versionmethod="GetVersion" errormethod="GetLastError">
64+
<global baseclassname="Base" releasemethod="ReleaseInstance" acquiremethod="AcquireInstance" versionmethod="GetVersion" errormethod="GetLastError">
6565

6666
<method name="GetVersion" description = "retrieves the binary version of this library.">
6767
<param name="Major" type="uint32" pass="out" description="returns the major version of this library" />
@@ -73,7 +73,10 @@
7373
<param name="ErrorMessage" type="string" pass="out" description="Message of the last error" />
7474
<param name="HasError" type="bool" pass="return" description="Is there a last error to query" />
7575
</method>
76-
<method name="ReleaseInstance" description="Releases the memory of an Instance">
76+
<method name="ReleaseInstance" description="Releases shared ownership of an Instance">
77+
<param name="Instance" type="class" class="Base" pass="in" description="Instance Handle" />
78+
</method>
79+
<method name="AcquireInstance" description="Acquires shared ownership of an Instance">
7780
<param name="Instance" type="class" class="Base" pass="in" description="Instance Handle" />
7881
</method>
7982
<method name="CreateVariable" description="Creates a new Variable instance">

Examples/Calculator/Calculator_component/Bindings/CppDynamic/calculator_abi.hpp

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ Interface version: 1.0.0
2828

2929
#include "calculator_types.hpp"
3030

31+
3132
extern "C" {
3233

3334
/*************************************************************************************************************************
@@ -132,13 +133,21 @@ CALCULATOR_DECLSPEC CalculatorResult calculator_getversion(Calculator_uint32 * p
132133
CALCULATOR_DECLSPEC CalculatorResult calculator_getlasterror(Calculator_Base pInstance, const Calculator_uint32 nErrorMessageBufferSize, Calculator_uint32* pErrorMessageNeededChars, char * pErrorMessageBuffer, bool * pHasError);
133134

134135
/**
135-
* Releases the memory of an Instance
136+
* Releases shared ownership of an Instance
136137
*
137138
* @param[in] pInstance - Instance Handle
138139
* @return error code or 0 (success)
139140
*/
140141
CALCULATOR_DECLSPEC CalculatorResult calculator_releaseinstance(Calculator_Base pInstance);
141142

143+
/**
144+
* Acquires shared ownership of an Instance
145+
*
146+
* @param[in] pInstance - Instance Handle
147+
* @return error code or 0 (success)
148+
*/
149+
CALCULATOR_DECLSPEC CalculatorResult calculator_acquireinstance(Calculator_Base pInstance);
150+
142151
/**
143152
* Creates a new Variable instance
144153
*

Examples/Calculator/Calculator_component/Bindings/CppDynamic/calculator_dynamic.h

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ Interface version: 1.0.0
1919
#include "calculator_types.hpp"
2020

2121

22+
2223
/*************************************************************************************************************************
2324
Class definition for Base
2425
**************************************************************************************************************************/
@@ -121,13 +122,21 @@ typedef CalculatorResult (*PCalculatorGetVersionPtr) (Calculator_uint32 * pMajor
121122
typedef CalculatorResult (*PCalculatorGetLastErrorPtr) (Calculator_Base pInstance, const Calculator_uint32 nErrorMessageBufferSize, Calculator_uint32* pErrorMessageNeededChars, char * pErrorMessageBuffer, bool * pHasError);
122123

123124
/**
124-
* Releases the memory of an Instance
125+
* Releases shared ownership of an Instance
125126
*
126127
* @param[in] pInstance - Instance Handle
127128
* @return error code or 0 (success)
128129
*/
129130
typedef CalculatorResult (*PCalculatorReleaseInstancePtr) (Calculator_Base pInstance);
130131

132+
/**
133+
* Acquires shared ownership of an Instance
134+
*
135+
* @param[in] pInstance - Instance Handle
136+
* @return error code or 0 (success)
137+
*/
138+
typedef CalculatorResult (*PCalculatorAcquireInstancePtr) (Calculator_Base pInstance);
139+
131140
/**
132141
* Creates a new Variable instance
133142
*
@@ -161,6 +170,7 @@ typedef struct {
161170
PCalculatorGetVersionPtr m_GetVersion;
162171
PCalculatorGetLastErrorPtr m_GetLastError;
163172
PCalculatorReleaseInstancePtr m_ReleaseInstance;
173+
PCalculatorAcquireInstancePtr m_AcquireInstance;
164174
PCalculatorCreateVariablePtr m_CreateVariable;
165175
PCalculatorCreateCalculatorPtr m_CreateCalculator;
166176
} sCalculatorDynamicWrapperTable;

Examples/Calculator/Calculator_component/Bindings/CppDynamic/calculator_dynamic.hpp

Lines changed: 131 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ Interface version: 1.0.0
1919
#include "calculator_types.hpp"
2020
#include "calculator_dynamic.h"
2121

22+
2223
#ifdef _WIN32
2324
#include <windows.h>
2425
#else // _WIN32
@@ -150,6 +151,14 @@ using CCalculatorInputVector = CInputVector<T>;
150151
class CWrapper {
151152
public:
152153

154+
CWrapper(void* pSymbolLookupMethod)
155+
{
156+
CheckError(nullptr, initWrapperTable(&m_WrapperTable));
157+
CheckError(nullptr, loadWrapperTableFromSymbolLookupMethod(&m_WrapperTable, pSymbolLookupMethod));
158+
159+
CheckError(nullptr, checkBinaryVersion());
160+
}
161+
153162
CWrapper(const std::string &sFileName)
154163
{
155164
CheckError(nullptr, initWrapperTable(&m_WrapperTable));
@@ -163,6 +172,11 @@ class CWrapper {
163172
return std::make_shared<CWrapper>(sFileName);
164173
}
165174

175+
static PWrapper loadLibraryFromSymbolLookupMethod(void* pSymbolLookupMethod)
176+
{
177+
return std::make_shared<CWrapper>(pSymbolLookupMethod);
178+
}
179+
166180
~CWrapper()
167181
{
168182
releaseWrapperTable(&m_WrapperTable);
@@ -173,6 +187,7 @@ class CWrapper {
173187
inline void GetVersion(Calculator_uint32 & nMajor, Calculator_uint32 & nMinor, Calculator_uint32 & nMicro);
174188
inline bool GetLastError(CBase * pInstance, std::string & sErrorMessage);
175189
inline void ReleaseInstance(CBase * pInstance);
190+
inline void AcquireInstance(CBase * pInstance);
176191
inline PVariable CreateVariable(const Calculator_double dInitialValue);
177192
inline PCalculator CreateCalculator();
178193

@@ -191,6 +206,7 @@ class CWrapper {
191206
CalculatorResult initWrapperTable(sCalculatorDynamicWrapperTable * pWrapperTable);
192207
CalculatorResult releaseWrapperTable(sCalculatorDynamicWrapperTable * pWrapperTable);
193208
CalculatorResult loadWrapperTable(sCalculatorDynamicWrapperTable * pWrapperTable, const char * pLibraryFileName);
209+
CalculatorResult loadWrapperTableFromSymbolLookupMethod(sCalculatorDynamicWrapperTable * pWrapperTable, void* pSymbolLookupMethod);
194210

195211
friend class CBase;
196212
friend class CVariable;
@@ -217,7 +233,7 @@ class CBase {
217233
if (m_pWrapper != nullptr)
218234
m_pWrapper->CheckError(this, nResult);
219235
}
220-
236+
public:
221237
/**
222238
* CBase::CBase - Constructor for Base class.
223239
*/
@@ -236,7 +252,6 @@ class CBase {
236252
m_pWrapper = nullptr;
237253
}
238254

239-
public:
240255
/**
241256
* CBase::GetHandle - Returns handle to instance.
242257
*/
@@ -317,11 +332,12 @@ class CCalculator : public CBase {
317332
std::vector<char> bufferErrorMessage(bytesNeededErrorMessage);
318333
CheckError(nullptr,m_WrapperTable.m_GetLastError(hInstance, bytesNeededErrorMessage, &bytesWrittenErrorMessage, &bufferErrorMessage[0], &resultHasError));
319334
sErrorMessage = std::string(&bufferErrorMessage[0]);
335+
320336
return resultHasError;
321337
}
322338

323339
/**
324-
* CWrapper::ReleaseInstance - Releases the memory of an Instance
340+
* CWrapper::ReleaseInstance - Releases shared ownership of an Instance
325341
* @param[in] pInstance - Instance Handle
326342
*/
327343
inline void CWrapper::ReleaseInstance(CBase * pInstance)
@@ -333,6 +349,19 @@ class CCalculator : public CBase {
333349
CheckError(nullptr,m_WrapperTable.m_ReleaseInstance(hInstance));
334350
}
335351

352+
/**
353+
* CWrapper::AcquireInstance - Acquires shared ownership of an Instance
354+
* @param[in] pInstance - Instance Handle
355+
*/
356+
inline void CWrapper::AcquireInstance(CBase * pInstance)
357+
{
358+
CalculatorHandle hInstance = nullptr;
359+
if (pInstance != nullptr) {
360+
hInstance = pInstance->GetHandle();
361+
};
362+
CheckError(nullptr,m_WrapperTable.m_AcquireInstance(hInstance));
363+
}
364+
336365
/**
337366
* CWrapper::CreateVariable - Creates a new Variable instance
338367
* @param[in] dInitialValue - Initial value of the new Variable
@@ -342,6 +371,10 @@ class CCalculator : public CBase {
342371
{
343372
CalculatorHandle hInstance = nullptr;
344373
CheckError(nullptr,m_WrapperTable.m_CreateVariable(dInitialValue, &hInstance));
374+
375+
if (!hInstance) {
376+
CheckError(nullptr,CALCULATOR_ERROR_INVALIDPARAM);
377+
}
345378
return std::make_shared<CVariable>(this, hInstance);
346379
}
347380

@@ -353,6 +386,10 @@ class CCalculator : public CBase {
353386
{
354387
CalculatorHandle hInstance = nullptr;
355388
CheckError(nullptr,m_WrapperTable.m_CreateCalculator(&hInstance));
389+
390+
if (!hInstance) {
391+
CheckError(nullptr,CALCULATOR_ERROR_INVALIDPARAM);
392+
}
356393
return std::make_shared<CCalculator>(this, hInstance);
357394
}
358395

@@ -384,6 +421,7 @@ class CCalculator : public CBase {
384421
pWrapperTable->m_GetVersion = nullptr;
385422
pWrapperTable->m_GetLastError = nullptr;
386423
pWrapperTable->m_ReleaseInstance = nullptr;
424+
pWrapperTable->m_AcquireInstance = nullptr;
387425
pWrapperTable->m_CreateVariable = nullptr;
388426
pWrapperTable->m_CreateCalculator = nullptr;
389427

@@ -524,6 +562,15 @@ class CCalculator : public CBase {
524562
if (pWrapperTable->m_ReleaseInstance == nullptr)
525563
return CALCULATOR_ERROR_COULDNOTFINDLIBRARYEXPORT;
526564

565+
#ifdef _WIN32
566+
pWrapperTable->m_AcquireInstance = (PCalculatorAcquireInstancePtr) GetProcAddress(hLibrary, "calculator_acquireinstance");
567+
#else // _WIN32
568+
pWrapperTable->m_AcquireInstance = (PCalculatorAcquireInstancePtr) dlsym(hLibrary, "calculator_acquireinstance");
569+
dlerror();
570+
#endif // _WIN32
571+
if (pWrapperTable->m_AcquireInstance == nullptr)
572+
return CALCULATOR_ERROR_COULDNOTFINDLIBRARYEXPORT;
573+
527574
#ifdef _WIN32
528575
pWrapperTable->m_CreateVariable = (PCalculatorCreateVariablePtr) GetProcAddress(hLibrary, "calculator_createvariable");
529576
#else // _WIN32
@@ -545,6 +592,74 @@ class CCalculator : public CBase {
545592
pWrapperTable->m_LibraryHandle = hLibrary;
546593
return CALCULATOR_SUCCESS;
547594
}
595+
596+
inline CalculatorResult CWrapper::loadWrapperTableFromSymbolLookupMethod(sCalculatorDynamicWrapperTable * pWrapperTable, void* pSymbolLookupMethod)
597+
{
598+
if (pWrapperTable == nullptr)
599+
return CALCULATOR_ERROR_INVALIDPARAM;
600+
if (pSymbolLookupMethod == nullptr)
601+
return CALCULATOR_ERROR_INVALIDPARAM;
602+
603+
typedef CalculatorResult(*SymbolLookupType)(const char*, void**);
604+
605+
SymbolLookupType pLookup = (SymbolLookupType)pSymbolLookupMethod;
606+
607+
CalculatorResult eLookupError = CALCULATOR_SUCCESS;
608+
eLookupError = (*pLookup)("calculator_variable_getvalue", (void**)&(pWrapperTable->m_Variable_GetValue));
609+
if ( (eLookupError != 0) || (pWrapperTable->m_Variable_GetValue == nullptr) )
610+
return CALCULATOR_ERROR_COULDNOTFINDLIBRARYEXPORT;
611+
612+
eLookupError = (*pLookup)("calculator_variable_setvalue", (void**)&(pWrapperTable->m_Variable_SetValue));
613+
if ( (eLookupError != 0) || (pWrapperTable->m_Variable_SetValue == nullptr) )
614+
return CALCULATOR_ERROR_COULDNOTFINDLIBRARYEXPORT;
615+
616+
eLookupError = (*pLookup)("calculator_calculator_enlistvariable", (void**)&(pWrapperTable->m_Calculator_EnlistVariable));
617+
if ( (eLookupError != 0) || (pWrapperTable->m_Calculator_EnlistVariable == nullptr) )
618+
return CALCULATOR_ERROR_COULDNOTFINDLIBRARYEXPORT;
619+
620+
eLookupError = (*pLookup)("calculator_calculator_getenlistedvariable", (void**)&(pWrapperTable->m_Calculator_GetEnlistedVariable));
621+
if ( (eLookupError != 0) || (pWrapperTable->m_Calculator_GetEnlistedVariable == nullptr) )
622+
return CALCULATOR_ERROR_COULDNOTFINDLIBRARYEXPORT;
623+
624+
eLookupError = (*pLookup)("calculator_calculator_clearvariables", (void**)&(pWrapperTable->m_Calculator_ClearVariables));
625+
if ( (eLookupError != 0) || (pWrapperTable->m_Calculator_ClearVariables == nullptr) )
626+
return CALCULATOR_ERROR_COULDNOTFINDLIBRARYEXPORT;
627+
628+
eLookupError = (*pLookup)("calculator_calculator_multiply", (void**)&(pWrapperTable->m_Calculator_Multiply));
629+
if ( (eLookupError != 0) || (pWrapperTable->m_Calculator_Multiply == nullptr) )
630+
return CALCULATOR_ERROR_COULDNOTFINDLIBRARYEXPORT;
631+
632+
eLookupError = (*pLookup)("calculator_calculator_add", (void**)&(pWrapperTable->m_Calculator_Add));
633+
if ( (eLookupError != 0) || (pWrapperTable->m_Calculator_Add == nullptr) )
634+
return CALCULATOR_ERROR_COULDNOTFINDLIBRARYEXPORT;
635+
636+
eLookupError = (*pLookup)("calculator_getversion", (void**)&(pWrapperTable->m_GetVersion));
637+
if ( (eLookupError != 0) || (pWrapperTable->m_GetVersion == nullptr) )
638+
return CALCULATOR_ERROR_COULDNOTFINDLIBRARYEXPORT;
639+
640+
eLookupError = (*pLookup)("calculator_getlasterror", (void**)&(pWrapperTable->m_GetLastError));
641+
if ( (eLookupError != 0) || (pWrapperTable->m_GetLastError == nullptr) )
642+
return CALCULATOR_ERROR_COULDNOTFINDLIBRARYEXPORT;
643+
644+
eLookupError = (*pLookup)("calculator_releaseinstance", (void**)&(pWrapperTable->m_ReleaseInstance));
645+
if ( (eLookupError != 0) || (pWrapperTable->m_ReleaseInstance == nullptr) )
646+
return CALCULATOR_ERROR_COULDNOTFINDLIBRARYEXPORT;
647+
648+
eLookupError = (*pLookup)("calculator_acquireinstance", (void**)&(pWrapperTable->m_AcquireInstance));
649+
if ( (eLookupError != 0) || (pWrapperTable->m_AcquireInstance == nullptr) )
650+
return CALCULATOR_ERROR_COULDNOTFINDLIBRARYEXPORT;
651+
652+
eLookupError = (*pLookup)("calculator_createvariable", (void**)&(pWrapperTable->m_CreateVariable));
653+
if ( (eLookupError != 0) || (pWrapperTable->m_CreateVariable == nullptr) )
654+
return CALCULATOR_ERROR_COULDNOTFINDLIBRARYEXPORT;
655+
656+
eLookupError = (*pLookup)("calculator_createcalculator", (void**)&(pWrapperTable->m_CreateCalculator));
657+
if ( (eLookupError != 0) || (pWrapperTable->m_CreateCalculator == nullptr) )
658+
return CALCULATOR_ERROR_COULDNOTFINDLIBRARYEXPORT;
659+
660+
return CALCULATOR_SUCCESS;
661+
}
662+
548663

549664

550665
/**
@@ -563,6 +678,7 @@ class CCalculator : public CBase {
563678
{
564679
Calculator_double resultValue = 0;
565680
CheckError(m_pWrapper->m_WrapperTable.m_Variable_GetValue(m_pHandle, &resultValue));
681+
566682
return resultValue;
567683
}
568684

@@ -601,6 +717,10 @@ class CCalculator : public CBase {
601717
{
602718
CalculatorHandle hVariable = nullptr;
603719
CheckError(m_pWrapper->m_WrapperTable.m_Calculator_GetEnlistedVariable(m_pHandle, nIndex, &hVariable));
720+
721+
if (!hVariable) {
722+
CheckError(CALCULATOR_ERROR_INVALIDPARAM);
723+
}
604724
return std::make_shared<CVariable>(m_pWrapper, hVariable);
605725
}
606726

@@ -620,6 +740,10 @@ class CCalculator : public CBase {
620740
{
621741
CalculatorHandle hInstance = nullptr;
622742
CheckError(m_pWrapper->m_WrapperTable.m_Calculator_Multiply(m_pHandle, &hInstance));
743+
744+
if (!hInstance) {
745+
CheckError(CALCULATOR_ERROR_INVALIDPARAM);
746+
}
623747
return std::make_shared<CVariable>(m_pWrapper, hInstance);
624748
}
625749

@@ -631,6 +755,10 @@ class CCalculator : public CBase {
631755
{
632756
CalculatorHandle hInstance = nullptr;
633757
CheckError(m_pWrapper->m_WrapperTable.m_Calculator_Add(m_pHandle, &hInstance));
758+
759+
if (!hInstance) {
760+
CheckError(CALCULATOR_ERROR_INVALIDPARAM);
761+
}
634762
return std::make_shared<CVariable>(m_pWrapper, hInstance);
635763
}
636764

0 commit comments

Comments
 (0)