invoke method

Future<Map<String, String>> invoke(
  1. Map<String, dynamic> args
)

Implementation

Future<Map<String, String>> invoke(Map<String, dynamic> args) async {
  final param =
      '  <u:$name xmlns:u="${service.type}">${args.keys.map((argumentName) {
    String argument = args[argumentName].toString();
    argument = argument.replaceAll('&', '&amp;');
    argument = argument.replaceAll('<', '&lt;');
    argument = argument.replaceAll('>', '&gt;');
    argument = argument.replaceAll('\'', '&apos;');
    argument = argument.replaceAll('"', '&quot;');

    return '<$argumentName>$argument</$argumentName>';
  }).join('\n')}</u:$name>\n';

  final result = await service.sendToControlUrl(name, param);
  final doc = XmlDocument.parse(result);
  XmlElement response = doc.rootElement;

  if (response.name.local != 'Body') {
    response =
        response.children.firstWhere((x) => x is XmlElement) as XmlElement;
  }

  if (const bool.fromEnvironment('upnp.action.show_response',
      defaultValue: false)) {
    print('Got Action Response: ${response.toXmlString()}');
  }

  if (!response.name.local.contains('Response') &&
      response.children.length > 1) {
    response = response.children[1] as XmlElement;
  }

  if (response.children.length == 1) {
    final d = response.children[0];

    if (d is XmlElement) {
      if (d.name.local.contains('Response')) {
        response = d;
      }
    }
  }

  if (const bool.fromEnvironment('upnp.action.show_response',
      defaultValue: false)) {
    print('Got Action Response (Real): ${response.toXmlString()}');
  }

  final List<XmlElement> results =
      response.children.whereType<XmlElement>().toList();
  final map = <String, String>{};
  for (XmlElement r in results) {
    map[r.name.local] = r.innerText;
  }
  return map;
}