public boolean getSpecificPortMappingEntry(int externalPort,
                                               String protocol, final PortMappingEntry portMappingEntry)
            throws IOException, SAXException {

        portMappingEntry.setExternalPort(externalPort);
        portMappingEntry.setProtocol(protocol);

        Map<String, String> args = new HashMap<String, String>();
        args.put("NewRemoteHost", ""); // wildcard, any remote host matches
        args.put("NewExternalPort", Integer.toString(externalPort));
        args.put("NewProtocol", protocol);

        Map<String, String> nameValue = simpleUPnPcommand(controlURL,
                serviceType, "GetSpecificPortMappingEntry", args);

        if (nameValue.isEmpty() || nameValue.containsKey("errorCode"))
            return false;

        if (!nameValue.containsKey("NewInternalClient") ||
                !nameValue.containsKey("NewInternalPort"))
            return false;

        portMappingEntry.setProtocol(nameValue.get("NewProtocol"));
        portMappingEntry.setEnabled(nameValue.get("NewEnabled"));
        portMappingEntry.setInternalClient(nameValue.get("NewInternalClient"));
        portMappingEntry.setExternalPort(externalPort);
        portMappingEntry.setPortMappingDescription(nameValue.get("NewPortMappingDescription"));
        portMappingEntry.setRemoteHost(nameValue.get("NewRemoteHost"));

        try {
            portMappingEntry.setInternalPort(Integer.parseInt(nameValue.get("NewInternalPort")));
        } catch (NumberFormatException nfe) {
            // skip bad port
        }


        return true;
    }