Esempio n. 1
0
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;
}
Esempio n. 2
0
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;
}