| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 | using System;using System.IO;using System.Text;using MediaBrowser.Common.Configuration;using MediaBrowser.Model.IO;using Microsoft.Extensions.Logging;namespace Emby.Server.Implementations.Devices{    public class DeviceId    {        private readonly IApplicationPaths _appPaths;        private readonly ILogger _logger;        private readonly IFileSystem _fileSystem;        private readonly object _syncLock = new object();        private string CachePath => Path.Combine(_appPaths.DataPath, "device.txt");        private string GetCachedId()        {            try            {                lock (_syncLock)                {                    var value = File.ReadAllText(CachePath, Encoding.UTF8);                    if (Guid.TryParse(value, out var guid))                    {                        return value;                    }                    _logger.LogError("Invalid value found in device id file");                }            }            catch (DirectoryNotFoundException)            {            }            catch (FileNotFoundException)            {            }            catch (Exception ex)            {                _logger.LogError(ex, "Error reading file");            }            return null;        }        private void SaveId(string id)        {            try            {                var path = CachePath;                Directory.CreateDirectory(Path.GetDirectoryName(path));                lock (_syncLock)                {                    File.WriteAllText(path, id, Encoding.UTF8);                }            }            catch (Exception ex)            {                _logger.LogError(ex, "Error writing to file");            }        }        private static string GetNewId()        {            return Guid.NewGuid().ToString("N");        }        private string GetDeviceId()        {            var id = GetCachedId();            if (string.IsNullOrWhiteSpace(id))            {                id = GetNewId();                SaveId(id);            }            return id;        }        private string _id;        public DeviceId(            IApplicationPaths appPaths,            ILoggerFactory loggerFactory,            IFileSystem fileSystem)        {            if (fileSystem == null)            {                throw new ArgumentNullException(nameof(fileSystem));            }            _appPaths = appPaths;            _logger = loggerFactory.CreateLogger("SystemId");            _fileSystem = fileSystem;        }        public string Value => _id ?? (_id = GetDeviceId());    }}
 |