Skip to content
This repository was archived by the owner on Jan 14, 2021. It is now read-only.

Inotifypropertychanged #4

Open
wants to merge 5 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
73 changes: 42 additions & 31 deletions src/Mono.Upnp/Mono.Upnp/Mono.Upnp.Control/ServiceController.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
//
//
// ServiceController.cs
//
// Author:
Expand Down Expand Up @@ -41,6 +41,7 @@ public class ServiceController :
IXmlDeserializer<ServiceAction>,
IXmlDeserializer<StateVariable>
{
Service service;
DataServer scpd_server;
ControlServer control_server;
ControlClient control_client;
Expand All @@ -59,45 +60,55 @@ protected internal ServiceController (Deserializer deserializer, Service service
} else if (service.EventUrl == null) {
throw new ArgumentException ("The service has no EventUrl.", "service");
}


this.service = service;
actions = new CollectionMap<string, ServiceAction> ();
state_variables = new CollectionMap<string, StateVariable> ();
control_client = new ControlClient (
service.Type.ToString (), service.ControlUrl, deserializer.XmlDeserializer);
event_client = new EventClient (state_variables, service.EventUrl);
}

public ServiceController (IEnumerable<ServiceAction> actions, IEnumerable<StateVariable> stateVariables)
{
this.actions = Helper.MakeReadOnlyCopy<string, ServiceAction> (actions);
this.state_variables = Helper.MakeReadOnlyCopy<string, StateVariable> (stateVariables);
SpecVersion = new SpecVersion (1, 1);
}


public Service Service
{
get { return service; }
}

[XmlAttribute ("configId")]
protected internal virtual string ConfigurationId { get; set; }

[XmlElement ("specVersion")]
public virtual SpecVersion SpecVersion { get; protected set; }

[XmlArray ("actionList")]
protected virtual ICollection<ServiceAction> ActionCollection {
protected virtual ICollection<ServiceAction> ActionCollection
{
get { return actions; }
}

public IMap<string, ServiceAction> Actions {
public IMap<string, ServiceAction> Actions
{
get { return actions; }
}

[XmlArray ("serviceStateTable")]
protected virtual ICollection<StateVariable> StateVariableCollection {
protected virtual ICollection<StateVariable> StateVariableCollection
{
get { return state_variables; }
}

public IMap<string, StateVariable> StateVariables {
public IMap<string, StateVariable> StateVariables
{
get { return state_variables; }
}

protected internal virtual void Initialize (XmlSerializer serializer, Service service)
{
if (serializer == null) {
Expand All @@ -111,38 +122,38 @@ protected internal virtual void Initialize (XmlSerializer serializer, Service se
} else if (service.EventUrl == null) {
throw new ArgumentException ("The service has no EventUrl.", "service");
}

scpd_server = new DataServer (serializer.GetBytes (this), @"text/xml; charset=""utf-8""", service.ScpdUrl);
control_server = new ControlServer (actions, service.Type.ToString (), service.ControlUrl, serializer);
event_server = new EventServer (state_variables.Values, service.EventUrl);

foreach (var state_variable in state_variables.Values) {
state_variable.Initialize (this);
}
}

protected internal virtual void Start ()
{
if (scpd_server == null) {
throw new InvalidOperationException ("The service controller has not been initialized.");
}

scpd_server.Start ();
control_server.Start ();
event_server.Start ();
}

protected internal virtual void Stop ()
{
if (scpd_server == null) {
throw new InvalidOperationException ("The service controller has not been initialized.");
}

scpd_server.Stop ();
control_server.Stop ();
event_server.Stop ();
}

protected internal virtual IMap<string, string> Invoke (ServiceAction action,
IDictionary<string, string> arguments,
int retryAttempts)
Expand Down Expand Up @@ -172,64 +183,64 @@ internal void RefEvents ()
{
event_client.Ref ();
}

internal void UnrefEvents ()
{
event_client.Unref ();
}

internal void UpdateStateVariable (StateVariable stateVariable)
{
event_server.QueueUpdate (stateVariable);
}

ServiceAction IXmlDeserializer<ServiceAction>.Deserialize (XmlDeserializationContext context)
{
return DeserializeAction (context);
}

protected virtual ServiceAction DeserializeAction (XmlDeserializationContext context)
{
return Deserializer != null ? Deserializer.DeserializeAction (this, context) : null;
}

StateVariable IXmlDeserializer<StateVariable>.Deserialize (XmlDeserializationContext context)
{
return DeserializeStateVariable (context);
}

protected virtual StateVariable DeserializeStateVariable (XmlDeserializationContext context)
{
return Deserializer != null ? Deserializer.DeserializeStateVariable (this, context) : null;
}

void IXmlDeserializable.Deserialize (XmlDeserializationContext context)
{
Deserialize (context);
actions.MakeReadOnly ();
state_variables.MakeReadOnly ();
}

void IXmlDeserializable.DeserializeAttribute (XmlDeserializationContext context)
{
DeserializeAttribute (context);
}

void IXmlDeserializable.DeserializeElement (XmlDeserializationContext context)
{
DeserializeElement (context);
}

protected override void DeserializeElement (XmlDeserializationContext context)
{
AutoDeserializeElement (this, context);
}

protected override void Serialize (Mono.Upnp.Xml.XmlSerializationContext context)
{
AutoSerialize (this, context);
}

protected override void SerializeMembers (XmlSerializationContext context)
{
AutoSerializeMembers (this, context);
Expand Down
Loading