Browse Source

Moved subscriptionManager to session (was wrongly attributed to be a server property).

ichrispa 9 years ago
parent
commit
49876d4cfa

+ 0 - 8
src/server/ua_server.c

@@ -6,10 +6,6 @@
 #include "ua_services.h"
 #include "ua_nodeids.h"
 
-#ifdef ENABLESUBSCRIPTIONS
-#include "ua_subscription_manager.h"
-#endif
-
 const UA_ServerConfig UA_ServerConfig_standard = {
         UA_TRUE,
         UA_TRUE,
@@ -307,10 +303,6 @@ UA_Server * UA_Server_new(UA_ServerConfig config) {
 
     // random seed
     server->random_seed = (UA_UInt32)UA_DateTime_now();
-    
-#ifdef ENABLESUBSCRIPTIONS
-    SubscriptionManager_init(server);
-#endif
 
     // networklayers
     server->networkLayers = UA_NULL;

+ 0 - 5
src/server/ua_server_internal.h

@@ -49,11 +49,6 @@ struct UA_Server {
     UA_ByteString serverCertificate;
     UA_SecureChannelManager secureChannelManager;
     UA_SessionManager sessionManager;
-
-    /* Subscriptions and Monitoring */
-#ifdef ENABLESUBSCRIPTIONS
-    UA_SubscriptionManager subscriptionManager;
-#endif
     
     /* Address Space */
     UA_NodeStore *nodestore;

+ 12 - 12
src/server/ua_services_subscription.c

@@ -27,23 +27,23 @@ UA_Int32 Service_CreateSubscription(UA_Server *server, UA_Session *session,
     if ( response->responseHeader.serviceResult != UA_STATUSCODE_GOOD) return 0;
     
     // Create Subscription and Response
-    response->subscriptionId = ++(server->subscriptionManager.LastSessionID);
+    response->subscriptionId = ++(session->subscriptionManager.LastSessionID);
     newSubscription = UA_Subscription_new(response->subscriptionId);
     
-    UA_BOUNDEDVALUE_SETWBOUNDS(server->subscriptionManager.GlobalPublishingInterval, request->requestedPublishingInterval, response->revisedPublishingInterval);
+    UA_BOUNDEDVALUE_SETWBOUNDS(session->subscriptionManager.GlobalPublishingInterval, request->requestedPublishingInterval, response->revisedPublishingInterval);
     newSubscription->PublishingInterval = response->revisedPublishingInterval;
     
-    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(session->subscriptionManager.GlobalLifeTimeCount,  request->requestedLifetimeCount, response->revisedLifetimeCount);
+    newSubscription->LifeTime = (UA_UInt32_BoundedValue)  { .minValue=session->subscriptionManager.GlobalLifeTimeCount.minValue, .maxValue=session->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};
+    UA_BOUNDEDVALUE_SETWBOUNDS(session->subscriptionManager.GlobalKeepAliveCount, request->requestedMaxKeepAliveCount, response->revisedMaxKeepAliveCount);
+    newSubscription->KeepAliveCount = (UA_UInt32_BoundedValue)  { .minValue=session->subscriptionManager.GlobalKeepAliveCount.minValue, .maxValue=session->subscriptionManager.GlobalKeepAliveCount.maxValue, .currentValue=response->revisedMaxKeepAliveCount};
     
     newSubscription->NotificationsPerPublish = request->maxNotificationsPerPublish;
     newSubscription->PublishingMode          = request->publishingEnabled;
     newSubscription->Priority                = request->priority;
     
-    SubscriptionManager_addSubscription(&(server->subscriptionManager), newSubscription);    
+    SubscriptionManager_addSubscription(&(session->subscriptionManager), newSubscription);    
     
     return (UA_Int32) 0;
 }
@@ -58,7 +58,7 @@ UA_Int32 Service_CreateMonitoredItems(UA_Server *server, UA_Session *session,
     
     // Verify Session and Subscription
     response->responseHeader.serviceResult = UA_STATUSCODE_GOOD;
-    sub=SubscriptionManager_getSubscriptionByID(&(server->subscriptionManager), request->subscriptionId);
+    sub=SubscriptionManager_getSubscriptionByID(&(session->subscriptionManager), request->subscriptionId);
     if (session == NULL ) response->responseHeader.serviceResult = UA_STATUSCODE_BADSESSIONIDINVALID;           
     else if ( session->channel == NULL || session->activated == UA_FALSE) response->responseHeader.serviceResult = UA_STATUSCODE_BADSESSIONNOTACTIVATED;
     else if ( sub == NULL) response->responseHeader.serviceResult = UA_STATUSCODE_BADSUBSCRIPTIONIDINVALID;
@@ -97,15 +97,15 @@ UA_Int32 Service_CreateMonitoredItems(UA_Server *server, UA_Session *session,
             
             newMon = UA_MonitoredItem_new();
             memcpy(&(newMon->ItemNodeId), &(thisItemsRequest->itemToMonitor.nodeId), sizeof(UA_NodeId));
-            newMon->ItemId = ++(server->subscriptionManager.LastSessionID);
+            newMon->ItemId = ++(session->subscriptionManager.LastSessionID);
             thisItemsResult->monitoredItemId = newMon->ItemId;
             
             newMon->ClientHandle = thisItemsRequest->requestedParameters.clientHandle;
             
-            UA_BOUNDEDVALUE_SETWBOUNDS(server->subscriptionManager.GlobalSamplingInterval , thisItemsRequest->requestedParameters.samplingInterval, thisItemsResult->revisedSamplingInterval);
+            UA_BOUNDEDVALUE_SETWBOUNDS(session->subscriptionManager.GlobalSamplingInterval , thisItemsRequest->requestedParameters.samplingInterval, thisItemsResult->revisedSamplingInterval);
             newMon->SamplingInterval = thisItemsResult->revisedSamplingInterval;
             
-            UA_BOUNDEDVALUE_SETWBOUNDS(server->subscriptionManager.GlobalQueueSize, thisItemsRequest->requestedParameters.queueSize, thisItemsResult->revisedQueueSize);
+            UA_BOUNDEDVALUE_SETWBOUNDS(session->subscriptionManager.GlobalQueueSize, thisItemsRequest->requestedParameters.queueSize, thisItemsResult->revisedQueueSize);
             newMon->QueueSize = thisItemsResult->revisedQueueSize;
             
             LIST_INSERT_HEAD(sub->MonitoredItems, newMon, listEntry);
@@ -148,7 +148,7 @@ UA_Int32 Service_DeleteSubscriptions(UA_Server *server, UA_Session *session,
     }
     
     for(int i=0; i<request->subscriptionIdsSize;i++) {
-        retStat[i] = SubscriptionManager_deleteSubscription(&(server->subscriptionManager), request->subscriptionIds[i]);
+        retStat[i] = SubscriptionManager_deleteSubscription(&(session->subscriptionManager), request->subscriptionIds[i]);
     }
     response->resultsSize = request->subscriptionIdsSize;
     response->results     = retStat;

+ 7 - 4
src/server/ua_subscription_manager.c

@@ -5,8 +5,8 @@
 
 #include <stdio.h> // Remove later, debugging only
 
-void SubscriptionManager_init(UA_Server *server) {
-    UA_SubscriptionManager *manager = &(server->subscriptionManager);
+void SubscriptionManager_init(UA_Session *session) {
+    UA_SubscriptionManager *manager = &(session->subscriptionManager);
 
     /* FIXME: These init values are empirical. Maybe they should be part
      *        of the server config? */
@@ -20,8 +20,7 @@ void SubscriptionManager_init(UA_Server *server) {
     manager->ServerSubscriptions = (UA_ListOfUASubscriptions *) malloc (sizeof(UA_ListOfUASubscriptions));
     LIST_INIT(manager->ServerSubscriptions);
     
-    // Do this after the malloc to provide some basic degree of entropy
-    manager->LastSessionID = (UA_UInt32) (server->random_seed + (UA_UInt32)UA_DateTime_now());
+    manager->LastSessionID = (UA_UInt32) UA_DateTime_now();
     return;
 }
 
@@ -81,4 +80,8 @@ UA_Int32 SubscriptionManager_deleteSubscription(UA_SubscriptionManager *manager,
     return UA_STATUSCODE_GOOD;
 } 
 
+// void MonitoredItem_UpdateQueue(UA_MonitoredItem *monitoredItem) {
+    //
+//}
+
 #endif //#ifdef ENABLESUBSCRIPTIONS

+ 1 - 1
src/server/ua_subscription_manager.h

@@ -58,7 +58,7 @@ typedef struct UA_SubscriptionManager_s {
     UA_ListOfUASubscriptions *ServerSubscriptions;
 } UA_SubscriptionManager;
 
-void SubscriptionManager_init(UA_Server *server);
+void SubscriptionManager_init(UA_Session *session);
 UA_Subscription *UA_Subscription_new(UA_Int32 SubscriptionID);
 void SubscriptionManager_addSubscription(UA_SubscriptionManager *manager, UA_Subscription *subscription);
 UA_Subscription *SubscriptionManager_getSubscriptionByID(UA_SubscriptionManager *manager, UA_Int32 SubscriptionID);

+ 3 - 0
src/ua_session.c

@@ -50,6 +50,9 @@ void UA_Session_init(UA_Session *session) {
     UA_DateTime_init(&session->validTill);
     session->channel = UA_NULL;
     session->continuationPoints = (struct ContinuationPointList){UA_NULL};
+    #ifdef ENABLESUBSCRIPTIONS
+        SubscriptionManager_init(session);
+    #endif
 }
 
 void UA_Session_deleteMembers(UA_Session *session) {

+ 7 - 0
src/ua_session.h

@@ -5,6 +5,10 @@
 #include "ua_securechannel.h"
 #include "queue.h"
 
+#ifdef ENABLESUBSCRIPTIONS
+#include "server/ua_subscription_manager.h"
+#endif
+
 /**
  *  @ingroup communication
  *
@@ -29,6 +33,9 @@ struct UA_Session {
     UA_UInt32         maxResponseMessageSize;
     UA_Int64          timeout;
     UA_DateTime       validTill;
+    #ifdef ENABLESUBSCRIPTIONS
+        UA_SubscriptionManager subscriptionManager;
+    #endif
     UA_SecureChannel *channel;
     LIST_HEAD(ContinuationPointList, ContinuationPointEntry) continuationPoints;
 };