+ OIC_LOG_V(DEBUG, TAG, "OUT %s", __func__);
+ return OC_STACK_OK;
+}
+
+void PDMDestoryOicUuidLinkList(OCUuidList_t* ptr)
+{
+ OIC_LOG_V(DEBUG, TAG, "IN %s", __func__);
+
+ if(ptr)
+ {
+ OCUuidList_t *tmp1 = NULL,*tmp2=NULL;
+ LL_FOREACH_SAFE(ptr, tmp1, tmp2)
+ {
+ LL_DELETE(ptr, tmp1);
+ OICFree(tmp1);
+ }
+ }
+
+ OIC_LOG_V(DEBUG, TAG, "OUT %s", __func__);
+}
+
+void PDMDestoryStaleLinkList(OCPairList_t* ptr)
+{
+ OIC_LOG_V(DEBUG, TAG, "IN %s", __func__);
+
+ if(ptr)
+ {
+ OCPairList_t *tmp1 = NULL,*tmp2=NULL;
+ LL_FOREACH_SAFE(ptr, tmp1, tmp2)
+ {
+ LL_DELETE(ptr, tmp1);
+ OICFree(tmp1);
+ }
+ }
+
+ OIC_LOG_V(DEBUG, TAG, "OUT %s", __func__);
+}
+
+OCStackResult PDMIsLinkExists(const OicUuid_t* uuidOfDevice1, const OicUuid_t* uuidOfDevice2,
+ bool* result)
+{
+ OIC_LOG_V(DEBUG, TAG, "IN %s", __func__);
+
+ CHECK_PDM_INIT(TAG);
+ if (NULL == uuidOfDevice1 || NULL == uuidOfDevice2 || NULL == result)
+ {
+ return OC_STACK_INVALID_PARAM;
+ }
+ int id1 = 0;
+ int id2 = 0;
+ if (OC_STACK_OK != getIdForUUID(uuidOfDevice1, &id1))
+ {
+ OIC_LOG(ERROR, TAG, "Requested value not found");
+ return OC_STACK_INVALID_PARAM;
+ }
+
+ if (OC_STACK_OK != getIdForUUID(uuidOfDevice2, &id2))
+ {
+ OIC_LOG(ERROR, TAG, "Requested value not found");
+ return OC_STACK_INVALID_PARAM;
+ }
+
+ PdmDeviceState_t state = PDM_DEVICE_UNKNOWN;
+ if (OC_STACK_OK != PDMGetDeviceState(uuidOfDevice1, &state))
+ {
+ OIC_LOG(ERROR, TAG, "uuidOfDevice1:Internal error occured");
+ return OC_STACK_ERROR;
+ }
+ if (PDM_DEVICE_ACTIVE != state)
+ {
+ OIC_LOG_V(ERROR, TAG, "uuidOfDevice1:Device state is not active : %d", state);
+ return OC_STACK_INVALID_PARAM;
+ }
+
+ state = PDM_DEVICE_UNKNOWN;
+ if (OC_STACK_OK != PDMGetDeviceState(uuidOfDevice2, &state))
+ {
+ OIC_LOG(ERROR, TAG, "uuidOfDevice2:Internal error occured");
+ return OC_STACK_ERROR;
+ }
+ if (PDM_DEVICE_ACTIVE != state)
+ {
+ OIC_LOG_V(ERROR, TAG, "uuidOfDevice2:Device state is not active : %d", state);
+ return OC_STACK_INVALID_PARAM;
+ }
+
+ ASCENDING_ORDER(id1, id2);
+
+ sqlite3_stmt *stmt = 0;
+ int res = 0;
+ res = sqlite3_prepare_v2(g_db, PDM_SQLITE_GET_DEVICE_LINKS,
+ strlen(PDM_SQLITE_GET_DEVICE_LINKS) + 1, &stmt, NULL);
+ PDM_VERIFY_SQLITE_OK(TAG, res, ERROR, OC_STACK_ERROR);
+
+ res = sqlite3_bind_int(stmt, PDM_BIND_INDEX_FIRST, id1);
+ PDM_VERIFY_SQLITE_OK(TAG, res, ERROR, OC_STACK_ERROR);
+
+ res = sqlite3_bind_int(stmt, PDM_BIND_INDEX_SECOND, id2);
+ PDM_VERIFY_SQLITE_OK(TAG, res, ERROR, OC_STACK_ERROR);
+
+ bool ret = false;
+ while(SQLITE_ROW == sqlite3_step(stmt))
+ {
+ OIC_LOG(INFO, TAG, "Link already exists between devices");
+ ret = true;
+ }
+ sqlite3_finalize(stmt);
+ *result = ret;
+ OIC_LOG_V(DEBUG, TAG, "OUT %s", __func__);
+ return OC_STACK_OK;
+}
+
+static OCStackResult updateDeviceState(const OicUuid_t *uuid, PdmDeviceState_t state)
+{
+ OIC_LOG_V(DEBUG, TAG, "IN %s", __func__);
+
+ sqlite3_stmt *stmt = 0;
+ int res = 0 ;
+ res = sqlite3_prepare_v2(g_db, PDM_SQLITE_UPDATE_DEVICE,
+ strlen(PDM_SQLITE_UPDATE_DEVICE) + 1, &stmt, NULL);
+ PDM_VERIFY_SQLITE_OK(TAG, res, ERROR, OC_STACK_ERROR);
+
+ res = sqlite3_bind_int(stmt, PDM_BIND_INDEX_FIRST, state);
+ PDM_VERIFY_SQLITE_OK(TAG, res, ERROR, OC_STACK_ERROR);
+
+ res = sqlite3_bind_blob(stmt, PDM_BIND_INDEX_SECOND, uuid, UUID_LENGTH, SQLITE_STATIC);
+ PDM_VERIFY_SQLITE_OK(TAG, res, ERROR, OC_STACK_ERROR);
+
+ if (SQLITE_DONE != sqlite3_step(stmt))
+ {
+ OIC_LOG_V(ERROR, TAG, "Error message: %s", sqlite3_errmsg(g_db));
+ sqlite3_finalize(stmt);
+ return OC_STACK_ERROR;
+ }
+ sqlite3_finalize(stmt);
+ OIC_LOG_V(DEBUG, TAG, "OUT %s", __func__);
+ return OC_STACK_OK;
+}
+
+static OCStackResult updateLinkForStaleDevice(const OicUuid_t *devUuid)
+{
+ OIC_LOG_V(DEBUG, TAG, "IN %s", __func__);
+
+ sqlite3_stmt *stmt = 0;
+ int res = 0 ;
+
+ int id = 0;
+ if (OC_STACK_OK != getIdForUUID(devUuid, &id))
+ {
+ OIC_LOG(ERROR, TAG, "Requested value not found");
+ return OC_STACK_INVALID_PARAM;
+ }
+
+ res = sqlite3_prepare_v2(g_db, PDM_SQLITE_UPDATE_LINK_STALE_FOR_STALE_DEVICE,
+ strlen(PDM_SQLITE_UPDATE_LINK_STALE_FOR_STALE_DEVICE) + 1,
+ &stmt, NULL);
+ PDM_VERIFY_SQLITE_OK(TAG, res, ERROR, OC_STACK_ERROR);
+
+ res = sqlite3_bind_int(stmt, PDM_BIND_INDEX_FIRST, id);
+ PDM_VERIFY_SQLITE_OK(TAG, res, ERROR, OC_STACK_ERROR);
+
+ res = sqlite3_bind_int(stmt, PDM_BIND_INDEX_SECOND, id);
+ PDM_VERIFY_SQLITE_OK(TAG, res, ERROR, OC_STACK_ERROR);
+
+ if (SQLITE_DONE != sqlite3_step(stmt))
+ {
+ OIC_LOG_V(ERROR, TAG, "Error message: %s", sqlite3_errmsg(g_db));
+ sqlite3_finalize(stmt);
+ return OC_STACK_ERROR;
+ }
+ sqlite3_finalize(stmt);
+ OIC_LOG_V(DEBUG, TAG, "OUT %s", __func__);
+ return OC_STACK_OK;
+}
+
+OCStackResult PDMSetDeviceState(const OicUuid_t* uuid, PdmDeviceState_t state)
+{
+ OIC_LOG_V(DEBUG, TAG, "IN %s", __func__);
+
+ OCStackResult res = OC_STACK_ERROR;
+
+ CHECK_PDM_INIT(TAG);
+ if (NULL == uuid)
+ {
+ OIC_LOG(ERROR, TAG, "Invalid PARAM");
+ return OC_STACK_INVALID_PARAM;
+ }
+ begin();
+
+ if(PDM_DEVICE_STALE == state)
+ {
+ res = updateLinkForStaleDevice(uuid);
+ if (OC_STACK_OK != res)
+ {
+ rollback();
+ OIC_LOG(ERROR, TAG, "unable to update links");
+ return res;
+ }
+ }
+
+ res = updateDeviceState(uuid, state);
+ if (OC_STACK_OK != res)
+ {
+ rollback();
+ OIC_LOG(ERROR, TAG, "unable to update device state");
+ return res;
+ }
+ commit();
+ OIC_LOG_V(DEBUG, TAG, "OUT %s", __func__);