/** Terminates the manager */
 public void terminate() {
   terminateThread = true;
   while (!terminated) {
     ThreadHelper.sleep(10);
   }
   socketStructureManagement.terminate();
 }
  /**
   * Creates a new instance of BinaryDeviceMessageManagement.
   *
   * @param binaryDevice
   */
  public BinaryDeviceMessageManagement(BinaryDevice binaryDevice) {
    super("BinaryDevice.MessageManagement");
    this.binaryDevice = binaryDevice;

    socketStructureManagement = new BinaryDeviceSocketStructureManagement(null, null);
    socketStructureManagement.initHostAddressSocketStructures();

    start();
  }
  /** 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;
  }