예제 #1
0
void resourceFindCallback::foundResource(std::shared_ptr<OCResource> resource) {

    resourceCallbackMutex.lock();
    Dart_CObject* result = new Dart_CObject;

    // Indicate invocation
    m_callbackInvoked = true;

    try {
        // Check for a null resource
        if (resource == NULL) {
            // Return a boolean here to indicate no resources found
            Dart_CObject* servicePortObject = m_message->value.as_array.values[EXT_SERVICE_PORT];
            Dart_Port reply_port_id = servicePortObject->value.as_send_port.id;
            result->type = Dart_CObject_kBool;
            result->value.as_bool = false;
            Dart_PostCObject(reply_port_id, result);
            resourceCallbackMutex.unlock();
#ifdef DEBUG
            std::cout << "<<< foundResource - returned invalid result" << std::endl;
#endif
        } else {
#ifdef DEBUG
            //std::cout << "<<< foundResource - resource id is " << resource->uniqueIdentifier() << std::endl;
#endif
            // Build and return the result for a found resource
            
            // Host
            Dart_CObject* retHost = new Dart_CObject;
            std::string host = resource->host();
            retHost->type = Dart_CObject_kString;
            retHost->value.as_string = const_cast<char*> (host.c_str());


            // Uri
            Dart_CObject* retUri = new Dart_CObject;
            std::string uri = resource->uri();
            retUri->type = Dart_CObject_kString;
            retUri->value.as_string = const_cast<char*> (uri.c_str());

            // Unique id
            Dart_CObject* retUid = new Dart_CObject;
            retUid->type = Dart_CObject_kString;
            retUid->value.as_string = const_cast<char*> (uri.c_str());
            
            // We don't know how many resource and interface types a resource has so
            // use dynamic memory allocation, not Dart as we have no zone in this callback.

            // Resource types
            Dart_CObject* retResourceTypes = new Dart_CObject;
            Dart_CObject* resTemp;
            std::vector<std::string> resourceTypes = resource->getResourceTypes();
            long unsigned int resourceTypesLen = resourceTypes.size();
            Dart_CObject** resourceTemp = new Dart_CObject*[resourceTypesLen];
            int i = 0;
            for (std::vector<std::string>::iterator it = resourceTypes.begin(); it != resourceTypes.end(); ++it) {
                resTemp = new Dart_CObject;
                resTemp->type = Dart_CObject_kString;
                resTemp->value.as_string = const_cast<char*> ((*it).c_str());
                resourceTemp[i] = resTemp;
                i++;
            }
            retResourceTypes->type = Dart_CObject_kArray;
            retResourceTypes->value.as_array.values = resourceTemp;
            retResourceTypes->value.as_array.length = resourceTypesLen;

            // Interface types
            Dart_CObject* retInterfaceTypes = new Dart_CObject;
            Dart_CObject* intTemp;
            std::vector<std::string> intTypes = resource->getResourceInterfaces();
            long unsigned intTypesLen = intTypes.size();
            Dart_CObject** interfaceTemp = new Dart_CObject*[intTypesLen];
            i = 0;
            for (std::vector<std::string>::iterator it = intTypes.begin(); it != intTypes.end(); ++it) {
                intTemp = new Dart_CObject;
                intTemp->type = Dart_CObject_kString;
                intTemp->value.as_string = const_cast<char*> ((*it).c_str());
                interfaceTemp[i] = intTemp;
                i++;
            }
            retInterfaceTypes->type = Dart_CObject_kArray;
            retInterfaceTypes->value.as_array.values = interfaceTemp;
            retInterfaceTypes->value.as_array.length = intTypesLen;

            // Observable
            Dart_CObject* retObservable = new Dart_CObject;
            bool observable = resource->isObservable();
            retObservable->type = Dart_CObject_kBool;
            retObservable->value.as_bool = observable;

            // Create a proxy object from the resource so we can see this outside
            // of this handler. 
            OCResource::Ptr resourcePtr = OCPlatform::constructResourceObject(resource->host(),
                    resource->uri(),
                    resource->connectivityType(), resource->isObservable(),
                    resource->getResourceTypes(),
                    resource->getResourceInterfaces());


            // The proxy object is only supports put/get/observe functionality so get as 
            // much resource data as we can here and return it to create a resource class.

            // The pointer
            Dart_CObject* retPtr = new Dart_CObject;
            retPtr->type = Dart_CObject_kInt64;
            retPtr->value.as_int64 = reinterpret_cast<int64_t> (resourcePtr.get());
            
            // Return it all
            Dart_CObject** temp = new Dart_CObject*[PLATFORM_FIND_RESOURCES_RET_PARAMS];
            temp[0] = retPtr;
            temp[1] = retUid;
            temp[2] = retUri;
            temp[3] = retHost;
            temp[4] = retResourceTypes;
            temp[5] = retInterfaceTypes;
            temp[6] = retObservable;

            result->type = Dart_CObject_kArray;
            result->value.as_array.values = temp;
            result->value.as_array.length = PLATFORM_FIND_RESOURCES_RET_PARAMS;
            if (m_resListCount <= (MAX_DISCOVERABLE_RESOURCES - 1)) {
                m_resList[m_resListCount] = result;
                ++m_resListCount;
            }
#ifdef DEBUG
            std::cout << "<<< foundResource - returned valid result id is " << resource->uniqueIdentifier() << std::endl;
            std::cout << "<<< foundResource - returned valid result uri is " << resource->uri() << std::endl;
#endif
        }
        resourceCallbackMutex.unlock();
    } catch (std::exception& e) {
        std::cout << "Exception in foundResource: " << e.what() << std::endl;
    }

}
예제 #2
0
    void foundDevice(std::shared_ptr<OCResource> resource)
    {
        using namespace OC::OCPlatform;
        if(resource && resource->uri() == "/device")
        {
            std::cout << "Discovered a device object"<<std::endl;
            std::cout << "\tHost: "<<resource->host()<<std::endl;
            std::cout << "\tURI:  "<<resource->uri() <<std::endl;
        }

        // we have now found a resource, so lets create a few resource objects
        // for the other resources that we KNOW are associated with the intel.fridge
        // server, and query them.
        std::vector<std::string> lightTypes = {"intel.fridge.light"};
        std::vector<std::string> ifaces = {DEFAULT_INTERFACE};
        OCResource::Ptr light = constructResourceObject(resource->host(),
                                "/light", m_connectivityType, false, lightTypes, ifaces);

        if(!light)
        {
            std::cout << "Error: Light Resource Object construction returned null\n";
            return;
        }

        std::vector<std::string> doorTypes = {"intel.fridge.door"};
        OCResource::Ptr leftdoor = constructResourceObject(resource->host(),
                                "/door/left", m_connectivityType, false, doorTypes, ifaces);

        if(!leftdoor)
        {
            std::cout << "Error: Left Door Resource Object construction returned null\n";
            return;
        }

        OCResource::Ptr rightdoor = constructResourceObject(resource->host(),
                                "/door/right", m_connectivityType, false, doorTypes, ifaces);

        if(!rightdoor)
        {
            std::cout << "Error: Right Door Resource Object construction returned null\n";
            return;
        }

        OCResource::Ptr randomdoor = constructResourceObject(resource->host(),
                                "/door/random", m_connectivityType, false, doorTypes, ifaces);
        if(!randomdoor)
        {
            std::cout << "Error: Random Door Resource Object construction returned null\n";
            return;
        }

        // Set header options with API version and token
        HeaderOptions headerOptions;
        try
        {
            // Set API version and client token
            HeaderOption::OCHeaderOption apiVersion(API_VERSION, "v.1.0");
            HeaderOption::OCHeaderOption clientToken(TOKEN, "21ae43gf");
            headerOptions.push_back(apiVersion);
            headerOptions.push_back(clientToken);
        }
        catch(OCException& e)
        {
            std::cout << "Error creating HeaderOption: " << e.what() << std::endl;
        }


        // Setting header options will send above options in all requests
        // Header options are set per resource.
        // Below, header options are set only for device resource
        resource->setHeaderOptions(headerOptions);

        ++m_callsMade;
        resource->get(QueryParamsMap(), GetCallback(
                std::bind(&ClientFridge::getResponse, this, "Device", PH::_1,
                    PH::_2, PH::_3, resource, 0)
                ));
        ++m_callsMade;
        light->get(QueryParamsMap(), GetCallback(
                std::bind(&ClientFridge::getResponse, this, "Fridge Light", PH::_1,
                    PH::_2, PH::_3, light, 1)
                ));
        ++m_callsMade;
        leftdoor->get(QueryParamsMap(), GetCallback(
                std::bind(&ClientFridge::getResponse, this, "Left Door", PH::_1,
                    PH::_2, PH::_3, leftdoor, 2)
                ));
        ++m_callsMade;
        rightdoor->get(QueryParamsMap(), GetCallback(
                std::bind(&ClientFridge::getResponse, this, "Right Door", PH::_1,
                    PH::_2, PH::_3, rightdoor, 3)
                ));
        ++m_callsMade;
        randomdoor->get(QueryParamsMap(), GetCallback(
                std::bind(&ClientFridge::getResponse, this, "Random Door", PH::_1,
                    PH::_2, PH::_3, randomdoor, 4)
                ));
        ++m_callsMade;
        resource->deleteResource(DeleteCallback(
                std::bind(&ClientFridge::deleteResponse, this, "Device", PH::_1,
                    PH::_2, resource, 0)
                ));
    }