using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Diagnostics;

namespace SuperSocket.SocketEngine
{
    class ProcessLocker
    {
        private string m_LockFilePath;

        public ProcessLocker(string workDir, string lockFileName)
        {
            m_LockFilePath = Path.Combine(workDir, lockFileName);
        }

        public Process GetLockedProcess()
        {
            if (!File.Exists(m_LockFilePath))
                return null;

            int processId;

            if (!int.TryParse(File.ReadAllText(m_LockFilePath), out processId))
            {
                File.Delete(m_LockFilePath);
                return null;
            }

            try
            {
                return Process.GetProcessById(processId);
            }
            catch
            {
                File.Delete(m_LockFilePath);
                return null;
            }
        }

        public void SaveLock(Process process)
        {
            File.WriteAllText(m_LockFilePath, process.Id.ToString());
        }

        public void CleanLock()
        {
            if (File.Exists(m_LockFilePath))
                File.Delete(m_LockFilePath);
        }

        ~ProcessLocker()
        {
            CleanLock();
        }
    }
}