using System.IO.Compression; using System.Runtime.InteropServices; namespace EC.Util.CameraSDK; public class CameraFactory { static CameraFactory() { string zipPath = Path.Combine("libs", "cameraSdks.zip"); if (!File.Exists(zipPath)) throw new FileNotFoundException(zipPath); using ZipArchive archive = ZipFile.OpenRead(zipPath); bool isWin = RuntimeInformation.IsOSPlatform(OSPlatform.Windows), is64 = Environment.Is64BitProcess; string sysEnv = string.Format("{0}{1}", isWin ? "win" : "linux", is64 ? "64" : "32"); string hkOrDir = $"cameraSdks/hik/{sysEnv}/"; string dhOrDir = $"cameraSdks/dahua/{sysEnv}/"; string ysOrDir = $"cameraSdks/yushi/{sysEnv}/"; // TODO: linux chmod 777, LD_LIBRARY_PATH foreach (ZipArchiveEntry entry in archive.Entries) { if (entry.Length == 0) continue; string fullName = entry.FullName, fileExtPath = string.Empty; if (fullName.StartsWith(hkOrDir)) fileExtPath = Path.Join("libs", "hik", fullName[(hkOrDir.Length - 1)..]); else if (fullName.StartsWith(dhOrDir)) fileExtPath = Path.Join("libs", "dahua", fullName[(dhOrDir.Length - 1)..]); else if (fullName.StartsWith(ysOrDir)) fileExtPath = Path.Join("libs", "yushi", fullName[(ysOrDir.Length - 1)..]); if (string.IsNullOrEmpty(fileExtPath)) continue; FileInfo fi = new(fileExtPath); if (fi.Directory != null && !fi.Directory.Exists) fi.Directory.Create(); if (!fi.Exists) entry.ExtractToFile(fileExtPath); } if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) { string[] hikLibsName = new string[] { "libAudioRender.so", "libSuperRender.so" }; foreach (string name in hikLibsName) { if (File.Exists(Path.Join(".", name))) continue; string path = Path.Join("libs", "hik", name); FileInfo fi = new(path); if (!fi.Exists) throw new FileNotFoundException(path); fi.CopyTo(Path.Join(".", name), false); } } } public static void VirtualInit() { } public static ICameraSdk BuildCameraSdk(CameraInfo info) { ICameraSdk sdk = (info.Manufactor) switch { CameraManufactor.HiK => new HiKSdk(info), CameraManufactor.DaHua => new DaHuaSdk(info), CameraManufactor.YuShi => new YuShiSdk(info), _ => throw new NotSupportedException(), }; return sdk; } }