//-------------------------------------------------------------------------------------------------- void le_avdata_ReleaseSession ( le_avdata_RequestSessionObjRef_t sessionRequestRef ) { le_ref_IterRef_t iterRef; // Look up the reference. If it is NULL, then the reference is not valid. // Otherwise, delete the reference and request avcServer to release session. void* sessionPtr = le_ref_Lookup(AvSessionRequestRefMap, sessionRequestRef); if (sessionPtr == NULL) { LE_ERROR("Invalid session request reference %p", sessionPtr); return; } else { LE_PRINT_VALUE("%p", sessionPtr); le_ref_DeleteRef(AvSessionRequestRefMap, sessionRequestRef); } // Stop the session when all clients release their session reference. iterRef = le_ref_GetIterator(AvSessionRequestRefMap); if (le_ref_NextNode(iterRef) == LE_NOT_FOUND) { // Close the session if there is no new open request for 2 seconds. le_timer_Restart(SessionReleaseTimerRef); } }
//-------------------------------------------------------------------------------------------------- static void AssetActionHandler ( assetData_AssetDataRef_t assetRef, int instanceId, assetData_ActionTypes_t action, void* contextPtr ) { char appName[100]; int assetId; if ( assetData_GetAppNameFromAsset(assetRef, appName, sizeof(appName)) != LE_OK ) { LE_ERROR("Can't get app name from assetRef=%p", assetRef); return; } if ( assetData_GetAssetIdFromAsset(assetRef, &assetId) != LE_OK ) { LE_ERROR("Can't get assetId for app '%s' from assetRef=%p", appName, assetRef); return; } // Only interested in CREATE or DELETE actions; anything else is an error if ( action == ASSET_DATA_ACTION_CREATE ) { LE_INFO("/%s/%d/%d created.", appName, assetId, instanceId); // Start or restart the timer; will only report to the modem when the timer expires. // TODO: Probably need to revisit how this is done. le_timer_Restart(RegUpdateTimerRef); } else if ( action == ASSET_DATA_ACTION_DELETE ) { LE_INFO("/%s/%d/%d deleted.", appName, assetId, instanceId); // Start or restart the timer; will only report to the modem when the timer expires. // TODO: Probably need to revisit how this is done. le_timer_Restart(RegUpdateTimerRef); } else { LE_ERROR("Unexpected action %i on /%s/%d/%d.", action, appName, assetId, instanceId); } }
static int mqttClient_write(mqttClient_t* clientData, int length) { int bytes = length ? length:clientData->session.tx.bytesLeft; le_result_t rc = LE_OK; LE_ASSERT(clientData); clientData->session.cmdLen = length; if (clientData->session.sock == MQTT_CLIENT_INVALID_SOCKET) { rc = mqttClient_connect(clientData); if (rc) { LE_ERROR("mqttClient_connect() failed(%d)", errno); rc = LE_IO_ERROR; goto cleanup; } } else { while (bytes > 0) { mqttClient_dumpBuffer(clientData->session.tx.ptr, bytes); int sent = write(clientData->session.sock, clientData->session.tx.ptr, bytes); if (sent == -1) { if (errno == EAGAIN) { le_fdMonitor_Enable(clientData->session.sockFdMonitor, POLLOUT); clientData->session.tx.bytesLeft = bytes; LE_WARN("send blocked(%u)", clientData->session.tx.bytesLeft); goto cleanup; } else { LE_ERROR("write() failed(%d)", errno); rc = LE_IO_ERROR; goto cleanup; } } else { clientData->session.tx.ptr += sent; bytes -= sent; } } le_timer_Restart(clientData->session.pingTimer); clientData->session.tx.ptr = clientData->session.tx.buf; clientData->session.rx.ptr = clientData->session.rx.buf; } cleanup: return rc; }
static void mqttClient_processPingResp(mqttClient_t* clientData) { LE_DEBUG("---> PINGRESP"); LE_ASSERT(clientData); le_timer_Restart(clientData->session.pingTimer); }