[CONPRO-1471]Adding logic for caching MTU in tizen LE Server
[platform/upstream/iotivity.git] / resource / csdk / connectivity / src / bt_le_adapter / tizen / caleutil.c
old mode 100644 (file)
new mode 100755 (executable)
index 07600f0..0c12e25
  */
 static int32_t g_numberOfServiceConnected = 0;
 
-void CAIncrementRegisteredServiceCount()
+/*void CAIncrementRegisteredServiceCount()
 {
     g_numberOfServiceConnected++;
+}*/
+
+CAResult_t CAAddLEDataToList(LEDataList **dataList, const void *data, uint32_t dataLength)
+{
+    OIC_LOG(DEBUG, TAG, "IN");
+
+    VERIFY_NON_NULL(dataList, TAG, "Data list is null");
+    VERIFY_NON_NULL(data, TAG, "data is null");
+
+    if (0 == dataLength)
+    {
+        OIC_LOG(ERROR, TAG, "Invalid input: data length is zero!");
+        return CA_STATUS_INVALID_PARAM;
+    }
+
+    LEDataList *pending_data = (LEDataList *) OICMalloc(sizeof(LEDataList));
+    if (NULL == pending_data)
+    {
+        OIC_LOG(ERROR, TAG, "OICMalloc failed (data list)!");
+        return CA_MEMORY_ALLOC_FAILED;
+    }
+
+    pending_data->data = (LEData *) OICMalloc(sizeof(LEData));
+    if (NULL == pending_data->data)
+    {
+        OIC_LOG(ERROR, TAG, "OICMalloc failed (data node)!");
+        OICFree(pending_data);
+        return CA_MEMORY_ALLOC_FAILED;
+    }
+
+    pending_data->next = NULL;
+    pending_data->data->data = (void *) OICMalloc(dataLength); //data
+    if (NULL == pending_data->data->data)
+    {
+        OIC_LOG(ERROR, TAG, "OICMalloc failed (data)!");
+        OICFree(pending_data->data);
+        OICFree(pending_data);
+        return CA_MEMORY_ALLOC_FAILED;
+    }
+
+    memcpy(pending_data->data->data, data, dataLength);
+    pending_data->data->dataLength = dataLength;
+
+    if (NULL == *dataList)
+    {
+        *dataList = pending_data;
+    }
+    else
+    {
+        LEDataList *curNode = *dataList;
+        while (curNode->next != NULL)
+        {
+            curNode = curNode->next;
+        }
+        curNode->next = pending_data;
+    }
+
+    OIC_LOG(DEBUG, TAG, "OUT");
+    return CA_STATUS_OK;
 }
 
-void CADecrementRegisteredServiceCount()
+
+void CARemoveLEDataFromList(LEDataList **dataList)
 {
-    g_numberOfServiceConnected--;
+    OIC_LOG(DEBUG, TAG, "IN");
+
+    VERIFY_NON_NULL_VOID(dataList, TAG, "Data list is null");
+
+    if (*dataList)
+    {
+        LEDataList *curNode = *dataList;
+        *dataList = (*dataList)->next;
+
+        //Delete the first node
+        CADestroyLEData(curNode->data);
+        OICFree(curNode);
+    }
+
+    OIC_LOG(DEBUG, TAG, "OUT");
 }
 
-void CAResetRegisteredServiceCount()
+void CADestroyLEDataList(LEDataList **dataList)
 {
-    g_numberOfServiceConnected = 0;
+    OIC_LOG(DEBUG, TAG, "IN");
+
+    VERIFY_NON_NULL_VOID(dataList, TAG, "Data list is null");
+
+    while (*dataList)
+    {
+        LEDataList *curNode = *dataList;
+        *dataList = (*dataList)->next;
+
+        CADestroyLEData(curNode->data);
+        OICFree(curNode);
+    }
+
+    *dataList = NULL;
+
+    OIC_LOG(DEBUG, TAG, "OUT");
 }
 
