github.com/enbility/spine-go@v0.7.0/spine/nodemanagement_subscription.go (about) 1 package spine 2 3 import ( 4 "fmt" 5 6 "github.com/ahmetb/go-linq/v3" 7 "github.com/enbility/spine-go/api" 8 "github.com/enbility/spine-go/model" 9 "github.com/enbility/spine-go/util" 10 ) 11 12 func NewNodeManagementSubscriptionRequestCallType(clientAddress *model.FeatureAddressType, serverAddress *model.FeatureAddressType, featureType model.FeatureTypeType) *model.NodeManagementSubscriptionRequestCallType { 13 return &model.NodeManagementSubscriptionRequestCallType{ 14 SubscriptionRequest: &model.SubscriptionManagementRequestCallType{ 15 ClientAddress: clientAddress, 16 ServerAddress: serverAddress, 17 ServerFeatureType: &featureType, 18 }, 19 } 20 } 21 22 func NewNodeManagementSubscriptionDeleteCallType(clientAddress *model.FeatureAddressType, serverAddress *model.FeatureAddressType) *model.NodeManagementSubscriptionDeleteCallType { 23 return &model.NodeManagementSubscriptionDeleteCallType{ 24 SubscriptionDelete: &model.SubscriptionManagementDeleteCallType{ 25 ClientAddress: clientAddress, 26 ServerAddress: serverAddress, 27 }, 28 } 29 } 30 31 // route subscription request calls to the appropriate feature implementation and add the subscription to the current list 32 func (r *NodeManagement) processReadSubscriptionData(message *api.Message) error { 33 var remoteDeviceSubscriptions []model.SubscriptionManagementEntryDataType 34 remoteDeviceSubscriptionEntries := r.Device().SubscriptionManager().Subscriptions(message.FeatureRemote.Device()) 35 linq.From(remoteDeviceSubscriptionEntries).SelectT(func(s *api.SubscriptionEntry) model.SubscriptionManagementEntryDataType { 36 return model.SubscriptionManagementEntryDataType{ 37 SubscriptionId: util.Ptr(model.SubscriptionIdType(s.Id)), 38 ServerAddress: s.ServerFeature.Address(), 39 ClientAddress: s.ClientFeature.Address(), 40 } 41 }).ToSlice(&remoteDeviceSubscriptions) 42 43 cmd := model.CmdType{ 44 NodeManagementSubscriptionData: &model.NodeManagementSubscriptionDataType{ 45 SubscriptionEntry: remoteDeviceSubscriptions, 46 }, 47 } 48 49 return message.FeatureRemote.Device().Sender().Reply(message.RequestHeader, r.Address(), cmd) 50 } 51 52 func (r *NodeManagement) handleMsgSubscriptionData(message *api.Message) error { 53 switch message.CmdClassifier { 54 case model.CmdClassifierTypeCall: 55 return r.processReadSubscriptionData(message) 56 57 default: 58 return fmt.Errorf("nodemanagement.handleSubscriptionDeleteCall: NodeManagementSubscriptionRequestCall CmdClassifierType not implemented: %s", message.CmdClassifier) 59 } 60 } 61 62 func (r *NodeManagement) handleMsgSubscriptionRequestCall(message *api.Message, data *model.NodeManagementSubscriptionRequestCallType) error { 63 switch message.CmdClassifier { 64 case model.CmdClassifierTypeCall: 65 subscriptionMgr := r.Device().SubscriptionManager() 66 67 return subscriptionMgr.AddSubscription(message.FeatureRemote.Device(), *data.SubscriptionRequest) 68 69 default: 70 return fmt.Errorf("nodemanagement.handleSubscriptionRequestCall: NodeManagementSubscriptionRequestCall CmdClassifierType not implemented: %s", message.CmdClassifier) 71 } 72 } 73 74 func (r *NodeManagement) handleMsgSubscriptionDeleteCall(message *api.Message, data *model.NodeManagementSubscriptionDeleteCallType) error { 75 switch message.CmdClassifier { 76 case model.CmdClassifierTypeCall: 77 subscriptionMgr := r.Device().SubscriptionManager() 78 79 return subscriptionMgr.RemoveSubscription(*data.SubscriptionDelete, message.FeatureRemote.Device()) 80 81 default: 82 return fmt.Errorf("nodemanagement.handleSubscriptionDeleteCall: NodeManagementSubscriptionRequestCall CmdClassifierType not implemented: %s", message.CmdClassifier) 83 } 84 }