//
// 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;
using System.Runtime.InteropServices;

#endregion

namespace GMap.NET.GPS
{
   public enum GpsServiceState : int
   {
      Off=0,
      On=1,
      StartingUp=2,
      ShuttingDown=3,
      Unloading=4,
      Uninitialized=5,
      Unknown=-1
   }

   [StructLayout(LayoutKind.Sequential)]
   internal struct FileTime
   {
      int dwLowDateTime;
      int dwHighDateTime;
   }

   /// <summary>
   /// GpsDeviceState holds the state of the gps device and the friendly name if the 
   /// gps supports them.
   /// </summary>
   [StructLayout(LayoutKind.Sequential)]
   public class GpsDeviceState
   {
      public static int GpsMaxFriendlyName = 64;
      public static int GpsDeviceStructureSize = 216;

      int serviceState = 0;
      /// <summary>
      /// State of the GPS Intermediate Driver service
      /// </summary>
      public GpsServiceState ServiceState
      {
         get
         {
            return (GpsServiceState) serviceState;
         }
      }

      int deviceState = 0;
      /// <summary>
      /// Status of the actual GPS device driver.
      /// </summary>
      public GpsServiceState DeviceState
      {
         get
         {
            return (GpsServiceState) deviceState;
         }
      }

      string friendlyName = "";
      /// <summary>
      /// Friendly name of the real GPS device we are currently using.
      /// </summary>
      public string FriendlyName
      {
         get
         {
            return friendlyName;
         }
      }

      /// <summary>
      /// Constructor of GpsDeviceState.  It copies values from the native pointer 
      /// passed in. 
      /// </summary>
      /// <param name="pGpsDevice">Native pointer to memory that contains
      /// the GPS_DEVICE data</param>
      public GpsDeviceState(IntPtr pGpsDevice)
      {
         // make sure our pointer is valid
         if(pGpsDevice == IntPtr.Zero)
         {
            throw new ArgumentException();
         }

         // read in the service state which starts at offset 8
         serviceState = Marshal.ReadInt32(pGpsDevice, 8);
         // read in the device state which starts at offset 12
         deviceState = Marshal.ReadInt32(pGpsDevice, 12);

         // the friendly name starts at offset 88
         IntPtr pFriendlyName = (IntPtr) (pGpsDevice.ToInt32() + 88);
         // marshal the native string into our gpsFriendlyName
         friendlyName = Marshal.PtrToStringUni(pFriendlyName);
      }
   }
}
