// converts GPSAPI status to System.Device status private static GeoPositionStatus ToGeoPositionStatus(NativeMethods.SERVICE_STATE state) { GeoPositionStatus newStatus = GeoPositionStatus.NoData; switch (state) { case NativeMethods.SERVICE_STATE.SERVICE_STATE_UNKNOWN: case NativeMethods.SERVICE_STATE.SERVICE_STATE_OFF: newStatus = GeoPositionStatus.Disabled; break; case NativeMethods.SERVICE_STATE.SERVICE_STATE_UNLOADING: case NativeMethods.SERVICE_STATE.SERVICE_STATE_UNINITIALIZED: case NativeMethods.SERVICE_STATE.SERVICE_STATE_SHUTTING_DOWN: newStatus = GeoPositionStatus.NoData; break; case NativeMethods.SERVICE_STATE.SERVICE_STATE_STARTING_UP: case NativeMethods.SERVICE_STATE.SERVICE_STATE_ON: newStatus = GeoPositionStatus.Initializing; break; } return(newStatus); }
private static void WaitForStatus(IntPtr hService, NativeMethods.SERVICE_STATE desiredStatus, TimeSpan timeout) { Stopwatch swLoop = new Stopwatch(); swLoop.Start(); NativeMethods.SERVICE_STATUS serviceStatus = new NativeMethods.SERVICE_STATUS(); do { Thread.Sleep(500); if (!NativeMethods.QueryServiceStatus(hService, ref serviceStatus)) { throw new Exception($"WaitForStatus: Unable to query status of service, {Marshal.GetLastWin32Error()}"); } }while (serviceStatus.dwCurrentState != (int)desiredStatus && (swLoop.ElapsedMilliseconds <= timeout.TotalMilliseconds)); if (serviceStatus.dwCurrentState != (int)desiredStatus) { throw new Exception($"WaitForStatus: Service failed to reach desired state: {desiredStatus}, current state: {serviceStatus.dwCurrentState}"); } }