-int32_t  CAGetRegisteredServiceCount()
+void CADestroyLEData(LEData *data)
 {
-    return g_numberOfServiceConnected ;
+    if (data)
+    {
+        OICFree(data->data);
+        OICFree(data);
+    }
 }
 
 CAResult_t CAAddLEServerInfoToList(LEServerInfoList **serverList,
@@ -69,13 +162,13 @@ CAResult_t CAAddLEServerInfoToList(LEServerInfoList **serverList,
 
     OIC_LOG(DEBUG, TAG, "IN");
 
-    VERIFY_NON_NULL(serverList, TAG, "clientList");
-    VERIFY_NON_NULL(leServerInfo, TAG, "leClientInfo");
+    VERIFY_NON_NULL(serverList, TAG, "serverList");
+    VERIFY_NON_NULL(leServerInfo, TAG, "leServerInfo");
 
     LEServerInfoList *node = (LEServerInfoList *) OICCalloc(1, sizeof(LEServerInfoList));
     if (NULL == node)
     {
-        OIC_LOG(ERROR, TAG, "Malloc failed!");
+        OIC_LOG(ERROR, TAG, "Calloc failed!");
         return CA_STATUS_FAILED;
     }
 
@@ -92,8 +185,6 @@ CAResult_t CAAddLEServerInfoToList(LEServerInfoList **serverList,
         *serverList = node;
     }
 
-    CAIncrementRegisteredServiceCount();
-
     OIC_LOG_V(DEBUG, TAG, "Device [%s] added to list",
               leServerInfo->remoteAddress);
 
@@ -102,16 +193,55 @@ CAResult_t CAAddLEServerInfoToList(LEServerInfoList **serverList,
     return CA_STATUS_OK;
 }
 
+void CARemoveLEServerInfoFromList(LEServerInfoList **serverList,
+                                        const char *remoteAddress)
+{
+    OIC_LOG(DEBUG, TAG, "IN");
+    VERIFY_NON_NULL_VOID(serverList, TAG, "serverList");
+    VERIFY_NON_NULL_VOID(remoteAddress, TAG, "remoteAddress");
+
+    LEServerInfoList *temp = *serverList;
+    LEServerInfoList *prev = NULL;
+    while (temp)
+    {
+        if (!strcasecmp(temp->serverInfo->remoteAddress, remoteAddress))
+        {
+            if (NULL == prev)
+            {
+                *serverList = temp->next;
+            }
+            else
+            {
+                prev->next = temp->next;
+            }
+            
+            CAFreeLEServerInfo(temp->serverInfo);
+            OICFree(temp);
+            OIC_LOG_V(DEBUG, TAG, "Device [%s] removed from list", remoteAddress);
+            break;
+        }
+        prev = temp;
+        temp = temp->next;
+    }
+
+    OIC_LOG(DEBUG, TAG, "OUT");
+}
+
 CAResult_t CAGetLEServerInfo(LEServerInfoList *serverList, const char *leAddress,
                              LEServerInfo **leServerInfo)
 {
 
     OIC_LOG(DEBUG, TAG, "IN");
 
-    VERIFY_NON_NULL(serverList, TAG, "clientList");
     VERIFY_NON_NULL(leServerInfo, TAG, "leClientInfo");
     VERIFY_NON_NULL(leAddress, TAG, "leAddress");
 
+    if (NULL == serverList)
+    {
+        OIC_LOG(DEBUG, TAG, "Server list is empty");
+        return CA_STATUS_FAILED;
+    }
+
     LEServerInfoList *cur = serverList;
     *leServerInfo = NULL;
     while (cur != NULL)
@@ -130,60 +260,186 @@ CAResult_t CAGetLEServerInfo(LEServerInfoList *serverList, const char *leAddress
     return CA_STATUS_FAILED;
 }
 
-CAResult_t CAGetLEServerInfoByPosition(LEServerInfoList *serverList, int32_t position,
-                                       LEServerInfo **leServerInfo)
+
+
+void CAFreeLEServerList(LEServerInfoList *serverList)
 {
     OIC_LOG(DEBUG, TAG, "IN");
+    while (serverList)
+    {
+        LEServerInfoList *temp = serverList;
+        serverList = serverList->next;
+        CAFreeLEServerInfo(temp->serverInfo);
+        OICFree(temp);
+    }
+    OIC_LOG(DEBUG, TAG, "OUT");
+}
 
-    VERIFY_NON_NULL(serverList, TAG, "clientList");
-    VERIFY_NON_NULL(leServerInfo, TAG, "leClientInfo");
+void CAFreeLEServerInfo(LEServerInfo *leServerInfo)
+{
+    OIC_LOG(DEBUG, TAG, "IN");
+    if (leServerInfo)
+    {
+        if (leServerInfo->clientHandle)
+        {
+            bt_gatt_client_destroy(leServerInfo->clientHandle);
+        }
 
-    if (0 > position)
+        if (leServerInfo->pendingDataList)
+        {
+            CADestroyLEDataList(&(leServerInfo->pendingDataList));
+        }
+
+        if (leServerInfo->status > LE_STATUS_CONNECTED)
+        {    int32_t ret = bt_gatt_disconnect(leServerInfo->remoteAddress);
+
+            if (BT_ERROR_NONE != ret)
+            {
+                OIC_LOG_V(ERROR, TAG,
+                          "bt_gatt_disconnect Failed with ret value [%d]",
+                          ret);
+                return;
+            }
+        }
+        OICFree(leServerInfo->remoteAddress);
+        OICFree(leServerInfo);
+    }
+    OIC_LOG(DEBUG, TAG, "OUT");
+}
+
+CAResult_t CAAddLEClientInfoToList(LEClientInfoList **clientList,
+                                   char *clientAddress)
+{
+    OIC_LOG(DEBUG, TAG, "IN");
+    VERIFY_NON_NULL(clientList, TAG, "clientList");
+    VERIFY_NON_NULL(clientAddress, TAG, "clientAddress");
+
+    LEClientInfoList *node = (LEClientInfoList *) OICCalloc(1, sizeof(LEClientInfoList));
+    if (NULL == node)
     {
-        OIC_LOG(ERROR, TAG, "Position Invalid input !");
-        return CA_STATUS_INVALID_PARAM;
+        OIC_LOG(ERROR, TAG, "Malloc failed!");
+        return CA_STATUS_FAILED;
     }
 
-    *leServerInfo = NULL;
-    int32_t count = 0;
-    LEServerInfoList *cur = serverList;
-    while (cur != NULL)
+    node->remoteAddress= clientAddress;
+    node->mtuSize = 0;
+    node->next = NULL;
+
+    if (*clientList == NULL)   // Empty list
+    {
+        *clientList = node;
+    }
+    else     // Add at front end
+    {
+        node->next = *clientList;
+        *clientList = node;
+    }
+
+    OIC_LOG_V(DEBUG, TAG, "Device [%s] added to list", clientAddress);
+    OIC_LOG(DEBUG, TAG, "OUT");
+    return CA_STATUS_OK;
+}
+
+uint16_t CAClientInfoGetMTUSize(LEClientInfoList *clientList,
+                                        const char *clientAddress)
+{
+    OIC_LOG(DEBUG, TAG, "IN");
+
+    LEClientInfoList *temp = clientList;
+    while (temp)
     {
-        if (position == count)
+        if (!strcasecmp(temp->remoteAddress, clientAddress))
         {
-            *leServerInfo = cur->serverInfo;
-            OIC_LOG(DEBUG, TAG, "OUT");
+            return temp->mtuSize;
+        }
+        temp = temp->next;
+    }
+
+    OIC_LOG(DEBUG, TAG, "OUT");
+    return 0;
+}
+
+CAResult_t CAClientInfoUpdateMTUSize(LEClientInfoList *clientList,
+                                        const char *clientAddress,uint16_t mtu_size)
+{
+    OIC_LOG(DEBUG, TAG, "IN");
+
+    LEClientInfoList *temp = clientList;
+    while (temp)
+    {
+        if (!strcasecmp(temp->remoteAddress, clientAddress))
+        {
+            temp->mtuSize = mtu_size;
             return CA_STATUS_OK;
         }
-        count++;
-        cur = cur->next;
+        temp = temp->next;
     }
-    OIC_LOG(DEBUG, TAG, "Client info not found for the position");
+
+    OIC_LOG(DEBUG, TAG, "OUT");
     return CA_STATUS_FAILED;
 }
 
-void CAFreeLEServerList(LEServerInfoList *clientList)
+CAResult_t CAIsLEClientInfoInList(LEClientInfoList *clientList,
+                                        const char *clientAddress)
 {
     OIC_LOG(DEBUG, TAG, "IN");
-    while (clientList)
+
+    LEClientInfoList *temp = clientList;
+    while (temp)
     {
-        LEServerInfoList *temp = clientList;
-        clientList = clientList->next;
-        CAFreeLEServerInfo(temp->serverInfo);
-        OICFree(temp);
+        if (!strcasecmp(temp->remoteAddress, clientAddress))
+        {
+            return CA_STATUS_OK;
+        }
+        temp = temp->next;
     }
+
     OIC_LOG(DEBUG, TAG, "OUT");
+    return CA_STATUS_FAILED;
 }
 
-void CAFreeLEServerInfo(LEServerInfo *leServerInfo)
+void CARemoveLEClientInfoFromList(LEClientInfoList **clientList,
+                                  const char *clientAddress)
 {
     OIC_LOG(DEBUG, TAG, "IN");
-    if (leServerInfo)
+    VERIFY_NON_NULL_VOID(clientAddress, TAG, "clientAddress");
+
+    LEClientInfoList *temp = *clientList;
+    LEClientInfoList *prev = NULL;
+    while (temp)
     {
-        if (leServerInfo->remoteAddress)
+        if (!strcasecmp(temp->remoteAddress, clientAddress))
         {
-            bt_gatt_client_destroy(leServerInfo->clientHandle);
-            int32_t ret = bt_gatt_disconnect(leServerInfo->remoteAddress);
+            if (NULL == prev)
+            {
+                *clientList = temp->next;
+            }
+            else
+            {
+                prev->next = temp->next;
+            }
+            OICFree(temp->remoteAddress);
+            OICFree(temp);
+            OIC_LOG_V(DEBUG, TAG, "Device [%s] removed from list", clientAddress);
+            break;
+        }
+        prev = temp;
+        temp = temp->next;
+    }
+
+    OIC_LOG(DEBUG, TAG, "OUT");
+}
+
+void CADisconnectAllClient(LEClientInfoList *clientList)
+{
+    OIC_LOG(DEBUG, TAG, "IN");
+    while (clientList)
+    {
+        LEClientInfoList *temp = clientList;
+        clientList = clientList->next;
+        if (temp->remoteAddress)
+        {
+            int32_t ret = bt_gatt_disconnect(temp->remoteAddress);
 
             if (BT_ERROR_NONE != ret)
             {
@@ -192,9 +448,9 @@ void CAFreeLEServerInfo(LEServerInfo *leServerInfo)
                           ret);
                 return;
             }
-            OICFree(leServerInfo->remoteAddress);
+            OICFree(temp->remoteAddress);
         }
-        OICFree(leServerInfo);
+        OICFree(temp);
     }
     OIC_LOG(DEBUG, TAG, "OUT");
 }