OCStackResult OCRDDatabaseCheckResources(const char *interfaceType, const char *resourceType, OCDiscoveryPayload *discPayload) { if (initializeDatabase(NULL) != OC_STACK_OK) { return OC_STACK_INTERNAL_SERVER_ERROR; } if (!interfaceType && !resourceType) { return OC_STACK_INVALID_QUERY; } OCResourcePayload *resourcePayload = (OCResourcePayload *)OICCalloc(1, sizeof(OCResourcePayload)); if (!resourcePayload) { return OC_STACK_NO_MEMORY; } if (resourceType) { sqlite3_stmt *stmt = 0; const char *input = "SELECT * FROM RD_DEVICE_LINK_LIST INNER JOIN RD_LINK_RT ON " \ "RD_DEVICE_LINK_LIST.INS=RD_LINK_RT.LINK_ID WHERE RD_LINK_RT.rt LIKE ? "; VERIFY_SQLITE(sqlite3_prepare_v2(gRDDB, input, -1, &stmt, NULL)); VERIFY_SQLITE(sqlite3_bind_text(stmt, 1, resourceType, strlen(resourceType) + 1, SQLITE_STATIC)); int res = sqlite3_step (stmt); if (res == SQLITE_ROW || res == SQLITE_DONE) { int id = sqlite3_column_int(stmt, 0); const unsigned char *uri = sqlite3_column_text(stmt, uri_index - 1); int bitmap = sqlite3_column_int(stmt, p_index - 1); int deviceId = sqlite3_column_int(stmt, d_index - 1); OIC_LOG_V(DEBUG, TAG, " %s %d", uri, deviceId); resourcePayload->uri = OICStrdup((char *)uri); if (!resourcePayload->uri) { OCDiscoveryResourceDestroy(resourcePayload); return OC_STACK_NO_MEMORY; } res = sqlite3_reset(stmt); VERIFY_SQLITE(res); sqlite3_stmt *stmtRT = 0; const char *rt = "SELECT rt FROM RD_LINK_RT WHERE LINK_ID=?"; VERIFY_SQLITE(sqlite3_prepare_v2(gRDDB, rt, -1, &stmtRT, NULL)); VERIFY_SQLITE(sqlite3_bind_int(stmtRT, 1, id)); while (SQLITE_ROW == sqlite3_step(stmtRT)) { const unsigned char *rt1 = sqlite3_column_text(stmtRT, (rt_value_index - 1)); appendStringLL(&resourcePayload->types, rt1); } sqlite3_stmt *stmtIF = 0; const char *itf = "SELECT if FROM RD_LINK_IF WHERE LINK_ID=?"; VERIFY_SQLITE(sqlite3_prepare_v2(gRDDB, itf, -1, &stmtIF, NULL)); VERIFY_SQLITE(sqlite3_bind_int(stmtIF, 1, id)); while (SQLITE_ROW == sqlite3_step(stmtIF)) { const unsigned char *itf = sqlite3_column_text(stmtIF, (if_value_index - 1)); appendStringLL(&resourcePayload->interfaces, itf); } resourcePayload->bitmap = bitmap & (OC_OBSERVABLE | OC_DISCOVERABLE); resourcePayload->secure = (bitmap & OC_SECURE) != 0; const char *address = "SELECT di, address FROM RD_DEVICE_LIST INNER JOIN RD_DEVICE_LINK_LIST ON " \ "RD_DEVICE_LINK_LIST.DEVICE_ID = RD_DEVICE_LIST.ID WHERE RD_DEVICE_LINK_LIST.DEVICE_ID=?"; sqlite3_stmt *stmt1 = 0; VERIFY_SQLITE(sqlite3_prepare_v2(gRDDB, address, -1, &stmt1, NULL)); VERIFY_SQLITE(sqlite3_bind_int(stmt1, 1, deviceId)); // TODO: Right now, we have a bug where discovery payload can only send one device information. res = sqlite3_step(stmt1); if (res == SQLITE_ROW || res == SQLITE_DONE) { const unsigned char *di = sqlite3_column_text(stmt1, 0); const unsigned char *address = sqlite3_column_text(stmt1, 1); OIC_LOG_V(DEBUG, TAG, " %s %s", di, address); (discPayload)->baseURI = OICStrdup((char *)address); (discPayload)->sid = OICStrdup((char *)di); } OCDiscoveryPayloadAddNewResource(discPayload, resourcePayload); } } if (interfaceType) { sqlite3_stmt *stmt = 0; const char *input = "SELECT * FROM RD_DEVICE_LINK_LIST INNER JOIN RD_LINK_IF ON " \ "RD_DEVICE_LINK_LIST.INS=RD_LINK_IF.LINK_ID WHERE RD_LINK_IF.if LIKE ? "; VERIFY_SQLITE(sqlite3_prepare_v2(gRDDB, input, -1, &stmt, NULL)); VERIFY_SQLITE(sqlite3_bind_text(stmt, 1, interfaceType, strlen(interfaceType) + 1, SQLITE_STATIC)); int res = sqlite3_step (stmt); if (res == SQLITE_ROW || res == SQLITE_DONE) { int id = sqlite3_column_int(stmt, 0); const unsigned char *uri = sqlite3_column_text(stmt, uri_index - 1); int bitmap = sqlite3_column_int(stmt, p_index - 1); int deviceId = sqlite3_column_int(stmt, d_index - 1); OIC_LOG_V(DEBUG, TAG, " %s %d", uri, deviceId); resourcePayload->uri = OICStrdup((char *)uri); if (!resourcePayload->uri) { OCDiscoveryResourceDestroy(resourcePayload); return OC_STACK_NO_MEMORY; } VERIFY_SQLITE(sqlite3_reset(stmt)); sqlite3_stmt *stmtRT = 0; const char *rt = "SELECT rt FROM RD_LINK_RT WHERE LINK_ID=?"; VERIFY_SQLITE(sqlite3_prepare_v2(gRDDB, rt, -1, &stmtRT, NULL)); VERIFY_SQLITE(sqlite3_bind_int(stmtRT, 1, id)); while (SQLITE_ROW == sqlite3_step(stmtRT)) { const unsigned char *rt1 = sqlite3_column_text(stmtRT, (rt_value_index - 1)); appendStringLL(&resourcePayload->types, rt1); } sqlite3_stmt *stmtIF = 0; const char *itf = "SELECT if FROM RD_LINK_IF WHERE LINK_ID=?"; VERIFY_SQLITE(sqlite3_prepare_v2(gRDDB, itf, -1, &stmtIF, NULL)); VERIFY_SQLITE(sqlite3_bind_int(stmtIF, 1, id)); while (SQLITE_ROW == sqlite3_step (stmtIF)) { const unsigned char *itf = sqlite3_column_text(stmtIF, (if_value_index - 1)); appendStringLL(&resourcePayload->interfaces, itf); } resourcePayload->bitmap = bitmap & (OC_OBSERVABLE | OC_DISCOVERABLE); resourcePayload->secure = ((bitmap & OC_SECURE) != 0); const char *address = "SELECT di, address FROM RD_DEVICE_LIST INNER JOIN RD_DEVICE_LINK_LIST ON " \ "RD_DEVICE_LINK_LIST.DEVICE_ID = RD_DEVICE_LIST.ID WHERE RD_DEVICE_LINK_LIST.DEVICE_ID=?"; sqlite3_stmt *stmt1 = 0; VERIFY_SQLITE(sqlite3_prepare_v2(gRDDB, address, -1, &stmt1, NULL)); VERIFY_SQLITE(sqlite3_bind_int(stmt1, 1, deviceId)); res = sqlite3_step(stmt1); if (res == SQLITE_ROW || res == SQLITE_DONE) { const unsigned char *di = sqlite3_column_text(stmt1, 0); const unsigned char *address = sqlite3_column_text(stmt1, 1); OIC_LOG_V(DEBUG, TAG, " %s %s", di, address); (discPayload)->baseURI = OICStrdup((char *)address); (discPayload)->sid = OICStrdup((char *)di); } OCDiscoveryPayloadAddNewResource(discPayload, resourcePayload); } } return OC_STACK_OK; }
static OCStackResult OCParseDiscoveryPayload(OCPayload **outPayload, CborValue *rootValue) { OCStackResult ret = OC_STACK_INVALID_PARAM; OCResourcePayload *resource = NULL; OCDiscoveryPayload *out = NULL; size_t len = 0; CborError err = CborNoError; *outPayload = NULL; VERIFY_PARAM_NON_NULL(TAG, outPayload, "Invalid Parameter outPayload"); VERIFY_PARAM_NON_NULL(TAG, rootValue, "Invalid Parameter rootValue"); // Root value is already inside the main root array CborValue rootMap; ret = OC_STACK_NO_MEMORY; out = OCDiscoveryPayloadCreate(); VERIFY_PARAM_NON_NULL(TAG, out, "Failed error initializing discovery payload"); // Enter the main root map ret = OC_STACK_MALFORMED_RESPONSE; err = cbor_value_enter_container(rootValue, &rootMap); VERIFY_CBOR_SUCCESS(TAG, err, "to enter root map container"); // Look for DI CborValue curVal; err = cbor_value_map_find_value(&rootMap, OC_RSRVD_DEVICE_ID, &curVal); VERIFY_CBOR_SUCCESS(TAG, err, "to find device id tag"); { err = cbor_value_dup_byte_string(&curVal, &(out->sid), &len, NULL); VERIFY_CBOR_SUCCESS(TAG, err, "to copy device id value"); } // BaseURI - Not a mandatory field err = cbor_value_map_find_value(&rootMap, OC_RSRVD_BASE_URI, &curVal); if (cbor_value_is_valid(&curVal)) { err = cbor_value_dup_text_string(&curVal, &(out->baseURI), &len, NULL); VERIFY_CBOR_SUCCESS(TAG, err, "to find base uri value"); } // Look for Links which will have an array as the value CborValue linkMap; err = cbor_value_map_find_value(&rootMap, OC_RSRVD_LINKS, &linkMap); VERIFY_CBOR_SUCCESS(TAG, err, "to find links tag"); // Enter the links array and start iterating through the array processing // each resource which shows up as a map. CborValue resourceMap; err = cbor_value_enter_container(&linkMap, &resourceMap); VERIFY_CBOR_SUCCESS(TAG, err, "to enter link map"); while (cbor_value_is_map(&resourceMap)) { resource = (OCResourcePayload *)OICCalloc(1, sizeof(OCResourcePayload)); VERIFY_PARAM_NON_NULL(TAG, resource, "Failed allocating resource payload"); // Uri err = cbor_value_map_find_value(&resourceMap, OC_RSRVD_HREF, &curVal); VERIFY_CBOR_SUCCESS(TAG, err, "to find href tag"); err = cbor_value_dup_text_string(&curVal, &(resource->uri), &len, NULL); VERIFY_CBOR_SUCCESS(TAG, err, "to find href value"); // ResourceTypes err = OCParseStringLL(&resourceMap, OC_RSRVD_RESOURCE_TYPE, &resource->types); VERIFY_CBOR_SUCCESS(TAG, err, "to find resource type tag/value"); // Interface Types err = OCParseStringLL(&resourceMap, OC_RSRVD_INTERFACE, &resource->interfaces); VERIFY_CBOR_SUCCESS(TAG, err, "to find interface tag/value"); // Policy CborValue policyMap; err = cbor_value_map_find_value(&resourceMap, OC_RSRVD_POLICY, &policyMap); VERIFY_CBOR_SUCCESS(TAG, err, "to find policy tag"); // Bitmap err = cbor_value_map_find_value(&policyMap, OC_RSRVD_BITMAP, &curVal); VERIFY_CBOR_SUCCESS(TAG, err, "to find bitmap tag"); err = cbor_value_get_int(&curVal, (int *)&resource->bitmap); VERIFY_CBOR_SUCCESS(TAG, err, "to find bitmap value"); // Secure Flag err = cbor_value_map_find_value(&policyMap, OC_RSRVD_SECURE, &curVal); if (cbor_value_is_valid(&curVal)) { err = cbor_value_get_boolean(&curVal, &(resource->secure)); VERIFY_CBOR_SUCCESS(TAG, err, "to find secure value"); } // Port err = cbor_value_map_find_value(&policyMap, OC_RSRVD_HOSTING_PORT, &curVal); if (cbor_value_is_valid(&curVal)) { err = cbor_value_get_int(&curVal, (int *)&resource->port); VERIFY_CBOR_SUCCESS(TAG, err, "to find port value"); } err = cbor_value_advance(&resourceMap); VERIFY_CBOR_SUCCESS(TAG, err, "to advance resource map"); OCDiscoveryPayloadAddNewResource(out, resource); } err = cbor_value_leave_container(rootValue, &resourceMap); VERIFY_CBOR_SUCCESS(TAG, err, "to advance resource map"); *outPayload = (OCPayload *)out; return OC_STACK_OK; exit: OCDiscoveryResourceDestroy(resource); OCDiscoveryPayloadDestroy(out); return ret; }