|
@@ -5,31 +5,43 @@
|
|
|
#include "ua_statuscodes.h"
|
|
|
#include "ua_util.h"
|
|
|
|
|
|
-// Remove later, debugging only
|
|
|
-#include "ua_log.h"
|
|
|
|
|
|
+#include "ua_log.h" // Remove later, debugging only
|
|
|
+
|
|
|
+#define UA_BOUNDEDVALUE_SETWBOUNDS(BOUNDS, SRC, DST) { \
|
|
|
+ if (SRC > BOUNDS.maxValue) DST = BOUNDS.maxValue; \
|
|
|
+ else if (SRC < BOUNDS.minValue) DST = BOUNDS.minValue; \
|
|
|
+ else DST = SRC; \
|
|
|
+ }
|
|
|
+
|
|
|
UA_Int32 Service_CreateSubscription(UA_Server *server, UA_Session *session,
|
|
|
const UA_CreateSubscriptionRequest *request,
|
|
|
UA_CreateSubscriptionResponse *response) {
|
|
|
UA_Subscription *newSubscription;
|
|
|
+
|
|
|
+ // Verify Session
|
|
|
response->responseHeader.serviceResult = UA_STATUSCODE_GOOD;
|
|
|
+ if (session == NULL ) response->responseHeader.serviceResult = UA_STATUSCODE_BADSESSIONIDINVALID;
|
|
|
+ else if ( session->channel == NULL || session->activated == UA_FALSE) response->responseHeader.serviceResult = UA_STATUSCODE_BADSESSIONNOTACTIVATED;
|
|
|
+ if ( response->responseHeader.serviceResult != UA_STATUSCODE_GOOD) return 0;
|
|
|
|
|
|
+ // Create Subscription and Response
|
|
|
response->subscriptionId = ++(server->subscriptionManager.LastSessionID);
|
|
|
- if (request->requestedPublishingInterval > server->subscriptionManager.GlobalPublishingInterval.maxValue) response->revisedPublishingInterval = server->subscriptionManager.GlobalPublishingInterval.maxValue ;
|
|
|
- else if (request->requestedPublishingInterval < server->subscriptionManager.GlobalPublishingInterval.minValue) response->revisedPublishingInterval = server->subscriptionManager.GlobalPublishingInterval.minValue ;
|
|
|
- else response->revisedPublishingInterval = request->requestedPublishingInterval ;
|
|
|
+ newSubscription = UA_Subscription_new(response->subscriptionId);
|
|
|
|
|
|
- if (request->requestedLifetimeCount > server->subscriptionManager.GlobalLifeTimeCount.maxValue) response->revisedLifetimeCount = server->subscriptionManager.GlobalLifeTimeCount.maxValue ;
|
|
|
- else if (request->requestedLifetimeCount < server->subscriptionManager.GlobalLifeTimeCount.minValue) response->revisedLifetimeCount = server->subscriptionManager.GlobalLifeTimeCount.minValue ;
|
|
|
- else response->revisedLifetimeCount = request->requestedLifetimeCount ;
|
|
|
+ UA_BOUNDEDVALUE_SETWBOUNDS(server->subscriptionManager.GlobalPublishingInterval, request->requestedPublishingInterval, response->revisedPublishingInterval);
|
|
|
+ newSubscription->PublishingInterval = response->revisedPublishingInterval;
|
|
|
|
|
|
- if (request->requestedMaxKeepAliveCount > server->subscriptionManager.GlobalKeepAliveCount.maxValue) response->revisedMaxKeepAliveCount = server->subscriptionManager.GlobalKeepAliveCount.maxValue ;
|
|
|
- else if (request->requestedMaxKeepAliveCount < server->subscriptionManager.GlobalKeepAliveCount.minValue) response->revisedMaxKeepAliveCount = server->subscriptionManager.GlobalKeepAliveCount.minValue ;
|
|
|
- else response->revisedMaxKeepAliveCount = request->requestedMaxKeepAliveCount ;
|
|
|
+ UA_BOUNDEDVALUE_SETWBOUNDS(server->subscriptionManager.GlobalLifeTimeCount, request->requestedLifetimeCount, response->revisedLifetimeCount);
|
|
|
+ newSubscription->LifeTime = (UA_UInt32_BoundedValue) { .minValue=server->subscriptionManager.GlobalLifeTimeCount.minValue, .maxValue=server->subscriptionManager.GlobalLifeTimeCount.maxValue, .currentValue=response->revisedLifetimeCount};
|
|
|
+
|
|
|
+ UA_BOUNDEDVALUE_SETWBOUNDS(server->subscriptionManager.GlobalKeepAliveCount, request->requestedMaxKeepAliveCount, response->revisedMaxKeepAliveCount);
|
|
|
+ newSubscription->KeepAliveCount = (UA_UInt32_BoundedValue) { .minValue=server->subscriptionManager.GlobalKeepAliveCount.minValue, .maxValue=server->subscriptionManager.GlobalKeepAliveCount.maxValue, .currentValue=response->revisedMaxKeepAliveCount};
|
|
|
+
|
|
|
+ newSubscription->NotificationsPerPublish = request->maxNotificationsPerPublish;
|
|
|
+ newSubscription->PublishingMode = request->publishingEnabled;
|
|
|
+ newSubscription->Priority = request->priority;
|
|
|
|
|
|
- //maxNotificationsPerPublish ?
|
|
|
- //Type??
|
|
|
- newSubscription = UA_Subscription_new(response->subscriptionId);
|
|
|
SubscriptionManager_addSubscription(&(server->subscriptionManager), newSubscription);
|
|
|
|
|
|
return (UA_Int32) 0;
|