/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef _LOG4CXX_HELPERS_DATAGRAM_PACKET
#define _LOG4CXX_HELPERS_DATAGRAM_PACKET

#include <log4cxx/helpers/object.h>
#include <log4cxx/helpers/inetaddress.h>

namespace log4cxx
{
namespace helpers
{

/** This class represents a datagram packet.
<p>Datagram packets are used to implement a connectionless packet
delivery service. Each message is routed from one machine to another
based solely on information contained within that packet. Multiple
packets sent from one machine to another might be routed differently,
and might arrive in any order.
*/
class LOG4CXX_EXPORT DatagramPacket : public helpers::Object
{
	protected:
		/** the data for this packet. */
		void* buf;

		/** The offset of the data for this packet. */
		int offset;

		/** The length of the data for this packet. */
		int length;

		/** The IP address for this packet. */
		InetAddressPtr address;

		/** The UDP port number of the remote host. */
		int port;

	public:
		DECLARE_ABSTRACT_LOG4CXX_OBJECT(DatagramPacket)
		BEGIN_LOG4CXX_CAST_MAP()
		LOG4CXX_CAST_ENTRY(DatagramPacket)
		END_LOG4CXX_CAST_MAP()

		/** Constructs a DatagramPacket for receiving packets of length
		<code>length</code>. */
		DatagramPacket(void* buf, int length);

		/** Constructs a datagram packet for sending packets of length
		<code>length</code> to the specified port number on the specified
		host. */
		DatagramPacket(void* buf, int length, InetAddressPtr address, int port);

		/** Constructs a DatagramPacket for receiving packets of length
		<code>length</code>, specifying an offset into the buffer. */
		DatagramPacket(void* buf, int offset, int length);

		/** Constructs a datagram packet for sending packets of length
		<code>length</code> with offset <code>offset</code> to the
		specified port number on the specified host. */
		DatagramPacket(void* buf, int offset, int length, InetAddressPtr address,
			int port);

		~DatagramPacket();

		/** Returns the IP address of the machine to which this datagram
		is being sent or from which the datagram was received. */
		inline InetAddressPtr getAddress() const
		{
			return address;
		}

		/** Returns the data received or the data to be sent. */
		inline void* getData() const
		{
			return buf;
		}

		/** Returns the length of the data to be sent or the length of the
		data received. */
		inline int getLength() const
		{
			return length;
		}

		/** Returns the offset of the data to be sent or the offset of the
		data received. */
		inline int getOffset() const
		{
			return offset;
		}

		/** Returns the port number on the remote host to which this
		 datagram is being sent or from which the datagram was received. */
		inline int getPort() const
		{
			return port;
		}

		inline void setAddress(InetAddressPtr address1)
		{
			this->address = address1;
		}

		/** Set the data buffer for this packet. */
		inline void setData(void* buf1)
		{
			this->buf = buf1;
		}

		/** Set the data buffer for this packet. */
		inline void setData(void* buf1, int offset1, int length1)
		{
			this->buf = buf1;
			this->offset = offset1;
			this->length = length1;
		}

		/** Set the length for this packet. */
		inline void setLength(int length1)
		{
			this->length = length1;
		}

		inline void setPort(int port1)
		{
			this->port = port1;
		}

	private:
		//
		//  prevent copy and assignment statements
		DatagramPacket(const DatagramPacket&);
		DatagramPacket& operator=(const DatagramPacket&);

}; // class DatagramPacket
LOG4CXX_PTR_DEF(DatagramPacket);
}  // namespace helpers
} // namespace log4cxx

#endif // _LOG4CXX_HELPERS_DATAGRAM_PACKET
