|
|
|
@ -195,47 +195,70 @@ ClientDataSet_getDataSetSize(ClientDataSet self)
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static bool
|
|
|
|
|
doesControlObjectMatch(char* objRef, char* cntrlObj)
|
|
|
|
|
bool
|
|
|
|
|
private_IedConnection_doesControlObjectMatch(char* objRef, char* cntrlObj)
|
|
|
|
|
{
|
|
|
|
|
int objRefLen = strlen(objRef);
|
|
|
|
|
int i = 0;
|
|
|
|
|
|
|
|
|
|
char* separator = strchr(cntrlObj, '$');
|
|
|
|
|
while (objRef[i] != '/') {
|
|
|
|
|
if (objRef[i] != cntrlObj[i])
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
if (separator == NULL)
|
|
|
|
|
i++;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (cntrlObj[i] != '/')
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
int sepLen = separator - cntrlObj;
|
|
|
|
|
// --> LD is equal
|
|
|
|
|
|
|
|
|
|
if (sepLen >= objRefLen)
|
|
|
|
|
return false;
|
|
|
|
|
i++;
|
|
|
|
|
|
|
|
|
|
while (objRef[i] != '.') {
|
|
|
|
|
if (objRef[i] != cntrlObj[i])
|
|
|
|
|
return false;
|
|
|
|
|
i++;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (memcmp(objRef, cntrlObj, sepLen) != 0)
|
|
|
|
|
int j = i;
|
|
|
|
|
|
|
|
|
|
if (cntrlObj[j++] != '$')
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
char* cntrlObjName = objRef + sepLen + 1;
|
|
|
|
|
// --> LN is equal
|
|
|
|
|
|
|
|
|
|
if (separator[1] != 'C')
|
|
|
|
|
if (cntrlObj[j++] != 'C')
|
|
|
|
|
return false;
|
|
|
|
|
if (separator[2] != 'O')
|
|
|
|
|
if (cntrlObj[j++] != 'O')
|
|
|
|
|
return false;
|
|
|
|
|
if (separator[3] != '$')
|
|
|
|
|
if (cntrlObj[j++] != '$')
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
char* nextSeparator = strchr(separator + 4, '$');
|
|
|
|
|
// --> FC is ok
|
|
|
|
|
|
|
|
|
|
if (nextSeparator == NULL)
|
|
|
|
|
return false;
|
|
|
|
|
i++;
|
|
|
|
|
|
|
|
|
|
int cntrlObjNameLen = strlen(cntrlObjName);
|
|
|
|
|
while (objRef[i] != 0) {
|
|
|
|
|
if (cntrlObj[j] == 0)
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
if (cntrlObjNameLen != nextSeparator - (separator + 4))
|
|
|
|
|
return false;
|
|
|
|
|
if (objRef[i] == '.') {
|
|
|
|
|
if (cntrlObj[j] != '$')
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
if (objRef[i] != cntrlObj[j])
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (memcmp(cntrlObjName, separator + 4, cntrlObjNameLen) == 0)
|
|
|
|
|
return true;
|
|
|
|
|
i++;
|
|
|
|
|
j++;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
if ((cntrlObj[j] == 0) || (cntrlObj[j] == '$'))
|
|
|
|
|
return true;
|
|
|
|
|
else
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static bool
|
|
|
|
@ -357,7 +380,7 @@ handleLastApplErrorMessage(IedConnection self, MmsValue* lastApplError)
|
|
|
|
|
|
|
|
|
|
char* objectRef = ControlObjectClient_getObjectReference(object);
|
|
|
|
|
|
|
|
|
|
if (doesControlObjectMatch(objectRef, MmsValue_toString(cntrlObj))) {
|
|
|
|
|
if (private_IedConnection_doesControlObjectMatch(objectRef, MmsValue_toString(cntrlObj))) {
|
|
|
|
|
ControlObjectClient_setLastApplError(object, self->lastApplError);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -966,9 +989,8 @@ IedConnection_getDeviceModelFromServer(IedConnection self, IedClientError* error
|
|
|
|
|
|
|
|
|
|
LinkedList_destroy(logicalDeviceNames);
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
else
|
|
|
|
|
*error = iedConnection_mapMmsErrorToIedError(mmsError);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
LinkedList /*<char*>*/
|
|
|
|
|