161 lines
3.5 KiB
Go
161 lines
3.5 KiB
Go
package pmoupnp
|
||
|
||
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 human‑readable 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
|
||
}
|