/** * Creates a new helper for a given client connector. * * @param client The client to help. * @param helperClass Optional helper class name. * @return The new helper. */ @SuppressWarnings("unchecked") public ConnectorHelper<Client> createHelper(Client client, String helperClass) { ConnectorHelper<Client> result = null; if (client.getProtocols().size() > 0) { ConnectorHelper<Client> connector = null; for (final Iterator<ConnectorHelper<Client>> iter = getRegisteredClients().iterator(); (result == null) && iter.hasNext(); ) { connector = iter.next(); if (connector.getProtocols().containsAll(client.getProtocols())) { if ((helperClass == null) || connector.getClass().getCanonicalName().equals(helperClass)) { try { result = connector.getClass().getConstructor(Client.class).newInstance(client); } catch (Exception e) { Context.getCurrentLogger() .log( Level.SEVERE, "Exception during the instantiation of the client connector.", e); } } } } if (result == null) { // Couldn't find a matching connector StringBuilder sb = new StringBuilder(); sb.append("No available client connector supports the required protocols: "); for (Protocol p : client.getProtocols()) { sb.append("'").append(p.getName()).append("' "); } sb.append(". Please add the JAR of a matching connector to your classpath."); if (Edition.CURRENT == Edition.ANDROID) { sb.append(" Then, register this connector helper manually."); } Context.getCurrentLogger().log(Level.WARNING, sb.toString()); } } return result; }
/** * Put the headers in the request's attributes map. * * @param headers */ public void setHeaders(Series<Header> headers) { getAttributes().put(HeaderConstants.ATTRIBUTE_HEADERS, headers); // Parse the protocol string if (protocol != null) { int slashIndex = protocol.indexOf('/'); if (slashIndex != -1) { protocol = protocol.substring(slashIndex + 1); } else { protocol = null; } } // Set the protocol used for this request Protocol serverProtocol = getConnection().getHelper().getHelped().getProtocols().get(0); setProtocol( new Protocol( serverProtocol.getSchemeName(), serverProtocol.getName(), serverProtocol.getDescription(), serverProtocol.getDefaultPort(), serverProtocol.isConfidential(), protocol)); // Parse the host header String host = (getHeaders() == null) ? null : getHeaders().getFirstValue(HeaderConstants.HEADER_HOST, true); String hostDomain = null; int hostPort = -1; if (host != null) { int colonIndex = host.indexOf(':'); if (colonIndex != -1) { hostDomain = host.substring(0, colonIndex); hostPort = Integer.valueOf(host.substring(colonIndex + 1)); } else { hostDomain = host; hostPort = getProtocol().getDefaultPort(); } } else { if (!Protocol.SIP.getSchemeName().equals(serverProtocol.getSchemeName()) && !Protocol.SIPS.getSchemeName().equals(serverProtocol.getSchemeName())) { Context.getCurrentLogger().info("Couldn't find the mandatory \"Host\" HTTP header."); } } // Set the host reference Protocol protocol = getConnection().getHelper().getHelped().getProtocols().get(0); StringBuilder sb = new StringBuilder(); sb.append(protocol.getSchemeName()).append("://"); sb.append(hostDomain); if ((hostPort != -1) && (hostPort != protocol.getDefaultPort())) { sb.append(':').append(hostPort); } setHostRef(sb.toString()); // Set the resource reference if (resourceUri != null) { setResourceRef(new Reference(getHostRef(), resourceUri)); if (getResourceRef().isRelative()) { // Take care of the "/" between the host part and the segments. if (!resourceUri.startsWith("/")) { setResourceRef(new Reference(getHostRef().toString() + "/" + resourceUri)); } else { setResourceRef(new Reference(getHostRef().toString() + resourceUri)); } } setOriginalRef(getResourceRef().getTargetRef()); } // Set the request date String dateHeader = (getHeaders() == null) ? null : getHeaders().getFirstValue(HeaderConstants.HEADER_DATE, true); Date date = null; if (dateHeader != null) { date = DateUtils.parse(dateHeader); } if (date == null) { date = new Date(); } setDate(date); // Set the max forwards String maxForwardsHeader = (getHeaders() == null) ? null : getHeaders().getFirstValue(HeaderConstants.HEADER_MAX_FORWARDS, true); if (maxForwardsHeader != null) { try { setMaxForwards(Integer.parseInt(maxForwardsHeader)); } catch (NumberFormatException nfe) { Context.getCurrentLogger() .info("Unable to parse the Max-Forwards header: " + maxForwardsHeader); } } // Set the "callId" property String callIdHeader = (getHeaders() == null) ? null : getHeaders().getFirstValue(SipConstants.HEADER_CALL_ID, true); if (callIdHeader != null) { setCallId(callIdHeader); } // Set the "callSeq" property String callSeqHeader = (getHeaders() == null) ? null : getHeaders().getFirstValue(SipConstants.HEADER_CALL_SEQ, true); if (callSeqHeader != null) { setCommandSequence(callSeqHeader); } // Set the "to" property String toHeader = (getHeaders() == null) ? null : getHeaders().getFirstValue(SipConstants.HEADER_TO, true); if (toHeader != null) { try { setTo(new AddressReader(toHeader).readValue()); } catch (IOException e) { e.printStackTrace(); } } // Set the "from" property String fromHeader = (getHeaders() == null) ? null : getHeaders().getFirstValue(HeaderConstants.HEADER_FROM, true); if (fromHeader != null) { try { setFrom(new AddressReader(fromHeader).readValue()); } catch (IOException e) { e.printStackTrace(); } } // Set the "mime-version" property String mimeVersionHeader = (getHeaders() == null) ? null : getHeaders().getFirstValue(SipConstants.HEADER_MIME_VERSION, true); setMimeVersion(mimeVersionHeader); // Set the "mime-version" property String organizationHeader = (getHeaders() == null) ? null : getHeaders().getFirstValue(SipConstants.HEADER_ORGANIZATION, true); setOrganization(organizationHeader); String subjectHeader = (getHeaders() == null) ? null : getHeaders().getFirstValue(SipConstants.HEADER_SUBJECT, true); setSubject(subjectHeader); }