private void BriefAction(XmlReader reader, ServiceAction action) { reader.Read(); foreach (Argument argument in action.Arguments.Values) { argument.Value = argument.RelatedStateVariable.DefaultValue; } while (Helper.ReadToNextElement(reader)) { if (!action.Arguments.ContainsKey(reader.Name)) { throw UpnpControlException.InvalidArgs(); } Argument argument = action.Arguments[reader.Name]; if (argument.RelatedStateVariable.DataType.IsEnum) { try { argument.Value = Enum.Parse(argument.RelatedStateVariable.DataType, reader.ReadString()); } catch { throw UpnpControlException.ArgumentValueOutOfRange(); } } else { try { argument.Value = Convert.ChangeType(reader.ReadString(), argument.RelatedStateVariable.DataType); } catch { throw UpnpControlException.InvalidArgs(); } // TODO handle min, max, and step } } reader.Close(); }
private void HandleContextCore(HttpListenerContext context) { XmlReader reader = XmlReader.Create(context.Request.InputStream); reader.ReadToFollowing("Body", Protocol.SoapEnvelopeSchema); while (Helper.ReadToNextElement(reader)) { if (!service.Actions.ContainsKey(reader.LocalName)) { throw UpnpControlException.InvalidAction(); } ServiceAction action = service.Actions[reader.LocalName]; BriefAction(reader.ReadSubtree(), action); try { action.Execute(); } catch (UpnpControlException) { throw; } catch (ArgumentOutOfRangeException e) { throw UpnpControlException.ArgumentValueOutOfRange(e.Message); } catch (ArgumentException e) { throw UpnpControlException.ArgumentValueInvalid(e.Message); } catch (NotImplementedException e) { throw UpnpControlException.OptionalActionNotImplimented(e.Message); } catch (Exception e) { throw UpnpControlException.ActionFailed(e.Message); } DebriefAction(context, action); } }