//
// Copyright (c) Microsoft Corporation.  All rights reserved.
//
//
// Use of this sample source code is subject to the terms of the Microsoft
// license agreement under which you licensed this sample source code. If
// you did not accept the terms of the license agreement, you are not
// authorized to use this sample source code. For the terms of the license,
// please see the license agreement between you and Microsoft or, if applicable,
// see the LICENSE.RTF on your install media or the root of your tools installation.
// THE SAMPLE SOURCE CODE IS PROVIDED "AS IS", WITH NO WARRANTIES OR INDEMNITIES.
//
#region Using directives

using System;

#endregion

namespace GMap.NET.GPS
{
   /// <summary>
   /// Summary description for Utils.
   /// </summary>
   public class Utils
   {
      public Utils()
      {
      }

      public static IntPtr LocalAlloc(int byteCount)
      {
         IntPtr ptr = Win32.LocalAlloc(Win32.LMEM_ZEROINIT, byteCount);
         if(ptr == IntPtr.Zero)
         {
            throw new OutOfMemoryException();
         }

         return ptr;
      }

      public static void LocalFree(IntPtr hMem)
      {
         IntPtr ptr = Win32.LocalFree(hMem);
         if(ptr != IntPtr.Zero)
         {
            throw new ArgumentException();
         }
      }
   }

   public class Win32
   {
      public const int LMEM_ZEROINIT = 0x40;
      [System.Runtime.InteropServices.DllImport("coredll.dll", EntryPoint="#33", SetLastError=true)]
      public static extern IntPtr LocalAlloc(int flags, int byteCount);

      [System.Runtime.InteropServices.DllImport("coredll.dll", EntryPoint="#36", SetLastError=true)]
      public static extern IntPtr LocalFree(IntPtr hMem);
   }
}
