using System;
using System.Text;
using System.Runtime.InteropServices;

namespace Novell.Casa.Client.Auth
{
	/// <summary>
	/// Summary description for Class1.
	/// </summary>
	public class Authtoken
	{
		private const string AUTH_LIBRARY = "C:\\Program Files\\Novell\\CASA\\lib\\authtoken";
		private const int BUFFER_OVERFLOW = 6;

		[DllImport(AUTH_LIBRARY, CharSet=CharSet.None) ]
		public static extern int ObtainAuthToken
			(
				[In]		byte[] 			baService,		
				[In]		byte[]  		baHost,
				[In, Out]	byte[]	 		baToken,							
				[In, Out]	ref int 		iTokenLength
			);



		public Authtoken()
		{
		}


		public static byte[] ObtainAuthToken(string sService, string sHost)
		{
			int rcode = 0;
			byte[] baService = null;
			byte[] baHost =  null;			
			int bufferSize = 0;			

			byte[] baToken = new byte[bufferSize];

			// convert service to ascii byte array
			if (sService != null)
			{
				baService = Encoding.ASCII.GetBytes(sService);
			}
			else
			{
				throw new Exception("Invalid parameter");
			}

			// convert host to ascii byte array
			if (sHost != null)
			{
				baHost = Encoding.ASCII.GetBytes(sHost);
			}
			else
			{
				throw new Exception("Invalid parameter");
			}
			
			
			// call with buffersize of 0.  This way we determine the exact size.
			try
			{
				rcode = ObtainAuthToken(baService, baHost, baToken, ref bufferSize);
				
				int test = (rcode & BUFFER_OVERFLOW);
				if (test == BUFFER_OVERFLOW)
				{				
					// now allocate the proper size
					baToken = new byte[bufferSize];
					rcode = ObtainAuthToken(baService, baHost, baToken, ref bufferSize);
				}
			}
			catch (Exception e)
			{
				LogMessage(e.ToString());
				return null;
			}
									

			if (rcode != 0)
			{				
				throw new Exception(rcode.ToString());
			}
			else
			{
				return baToken;
			}			
		}

		private static void LogMessage(string sMessage)
		{
			System.Diagnostics.Trace.WriteLine("(C#)AuthToken: " + sMessage);
		}
	}
}