*/
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,
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;
}
*serverList = node;
}
- CAIncrementRegisteredServiceCount();
-
OIC_LOG_V(DEBUG, TAG, "Device [%s] added to list",
leServerInfo->remoteAddress);
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)
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 (leServerInfo->pendingDataList)
+ {
+ CADestroyLEDataList(&(leServerInfo->pendingDataList));
+ }
- if (0 > position)
+ 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
{
- if (position == count)
+ 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 (!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)
{
ret);
return;
}
- OICFree(leServerInfo->remoteAddress);
+ OICFree(temp->remoteAddress);
}
- OICFree(leServerInfo);
+ OICFree(temp);
}
OIC_LOG(DEBUG, TAG, "OUT");
}
case BT_ERROR_NOT_SUPPORTED:
errStr = "BT_ERROR_NOT_SUPPORTED";
break;
+ case BT_ERROR_QUOTA_EXCEEDED:
+ errStr = "BT_ERROR_QUOTA_EXCEEDED";
+ break;
+ case BT_ERROR_NO_DATA:
+ errStr = "BT_ERROR_NO_DATA";
+ break;
+ case BT_ERROR_AGAIN:
+ errStr = "BT_ERROR_AGAIN";
+ break;
default:
errStr = "NOT Defined";
break;