diff --git a/src/mms/inc/mms_client_connection.h b/src/mms/inc/mms_client_connection.h index 9d1157c8..fa7e70b1 100644 --- a/src/mms/inc/mms_client_connection.h +++ b/src/mms/inc/mms_client_connection.h @@ -865,16 +865,23 @@ MmsServerIdentity_destroy(MmsServerIdentity* self); * This function will return the status of the connected server by invoking the MMS status service. * The services returns the logical and physical states of the server. * - * \param self MmsConnection instance to operate on - * \param mmsError user provided variable to store error code - * \param vmdLogicalStatus user provided variable to store the logical state of the VMD - * \param vmdPhysicalStatus user provided variable to store the physical state of the VMD - * \param extendedDerivation instructs the server to invoke self-diagnosis routines to determine server status + * \param[in] self MmsConnection instance to operate on + * \param[out] mmsError user provided variable to store error code + * \param[out] vmdLogicalStatus user provided variable to store the logical state of the VMD + * \param[out] vmdPhysicalStatus user provided variable to store the physical state of the VMD + * \param[in] extendedDerivation instructs the server to invoke self-diagnosis routines to determine server status */ void MmsConnection_getServerStatus(MmsConnection self, MmsError* mmsError, int* vmdLogicalStatus, int* vmdPhysicalStatus, bool extendedDerivation); +typedef void +(*MmsConnection_GetServerStatusHandler) (int invokeId, void* parameter, MmsError mmsError, int vmdLogicalStatus, int vmdPhysicalStatus); + +uint32_t +MmsConnection_getServerStatusAsync(MmsConnection self, MmsError* mmsError, bool extendedDerivation, + MmsConnection_GetServerStatusHandler handler, void* parameter); + /******************************************************************************* * functions for MMS file services *******************************************************************************/ diff --git a/src/mms/inc_private/mms_client_internal.h b/src/mms/inc_private/mms_client_internal.h index 086f7fb9..832cdeef 100644 --- a/src/mms/inc_private/mms_client_internal.h +++ b/src/mms/inc_private/mms_client_internal.h @@ -70,7 +70,8 @@ typedef enum { MMS_CALL_TYPE_READ_NVL_DIRECTORY, MMS_CALL_TYPE_DEFINE_NVL, MMS_CALL_TYPE_DELETE_NVL, - MMS_CALL_TYPE_GET_VAR_ACCESS_ATTR + MMS_CALL_TYPE_GET_VAR_ACCESS_ATTR, + MMS_CALL_TYPE_GET_SERVER_STATUS } eMmsOutstandingCallType; struct sMmsOutstandingCall @@ -283,7 +284,7 @@ void mmsClient_createStatusRequest(uint32_t invokeId, ByteBuffer* request, bool extendedDerivation); bool -mmsClient_parseStatusResponse(MmsConnection self, int* vmdLogicalStatus, int* vmdPhysicalStatus); +mmsClient_parseStatusResponse(MmsConnection self, ByteBuffer* response, int bufPos, int* vmdLogicalStatus, int* vmdPhysicalStatus); void mmsClient_createFileOpenRequest(uint32_t invokeId, ByteBuffer* request, const char* fileName, uint32_t initialPosition); diff --git a/src/mms/iso_mms/client/mms_client_connection.c b/src/mms/iso_mms/client/mms_client_connection.c index 19305773..e36ff01e 100644 --- a/src/mms/iso_mms/client/mms_client_connection.c +++ b/src/mms/iso_mms/client/mms_client_connection.c @@ -913,7 +913,23 @@ handleAsyncResponse(MmsConnection self, ByteBuffer* response, uint32_t bufPos, M handler(outstandingCall->invokeId, outstandingCall->userParameter, err, typeSpec); } + } + else if (outstandingCall->type == MMS_CALL_TYPE_GET_SERVER_STATUS) { + MmsConnection_GetServerStatusHandler handler = + (MmsConnection_GetServerStatusHandler) outstandingCall->userCallback; + + if (err != MMS_ERROR_NONE) { + handler(outstandingCall->invokeId, outstandingCall->userParameter, err, 0, 0); + } + else { + int vmdLogicalStatus; + int vmdPhysicalStatus; + if (mmsClient_parseStatusResponse(self, response, bufPos, &vmdLogicalStatus, &vmdPhysicalStatus) == false) + err = MMS_ERROR_PARSING_RESPONSE; + + handler(outstandingCall->invokeId, outstandingCall->userParameter, err, vmdLogicalStatus, vmdPhysicalStatus); + } } removeFromOutstandingCalls(self, outstandingCall->invokeId); @@ -2690,26 +2706,91 @@ MmsConnection_identify(MmsConnection self, MmsError* mmsError) return identity; } +struct getServerStatusParameters +{ + Semaphore waitForResponse; + MmsError err; + int vmdLogicalStatus; + int vmdPhysicalStatus; +}; + +static void +getServerStatusHandler(int invokeId, void* parameter, MmsError mmsError, int vmdLogicalStatus, int vmdPhysicalStatus) +{ + struct getServerStatusParameters* parameters = (struct getServerStatusParameters*) parameter; + + parameters->err = mmsError; + parameters->vmdLogicalStatus = vmdLogicalStatus; + parameters->vmdPhysicalStatus = vmdPhysicalStatus; + + /* unblock user thread */ + Semaphore_post(parameters->waitForResponse); +} + + void MmsConnection_getServerStatus(MmsConnection self, MmsError* mmsError, int* vmdLogicalStatus, int* vmdPhysicalStatus, -bool extendedDerivation) + bool extendedDerivation) +{ + struct getServerStatusParameters parameter; + + MmsError err = MMS_ERROR_NONE; + + parameter.waitForResponse = Semaphore_create(1); + parameter.err = MMS_ERROR_NONE; + parameter.vmdLogicalStatus = 0; + parameter.vmdPhysicalStatus = 0; + + Semaphore_wait(parameter.waitForResponse); + + MmsConnection_getServerStatusAsync(self, &err, extendedDerivation, getServerStatusHandler, ¶meter); + + if (err == MMS_ERROR_NONE) { + Semaphore_wait(parameter.waitForResponse); + err = parameter.err; + + if (vmdLogicalStatus) + *vmdLogicalStatus = parameter.vmdLogicalStatus; + + if (vmdPhysicalStatus) + *vmdPhysicalStatus = parameter.vmdPhysicalStatus; + } + + Semaphore_destroy(parameter.waitForResponse); + + if (mmsError) + *mmsError = err; + +} + +uint32_t +MmsConnection_getServerStatusAsync(MmsConnection self, MmsError* mmsError, bool extendedDerivation, + MmsConnection_GetServerStatusHandler handler, void* parameter) { + uint32_t invokeId = 0; + + if (getAssociationState(self) != MMS_STATE_CONNECTED) { + if (mmsError) + *mmsError = MMS_ERROR_CONNECTION_LOST; + goto exit_function; + } + ByteBuffer* payload = IsoClientConnection_allocateTransmitBuffer(self->isoClient); - uint32_t invokeId = getNextInvokeId(self); + invokeId = getNextInvokeId(self); mmsClient_createStatusRequest(invokeId, payload, extendedDerivation); - ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload, mmsError); + MmsError err = sendAsyncRequest(self, invokeId, payload, MMS_CALL_TYPE_GET_SERVER_STATUS, handler, parameter); - if (responseMessage != NULL) { - if (mmsClient_parseStatusResponse(self, vmdLogicalStatus, vmdPhysicalStatus) == false) - *mmsError = MMS_ERROR_PARSING_RESPONSE; - } + if (mmsError) + *mmsError = err; - releaseResponse(self); +exit_function: + return invokeId; } + static LinkedList readJournal(MmsConnection self, MmsError* mmsError, uint32_t invokeId, ByteBuffer* payload, bool* moreFollows) { diff --git a/src/mms/iso_mms/client/mms_client_status.c b/src/mms/iso_mms/client/mms_client_status.c index 80853587..288bbafe 100644 --- a/src/mms/iso_mms/client/mms_client_status.c +++ b/src/mms/iso_mms/client/mms_client_status.c @@ -50,11 +50,10 @@ mmsClient_createStatusRequest(uint32_t invokeId, ByteBuffer* request, bool exten } bool -mmsClient_parseStatusResponse(MmsConnection self, int* vmdLogicalStatus, int* vmdPhysicalStatus) +mmsClient_parseStatusResponse(MmsConnection self, ByteBuffer* response, int bufPos, int* vmdLogicalStatus, int* vmdPhysicalStatus) { - uint8_t* buffer = self->lastResponse->buffer; - int maxBufPos = self->lastResponse->size; - int bufPos = self->lastResponseBufPos; + uint8_t* buffer = ByteBuffer_getBuffer(response); + int maxBufPos = ByteBuffer_getSize(response); int length; uint8_t tag = buffer[bufPos++];