/**
   * Sends a message over the connection. This method extracts the data payload from the <code>
   * Message</code> object so that it can be sent as a datagram.
   *
   * @param dmsg a <code>Message</code> object.
   * @exception ConnectionNotFoundException if the address is invalid or if no address is found in
   *     the message.
   * @exception IOException if an I/O error occurs.
   */
  public void send(Message dmsg) throws IOException {

    /** Saved timestamp for use with multiple segment records. */
    long sendtime = System.currentTimeMillis();

    byte[] buffer = null;
    String type = null;
    if (dmsg instanceof TextMessage) {
      type = MessageConnection.TEXT_MESSAGE;
      buffer = ((TextObject) dmsg).getPayloadData();
    } else if (dmsg instanceof BinaryMessage) {
      type = MessageConnection.BINARY_MESSAGE;
      buffer = ((BinaryObject) dmsg).getPayloadData();
    }

    /*
     * For text messages choose between UCS-2 or GSM 7-bit
     * encoding.
     */
    int encodingType = MessageTransportConstants.GSM_BINARY;
    if (type.equals(MessageConnection.TEXT_MESSAGE)) {
      byte[] gsm7bytes = TextEncoder.encode(buffer);
      if (gsm7bytes != null) {
        encodingType = MessageTransportConstants.GSM_TEXT;
        buffer = gsm7bytes;
      } else {
        encodingType = MessageTransportConstants.GSM_UCS2;
      }
    }

    mess = new DatagramPacket(buf, MessageTransportConstants.DATAGRAM_PACKET_SIZE);
    mess.setAddress(InetAddress.getByName(clientHost));
    mess.setPort(portOut);

    SMSPacket smsPacket = new SMSPacket();
    smsPacket.setEncodingType(encodingType);
    if (port != null) {
      smsPacket.setPort(Integer.parseInt(port));
    } else {
      smsPacket.setPort(0);
    }
    smsPacket.setTimeStamp(sendtime);

    /*
     * Set target address.
     */
    smsPacket.setAddress(dmsg.getAddress());

    /*
     * Set sender's phone number
     */
    smsPacket.setPhoneNumber(phoneNumber);

    smsPacket.setMessageLength(buffer.length);
    smsPacket.setMessage(buffer);

    debug("SMS PACKET: encoding type = " + encodingType);
    debug("SMS PACKET: port = " + port);
    debug("SMS PACKET: timestamp = " + sendtime);
    debug("SMS PACKET: address = " + dmsg.getAddress());
    debug("SMS PACKET: sender's phone number = " + phoneNumber);
    debug("SMS PACKET: message length = " + buffer.length);
    debug("SMS PACKET: message:" + new String(buffer));
    byte[] buf = smsPacket.getData();

    mess.setData(buf, 0, buf.length);
    dgc.send(mess);
  }