OCStackApplicationResult observeResourceCallback(void* ctx, OCDoHandle handle,
     OCClientResponse* clientResponse)
 {
     ClientCallbackContext::ObserveContext* context =
         static_cast<ClientCallbackContext::ObserveContext*>(ctx);
     OCRepresentation attrs;
     HeaderOptions serverHeaderOptions;
     uint32_t sequenceNumber = clientResponse->sequenceNumber;
     OCStackResult result = clientResponse->result;
     if(clientResponse->result == OC_STACK_OK)
     {
         parseServerHeaderOptions(clientResponse, serverHeaderOptions);
         try
         {
             attrs = parseGetSetCallback(clientResponse);
         }
         catch(OC::OCException& e)
         {
             result = e.code();
         }
     }
     std::thread exec(context->callback, serverHeaderOptions, attrs,
                 result, sequenceNumber);
     exec.detach();
     if(sequenceNumber == OC_OBSERVE_DEREGISTER)
     {
         return OC_STACK_DELETE_TRANSACTION;
     }
     return OC_STACK_KEEP_TRANSACTION;
 }
    OCStackApplicationResult setResourceCallback(void* ctx, OCDoHandle handle,
        OCClientResponse* clientResponse)
    {
        ClientCallbackContext::SetContext* context =
            static_cast<ClientCallbackContext::SetContext*>(ctx);
        OCRepresentation attrs;
        HeaderOptions serverHeaderOptions;

        OCStackResult result = clientResponse->result;
        if (OC_STACK_OK               == result ||
            OC_STACK_RESOURCE_CREATED == result ||
            OC_STACK_RESOURCE_DELETED == result)
        {
            parseServerHeaderOptions(clientResponse, serverHeaderOptions);
            try
            {
                attrs = parseGetSetCallback(clientResponse);
            }
            catch(OC::OCException& e)
            {
                result = e.code();
            }
        }

        std::thread exec(context->callback, serverHeaderOptions, attrs, result);
        exec.detach();
        return OC_STACK_DELETE_TRANSACTION;
    }
Example #3
0
    OCStackApplicationResult getResourceCallback(void* ctx,
                                                 OCDoHandle /*handle*/,
        OCClientResponse* clientResponse)
    {
        ClientCallbackContext::GetContext* context =
            static_cast<ClientCallbackContext::GetContext*>(ctx);

        OCRepresentation rep;
        HeaderOptions serverHeaderOptions;
        OCStackResult result = clientResponse->result;
        if(result == OC_STACK_OK)
        {
            parseServerHeaderOptions(clientResponse, serverHeaderOptions);
            try
            {
                rep = parseGetSetCallback(clientResponse);
            }
            catch(OC::OCException& e)
            {
                result = e.code();
            }
        }

        std::thread exec(context->callback, serverHeaderOptions, rep, result);
        exec.detach();
        return OC_STACK_DELETE_TRANSACTION;
    }
OCStackApplicationResult listenDeviceCallback(void* ctx, OCDoHandle handle,
        OCClientResponse* clientResponse)
{
    ClientCallbackContext::DeviceListenContext* context =
        static_cast<ClientCallbackContext::DeviceListenContext*>(ctx);

    OCRepresentation rep = parseGetSetCallback(clientResponse);
    std::thread exec(context->callback, rep);
    exec.detach();

    return OC_STACK_KEEP_TRANSACTION;
}
    OCStackApplicationResult listenDeviceCallback(void* ctx, OCDoHandle handle,
            OCClientResponse* clientResponse)
    {
        ClientCallbackContext::DeviceListenContext* context =
            static_cast<ClientCallbackContext::DeviceListenContext*>(ctx);

        try
        {
            OCRepresentation rep = parseGetSetCallback(clientResponse);
            std::thread exec(context->callback, rep);
            exec.detach();
        }
        catch(OC::OCException& e)
        {
            oclog() <<"Exception in listenDeviceCallback, ignoring response: "
                <<e.what() <<std::flush;
        }

        return OC_STACK_KEEP_TRANSACTION;
    }
Example #6
0
    OCStackApplicationResult createMQTopicCallback(void* ctx, OCDoHandle /*handle*/,
                    OCClientResponse* clientResponse)
    {
        ClientCallbackContext::CreateMQTopicContext* context =
            static_cast<ClientCallbackContext::CreateMQTopicContext*>(ctx);
        OCRepresentation rep;
        HeaderOptions serverHeaderOptions;

        if (!clientResponse)
        {
            return OC_STACK_DELETE_TRANSACTION;
        }

        std::string createdUri;
        OCStackResult result = clientResponse->result;
        if (OC_STACK_OK               == result ||
            OC_STACK_RESOURCE_CREATED == result)
        {
            parseServerHeaderOptions(clientResponse, serverHeaderOptions);
            try
            {
                rep = parseGetSetCallback(clientResponse);
            }
            catch(OC::OCException& e)
            {
                result = e.code();
            }

            bool isLocationOption = false;
            for (auto headerOption : serverHeaderOptions)
            {
                if (HeaderOption::LOCATION_PATH_OPTION_ID == headerOption.getOptionID())
                {
                    createdUri += "/";
                    createdUri += headerOption.getOptionData();
                    if (!isLocationOption)
                    {
                        isLocationOption = true;
                    }
                }
            }

            if (!isLocationOption)
            {
                createdUri = clientResponse->resourceUri;
            }
        }

        auto clientWrapper = context->clientWrapper.lock();

        if (!clientWrapper)
        {
            oclog() << "createMQTopicCallback(): failed to get a shared_ptr to the client wrapper"
                    << std::flush;
            return OC_STACK_DELETE_TRANSACTION;
        }

        try{
            if (OC_STACK_OK               == result ||
                OC_STACK_RESOURCE_CREATED == result)
            {
                ListenOCContainer container(clientWrapper, clientResponse->devAddr,
                                            createdUri);
                for (auto resource : container.Resources())
                {
                    std::thread exec(context->callback, serverHeaderOptions, rep, result, resource);
                    exec.detach();
                }
            }
            else
            {
                std::thread exec(context->callback, serverHeaderOptions, rep, result, nullptr);
                exec.detach();
            }
        }
        catch (std::exception &e){
            oclog() << "Exception in createMQTopicCallback, ignoring response: "
                    << e.what() << std::flush;
        }
        return OC_STACK_DELETE_TRANSACTION;
    }