#pragma once // ── IstakipServis — İş Takip'in uygulama yaşam döngüsü (kral VEYA istemci) ─── // docs/istakip_tasarim.md: Orchestrator'dan AYRI sistem; bir fikocad Kral olur // (istakip.kral=true → MongoDB'ye bağlanır + istakip.port'u dinler), diğerleri // istakip.kral_adres'e ("ip:port") bağlanır. Bayraklar kapalıyken HİÇBİR ŞEY // kurulmaz (sıcak yola sıfır yük). Okuma tek API: veri() önbelleği — kral kendi // merkezini de aynı önbelleğe yansıtır, pencere kral/istemci ayrımı bilmez. // Kural: kral kurulum DENEMESİ yalnız bayrak/ayar geçişinde bir kez (Mongo // bağlantı zaman aşımı ana ipliği kilitlemesin); başarısızsa olay + rozet, // kullanıcı ayarı düzeltip yeniden açar. #include #include #include #include #include "fiko/istakip/kanal.hpp" #include "istakip_ag.hpp" namespace fiko { class OlayGunlugu; // AyarSistemi köprüleri (ayar_kayitlari.cpp tanımlar: istakip.* kayıtları). bool istakipKral(); uint16_t istakipPort(); std::string istakipKralAdres(); std::string istakipMongoUri(); bool istakipIstemciYazabilir(); bool istakipKimlikDogrulama(); uint64_t istakipSnapshotParca(); class IstakipServis { public: // Kare-başı drain nabzı (belge_penceresi): kur/yık + taşıma tik + olay yayını. void tik(OlayGunlugu& olaylar, uint64_t simdiMs); void kapat(); bool aktifMi() const { return kralMi() || istemciMi(); } bool kralMi() const { return merkez_ != nullptr; } bool istemciMi() const { return istemciTasima_ != nullptr; } bool senkronMu() const; // kral: depo açık · istemci: kanal bağlı+senkron std::string durumMetni() const; // üst şerit rozeti ("Kral · 3 istemci" vb.) // Okuma: kral/istemci ORTAK önbellek (aktif değilken nullptr). istakip::IsIstemci* veri() { return onbellek_.get(); } const istakip::IsIstemci* veri() const { return onbellek_.get(); } // Tek yazma API'si (pencere/Lua/MCP): kralsa doğrudan merkez + delta yayını, // istemciyse kanala kuyruklar. Dönen sira (0 = servis kapalı). Çakışma/yetki // redleri olay olarak akar (IsIstemciKanal::yazHata → OlayGunlugu). uint64_t yaz(const istakip::IsKayit& taslak, uint64_t beklenenSurum = 0); // Dosya köprüsü (iş emri "Belge" alanı): istemci kraldan kayıtlı belgeyi çeker. // İndirilen gecici/istakip/dosyalar altına yazılır; yerelYol() önce yerel diski, // sonra indirilenleri arar (boş = yok — dosyaGetir ile iste, sonucu olay+harita). bool dosyaGetir(const std::string& yol); // false = kral/bağlantı yok std::string yerelYol(const std::string& yol) const; // açılabilir yol ("" = yok) bool dosyaBekleniyor() const { return dosyaBekleniyor_; } // Teşhis (pencere durum satırı). istakip::IsMerkez* merkez() { return merkez_.get(); } istakip::IsKralKanal* kralKanal() { return kralKanal_.get(); } IstakipTasimaKral* kralTasima() { return kralTasima_.get(); } IstakipTasimaIstemci* istemciTasima() { return istemciTasima_.get(); } const std::string& sonHata() const { return sonHata_; } private: void kralKur(OlayGunlugu& olaylar); void istemciKur(OlayGunlugu& olaylar, const std::string& adres); void olaylariYayinla(OlayGunlugu& olaylar); // F3: eski/yeni kaydı alan-bazında diff'leyip "_olay(olay_tur=sistem)" üretir. // Yalnız KRAL yazma yolunda çağrılır (bu süreçteki UI'nin kendi yazdıkları — // uzak istemcilerden ağ üzerinden gelen yazmalar şu an kapsanmıyor, F3.1). // eski=nullptr → yeni kayıt; "_olay"/"_sema" kendisi olay üretmez (döngü/gürültü). void olayUret(const istakip::IsKayit* eski, const istakip::IsKayit& yeni); // Ortak okuma önbelleği (kralda merkez aynası, istemcide senkron kopya). std::unique_ptr onbellek_; // Kral tarafı. std::unique_ptr depo_; std::unique_ptr merkez_; std::unique_ptr kralTasima_; std::unique_ptr kralKanal_; uint64_t kralYerelSira_ = 0; // kralın kendi yazma sırası (depodan devam eder) // İstemci tarafı. std::unique_ptr istemciTasima_; std::unique_ptr istemciKanal_; std::string istemciAdres_; // kurulu hedef ("ip:port" — ayar değişince yeniden kur) bool bagliIdi_ = false; // IsKralBaglandi/Koptu kenar tespiti // Kurulum denemesi kilidi: bayrak geçişinde bir kez (başarısızsa tekrar yok; // kullanıcı ayarı kapatıp açınca sıfırlanır). bool kralDenendi_ = false; bool istemciDenendi_ = false; uint64_t sonYayinSurum_ = 0; // IsKayitDegisti kenar tespiti (throttle'sız tek olay) std::string sonHata_; OlayGunlugu* olaylar_ = nullptr; // yazHata callback'i için (tik'te tazelenir) std::unordered_map indirilen_; // kral yolu → yerel yol bool dosyaBekleniyor_ = false; }; // App-global servis (istakip_servis.cpp tanımlar; pencere + Lua okur). extern IstakipServis g_istakipServis; } // namespace fiko