/***************************************************************************
 *                              NativeReader.cs
 *                            -------------------
 *   begin                : May 1, 2002
 *   copyright            : (C) The RunUO Software Team
 *   email                : info@runuo.com
 *
 *   $Id$
 *
 ***************************************************************************/

/***************************************************************************
 *
 *   This program is free software; you can redistribute it and/or modify
 *   it under the terms of the GNU General Public License as published by
 *   the Free Software Foundation; either version 2 of the License, or
 *   (at your option) any later version.
 *
 ***************************************************************************/

using System;
using System.Runtime.InteropServices;

namespace Server {
	public static class NativeReader {

		private static readonly INativeReader m_NativeReader;

		static NativeReader() {
			if ( Core.Unix )
				m_NativeReader = new NativeReaderUnix();
			else
				m_NativeReader = new NativeReaderWin32();
		}

		public static unsafe void Read( IntPtr ptr, void *buffer, int length ) {
			m_NativeReader.Read( ptr, buffer, length );
		}
	}

	public interface INativeReader {
		unsafe void Read( IntPtr ptr, void *buffer, int length );
	}

	public sealed class NativeReaderWin32 : INativeReader {
		[DllImport( "kernel32" )]
		private unsafe static extern int _lread( IntPtr hFile, void *lpBuffer, int wBytes );

		public NativeReaderWin32() {
		}

		public unsafe void Read( IntPtr ptr, void *buffer, int length ) {
			_lread( ptr, buffer, length );
		}
	}

	public sealed class NativeReaderUnix : INativeReader {
		[DllImport( "libc" )]
		private unsafe static extern int read( IntPtr ptr, void *buffer, int length );

		public NativeReaderUnix() {
		}

		public unsafe void Read( IntPtr ptr, void *buffer, int length ) {
			read( ptr, buffer, length );
		}
	}
}