Эх сурвалжийг харах

Add "PreDeleteCallback" of Certificate Management Object

micsat 4 жил өмнө
parent
commit
bb716fcb1c

+ 14 - 61
CertificateManagementObject/certificatemanagement.c

@@ -58,6 +58,7 @@
  */
 /** The implemented class revision is 1 */
 #define CERTIFICATE_MANAGEMENT_OBJECT_REVISION 1
+#define DEFAULT_DEVICE_CERTIFICATE_INSTANCE_NUMBER 1
 
 /**
  * declaration of (static) Certificate Management object instance 1 data
@@ -273,70 +274,21 @@ EipStatus CertificateManagementObjectPostCreateCallback(
   return kEipStatusOk;
 }
 
-/** @brief Certificate Management Object Delete service
+/** @brief Certificate Management Object PreDeleteCallback
  *
- *  The Delete service shall be used to delete dynamic instances
- *  (static instances shall return status code 0x2D, Instance Not Deletable).
+ *  Used for common Delete service before instance is deleted
  *  @See Vol.8, Chapter 5-5.5.2
  */
-EipStatus CertificateManagementObjectDelete( //TODO: use common delete service
+EipStatus CertificateManagementObjectPreDeleteCallback(
     CipInstance *RESTRICT const instance,
     CipMessageRouterRequest *const message_router_request,
-    CipMessageRouterResponse *const message_router_response,
-    const struct sockaddr *originator_address,
-    const int encapsulation_session) {
-
-  message_router_response->general_status = kCipErrorInstanceNotDeletable;
-  message_router_response->size_of_additional_status = 0;
-  InitializeENIPMessage(&message_router_response->message);
-  message_router_response->reply_service = (0x80 | message_router_request->service);
-
-  CipClass *const cmo_class =
-      GetCipClass(kCertificateManagementObjectClassCode);
-
-  if (instance->instance_number != 1) {  // static instance 1 should not be deleted
-
-    CipInstance *instances = cmo_class->instances;
-
-    // update pointers in instance list
-    instances = cmo_class->instances; /* pointer to first instance */
-    if (instances->instance_number == instance->instance_number) {  // if instance to delete is head
-      cmo_class->instances = instances->next;
-    } else {
-      while (NULL != instances->next) // as long as what next points to is not zero
-      {
-        CipInstance *next_instance = instances->next;
-        if (next_instance->instance_number == instance->instance_number) {
-          instances->next = next_instance->next;
-          break;
-        }
-        instances = instances->next;
-      }
-    }
-    // free all allocated attributes of instance
-    CipAttributeStruct *attribute = instance->attributes; /* init pointer to array of attributes*/
-    for(int i = 0; i < instance->cip_class->number_of_attributes; i++) {
-        CipFree(attribute->data);
-        ++attribute;
-    }
-    CipFree(instance->attributes);
-
-    OPENER_TRACE_INFO("CMO instance number %d deleted\n", instance->instance_number);
-    CipFree(instance);  // delete instance
-
-    cmo_class->number_of_instances -= 1; /* update the total number of instances
-                                            recorded by the class - Attr. 3 */
-
-    // update largest instance number (class Attribute 2)
-    instances = cmo_class->instances;
-    while (NULL != instances->next) {  // get last element - should be largest number
-      instances = instances->next;
-    }
-    cmo_class->max_instance = instances->instance_number;
-
-    message_router_response->general_status = kCipErrorSuccess;
+    CipMessageRouterResponse *const message_router_response
+) {
+  if (DEFAULT_DEVICE_CERTIFICATE_INSTANCE_NUMBER ==
+      instance->instance_number) {  // static instance 1 should not be deleted
+    message_router_response->general_status = kCipErrorInstanceNotDeletable;
+    return kEipStatusError;
   }
-
   return kEipStatusOk;
 }
 
@@ -469,7 +421,8 @@ void CertificateManagementObjectInitializeClassSettings(CipClass *class) {
   // add Callback function pointers
   class->PreCreateCallback = &CertificateManagementObjectPreCreateCallback;
   class->PostCreateCallback = &CertificateManagementObjectPostCreateCallback;
-  //TODO: add reset + delete callbacks
+  class->PreDeleteCallback = &CertificateManagementObjectPreDeleteCallback;
+  //TODO: add reset callbacks
 
 }
 
@@ -516,8 +469,8 @@ EipStatus CertificateManagementObjectInit(void) {
   );
   InsertService(certificate_management_object_class,
                 kDelete,
-                &CertificateManagementObjectDelete,
-                "CertificateManagementObjectDelete"
+                &Delete,
+                "Delete"
   );
   InsertService(certificate_management_object_class,
                 kGetAttributeSingle,