using System; using System.Diagnostics; using Teigha.Runtime; namespace DwgExtractorManual.Models { /// /// Singleton class to manage Teigha Services lifecycle and prevent disposal conflicts /// public sealed class TeighaServicesManager { private static readonly object _lock = new object(); private static TeighaServicesManager? _instance = null; private static Services? _services = null; private static int _referenceCount = 0; private static bool _isActivated = false; private TeighaServicesManager() { // Private constructor for singleton } public static TeighaServicesManager Instance { get { if (_instance == null) { lock (_lock) { if (_instance == null) { _instance = new TeighaServicesManager(); } } } return _instance; } } /// /// Acquires Teigha Services (creates if needed, increments reference count) /// /// The Services instance public Services AcquireServices() { lock (_lock) { try { Debug.WriteLine($"[TeighaManager] AcquireServices - Current ref count: {_referenceCount}"); if (!_isActivated) { Debug.WriteLine("[TeighaManager] Activating ODA for first time..."); ActivateODA(); _isActivated = true; } if (_services == null) { Debug.WriteLine("[TeighaManager] Creating new Services instance..."); _services = new Services(); Debug.WriteLine("[TeighaManager] Services instance created successfully"); } _referenceCount++; Debug.WriteLine($"[TeighaManager] Services acquired - New ref count: {_referenceCount}"); return _services; } catch (Teigha.Runtime.Exception ex) { Debug.WriteLine($"[TeighaManager] Error acquiring services: {ex.Message}"); throw; } } } /// /// Releases Teigha Services (decrements reference count, disposes when count reaches 0) /// public void ReleaseServices() { lock (_lock) { try { Debug.WriteLine($"[TeighaManager] ReleaseServices - Current ref count: {_referenceCount}"); if (_referenceCount > 0) { _referenceCount--; Debug.WriteLine($"[TeighaManager] Services released - New ref count: {_referenceCount}"); } // Don't dispose Services until app shutdown to prevent conflicts // Just track reference count for debugging if (_referenceCount == 0) { Debug.WriteLine("[TeighaManager] All references released (Services kept alive for app lifetime)"); } } catch (Teigha.Runtime.Exception ex) { Debug.WriteLine($"[TeighaManager] Error releasing services: {ex.Message}"); // Don't throw on release to prevent cascade failures } } } /// /// Force dispose Services (only call on application shutdown) /// public void ForceDisposeServices() { lock (_lock) { try { Debug.WriteLine("[TeighaManager] Force disposing Services..."); if (_services != null) { _services.Dispose(); Debug.WriteLine("[TeighaManager] Services disposed successfully"); } _services = null; _referenceCount = 0; _isActivated = false; Debug.WriteLine("[TeighaManager] Force dispose completed"); } catch (Teigha.Runtime.Exception ex) { Debug.WriteLine($"[TeighaManager] Error during force dispose: {ex.Message}"); // Reset state even if disposal fails _services = null; _referenceCount = 0; _isActivated = false; } } } /// /// Get current reference count (for debugging) /// public int ReferenceCount { get { lock (_lock) { return _referenceCount; } } } /// /// Check if Services is active and valid /// public bool IsServicesActive { get { lock (_lock) { return _services != null && _isActivated; } } } private void ActivateODA() { try { Debug.WriteLine("[TeighaManager] Activating ODA..."); var userInfo = "c2FtYW4gZW5naW5lZXJpbmc="; var userSignature = "F0kuQTmtVpHtvl/TgaFVGE92/YqGmYR9SLoXckEjnOk8NoAQh7Sg6GQruVC04JqD4C/IipxJYqpqvMfMc2auRMG+cAJCKqKUE2djIMdkUdb+C5IVx2c97fcK5ba3n8DDvB54Upokajl+6j12yD8h8MKGOR3Z3zysObeXD62bFpQgp00GCYTqlxEZtTIRjHIPAfJfix8Y0jtXWWYyVJ3LYOu86as5xtx+hY1aakpYIJiQk/6pGd84qSn/9K1w8nxR7UrFzieDeQ/xM58BHSD4u/ZxVJwvv6Uy10tsdBFBTvfJMAFp05Y7yeyeCNr100tA3iOfmWoXAVRHfxnkPfiYR54aK04QI+R6OGkI+yd1oR5BtmN6BdDt3z8KYK5EpFGJGiJIGoUy5PvkYdJ2VV6xe9JWBiIJuI/tDn1Y+uyTQFA9qaDHnOURriXsRGfy8reDPf1eejybSJxWKkpilG6RXhq3xHlCkjZzh1Q45S+xYXNGatcWMm9nkn20M8Ke5JEVaI9w/p2GE36CHRtRQbt8kfPmsbWNXJCFr4svHW2MPbCKWoyn5XEyMWBnuAKi74zvczB13DKjf29SqSIgF5k/hwy2QrgvnaKzY1k8bw8w2/k0vJXcS3GKOB/ZYDle1tf/lkAD1HtnF9zE18TiXhVnqwAVjwg4ui1RPLn/LMs6b5Y="; Services.odActivate(userInfo, userSignature); Debug.WriteLine("[TeighaManager] ODA activation successful"); } catch (Teigha.Runtime.Exception ex) { Debug.WriteLine($"[TeighaManager] ODA activation failed: {ex.Message}"); throw; } } } }