#pragma once // CATIA çalışma alanı plan dosyası — okunabilir + versiyonlanabilir (JSON). // Kaydet/Geri Yükle komutlarının ortak veri sözleşmesi (bkz. docs/catia_calisma_alani.md). // // ÖNEMLİ (kullanıcı gereksinimi): PID/HWND KALICI KİMLİK OLARAK YAZILMAZ — // yalnız çalışma anındaki geçici eşleştirme içindir, plana hiç girmez. // Kalıcı eşleştirme anahtarı: pencere BAŞLIĞI + süreç YOLU + belge tam // yolları + kayıt anındaki masaüstü SIRA NUMARASI (GUID'ler yeniden // başlatma sonrası kaybolabilir — bu yüzden hem GUID hem sıra saklanır; // geri yüklemede GUID varsa/geçerliyse önce o denenir, yoksa sıraya düşülür). #include #include #include #include "catia_kesif.hpp" #include "windows_surum.hpp" namespace fiko { struct PlanBelge { std::string ad; std::string tamYol; bool aktif = false; bool kayitliMi = false; }; struct PlanOturum { int masaustuSira = -1; // kayıt anında gözlemlenen masaüstü sırası (0-tabanlı) std::string masaustuGuid; // kayıt anındaki GUID (reboot sonrası geçersiz olabilir) std::string pencereBasligi; // eşleştirme ipucu (kalıcı kimlik DEĞİL, sadece rapor+ipucu) std::string surecYolu; // CNEXT.exe tam yolu (hangi CATIA sürümü ile açılacağının ipucu) long x = 0, y = 0, genislik = 0, yukseklik = 0; bool maksimize = false, minimize = false; std::vector belgeler; }; struct CalismaAlaniPlani { std::string olusturmaZamani; // ISO-8601 benzeri (yerel saat, insan-okunur) std::string windowsSurumOzeti; // "Windows 10 (build 19045.xxxx)" — bilgi amaçlı std::vector oturumlar; std::vector masaustuGuidSirasi; // gözlemlenen sırada benzersiz masaüstü GUID'leri }; // Kesif sonucunu plan modeline çevirir (masaüstü sırasını GUID'lerin ilk // görülme sırasına göre atar). CalismaAlaniPlani planOlustur(const CatiaKesifSonucu& kesif, const WindowsSurumBilgi& surum); // Tek bir oturumu plana ekler/günceller (pencereBasligi+surecYolu eşleşmesiyle // UPSERT — planOlustur'daki masaüstü-sıra atama mantığıyla AYNI). COM sunucu // (com_sunucu.cpp, CATIA VBA push akışı) ve ileride Faz 1 UI'ın ortak yazma // yolu olması için ayrı fonksiyon olarak açıldı. void planOturumEkleGuncelle(CalismaAlaniPlani& p, PlanOturum yeniOturum); // planOlustur/calismaAlaniPlaniYaz içinde kullanılan zaman damgası biçimi // ("iso" -> "YYYY-MM-DD HH:MM:SS", "dosya" -> "YYYYMMDD_HHMMSS") — COM // sunucunun push-güncelleme zaman damgasını AYNI biçimde üretmesi için // (önceden yalnız .cpp'de tanımlıydı) dışarı açıldı. std::string zamanDamgaOlustur(const char* bicim); // exe yanında "calisma_alanlari/" klasörü — yoksa oluşturulur. std::string calismaAlaniKlasoru(); std::string sonPlanDosyaYolu(); // calisma_alanlari/son_calisma_alani.json std::string zamanDamgaliPlanDosyaYolu(); // calisma_alanlari/calisma_alani_YYYYMMDD_HHMMSS.json // true=başarılı; hataCikis yalnız başarısızlıkta doldurulur (dürüst rapor). bool calismaAlaniPlaniYaz(const CalismaAlaniPlani& p, const std::string& dosyaYolu, std::string& hataCikis); bool calismaAlaniPlaniOku(const std::string& dosyaYolu, CalismaAlaniPlani& pCikis, std::string& hataCikis); // Plan ile GÜNCEL keşfi karşılaştırıp insan-okunur fark raporu üretir (Faz 1 // geri-yükleme bu raporu gösterir; otomatik eyleme henüz GEÇMEZ). std::string planKarsilastirmaRaporu(const CalismaAlaniPlani& plan, const CatiaKesifSonucu& guncel); // ============================================================================ // BEKLEYEN ACMA ISTEKLERI — CATIA COM sunucu / VBA-handoff akisi icin. // (bkz. docs/catia_com_sunucu_pivot.md, "VBA'dan CATIA instance aktarma") // // Senaryo: kullanici fikocad UI'da ZATEN ACIK bir CATIA oturumuna ek belge // acmak istiyor. Eski/guvenilmez yontem (AccessibleObjectFromWindow ile // disaridan PID'e gore CATIA'yi bulmaya calismak) — bunun yerine istek // diske yazilir, kullanici CATIA'daki push butonuna (VBA makrosu) bastiginda // VBA CATIA nesnesinin KENDISINI COM sunucuya parametre olarak geciyor; COM // sunucu bu GUVENILIR/gercek IDispatch'i kullanarak bekleyen istegi hemen // isler (catiaBelgeAc ile) — hicbir disaridan-kesif/dogrulama GEREKMEZ. // // Anahtar = pencereBasligi+"|"+surecYolu — planOturumEkleGuncelle/oturumEslestir // ile AYNI eslestirme ipucu cifti (kalici kimlik degil, sadece rapor+ipucu). // ============================================================================ std::string oturumAnahtariOlustur(const std::string& pencereBasligi, const std::string& surecYolu); std::string bekleyenAcmaDosyaYolu(); // calisma_alanlari/bekleyen_acma.json // UPSERT: ayni anahtarla mevcut istek varsa yollari DEGISTIRIR (eskiyi atar), // yoksa yeni istek ekler. true=basarili; hataCikis yalniz basarisizlikta. bool bekleyenAcmaEkle(const std::string& anahtar, const std::vector& yollar, std::string& hataCikis); // Anahtara ait istek varsa yollarCikis'i doldurur VE dosyadan SILER (tek // seferlik tuketim — istek islendikten sonra tekrar tekrar acilmasin diye). // Bulunamazsa false doner, yollarCikis dokunulmaz. bool bekleyenAcmaAlVeSil(const std::string& anahtar, std::vector& yollarCikis); } // namespace fiko