/***********************************************************************
 * 
 *  Copyright (C) 2005-2006 Novell, Inc. All Rights Reserved.
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License as published by the Free Software Foundation; version 2.1
 *  of the License.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Library Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, Novell, Inc.
 * 
 *  To contact Novell about this file by physical or electronic mail, 
 *  you may find current contact information at www.novell.com.
 * 
 ***********************************************************************/

using System;
using System.Text;
using System.Collections.Specialized;
using System.Runtime.InteropServices;

namespace Novell.CASA.DataEngines.KWallet
{

	public class kwallet
	{

		//private static int MAX_NAME_LENGTH = 512;
		private const string CPP_LIB = "casakwallet";



		/*

				[DllImport(CPP_LIB)]
				public static extern void MyTest(
						EnumSecretList enumSecretList
				);

		*/
		[DllImport(CPP_LIB)]
		public static extern void Aggregate(
			EnumSecretList enumSecretList
			);

		[DllImport(CPP_LIB)]
		public static extern void FreeList();

		[DllImport(CPP_LIB)]
		public static extern int SetEntry(string walletName, string folderName, int entryType, string keyName, string value, int valueLen); 	     

		[DllImport(CPP_LIB)]
		public static extern int SetMapEntry(string walletName, string folderName, string keyName, String[,] value, int eleCount); 	     
		[DllImport(CPP_LIB)]
		public static extern int RemoveEntry(string walletName, string folderName, string keyName);

		/*
			  public static int Try(EnumSecretList enumSecretList)
			  {
					 MyTest(enumSecretList);
					 return 0;
			  }

		*/
		public static int AggregateKW(EnumSecretList enumSecretList)
		{
			Aggregate(enumSecretList);
			return 0;
		}



		public static int FreeResources()
		{
			FreeList();
			return 0;
		}
      
      
		public  static int SetSecret(string walletName, string folderName, int entryType, string keyName, string value, int valueLen )
		{
			return(SetEntry(walletName, folderName, entryType, keyName,  value, valueLen ));
		} 	     


		public  static int SetSecret(string walletName, string folderName, string keyName, NameValueCollection nvc)
		{
                
			String[,] mapele = new String[nvc.Count,2 ];
                
			for (int i=0; i< nvc.Count; i++)
			{
				mapele[i,0] = nvc.GetKey(i);
				mapele[i,1] = nvc.Get(nvc.GetKey(i));
                     

			} 
                               
			return(SetMapEntry(walletName, folderName, keyName,  mapele, nvc.Count));
		} 	     

		public  static int DeleteSecret(string walletName, string folderName, string keyName)
		{
			return(RemoveEntry(walletName, folderName, keyName));
		} 	     


      
      
      
      
      
      
      
      

		//TBD: All this for future.
		/*
			[DllImport(CPP_LIB)]
			public static extern int ReadSecret
			(
				[MarshalAs(UnmanagedType.LPStr)]
				String walletName,
				[MarshalAs(UnmanagedType.LPStr)]
				String folderName,
				[MarshalAs(UnmanagedType.LPStr)]
				String key,
				[MarshalAs(UnmanagedType.LPStr)]
				Byte[] secretVal
			);

			[DllImport(CPP_LIB)]
			public static extern int WriteSecret
			(
				[MarshalAs(UnmanagedType.LPStr)]
				String walletName,
				[MarshalAs(UnmanagedType.LPStr)]
				String folderName,
				int entryType,
				[MarshalAs(UnmanagedType.LPStr)]
				String key,
				[MarshalAs(UnmanagedType.LPStr)]
				Byte[] secret
			);




			[DllImport(CPP_LIB)]
			public static extern void CloseAllWallets();







			public static int ReadWallet(String walletName, String folderName, String key, Byte[] secretVal) 
			{

				// Read a secret from wallet
				 return (ReadSecret(walletName, folderName, key, secretVal)); 
			}

			public static int WriteWallet(String walletName, String folderName,int entryType, String key, Byte[] secretVal)
			{

				// Write secret to wallet
				return (WriteSecret( walletName, folderName, entryType, key, secretVal));

			}





			public static void DisconnectApplication()
			{

				CloseAllWallets();

			}
		*/
		
	}

}