diff --git a/src/iec61850/client/ied_connection.c b/src/iec61850/client/ied_connection.c index 8b30c753..30f1ea93 100644 --- a/src/iec61850/client/ied_connection.c +++ b/src/iec61850/client/ied_connection.c @@ -1937,7 +1937,7 @@ mmsConnectionFileCloseHandler (uint32_t invokeId, void* parameter, MmsError mmsE } static void -mmsConnectionFileReadHandler (uint32_t invokeId, void* parameter, MmsError mmsError, uint8_t* buffer, uint32_t byteReceived, +mmsConnectionFileReadHandler (uint32_t invokeId, void* parameter, MmsError mmsError, int32_t frsmId, uint8_t* buffer, uint32_t byteReceived, bool moreFollows) { IedConnection self = (IedConnection) parameter; @@ -1954,7 +1954,7 @@ mmsConnectionFileReadHandler (uint32_t invokeId, void* parameter, MmsError mmsEr handler(call->specificParameter2.getFileInfo.originalInvokeId, call->callbackParameter, err, invokeId, NULL, 0, false); /* close file */ - MmsConnection_fileCloseAsync(self->connection, &mmsError, call->specificParameter2.getFileInfo.frsmId, mmsConnectionFileCloseHandler, self); + MmsConnection_fileCloseAsync(self->connection, &mmsError, frsmId, mmsConnectionFileCloseHandler, self); if (mmsError != MMS_ERROR_NONE) iedConnection_releaseOutstandingCall(self, call); @@ -1964,7 +1964,7 @@ mmsConnectionFileReadHandler (uint32_t invokeId, void* parameter, MmsError mmsEr if ((moreFollows == false) || (cont == false)) { /* close file */ - MmsConnection_fileCloseAsync(self->connection, &mmsError, call->specificParameter2.getFileInfo.frsmId, mmsConnectionFileCloseHandler, self); + MmsConnection_fileCloseAsync(self->connection, &mmsError, frsmId, mmsConnectionFileCloseHandler, self); if (mmsError != MMS_ERROR_NONE) iedConnection_releaseOutstandingCall(self, call); @@ -1972,7 +1972,7 @@ mmsConnectionFileReadHandler (uint32_t invokeId, void* parameter, MmsError mmsEr else { /* send next read request */ - call->invokeId = MmsConnection_fileReadAsync(self->connection, &mmsError, call->specificParameter2.getFileInfo.frsmId, + call->invokeId = MmsConnection_fileReadAsync(self->connection, &mmsError, frsmId, mmsConnectionFileReadHandler, self); if (mmsError != MMS_ERROR_NONE) { @@ -1981,7 +1981,7 @@ mmsConnectionFileReadHandler (uint32_t invokeId, void* parameter, MmsError mmsEr handler(invokeId, call->callbackParameter, err, invokeId, NULL, 0, false); /* close file */ - MmsConnection_fileCloseAsync(self->connection, &mmsError, call->specificParameter2.getFileInfo.frsmId, mmsConnectionFileCloseHandler, self); + MmsConnection_fileCloseAsync(self->connection, &mmsError, frsmId, mmsConnectionFileCloseHandler, self); if (mmsError != MMS_ERROR_NONE) { iedConnection_releaseOutstandingCall(self, call); @@ -2019,8 +2019,6 @@ mmsConnectionFileOpenHandler (uint32_t invokeId, void* parameter, MmsError mmsEr iedConnection_releaseOutstandingCall(self, call); } else { - - call->specificParameter2.getFileInfo.frsmId = frsmId; call->specificParameter2.getFileInfo.originalInvokeId = invokeId; call->invokeId = MmsConnection_fileReadAsync(self->connection, &mmsError, frsmId, mmsConnectionFileReadHandler, self); diff --git a/src/iec61850/inc_private/ied_connection_private.h b/src/iec61850/inc_private/ied_connection_private.h index e10bc3d8..3b061b5b 100644 --- a/src/iec61850/inc_private/ied_connection_private.h +++ b/src/iec61850/inc_private/ied_connection_private.h @@ -42,7 +42,6 @@ struct sIedConnectionOutstandingCall { union { void* pointer; struct { - int32_t frsmId; uint32_t originalInvokeId; } getFileInfo; struct { diff --git a/src/mms/inc/mms_client_connection.h b/src/mms/inc/mms_client_connection.h index 3cd9feb6..e7e57338 100644 --- a/src/mms/inc/mms_client_connection.h +++ b/src/mms/inc/mms_client_connection.h @@ -1074,8 +1074,21 @@ typedef void typedef void (*MmsFileReadHandler) (void* parameter, int32_t frsmId, uint8_t* buffer, uint32_t bytesReceived); +/** + * \brief Callback handler for the file read service + * + * Will be called for every received part of the file and when there is an error during reading the file. + * + * \param invokeId invokeID of the response + * \param parameter user provided context parameter + * \param mmsError error code + * \param frsmId ID of the file + * \param buffer buffer where the received bytes are stored + * \param bytesReceived number of bytes received with this response + * \param moreFollows more messages with parts of the file are following + */ typedef void -(*MmsConnection_FileReadHandler) (uint32_t invokeId, void* parameter, MmsError mmsError, uint8_t* buffer, uint32_t byteReceived, +(*MmsConnection_FileReadHandler) (uint32_t invokeId, void* parameter, MmsError mmsError, int32_t frsmId, uint8_t* buffer, uint32_t byteReceived, bool moreFollows); diff --git a/src/mms/iso_mms/client/mms_client_connection.c b/src/mms/iso_mms/client/mms_client_connection.c index 13aae158..51d25044 100644 --- a/src/mms/iso_mms/client/mms_client_connection.c +++ b/src/mms/iso_mms/client/mms_client_connection.c @@ -894,18 +894,18 @@ handleAsyncResponse(MmsConnection self, ByteBuffer* response, uint32_t bufPos, M MmsConnection_FileReadHandler handler = (MmsConnection_FileReadHandler) outstandingCall->userCallback; + int32_t frsmId = outstandingCall->internalParameter.i32; + if (err != MMS_ERROR_NONE) { - handler(outstandingCall->invokeId, outstandingCall->userParameter, err, NULL, 0, false); + handler(outstandingCall->invokeId, outstandingCall->userParameter, err, frsmId, NULL, 0, false); } else { bool moreFollows; - int32_t frsmId = outstandingCall->internalParameter.i32; - if (mmsMsg_parseFileReadResponse(ByteBuffer_getBuffer(response), bufPos, ByteBuffer_getSize(response), outstandingCall->invokeId, frsmId, &moreFollows, handler, outstandingCall->userParameter) == false) { - handler(outstandingCall->invokeId, outstandingCall->userParameter, MMS_ERROR_PARSING_RESPONSE, NULL, 0, false); + handler(outstandingCall->invokeId, outstandingCall->userParameter, MMS_ERROR_PARSING_RESPONSE, frsmId, NULL, 0, false); } } } @@ -3671,14 +3671,13 @@ struct fileReadParameters { Semaphore waitForResponse; MmsError err; - int32_t frsmId; MmsFileReadHandler handler; void* handlerParameter; bool moreFollows; }; static void -fileReadHandler(uint32_t invokeId, void* parameter, MmsError mmsError, uint8_t* buffer, uint32_t byteReceived, +fileReadHandler(uint32_t invokeId, void* parameter, MmsError mmsError, int frsmId, uint8_t* buffer, uint32_t byteReceived, bool moreFollows) { struct fileReadParameters* parameters = (struct fileReadParameters*) parameter; @@ -3686,7 +3685,7 @@ fileReadHandler(uint32_t invokeId, void* parameter, MmsError mmsError, uint8_t* parameters->err = mmsError; if (mmsError == MMS_ERROR_NONE) - parameters->handler(parameters->handlerParameter, parameters->frsmId, buffer, byteReceived); + parameters->handler(parameters->handlerParameter, frsmId, buffer, byteReceived); parameters->moreFollows = moreFollows; @@ -3706,7 +3705,6 @@ MmsConnection_fileRead(MmsConnection self, MmsError* mmsError, int32_t frsmId, M parameter.waitForResponse = Semaphore_create(1); parameter.err = MMS_ERROR_NONE; - parameter.frsmId = frsmId; parameter.handler = handler; parameter.handlerParameter = handlerParameter; parameter.moreFollows = false; diff --git a/src/mms/iso_mms/client/mms_client_files.c b/src/mms/iso_mms/client/mms_client_files.c index de799f52..9ddb26cb 100644 --- a/src/mms/iso_mms/client/mms_client_files.c +++ b/src/mms/iso_mms/client/mms_client_files.c @@ -755,7 +755,7 @@ mmsMsg_parseFileReadResponse(uint8_t* buffer, int bufPos, int maxBufPos, uint32_ } } - handler(invokeId, handlerParameter, frsmId, data, dataLen, *moreFollows); + handler(invokeId, handlerParameter, MMS_ERROR_NONE, frsmId, data, dataLen, *moreFollows); return true; } diff --git a/src/mms/iso_mms/server/mms_server_connection.c b/src/mms/iso_mms/server/mms_server_connection.c index 8b55b45b..0dc9be75 100644 --- a/src/mms/iso_mms/server/mms_server_connection.c +++ b/src/mms/iso_mms/server/mms_server_connection.c @@ -453,14 +453,20 @@ getUploadTaskByInvokeId(MmsServer mmsServer, uint32_t invokeId) } static void -mmsFileReadHandler(uint32_t invokeId, void* parameter, MmsError mmsError, uint8_t* buffer, uint32_t bytesReceived, bool moreFollows) +mmsFileReadHandler(uint32_t invokeId, void* parameter, MmsError mmsError, int32_t frsmId, uint8_t* buffer, uint32_t bytesReceived, bool moreFollows) { MmsObtainFileTask task = (MmsObtainFileTask) parameter; - if (DEBUG_MMS_SERVER) - printf("MMS_SERVER: file %i received %i bytes\n", task->frmsId, bytesReceived); + if (mmsError == MMS_ERROR_NONE) { + if (DEBUG_MMS_SERVER) + printf("MMS_SERVER: file %i received %i bytes\n", task->frmsId, bytesReceived); - FileSystem_writeFile(task->fileHandle, buffer, bytesReceived); + FileSystem_writeFile(task->fileHandle, buffer, bytesReceived); + } + else { + if (DEBUG_MMS_SERVER) + printf("MMS_SERVER: problem reading file %i (error code: %i)\n", task->frmsId, mmsError); + } } static void