[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 d64c925..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,
@@ -75,7 +168,7 @@ CAResult_t CAAddLEServerInfoToList(LEServerInfoList **serverList,
     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);
 
@@ -123,10 +214,8 @@ void CARemoveLEServerInfoFromList(LEServerInfoList **serverList,
             {
                 prev->next = temp->next;
             }
-            CADecrementRegisteredServiceCount();
-            bt_gatt_client_destroy(temp->serverInfo->clientHandle);
-            OICFree(temp->serverInfo->remoteAddress);
-            OICFree(temp->serverInfo);
+            
+            CAFreeLEServerInfo(temp->serverInfo);
             OICFree(temp);
             OIC_LOG_V(DEBUG, TAG, "Device [%s] removed from list", remoteAddress);
             break;
@@ -144,10 +233,15 @@ CAResult_t CAGetLEServerInfo(LEServerInfoList *serverList, const char *leAddress
 
     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)
@@ -166,37 +260,7 @@ CAResult_t CAGetLEServerInfo(LEServerInfoList *serverList, const char *leAddress
     return CA_STATUS_FAILED;
 }
 
-CAResult_t CAGetLEServerInfoByPosition(LEServerInfoList *serverList, int32_t position,
-                                       LEServerInfo **leServerInfo)
-{
-    OIC_LOG(DEBUG, TAG, "IN");
 
-    VERIFY_NON_NULL(serverList, TAG, "clientList");
-    VERIFY_NON_NULL(leServerInfo, TAG, "leClientInfo");
-
-    if (0 > position)
-    {
-        OIC_LOG(ERROR, TAG, "Position Invalid input !");
-        return CA_STATUS_INVALID_PARAM;
-    }
-
-    *leServerInfo = NULL;
-    int32_t count = 0;
-    LEServerInfoList *cur = serverList;
-    while (cur != NULL)
-    {
-        if (position == count)
-        {
-            *leServerInfo = cur->serverInfo;
-            OIC_LOG(DEBUG, TAG, "OUT");
-            return CA_STATUS_OK;
-        }
-        count++;
-        cur = cur->next;
-    }
-    OIC_LOG(DEBUG, TAG, "Client info not found for the position");
-    return CA_STATUS_FAILED;
-}
 
 void CAFreeLEServerList(LEServerInfoList *serverList)
 {
@@ -216,10 +280,18 @@ void CAFreeLEServerInfo(LEServerInfo *leServerInfo)
     OIC_LOG(DEBUG, TAG, "IN");
     if (leServerInfo)
     {
-        if (leServerInfo->remoteAddress)
+        if (leServerInfo->clientHandle)
         {
             bt_gatt_client_destroy(leServerInfo->clientHandle);
-            int32_t ret = bt_gatt_disconnect(leServerInfo->remoteAddress);
+        }
+
+        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)
             {
@@ -228,8 +300,8 @@ void CAFreeLEServerInfo(LEServerInfo *leServerInfo)
                           ret);
                 return;
             }
-            OICFree(leServerInfo->remoteAddress);
         }
+        OICFree(leServerInfo->remoteAddress);
         OICFree(leServerInfo);
     }
     OIC_LOG(DEBUG, TAG, "OUT");
@@ -250,6 +322,7 @@ CAResult_t CAAddLEClientInfoToList(LEClientInfoList **clientList,
     }
 
     node->remoteAddress= clientAddress;
+    node->mtuSize = 0;
     node->next = NULL;
 
     if (*clientList == NULL)   // Empty list
@@ -267,6 +340,45 @@ CAResult_t CAAddLEClientInfoToList(LEClientInfoList **clientList,
     return CA_STATUS_OK;
 }
 
+uint16_t CAClientInfoGetMTUSize(LEClientInfoList *clientList,
+                                        const char *clientAddress)
+{
+    OIC_LOG(DEBUG, TAG, "IN");
+
+    LEClientInfoList *temp = clientList;
+    while (temp)
+    {
+        if (!strcasecmp(temp->remoteAddress, clientAddress))
+        {
+            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;
+        }
+        temp = temp->next;
+    }
+
+    OIC_LOG(DEBUG, TAG, "OUT");
+    return CA_STATUS_FAILED;
+}
+
 CAResult_t CAIsLEClientInfoInList(LEClientInfoList *clientList,
                                         const char *clientAddress)
 {