# CATIA calisma alani - MIMARI PIVOT: COM sunucu (push modeli)

(bkz. docs/catia_calisma_alani.md - bu dosya oradaki "ROT (class-moniker,
DOGRU yontem) de BASARISIZ" bolumunden sonraki devam notudur, 18 Eylul)

## Karar (kullanici)

Yukaridaki TUM disaridan-baglanma denemeleri (AccessibleObjectFromWindow VE
ROT class-moniker, docs/catia_calisma_alani.md) gercek CATIA V5'te basarisiz
oldu. Kullanicinin karari: kesif yonunu TERSINE cevir. fikocad artik
CATIA'ya baglanmaya HIC CALISMAYACAK. Bunun yerine CATIA'nin KENDISI
(kullanicinin kendi yazacagi bir VBA makrosu, buton ile tetiklenir)
fikocad'a COM uzerinden "benim PID'im, acik belgelerim sunlar" diye
BILDIRECEK (push modeli). Kullanici her acik CATIA orneginde bu butona tek
tek basacak.

Ilk tasarim onerisi (komut satiri + named-pipe IPC) kullanici tarafindan
reddedildi, bunun yerine gercek bir COM Otomasyon sunucusu ("Fikocad.
Application") istendi - VBA'dan dogrudan CreateObject("Fikocad.Application")
+ .CatiaKaydet(...) ile cagrilabilsin. Tek-instance yonetimi boylece COM'un
kendisine (REGCLS_MULTIPLEUSE) birakildi, ayri bir IPC mekanizmasi
YAZILMASINA gerek kalmadi.

## DURUST DURUM (bu oturum) — YAZILDI, DERLENMEDI, TEST EDILMEDI

Bu degisiklik Claude tarafindan, kullanicinin Windows makinesine MCP
Filesystem araciyla UZAKTAN erisilerek yazildi. Bu ortamda MSVC/derle.bat
CALISTIRILAMADI - yani asagidaki kod hicbir sekilde derlenmedi veya runtime
test edilmedi. "Yaziliyor" ile "calisiyor" arasindaki fark projenin kendi
kuralidir (bkz. catia_calisma_alani.md giris notu) - burada da aynen
gecerli: kullanicinin derle.bat calistirip SONUCU (hata varsa TAM hata
metnini) paylasmasi GEREKIYOR.

## Eklenen/degistirilen dosyalar

1. **com_sunucu.hpp/.cpp** (yeni) — COM sunucu tarafi:
   - `FikocadUygulamaNesnesi : IDispatch` — late-binding (GetIDsOfNames +
     Invoke) ile iki metot: `CatiaKaydet(pid As Long, aktifIndex As Long,
     yollar As String) As String` (bos donus = basarili, dolu = insan-okunur
     hata metni) ve `Ping() As String` (baglanti testi, "fikocad COM
     sunucusu calisiyor" doner).
   - `FikocadSinifFabrikasi : IClassFactory` — standart local-server
     nesne-sayaci + kilit-sayaci kalibi: ikisi de sifira dusunce sunucu
     sureci WM_QUIT ile DURUSTCE kapanir, arka planda sonsuza dek asili
     KALMAZ.
   - `comSunucusuKaydet()` — HKCU\Software\Classes altina ProgID
     ("Fikocad.Application") + CLSID + LocalServer32 ("<exe>" -Embedding)
     kaydi yazar. Yalniz HKEY_CURRENT_USER — yonetici hakki GEREKMEZ, UAC
     istemi CIKMAZ. main.cpp'de normal GUI acilisinda BIR KEZ, idempotent
     olarak cagrilir.
   - `comEmbeddingKomutuMu()` / `comSunucusuCalistir()` — Windows'un COM
     aktivasyonunda otomatik ekledigi standart "-Embedding" komut satiri
     anahtarini tanir; bu durumda AGIR motor/GUI kurulumunun (Vulkan/OCCT/
     lisans/CEF) TAMAMINI atlayip yalniz COM mesaj dongusunu calistirir
     (tamamen headless, pencere ACMAZ, gorev cubugunda gorunmez).
   - `catiaKaydetIsle()` (is mantigi): PID'den HWND'yi `catiaPencereBulPidIle`
     (catia_kesif.cpp'de zaten var, COM'suz/guvenilir EnumWindows tabanli
     yontem) ile bulur; pencere basligi/geometri (GetWindowPlacement)/sanal
     masaustu GUID'i (fiko::ComOturum + pencereMasaustuGetir) KENDI
     tarafinda toplar; VBA'dan gelen belge yol listesini ("|" ile ayrilmis)
     DOGRUDAN kullanir (artik COM ile CATIA'dan "kesfetmeye" CALISMAZ).
     Sonucu calisma_alanlari/son_calisma_alani.json'a UPSERT eder.

2. **calisma_alani_plan.hpp/.cpp** (degisiklik) — kucuk, mevcut kaliplarla
   tutarli ek:
   - `planOturumEkleGuncelle(plan, yeniOturum)` — pencereBasligi+surecYolu
     eslesmesiyle UPSERT (planOlustur() icindeki masaustu-sira atama
     mantigiyla AYNI). COM sunucunun ve ileride Faz 1 UI'in ortak yazma
     yolu olmasi icin ayri fonksiyon olarak acildi.
   - `zamanDamgaOlustur()` header'a acildi (onceden yalniz .cpp'de tanimli
     internal-linkage-benzeri bir fonksiyondu, artik com_sunucu.cpp de
     kullaniyor).

3. **main.cpp** (degisiklik):
   - `wWinMain`'in EN BASINDA (CEF alt-surec kontrolunden bile once)
     "-Embedding" kontrolu eklendi — varsa comSunucusuCalistir()'e dallanip
     doner, hicbir agir kurulum CALISMAZ.
   - Normal acilis yolunda (SetUnhandledExceptionFilter'dan hemen sonra)
     `fiko::comSunucusuKaydet();` cagrisi eklendi.

4. **CMakeLists.txt** (degisiklik): `com_sunucu.cpp` target_sources'a,
   `advapi32` (Reg* fonksiyonlari icin, RegCreateKeyExW/RegSetValueExW
   digerleri gibi otomatik linklenmeyebilir diye ACIKCA eklendi)
   target_link_libraries'e eklendi.

## Bu oturumda yazilirken bulunup DUZELTILEN bir hata

Ilk taslakta `comSunucusuCalistir()` sonunda hem basarisiz
CoRegisterClassObject dalinda hem de normal kapanista `fabrika->Release()`
IKI KEZ cagriliyordu. Dogrusu: CoRegisterClassObject BASARILI olursa COM
kendi ic AddRef'ini yapar (bunu CoRevokeClassObject Release eder), bizim
kendi olusturma-zamani AddRef'imiz AYRI ve tektir — iki Release cagrisi
ref sayacini erken sifira dusurup use-after-free'ye yol acardi. Kod
YAZILIRKEN (derlenmeden once, yalniz mantik incelemesiyle) fark edilip
duzeltildi; benzer baska hatalar da olabilir cunku hicbir derleme/calisma
zamani dogrulamasi YAPILMADI.

## Bilincli sinirlamalar (runtime testte karsilasilabilir davranislar)

- `catiaPencereBulPidIle` PID'e ait gorunur+sahipsiz ust pencere BULAMAZSA
  (orn. CATIA henuz acilma asamasinda/splash ekraninda) CatiaKaydet DURUST
  bir hata metni doner — VBA tarafi MsgBox ile gosterip kullanicinin birkac
  saniye sonra tekrar denemesini saglayabilir.
- Sanal masaustu tespiti basarisiz olursa CatiaKaydet YINE DE DEVAM eder
  (yalniz masaustuGuid bos kalir, gunluge uyari yazilir) — belge kaydi
  sanal masaustu bilgisine BAGIMLI KILINMADI, cunku kullanicinin asil
  ihtiyaci "belgeler bos gelmesin" onceliklidir.
- Plan dosyasi bozuksa/yoksa CatiaKaydet yeni bos bir plandan devam eder
  (push akisini KESMEZ) — DURUST log satiri birakir ama kullaniciyi turun
  ortasinda DURDURMAZ (kullanici her CATIA'da tek tek basacagi icin tek bir
  hatanin tum turu durdurmasi kotu deneyim olurdu).

## VBA ornek kullanim (com_sunucu.hpp basinda da var)

```vba
Private Declare PtrSafe Function GetCurrentProcessId Lib "kernel32" () As Long

Sub CalismaAlaniniKaydet()
    Dim app As Object, yollar As String, i As Integer, aktifIdx As Integer
    Set app = CreateObject("Fikocad.Application")
    aktifIdx = -1
    For i = 1 To CATIA.Documents.Count
        If i > 1 Then yollar = yollar & "|"
        yollar = yollar & CATIA.Documents.Item(i).FullName
        If CATIA.Documents.Item(i).FullName = CATIA.ActiveDocument.FullName Then
            aktifIdx = i - 1
        End If
    Next i
    Dim sonuc As String
    sonuc = app.CatiaKaydet(GetCurrentProcessId(), aktifIdx, yollar)
    If sonuc <> "" Then
        MsgBox "Kaydetme hatasi: " & sonuc
    Else
        MsgBox "Kaydedildi."
    End If
End Sub
```

## Siradaki adim (kullanicidan beklenen — sirali test plani)

1. `derle.bat` ile TAM `fikocad` hedefini derle. Bu kod HICBIR SEKILDE MSVC'den
   gecmedi — ilk derleme adiminda gercek hatalar cikma ihtimali yuksek,
   TAM hata metnini (dosya/satir) paylas.
2. Derleme basariliysa: fikocad.exe'yi normal calistir (boylece
   comSunucusuKaydet() HKCU kaydini yazsin), sonra CATIA'da basit bir test
   makrosuyla YALNIZ `CreateObject("Fikocad.Application").Ping()` cagir —
   "fikocad COM sunucusu calisiyor" donuyor mu kontrol et. Bu adim
   CatiaKaydet'in gercek PID/belge mantigina hic girmeden salt COM
   aktivasyon+dispatch zincirini (ProgID->CLSID->LocalServer32 baslatma->
   -Embedding algila->CoRegisterClassObject->GetIDsOfNames->Invoke) DOGRULAR.
3. Ping basariliysa gercek `CatiaKaydet(pid, aktifIndex, yollar)` cagrisini
   dene, calisma_alanlari/son_calisma_alani.json'in GERCEKTEN dogru
   icerikle (pencere basligi/surec yolu/geometri/masaustu GUID'i/belgeler)
   OLUSUP OLUSMADIGINI kontrol et.
4. Birden fazla CATIA orneginde ARKA ARKAYA dene (kullanicinin "diger
   catialarda da tek tek basicam" akisi) — REGCLS_MULTIPLEUSE ile TEK
   sunucu surecinin (Gorev Yoneticisi'nde tek "fikocad.exe" satiri,
   komut satirinda -Embedding gorunmeli) birden fazla CatiaKaydet cagrisini
   SIRAYLA/DOGRU isledigini, her cagridan sonra plan dosyasinin dogru
   UPSERT edildigini (eski oturumlarin SILINMEDIGINI, ayni PID+baslikla
   tekrar cagrilirsa GUNCELLENDIGINI) dogrula.
5. Bu dosyayi GERCEK gozlemlenen sonuclarla guncelle — "yazildi" durumundan
   "derlendi, RUNTIME test edildi: [sonuc]" durumuna gecir.
