//-------------------------------------------------------------------------------------------------- static void List ( void ) //-------------------------------------------------------------------------------------------------- { le_msg_MessageRef_t msgRef = le_msg_CreateMsg(SessionRef); le_msg_SetFd(msgRef, 1); le_sdtp_Msg_t* msgPtr = le_msg_GetPayloadPtr(msgRef); msgPtr->msgType = LE_SDTP_MSGID_LIST; msgRef = le_msg_RequestSyncResponse(msgRef); if (msgRef == NULL) { ExitWithErrorMsg("Communication with Service Directory failed."); } le_msg_ReleaseMsg(msgRef); exit(EXIT_SUCCESS); }
//-------------------------------------------------------------------------------------------------- void FileTestRespond ( ServerCmdRef_t _cmdRef, int dataOut ) { LE_ASSERT(_cmdRef != NULL); // Get the message related data le_msg_MessageRef_t _msgRef = (le_msg_MessageRef_t)_cmdRef; _Message_t* _msgPtr = le_msg_GetPayloadPtr(_msgRef); __attribute__((unused)) uint8_t* _msgBufPtr = _msgPtr->buffer; // Ensure the passed in msgRef is for the correct message LE_ASSERT(_msgPtr->id == _MSGID_FileTest); // Ensure that this Respond function has not already been called LE_FATAL_IF( !le_msg_NeedsResponse(_msgRef), "Response has already been sent"); // Pack any "out" parameters le_msg_SetFd(_msgRef, dataOut); // Return the response LE_DEBUG("Sending response to client session %p", le_msg_GetSession(_msgRef)); le_msg_Respond(_msgRef); }
static void AsyncResponse_TestCallback ( uint32_t data, const char* name, int dataFile, void* contextPtr ) { le_msg_MessageRef_t _msgRef; _Message_t* _msgPtr; _ServerData_t* serverDataPtr = (_ServerData_t*)contextPtr; // This is a one-time handler; if the server accidently calls it a second time, then // the client sesssion ref would be NULL. if ( serverDataPtr->clientSessionRef == NULL ) { LE_FATAL("Handler passed to TestCallback() can't be called more than once"); } // Will not be used if no data is sent back to client __attribute__((unused)) uint8_t* _msgBufPtr; // Create a new message object and get the message buffer _msgRef = le_msg_CreateMsg(serverDataPtr->clientSessionRef); _msgPtr = le_msg_GetPayloadPtr(_msgRef); _msgPtr->id = _MSGID_TestCallback; _msgBufPtr = _msgPtr->buffer; // Always pack the client context pointer first _msgBufPtr = PackData( _msgBufPtr, &(serverDataPtr->contextPtr), sizeof(void*) ); // Pack the input parameters _msgBufPtr = PackData( _msgBufPtr, &data, sizeof(uint32_t) ); _msgBufPtr = PackString( _msgBufPtr, name ); le_msg_SetFd(_msgRef, dataFile); // Send the async response to the client LE_DEBUG("Sending message to client session %p : %ti bytes sent", serverDataPtr->clientSessionRef, _msgBufPtr-_msgPtr->buffer); SendMsgToClient(_msgRef); // The registered handler has been called, so no longer need the server data. // Explicitly set clientSessionRef to NULL, so that we can catch if this function gets // accidently called again. serverDataPtr->clientSessionRef = NULL; le_mem_Release(serverDataPtr); }
static void Handle_FileTest ( le_msg_MessageRef_t _msgRef ) { // Get the message buffer pointer uint8_t* _msgBufPtr = ((_Message_t*)le_msg_GetPayloadPtr(_msgRef))->buffer; // Needed if we are returning a result or output values uint8_t* _msgBufStartPtr = _msgBufPtr; // Unpack the input parameters from the message int dataFile; dataFile = le_msg_GetFd(_msgRef); // Define storage for output parameters int dataOut; // Call the function FileTest ( dataFile, &dataOut ); // Re-use the message buffer for the response _msgBufPtr = _msgBufStartPtr; // Pack any "out" parameters le_msg_SetFd(_msgRef, dataOut); // Return the response LE_DEBUG("Sending response to client session %p : %ti bytes sent", le_msg_GetSession(_msgRef), _msgBufPtr-_msgBufStartPtr); le_msg_Respond(_msgRef); }