Browse Source

Added support for propper DeleteSubscriptions and free()

ichrispa 10 years ago
parent
commit
1cee79cada

+ 28 - 0
src/server/ua_services_subscription.c

@@ -118,6 +118,14 @@ UA_Int32 Service_CreateMonitoredItems(UA_Server *server, UA_Session *session,
 UA_Int32 Service_Publish(UA_Server *server, UA_Session *session,
                          const UA_PublishRequest *request,
                          UA_PublishResponse *response) {
+    
+    // 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;
+    
+    // FIXME
     response->responseHeader.serviceResult = UA_STATUSCODE_BADSERVICEUNSUPPORTED;
     return 0;
 }
@@ -125,6 +133,26 @@ UA_Int32 Service_Publish(UA_Server *server, UA_Session *session,
 UA_Int32 Service_DeleteSubscriptions(UA_Server *server, UA_Session *session,
                                      const UA_DeleteSubscriptionsRequest *request,
                                      UA_DeleteSubscriptionsResponse *response) {
+    UA_StatusCode *retStat;
+    
+    // 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;
+    
+    retStat = (UA_StatusCode *) malloc(sizeof(UA_StatusCode) * request->subscriptionIdsSize);
+    if (retStat==NULL) {
+        response->responseHeader.serviceResult = UA_STATUSCODE_BADOUTOFMEMORY;
+        return -1;
+    }
+    
+    for(int i=0; i<request->subscriptionIdsSize;i++) {
+        retStat[i] = SubscriptionManager_deleteSubscription(&(server->subscriptionManager), request->subscriptionIds[i]);
+    }
+    response->resultsSize = request->subscriptionIdsSize;
+    response->results     = retStat;
+    response->responseHeader.serviceResult = UA_STATUSCODE_BADSERVICEUNSUPPORTED;
     return 0;
 } 
 

+ 17 - 5
src/server/ua_subscription_manager.c

@@ -60,13 +60,25 @@ UA_Subscription *SubscriptionManager_getSubscriptionByID(UA_SubscriptionManager
     return retsub;
 }
 
-void SubscriptionManager_deleteSubscription(UA_SubscriptionManager *manager, UA_Int32 SubscriptionID) {
-    UA_Subscription *sub;
+UA_Int32 SubscriptionManager_deleteSubscription(UA_SubscriptionManager *manager, UA_Int32 SubscriptionID) {
+    UA_Subscription  *sub;
+    UA_MonitoredItem *mon;
     
-    sub = SubscriptionManager_getSubscriptionByID(manager, SubscriptionID);
-    if (sub != NULL) LIST_REMOVE(sub, listEntry);
+    sub = SubscriptionManager_getSubscriptionByID(manager, SubscriptionID);    
+    if (sub != NULL) {
+        while (sub->MonitoredItems->lh_first != NULL)  {
+           mon = sub->MonitoredItems->lh_first;
+           LIST_REMOVE(sub->MonitoredItems->lh_first, listEntry);
+           free(mon);
+        }
+    }
+    else {
+        return UA_STATUSCODE_BADSUBSCRIPTIONIDINVALID;
+    }
+    LIST_REMOVE(sub, listEntry);
+    free(sub);
     
-    return;
+    return UA_STATUSCODE_GOOD;
 } 
 
 #endif //#ifdef ENABLESUBSCRIPTIONS

+ 1 - 1
src/server/ua_subscription_manager.h

@@ -62,7 +62,7 @@ void SubscriptionManager_init(UA_Server *server);
 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);
-void SubscriptionManager_deleteSubscription(UA_SubscriptionManager *manager, UA_Int32 SubscriptionID);
+UA_Int32  SubscriptionManager_deleteSubscription(UA_SubscriptionManager *manager, UA_Int32 SubscriptionID);
 UA_MonitoredItem *UA_MonitoredItem_new(void);
 
 #endif  // ifndef... define UA_SUBSCRIPTION_MANAGER_H_