[RICPLT-2157] Restructure handlers and converters.......
[ric-plt/e2mgr.git] / E2Manager / handlers / rmrmsghandlers / x2_reset_request_notification_handler.go
 // limitations under the License.
 //
 
-package handlers
+package rmrmsghandlers
 
+// #cgo CFLAGS: -I../../asn1codec/inc/  -I../../asn1codec/e2ap_engine/
+// #cgo LDFLAGS: -L ../../asn1codec/lib/ -L../../asn1codec/e2ap_engine/ -le2ap_codec -lasncodec
+// #include <asn1codec_utils.h>
+// #include <x2reset_response_wrapper.h>
+import "C"
 import (
        "e2mgr/e2pdus"
        "e2mgr/logger"
@@ -25,6 +30,7 @@ import (
        "e2mgr/sessions"
        "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"
        "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader"
+       "unsafe"
 )
 
 type X2ResetRequestNotificationHandler struct {
@@ -37,8 +43,7 @@ func NewX2ResetRequestNotificationHandler(rnibReaderProvider func() reader.RNibR
        }
 }
 
-func (src X2ResetRequestNotificationHandler) Handle(logger *logger.Logger, e2Sessions sessions.E2Sessions,
-       request *models.NotificationRequest, messageChannel chan<- *models.NotificationResponse) {
+func (src X2ResetRequestNotificationHandler) Handle(logger *logger.Logger, e2Sessions sessions.E2Sessions, request *models.NotificationRequest, messageChannel chan<- *models.NotificationResponse) {
 
        logger.Debugf("#X2ResetRequestNotificationHandler.Handle - Ran name: %s", request.RanName)
 
@@ -64,9 +69,24 @@ func (src X2ResetRequestNotificationHandler) Handle(logger *logger.Logger, e2Ses
 
                return
        }
-       response := models.NotificationResponse{RanName: request.RanName, Payload: e2pdus.PackedX2ResetResponse, MgsType: rmrCgo.RIC_X2_RESET_RESP}
-       messageChannel <- &response
+       src.createAndAddToChannel(logger, request, messageChannel)
 
        //TODO change name of printHandlingSetupResponseElapsedTimeInMs (remove setup response) and move to utils?
        printHandlingSetupResponseElapsedTimeInMs(logger, "#X2ResetRequestNotificationHandler.Handle - Summary: Elapsed time for receiving and handling reset request message from E2 terminator", request.StartTime)
-}
\ No newline at end of file
+}
+
+func (src X2ResetRequestNotificationHandler) createAndAddToChannel(logger *logger.Logger, request *models.NotificationRequest, messageChannel chan<- *models.NotificationResponse) {
+
+       packedBuffer := make([]C.uchar, e2pdus.MaxAsn1PackedBufferSize)
+       errorBuffer := make([]C.char, e2pdus.MaxAsn1CodecMessageBufferSize)
+       var payloadSize = C.ulong(e2pdus.MaxAsn1PackedBufferSize)
+
+       if status := C.build_pack_x2reset_response(&payloadSize, &packedBuffer[0], C.ulong(e2pdus.MaxAsn1CodecMessageBufferSize), &errorBuffer[0]); !status {
+               logger.Errorf("#X2ResetRequestNotificationHandler.createAndAddToChannel - failed to build and pack the reset response message %s ", C.GoString(&errorBuffer[0]))
+               return
+       }
+       payload := C.GoBytes(unsafe.Pointer(&packedBuffer[0]), C.int(payloadSize))
+       response := models.NotificationResponse{RanName: request.RanName, Payload: payload, MgsType: rmrCgo.RIC_X2_RESET_RESP}
+
+       messageChannel <- &response
+}