Example #1
0
//--------------------------------------------------------------------------------------------------
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);
    }
}
Example #2
0
//--------------------------------------------------------------------------------------------------
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);
    }
}
Example #3
0
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;
}
Example #4
0
static void mqttClient_processPingResp(mqttClient_t* clientData)
{
  LE_DEBUG("---> PINGRESP");
  LE_ASSERT(clientData);
  le_timer_Restart(clientData->session.pingTimer);
}