//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+#include "iotivity_config.h"
#include <stdio.h>
#include <string.h>
#include <string>
#include <stdlib.h>
+#ifdef HAVE_UNISTD_H
#include <unistd.h>
+#endif
+#ifdef HAVE_WINDOWS_H
+#include <windows.h>
+#endif
#include <signal.h>
+#ifdef HAVE_PTHREAD_H
#include <pthread.h>
+#endif
#include <ocstack.h>
#include <logger.h>
+#include <getopt.h>
#include "ocpayload.h"
-
-const char *getResult(OCStackResult result);
+#include "common.h"
#define TAG PCF("ocservercontainer")
void PrintUsage()
{
- OC_LOG(INFO, TAG, "Usage : ocservercoll -t <Test Case>");
- OC_LOG(INFO, TAG,
+ OIC_LOG(INFO, TAG, "Usage : ocservercoll -t <Test Case>");
+ OIC_LOG(INFO, TAG,
"Test Case 1 : Create room resource with default collection entity handler.");
- OC_LOG(INFO, TAG,
+ OIC_LOG(INFO, TAG,
"Test Case 2 : Create room resource with application collection entity handler.");
}
typeOfMethod = "OC_REST_PUT";
}
- OC_LOG_V(INFO, TAG, "Receiving message type: %s, method %s", typeOfMessage,
+ OIC_LOG_V(INFO, TAG, "Receiving message type: %s, method %s", typeOfMessage,
typeOfMethod);
}
+//The only case when this entity handler is for a non-existing resource.
+OCEntityHandlerResult
+OCDeviceEntityHandlerCb (OCEntityHandlerFlag flag,
+ OCEntityHandlerRequest *entityHandlerRequest, char* uri, void* /*callbackParam*/)
+{
+ OIC_LOG_V(INFO, TAG, "Inside device default entity handler - flags: 0x%x, uri: %s", flag, uri);
+
+ OCEntityHandlerResult ehResult = OC_EH_OK;
+ OCEntityHandlerResponse response;
+
+ if (!entityHandlerRequest)
+ {
+ OIC_LOG(ERROR, TAG, "Invalid request pointer");
+ return OC_EH_ERROR;
+ }
+
+ if (entityHandlerRequest->resource == NULL)
+ {
+ OIC_LOG(INFO, TAG, "Received request from client to a non-existing resource");
+ ehResult = OC_EH_RESOURCE_NOT_FOUND;
+ }
+ else
+ {
+ OIC_LOG_V(INFO, TAG, "Device Handler: Received unsupported request from client %d",
+ entityHandlerRequest->method);
+ ehResult = OC_EH_ERROR;
+ }
+
+ if (!((ehResult == OC_EH_ERROR) || (ehResult == OC_EH_FORBIDDEN)))
+ {
+ // Format the response. Note this requires some info about the request
+ response.requestHandle = entityHandlerRequest->requestHandle;
+ response.resourceHandle = entityHandlerRequest->resource;
+ response.ehResult = ehResult;
+ response.payload = nullptr;
+ response.numSendVendorSpecificHeaderOptions = 0;
+ memset(response.sendVendorSpecificHeaderOptions,
+ 0, sizeof response.sendVendorSpecificHeaderOptions);
+ // Indicate that response is NOT in a persistent buffer
+ response.persistentBufferFlag = 0;
+
+ // Send the response
+ if (OCDoResponse(&response) != OC_STACK_OK)
+ {
+ OIC_LOG(ERROR, TAG, "Error sending response");
+ ehResult = OC_EH_ERROR;
+ }
+ }
+ return ehResult;
+}
+
OCEntityHandlerResult OCEntityHandlerRoomCb(OCEntityHandlerFlag flag,
OCEntityHandlerRequest * ehRequest,
- void* callback)
+ void* /*callback*/)
{
OCEntityHandlerResult ret = OC_EH_OK;
OCEntityHandlerResponse response;
- OCRepPayload* payload = OCRepPayloadCreate();
- OC_LOG_V(INFO, TAG, "Callback for Room");
+ OIC_LOG_V(INFO, TAG, "Callback for Room");
PrintReceivedMsgInfo(flag, ehRequest );
if(ehRequest && flag == OC_REQUEST_FLAG )
{
std::string query = (const char*)ehRequest->query;
+ OCRepPayload* payload = OCRepPayloadCreate();
if(OC_REST_GET == ehRequest->method)
{
// Send the response
if (OCDoResponse(&response) != OC_STACK_OK)
{
- OC_LOG(ERROR, TAG, "Error sending response");
+ OIC_LOG(ERROR, TAG, "Error sending response");
ret = OC_EH_ERROR;
}
}
// Send the response
if (OCDoResponse(&response) != OC_STACK_OK)
{
- OC_LOG(ERROR, TAG, "Error sending response");
+ OIC_LOG(ERROR, TAG, "Error sending response");
ret = OC_EH_ERROR;
}
}
}
else
{
- OC_LOG_V (INFO, TAG, "Received unsupported method %d from client",
+ OIC_LOG_V (INFO, TAG, "Received unsupported method %d from client",
ehRequest->method);
ret = OC_EH_ERROR;
}
+ OCRepPayloadDestroy(payload);
}
else if (ehRequest && flag == OC_OBSERVE_FLAG)
{
}
OCEntityHandlerResult OCEntityHandlerLightCb(OCEntityHandlerFlag flag,
- OCEntityHandlerRequest * ehRequest,void* callbackParam)
+ OCEntityHandlerRequest * ehRequest,void* /*callbackParam*/)
{
OCEntityHandlerResult ret = OC_EH_OK;
OCEntityHandlerResponse response;
- OCRepPayload* payload = OCRepPayloadCreate();
- OC_LOG_V(INFO, TAG, "Callback for Light");
+ OIC_LOG_V(INFO, TAG, "Callback for Light");
PrintReceivedMsgInfo(flag, ehRequest );
if(ehRequest && flag == OC_REQUEST_FLAG)
{
+ OCRepPayload* payload = OCRepPayloadCreate();
if(OC_REST_GET == ehRequest->method)
{
OCRepPayloadSetUri(payload, gLightResourceUri);
}
else
{
- OC_LOG_V (INFO, TAG, "Received unsupported method %d from client",
+ OIC_LOG_V (INFO, TAG, "Received unsupported method %d from client",
ehRequest->method);
ret = OC_EH_ERROR;
}
// Send the response
if (OCDoResponse(&response) != OC_STACK_OK)
{
- OC_LOG(ERROR, TAG, "Error sending response");
+ OIC_LOG(ERROR, TAG, "Error sending response");
ret = OC_EH_ERROR;
}
}
+ OCRepPayloadDestroy(payload);
}
else if (ehRequest && flag == OC_OBSERVE_FLAG)
{
}
OCEntityHandlerResult OCEntityHandlerFanCb(OCEntityHandlerFlag flag,
- OCEntityHandlerRequest * ehRequest, void* callback)
+ OCEntityHandlerRequest * ehRequest, void* /*callback*/)
{
OCEntityHandlerResult ret = OC_EH_OK;
OCEntityHandlerResponse response;
- OCRepPayload* payload = OCRepPayloadCreate();
- OC_LOG_V(INFO, TAG, "Callback for Fan");
+ OIC_LOG_V(INFO, TAG, "Callback for Fan");
PrintReceivedMsgInfo(flag, ehRequest );
if(ehRequest && flag == OC_REQUEST_FLAG)
{
+ OCRepPayload* payload = OCRepPayloadCreate();
+
if(OC_REST_GET == ehRequest->method)
{
OCRepPayloadSetUri(payload, gFanResourceUri);
}
else
{
- OC_LOG_V (INFO, TAG, "Received unsupported method %d from client",
+ OIC_LOG_V (INFO, TAG, "Received unsupported method %d from client",
ehRequest->method);
ret = OC_EH_ERROR;
}
// Send the response
if (OCDoResponse(&response) != OC_STACK_OK)
{
- OC_LOG(ERROR, TAG, "Error sending response");
+ OIC_LOG(ERROR, TAG, "Error sending response");
ret = OC_EH_ERROR;
}
}
+ OCRepPayloadDestroy(payload);
}
else if (ehRequest && flag == OC_OBSERVE_FLAG)
light.power += 5;
if (gLightUnderObservation)
{
- OC_LOG_V(INFO, TAG,
+ OIC_LOG_V(INFO, TAG,
" =====> Notifying stack of new power level %d\n", light.power);
result = OCNotifyAllObservers (light.handle, OC_NA_QOS);
if (OC_STACK_NO_OBSERVERS == result)
return -1;
}
- OC_LOG(DEBUG, TAG, "OCServer is starting...");
+ OIC_LOG(DEBUG, TAG, "OCServer is starting...");
if (OCInit(NULL, 0, OC_SERVER) != OC_STACK_OK)
{
- OC_LOG(ERROR, TAG, "OCStack init error");
+ OIC_LOG(ERROR, TAG, "OCStack init error");
return 0;
}
+ OCSetDefaultDeviceEntityHandler(OCDeviceEntityHandlerCb, NULL);
+
/*
* Declare and create the example resource: light
*/
pthread_create (&threadId, NULL, ChangeLightRepresentation, (void *)NULL);
// Break from loop with Ctrl-C
- OC_LOG(INFO, TAG, "Entering ocserver main loop...");
+ OIC_LOG(INFO, TAG, "Entering ocserver main loop...");
signal(SIGINT, handleSigInt);
while (!gQuitFlag)
{
if (OCProcess() != OC_STACK_OK)
{
- OC_LOG(ERROR, TAG, "OCStack process error");
+ OIC_LOG(ERROR, TAG, "OCStack process error");
return 0;
}
sleep(2);
/*
* Cancel the light thread and wait for it to terminate
*/
+#ifdef HAVE_PTHREAD_H
pthread_cancel(threadId);
pthread_join(threadId, NULL);
+#endif
- OC_LOG(INFO, TAG, "Exiting ocserver main loop...");
+ OIC_LOG(INFO, TAG, "Exiting ocserver main loop...");
if (OCStop() != OC_STACK_OK)
{
- OC_LOG(ERROR, TAG, "OCStack process error");
+ OIC_LOG(ERROR, TAG, "OCStack process error");
}
return 0;
OCEntityHandlerFanCb,
NULL,
OC_DISCOVERABLE|OC_OBSERVABLE);
- OC_LOG_V(INFO, TAG, "Created fan resource with result: %s", getResult(res));
+ OIC_LOG_V(INFO, TAG, "Created fan resource with result: %s", getResult(res));
OCResourceHandle light;
res = OCCreateResource(&light,
OCEntityHandlerLightCb,
NULL,
OC_DISCOVERABLE|OC_OBSERVABLE);
- OC_LOG_V(INFO, TAG, "Created light resource with result: %s", getResult(res));
+ OIC_LOG_V(INFO, TAG, "Created light resource with result: %s", getResult(res));
OCResourceHandle room;
OC_DISCOVERABLE);
}
- OC_LOG_V(INFO, TAG, "Created room resource with result: %s", getResult(res));
+ OIC_LOG_V(INFO, TAG, "Created room resource with result: %s", getResult(res));
OCBindResourceInterfaceToResource(room, OC_RSRVD_INTERFACE_LL);
OCBindResourceInterfaceToResource(room, OC_RSRVD_INTERFACE_DEFAULT);
res = OCBindResource(room, light);
- OC_LOG_V(INFO, TAG, "OC Bind Contained Resource to resource: %s", getResult(res));
+ OIC_LOG_V(INFO, TAG, "OC Bind Contained Resource to resource: %s", getResult(res));
res = OCBindResource(room, fan);
- OC_LOG_V(INFO, TAG, "OC Bind Contained Resource to resource: %s", getResult(res));
+ OIC_LOG_V(INFO, TAG, "OC Bind Contained Resource to resource: %s", getResult(res));
}