if(resourceURI == "/a/light")
{
+ HeaderOptions headerOptions = resource->getServerHeaderOptions();
+ if (headerOptions.size() == 0)
+ {
+ std::cout << "No header option exists" << std::endl;
+ }
+ else
+ {
+ for (auto it = headerOptions.begin(); it != headerOptions.end(); ++it)
+ {
+ if (it->getOptionID() == 12) // COAP_OPTION_CONTENT_FORMAT
+ {
+ size_t dataLength = it->getOptionData().length();
+ char* optionData = new char[dataLength];
+ strncpy(optionData, it->getOptionData().c_str(), dataLength);
+ int format = optionData[0] * 256 + optionData[1];
+ std::cout << "Server format in Discovery response:" << format
+ << std::endl;
+ delete[] optionData;
+ }
+ if (it->getOptionID() == 2053) // CA_OPTION_CONTENT_VERSION
+ {
+ size_t dataLength = it->getOptionData().length();
+ char* optionData = new char[dataLength];
+ strncpy(optionData, it->getOptionData().c_str(), dataLength);
+ int version = optionData[0] * 256;
+ std::cout << "Server version in Discovery response:" << version
+ << std::endl;
+ delete[] optionData;
+ }
+ }
+ }
+
if (resource->connectivityType() & TRANSPORT_TYPE_TO_USE)
{
curResource = resource;
m_interfaces(std::move(o.m_interfaces)),
m_children(std::move(m_children)),
m_endpoints(std::move(m_endpoints)),
+ m_serverHeaderOptions(std::move(m_serverHeaderOptions)),
m_observeHandle(std::move(m_observeHandle)),
m_headerOptions(std::move(m_headerOptions))
{
std::vector<std::string> getAllHosts() const;
/**
+ * Function to get the header options information from response
+ * @return headerOptions HeaderOptions vector consisting of OCHeaderOption objects
+ */
+ HeaderOptions getServerHeaderOptions() const;
+
+ /**
* Function to get the URI for this resource
* @return std::string resource URI
*/
std::vector<std::string> m_interfaces;
std::vector<std::string> m_children;
std::vector<std::string> m_endpoints;
+ HeaderOptions m_serverHeaderOptions;
OCDoHandle m_observeHandle;
HeaderOptions m_headerOptions;
const std::string& serverId, uint8_t property,
const std::vector<std::string>& resourceTypes,
const std::vector<std::string>& interfaces,
- const std::vector<std::string>& endpoints);
+ const std::vector<std::string>& endpoints,
+ const HeaderOptions& serverHeaderOptions);
OCResource(std::weak_ptr<IClientWrapper> clientWrapper,
const std::string& host, const std::string& uri,
public:
ListenOCContainer(std::weak_ptr<IClientWrapper> cw,
- OCDevAddr& devAddr, OCDiscoveryPayload* payload)
+ OCDevAddr& devAddr,
+ HeaderOptions serverHeaderOption, OCDiscoveryPayload* payload)
{
OCDevAddr currentDevAddr = devAddr;
while (payload)
res->bitmap,
StringLLToVector(res->types),
StringLLToVector(res->interfaces),
- epsVector
+ epsVector,
+ serverHeaderOption
)));
#ifdef TCP_ADAPTER
res->bitmap,
StringLLToVector(res->types),
StringLLToVector(res->interfaces),
- epsVector
+ epsVector,
+ serverHeaderOption
)));
}
#endif
return root;
}
+ void parseServerHeaderOptions(OCClientResponse* clientResponse,
+ HeaderOptions& serverHeaderOptions)
+ {
+ if (clientResponse)
+ {
+ // Parse header options from server
+ uint16_t optionID;
+ std::string optionData;
+
+ for(size_t i = 0; i < clientResponse->numRcvdVendorSpecificHeaderOptions; i++)
+ {
+ optionID = clientResponse->rcvdVendorSpecificHeaderOptions[i].optionID;
+ optionData = reinterpret_cast<const char*>
+ (clientResponse->rcvdVendorSpecificHeaderOptions[i].optionData);
+ HeaderOption::OCHeaderOption headerOption(optionID, optionData);
+ serverHeaderOptions.push_back(headerOption);
+ }
+ }
+ else
+ {
+ // clientResponse is invalid
+ // TODO check proper logging
+ std::cout << " Invalid response " << std::endl;
+ }
+ }
+
OCStackApplicationResult listenCallback(void* ctx, OCDoHandle /*handle*/,
OCClientResponse* clientResponse)
{
try
{
+ HeaderOptions serverHeaderOptions;
+ parseServerHeaderOptions(clientResponse, serverHeaderOptions);
ListenOCContainer container(clientWrapper, clientResponse->devAddr,
+ serverHeaderOptions,
reinterpret_cast<OCDiscoveryPayload*>(clientResponse->payload));
// loop to ensure valid construction of all resources
return OC_STACK_KEEP_TRANSACTION;
}
+ HeaderOptions serverHeaderOptions;
+ parseServerHeaderOptions(clientResponse, serverHeaderOptions);
ListenOCContainer container(clientWrapper, clientResponse->devAddr,
- reinterpret_cast<OCDiscoveryPayload*>(clientResponse->payload));
+ serverHeaderOptions,
+ reinterpret_cast< OCDiscoveryPayload* >(clientResponse->payload));
// loop to ensure valid construction of all resources
for (auto resource : container.Resources())
{
try
{
+ HeaderOptions serverHeaderOptions;
+ parseServerHeaderOptions(clientResponse, serverHeaderOptions);
ListenOCContainer container(clientWrapper, clientResponse->devAddr,
- reinterpret_cast<OCDiscoveryPayload*>(clientResponse->payload));
+ serverHeaderOptions,
+ reinterpret_cast< OCDiscoveryPayload* >(clientResponse->payload));
OIC_LOG_V(DEBUG, TAG, "%s: call response callback", __func__);
std::thread exec(context->callback, container.Resources());
try
{
+ HeaderOptions serverHeaderOptions;
+ parseServerHeaderOptions(clientResponse, serverHeaderOptions);
ListenOCContainer container(clientWrapper, clientResponse->devAddr,
- reinterpret_cast<OCDiscoveryPayload*>(clientResponse->payload));
+ serverHeaderOptions,
+ reinterpret_cast< OCDiscoveryPayload* >(clientResponse->payload));
OIC_LOG_V(DEBUG, TAG, "%s: call response callback", __func__);
std::thread exec(context->callback, container.Resources());
try
{
+ HeaderOptions serverHeaderOptions;
+ parseServerHeaderOptions(clientResponse, serverHeaderOptions);
ListenOCContainer container(clientWrapper, clientResponse->devAddr,
- (OCRepPayload *) clientResponse->payload);
+ serverHeaderOptions,
+ (OCRepPayload *) clientResponse->payload);
// loop to ensure valid construction of all resources
for (auto resource : container.Resources())
return result;
}
- void parseServerHeaderOptions(OCClientResponse* clientResponse,
- HeaderOptions& serverHeaderOptions)
- {
- if (clientResponse)
- {
- // Parse header options from server
- uint16_t optionID;
- std::string optionData;
-
- for(size_t i = 0; i < clientResponse->numRcvdVendorSpecificHeaderOptions; i++)
- {
- optionID = clientResponse->rcvdVendorSpecificHeaderOptions[i].optionID;
- optionData = reinterpret_cast<const char*>
- (clientResponse->rcvdVendorSpecificHeaderOptions[i].optionData);
- HeaderOption::OCHeaderOption headerOption(optionID, optionData);
- serverHeaderOptions.push_back(headerOption);
- }
- }
- else
- {
- // clientResponse is invalid
- // TODO check proper logging
- std::cout << " Invalid response " << std::endl;
- }
- }
-
#ifdef WITH_MQ
OCStackApplicationResult createMQTopicCallback(void* ctx, OCDoHandle /*handle*/,
OCClientResponse* clientResponse)
const std::string& serverId, uint8_t property,
const std::vector<std::string>& resourceTypes,
const std::vector<std::string>& interfaces,
- const std::vector<std::string>& endpoints)
+ const std::vector<std::string>& endpoints,
+ const HeaderOptions& serverHeaderOptions)
: m_clientWrapper(clientWrapper), m_uri(uri),
m_resourceId(serverId, m_uri), m_devAddr(devAddr),
m_isCollection(false), m_property(property),
m_resourceTypes(resourceTypes), m_interfaces(interfaces),
m_endpoints(endpoints),
+ m_serverHeaderOptions(serverHeaderOptions),
m_observeHandle(nullptr)
{
m_isCollection = std::find(m_interfaces.begin(), m_interfaces.end(), LINK_INTERFACE)
return m_endpoints;
}
+HeaderOptions OCResource::getServerHeaderOptions() const
+{
+ return m_serverHeaderOptions;
+}
+
std::string OCResource::uri() const
{
return m_uri;