Переглянути джерело

Session verification prior to subscription creation.

ichrispa 10 роки тому
батько
коміт
828d9f00ff
1 змінених файлів з 26 додано та 14 видалено
  1. 26 14
      src/server/ua_services_subscription.c

+ 26 - 14
src/server/ua_services_subscription.c

@@ -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;