/*
   * (non-Javadoc)
   *
   * @see de.fhg.fokus.magic.http.IHTTPClient#sendRequestAndWaitForResponse(de.fhg.fokus.magic.http.HTTPMessageObject)
   */
  public void sendRequestAndWaitForResponse(HTTPMessageObject request) {
    if (request == null) {
      logger.error("no message to be sent");
      return;
    }

    // cancel request if too many active clients
    if (activeClients > HTTPDefaults.MAX_ACTIVE_CLIENTS) {
      return;
    }
    activeClients++;

    int numberOfRetries = 0;
    boolean success = false;

    while (!success && !terminateClient && numberOfRetries < HTTPDefaults.MAX_CLIENT_FAILURES) {
      try {
        if (socket == null) {
          socket = new DatagramSocket();
        }
        SocketHelper.sendBinaryMessage(request.toBinaryMessage(), socket);

        // try to receive response for 2 seconds
        BinaryMessageObject binaryResponse = SocketHelper.readBinaryMessage(null, socket, 2000);

        if (binaryResponse != null) {
          responseMessage = binaryResponse.toHTTPMessageObject();
          responseMessage.setDestinationAddress(binaryResponse.getSourceAddress());
          responseMessage.setSourceAddress(request.getDestinationAddress());
        }
        success = true;
      } catch (Exception e) {
        numberOfRetries++;
      }
    }
    tryClose();
    activeClients--;

    if (debug) {
      System.out.println("HTTPClient response header:" + responseMessage.getHeader());
      System.out.println(
          "HTTPClient response body:"
              + StringHelper.byteArrayToUTF8String(responseMessage.getBody()));
    }
  }
  /** Reads messages */
  public void run() {
    while (!terminateThread) {
      for (int i = 0; i < socketStructureManagement.getSocketStructureCount(); i++) {
        BinaryDeviceHostAddressSocketStructure currentSocketStructure =
            (BinaryDeviceHostAddressSocketStructure)
                socketStructureManagement.getSocketStructure(i);

        BinaryMessageObject message = null;
        // read search messages
        do {
          message =
              SocketHelper.readBinaryMessage(null, currentSocketStructure.getDiscoverySocket(), 10);
          if (message != null) {
            // Portable.println("Discovery: Received multicast discovery message");
            binaryDevice.processDiscoveryMessage(message, currentSocketStructure);
          }
        } while (message != null);
        // read search reply messages
        do {
          message =
              SocketHelper.readBinaryMessage(
                  null, currentSocketStructure.getDescriptionSocket(), 10);
          if (message != null) {
            Portable.println(
                "Description: Received description request from "
                    + IPHelper.toString(message.getSourceAddress())
                    + " with "
                    + BinaryUPnPConstants.toDebugString(message.getBody()));
            binaryDevice.processDescriptionMessage(message, currentSocketStructure);
          }
        } while (message != null);
        do {
          // read control messages
          message =
              SocketHelper.readBinaryMessage(null, currentSocketStructure.getControlSocket(), 10);
          if (message != null) {
            binaryDevice.processControlMessage(message, currentSocketStructure);
          }
        } while (message != null);
      }
      ThreadHelper.sleep(50);
    }
    terminated = true;
  }
 /**
  * Sends a request which is not answered by the server. This method can be used for time-critical
  * data
  */
 public void sendRequest(HTTPMessageObject request) {
   if (request == null) {
     logger.error("no message to be sent");
     return;
   }
   try {
     if (socket == null) {
       socket = new DatagramSocket();
     }
     SocketHelper.sendBinaryMessage(request.toBinaryMessage(), socket);
   } catch (Exception e) {
   } finally {
     tryClose();
   }
 }
  /** Reads SSDP messages from the multicast sockets of all registered modules */
  public void run() {
    // System.out.println(" Start ExternalSSDPManagement thread, wait for NOTIFY and M-SEARCH
    // packets...");

    while (!terminateThread) {
      synchronized (listLock) {
        for (int i = 0; i < socketList.size(); i++) {
          IDatagramSocket socket = (IDatagramSocket) socketList.elementAt(i);

          boolean readUDP = true;
          while (readUDP) {
            BinaryMessageObject binaryMessage =
                SocketHelper.readBinaryMessage(udpPacketManager, socket, 20);
            if (binaryMessage != null) {
              // System.out.println("Received message from " +
              // IPAddress.toString(binaryMessage.getSourceAddress()));
              HTTPMessageObject httpMessage =
                  new HTTPMessageObject(
                      binaryMessage.getBodyAsString(), binaryMessage.getSourceAddress());

              // allow message processing by registered handler
              ((ISSDPMessageHandler) messageHandlerList.elementAt(i)).processMessage(httpMessage);
            } else {
              readUDP = false;
            }
          }
        }
      }
      if (udpPacketManager != null) {
        udpPacketManager.triggerEvents();
      }

      ThreadHelper.sleep(50);
    }
    System.out.println("  ExternalSSDPManagement thread was shut down");
    // close sockets
    terminated = true;
  }