1 //******************************************************************
3 // Copyright 2015 Intel Mobile Communications GmbH All Rights Reserved.
5 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
7 // Licensed under the Apache License, Version 2.0 (the "License");
8 // you may not use this file except in compliance with the License.
9 // You may obtain a copy of the License at
11 // http://www.apache.org/licenses/LICENSE-2.0
13 // Unless required by applicable law or agreed to in writing, software
14 // distributed under the License is distributed on an "AS IS" BASIS,
15 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 // See the License for the specific language governing permissions and
17 // limitations under the License.
19 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
24 * This file contains APIs for Plugin Interface module to be implemented.
27 #include "plugininterface.h"
28 #include "plugintranslatortypes.h"
29 #include "pluginlist.h"
30 #include "zigbee_wrapper.h"
31 #include "oic_string.h"
32 #include "oic_malloc.h"
34 #include "ocpayload.h"
40 #define TAG PCF("pluginInterface")
43 * Entity handler callback that fills the resPayload of the entityHandlerRequest.
45 OCEntityHandlerResult PluginInterfaceEntityHandler(OCEntityHandlerFlag flag,
46 OCEntityHandlerRequest * entityHandlerRequest,
49 if (!entityHandlerRequest)
51 OC_LOG (ERROR, TAG, "Invalid request pointer");
55 OCEntityHandlerResult ehResult = OC_EH_ERROR;
56 OCStackResult result = OC_STACK_ERROR;
57 PIPluginBase * plugin = (PIPluginBase *) callbackParam;
59 OCEntityHandlerResponse * response =
60 (OCEntityHandlerResponse *) OICCalloc(1, sizeof(*response));
67 OCRepPayload* payload = (OCRepPayload *) entityHandlerRequest->payload;
69 if (flag & OC_REQUEST_FLAG)
71 if (plugin->processEHRequest)
73 ehResult = plugin->processEHRequest(plugin, entityHandlerRequest, &payload);
77 // If the result isn't an error or forbidden, send response
78 if (!((ehResult == OC_EH_ERROR) || (ehResult == OC_EH_FORBIDDEN)))
80 // Format the response. Note this requires some info about the request
81 response->requestHandle = entityHandlerRequest->requestHandle;
82 response->resourceHandle = entityHandlerRequest->resource;
83 response->ehResult = ehResult;
84 response->payload = (OCPayload*) payload;
85 // Indicate that response is NOT in a persistent buffer
86 response->persistentBufferFlag = 0;
88 result = OCDoResponse(response);
89 if (result != OC_STACK_OK)
91 OC_LOG_V(ERROR, TAG, "Error sending response %u", result);
92 ehResult = OC_EH_ERROR;
97 OC_LOG_V(ERROR, TAG, "Error handling request %u", ehResult);
100 OCPayloadDestroy(response->payload);
105 void piNewResourceCB(PIPluginBase * p_plugin, PIResourceBase * r_newResource)
107 if (!p_plugin || !r_newResource)
112 r_newResource->piResource.resourceProperties = OC_DISCOVERABLE | OC_OBSERVABLE;
113 OCStackResult result = OCCreateResource(&r_newResource->piResource.resourceHandle,
114 r_newResource->piResource.resourceTypeName,
115 r_newResource->piResource.resourceInterfaceName,
116 r_newResource->piResource.uri,
117 PluginInterfaceEntityHandler,
119 r_newResource->piResource.resourceProperties);
120 if (result != OC_STACK_OK)
122 OICFree (r_newResource->piResource.uri);
123 OICFree (r_newResource);
126 OC_LOG_V(INFO, TAG, "Created resource of type: %s\n",
127 r_newResource->piResource.resourceTypeName);
129 result = AddResourceToPlugin(p_plugin, r_newResource);
132 void piObserveNotificationUpdate(PIPluginBase * plugin, const char * uri)
138 PIResource * piResource = NULL;
140 OCStackResult result = GetResourceFromURI(plugin, &piResource, uri);
141 if(result != OC_STACK_OK)
143 OC_LOG(ERROR, TAG, "Failed to find a matching URI based on observe notification update.");
147 result = OCNotifyAllObservers(piResource->resourceHandle, OC_LOW_QOS);
148 if(result != OC_STACK_OK && result != OC_STACK_NO_OBSERVERS)
150 OC_LOG_V(ERROR, TAG, "Failed to notify observers of update. Result: %d", result);
154 OCStackResult PIStartPlugin(const char * comPort, PIPluginType pluginType, PIPlugin ** plugin)
156 if (!plugin || !comPort || strlen(comPort) == 0)
158 return OC_STACK_INVALID_PARAM;
160 OCStackResult result = OC_STACK_ERROR;
161 if (pluginType == PLUGIN_ZIGBEE)
163 result = ZigbeeInit(comPort,
164 (PIPlugin_Zigbee **) plugin,
166 piObserveNotificationUpdate);
167 if (result != OC_STACK_OK)
173 return OC_STACK_ERROR;
175 result = AddPlugin((PIPluginBase *) *plugin);
176 if (result == OC_STACK_OK)
178 result = ZigbeeDiscover((PIPlugin_Zigbee *) plugin);
184 OCStackResult PIStopPlugin(PIPlugin * plugin)
188 return OC_STACK_INVALID_PARAM;
191 return DeletePlugin((PIPluginBase *) plugin);
194 OCStackResult PIStopAll()
196 return DeletePluginList();
199 OCStackResult PIProcess(PIPlugin * p_plugin)
201 PIPluginBase * plugin = (PIPluginBase *) p_plugin;
204 return OC_STACK_INVALID_PARAM;
206 OCStackResult result = OC_STACK_ERROR;
207 if (plugin->type == PLUGIN_ZIGBEE)
209 result = ZigbeeProcess((PIPlugin_Zigbee *)plugin);