Files
pmomusic/upnp/device.go
2025-09-06 17:45:28 +02:00

161 lines
3.5 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package upnp
import (
"fmt"
)
type DeviceType string
const (
MediaServer DeviceType = "MediaServer"
MediaRenderer DeviceType = "MediaRenderer"
)
type Device struct {
name string
devtype DeviceType
version int
friendlyName string
manufacturer string
manufacturerURL string
modelDescription string
modelName string
modelNumber string
modelURL string
serialNumber string
specVersion string
services ServiceSet
}
// NewDevice creates a new UPnP Device with the given name and type.
// It populates a minimal set of device attributes such as
// FriendlyName, Manufacturer, ModelName and a default version.
//
// Parameters:
//
// name the humanreadable name of the device.
// devtype a unique string identifying the device type
// (used as the Device Identifier as well).
//
// Returns:
//
// *Device a pointer to the freshly allocated Device instance.
// The caller owns the reference and may further
// customise the device by setting additional fields
// or services.
//
// Side effects:
//
// No I/O or external calls are performed. The function
// simply constructs a struct in memory; it is safe to
// call from multiple goroutines.
//
// Example:
//
// // Create a speaker device and register it with a server.
// dev := upnp.NewDevice("LivingRoomSpeaker", "AudioDevice")
// server.RegisterDevice(dev.Name(), dev)
func NewDevice(name string, devtype DeviceType) *Device {
switch devtype {
case MediaServer, MediaRenderer:
dev := &Device{
name: name,
devtype: devtype,
friendlyName: "PMOMusic - " + name,
manufacturer: "Petit Maison Orange",
modelName: "PMOMusic - " + name,
version: 1,
services: make(ServiceSet),
}
return dev
default:
return nil
}
}
func (d *Device) Name() string {
return d.name
}
func (d *Device) SetName(name string) {
d.name = name
}
func (d *Device) SetFriendlyName(name string) {
d.friendlyName = name
}
func (d *Device) SetModelName(name string) {
d.modelName = name
}
func (d *Device) TypeID() string {
return "Device"
}
func (d *Device) DeviceType() DeviceType {
return d.devtype
}
func (d *Device) SetVersion(version int) error {
if version < 1 {
return fmt.Errorf("%s", "version must be greater than or equal to 1")
}
d.version = version
return nil
}
func (d *Device) Version() int {
return d.version
}
func (d *Device) Manufacturer() string {
return d.manufacturer
}
func (d *Device) SetManufacturer(manufacturer string) {
d.manufacturer = manufacturer
}
func (d *Device) ModelName() string {
return d.modelName
}
func (d *Device) AddService(srv *Service) error {
err := d.services.Insert(srv)
return err
}
func (d *Device) NewInstance(server *Server, udn string) *DeviceInstance {
di := &DeviceInstance{
name: d.name,
devtype: d.devtype,
version: d.version,
udn: udn,
server: server,
friendlyName: d.friendlyName,
manufacturer: d.manufacturer,
manufacturerURL: d.manufacturerURL,
modelDescription: d.modelDescription,
modelName: d.modelName,
modelNumber: d.modelNumber,
modelURL: d.modelURL,
serialNumber: d.serialNumber,
specVersion: d.specVersion,
devices: make(DeviceInstanceSet), // vide initialement
services: make(ServiceInstanceSet),
}
for svc := range d.services.All() {
i := svc.NewInstance()
i.device = di
di.services.Insert(i)
}
return di
}