package goupnp
import (
"context"
"fmt"
"net"
"net/url"
"github.com/huin/goupnp/soap"
)
type ServiceClient struct {
SOAPClient *soap .SOAPClient
RootDevice *RootDevice
Location *url .URL
Service *Service
localAddr net .IP
}
func NewServiceClientsCtx (ctx context .Context , searchTarget string ) (clients []ServiceClient , errors []error , err error ) {
var maybeRootDevices []MaybeRootDevice
if maybeRootDevices , err = DiscoverDevicesCtx (ctx , searchTarget ); err != nil {
return
}
clients = make ([]ServiceClient , 0 , len (maybeRootDevices ))
for _ , maybeRootDevice := range maybeRootDevices {
if maybeRootDevice .Err != nil {
errors = append (errors , maybeRootDevice .Err )
continue
}
deviceClients , err := newServiceClientsFromRootDevice (maybeRootDevice .Root , maybeRootDevice .Location , searchTarget , maybeRootDevice .LocalAddr )
if err != nil {
errors = append (errors , err )
continue
}
clients = append (clients , deviceClients ...)
}
return
}
func NewServiceClients (searchTarget string ) (clients []ServiceClient , errors []error , err error ) {
return NewServiceClientsCtx (context .Background (), searchTarget )
}
func NewServiceClientsByURLCtx (ctx context .Context , loc *url .URL , searchTarget string ) ([]ServiceClient , error ) {
rootDevice , err := DeviceByURLCtx (ctx , loc )
if err != nil {
return nil , err
}
return NewServiceClientsFromRootDevice (rootDevice , loc , searchTarget )
}
func NewServiceClientsByURL (loc *url .URL , searchTarget string ) ([]ServiceClient , error ) {
return NewServiceClientsByURLCtx (context .Background (), loc , searchTarget )
}
func NewServiceClientsFromRootDevice (rootDevice *RootDevice , loc *url .URL , searchTarget string ) ([]ServiceClient , error ) {
return newServiceClientsFromRootDevice (rootDevice , loc , searchTarget , nil )
}
func newServiceClientsFromRootDevice(
rootDevice *RootDevice ,
loc *url .URL ,
searchTarget string ,
lAddr net .IP ,
) ([]ServiceClient , error ) {
device := &rootDevice .Device
srvs := device .FindService (searchTarget )
if len (srvs ) == 0 {
return nil , fmt .Errorf ("goupnp: service %q not found within device %q (UDN=%q)" ,
searchTarget , device .FriendlyName , device .UDN )
}
clients := make ([]ServiceClient , 0 , len (srvs ))
for _ , srv := range srvs {
clients = append (clients , ServiceClient {
SOAPClient : srv .NewSOAPClient (),
RootDevice : rootDevice ,
Location : loc ,
Service : srv ,
localAddr : lAddr ,
})
}
return clients , nil
}
func (client *ServiceClient ) GetServiceClient () *ServiceClient {
return client
}
func (client *ServiceClient ) LocalAddr () net .IP {
return client .localAddr
}
The pages are generated with Golds v0.8.2 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .