/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2013 Raytrix GmbH. All rights reserved.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#pragma once

namespace Rx
{
	namespace Camera
	{
		namespace EIPProperty
		{
			enum ID;
		}
	}
}

namespace Rx
{
	namespace Interop
	{
		namespace Runtime30
		{
			namespace EThreeState
			{
				enum ID;
			}
		}
	}
}

namespace Rx
{
	namespace Interop
	{
		namespace Runtime30
		{
			namespace Camera
			{
				// forward declaration
				namespace ESetIpCode
				{
					enum ID;
				}

				/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
				/// <summary>
				///		Provides functions for GigE Devices to change their GigE specific properties.
				/// </summary>
				/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
				class INativeDeviceIPv4Do
				{
				protected:

					virtual ~INativeDeviceIPv4Do() { };

				public:

					/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
					/// <summary>
					/// 	Executes the set IP configuration operation.
					///
					/// 	Should be succesful in Discovered or Initialized State.
					/// 	Throws RxCameraException.
					///
					/// </summary>
					///
					/// <returns>	. </returns>
					/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
					virtual ESetIpCode::ID DoSetIPConfig() = 0;

					/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
					/// <summary>
					/// 	Executes the set IP configuration operation.
					/// 	Should be succesful in Discovered or Initialized State.
					/// 	Throws RxCameraException. (!)
					///
					///  	Excpected Device State:
					///
					///
					/// </summary>
					///
					/// <param name="uCamIP">			The camera IP. </param>
					/// <param name="uCamSubnet">   	The camera subnet. </param>
					/// <param name="uCamGateway">  	The camera gateway. </param>
					/// <param name="bIsPersistent">	true if this INativeDeviceIPv4Do is persistent. </param>
					///
					/// <returns>	. </returns>
					/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
					virtual ESetIpCode::ID DoSetIPConfig(unsigned uCamIP, unsigned uCamSubnet, unsigned uCamGateway, bool bIsPersistent) = 0;

					/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
					/// <summary>
					/// 	Executes the get IP configuration operation.
					/// 	Excpected Device State:
					/// 		- Any
					/// </summary>
					///
					/// <param name="uCamIP">			[in,out] The camera IP. </param>
					/// <param name="uCamSubnet">   	[in,out] The camera subnet. </param>
					/// <param name="uCamGateway">  	[in,out] The camera gateway. </param>
					/// <param name="eIsPersistent">	[in,out] The is persistent. </param>
					/// <param name="eIsDHCP">			[in,out] The is dhcp. </param>
					/// <param name="u64CamMAC">		[in,out] The camera MAC. </param>
					/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
					virtual void DoGetIPConfig(unsigned& uCamIP,
							unsigned& uCamSubnet,
							unsigned& uCamGateway,
							EThreeState::ID& eIsPersistent,
							EThreeState::ID& eIsDHCP,
							unsigned __int64& u64CamMAC) = 0;
				};
			}
		}
	}
}

#pragma make_public(Rx::Interop::Runtime30::Camera::INativeDeviceIPv4Do)
