#include "arac_kayitlari.hpp" #include #include #include #include #include "ayar_kalici.hpp" // ayarOku/ayarYaz — araç penceresi geometrisi kalıcılığı #include "kafa_penceresi.hpp" #include "lisans_yukle.hpp" #include "fiko/cekirdek/arac_kipi.hpp" #include "fiko/cekirdek/lisans.hpp" #include "fiko/core/gunluk.hpp" namespace fiko { // App-global araç kayıt defteri (LisansSistemi kalıbı). AracSistemi& aracSistemi() { static AracSistemi s; return s; } namespace { std::string g_komutSatiri; bool g_kuruldu = false; bool g_lisanstanOtomatik = true; // Ortam değişkeni FIKO_ARAC (servis/süreç başlatma, COM sunucu kabuğu). std::string cevreArac() { char* v = nullptr; std::size_t n = 0; if (_dupenv_s(&v, &n, "FIKO_ARAC") != 0 || !v) return {}; std::string o(v); std::free(v); return o; } } // namespace void aracKomutSatiriAyarla(const std::string& args) { g_komutSatiri = args; } const std::string& aracKomutSatiri() { return g_komutSatiri; } // Komut satırındaki İLK bayrak-olmayan argüman = açılacak dosya yolu (Windows dosya // ilişkilendirmesi / "Birlikte aç" / betikle otomatik açılış). Tırnaklı yol desteklenir; // "-"/"--" ile başlayan her şey atlanır. Boş → açılacak dosya yok (eski davranış). std::string komutSatirindanDosya() { const std::string& s = g_komutSatiri; std::size_t i = 0; while (i < s.size()) { while (i < s.size() && (s[i] == ' ' || s[i] == '\t')) ++i; if (i >= s.size()) break; std::string tok; if (s[i] == '"') { ++i; while (i < s.size() && s[i] != '"') tok += s[i++]; if (i < s.size()) ++i; } else { while (i < s.size() && s[i] != ' ' && s[i] != '\t') tok += s[i++]; } if (!tok.empty() && tok[0] != '-') return tok; } return {}; } bool aracLisanstanOtomatik() { return g_lisanstanOtomatik; } void aracLisanstanOtomatikAyarla(bool a) { g_lisanstanOtomatik = a; } namespace { int g_pencereG = 282; // Fikri'nin ayarladığı ölçü (istemci alanı) — varsayılan bu int g_pencereY = 416; float g_gostericiOran = 0.75f; } // namespace int aracPencereGenislik() { return g_pencereG; } void aracPencereGenislikAyarla(int px) { g_pencereG = px; } int aracPencereYukseklik() { return g_pencereY; } void aracPencereYukseklikAyarla(int px) { g_pencereY = px; } float aracGostericiOran() { return g_gostericiOran; } void aracGostericiOranAyarla(float o) { g_gostericiOran = o; } namespace { std::string geoAnahtar(const std::string& kimlik) { // Kimlik zaten "arac." ile başlar → "ayar.arac.pencere.arac.ozmo_kafa" gibi çirkin // tekrar olmasın diye önek atılır: "ayar.arac.pencere.ozmo_kafa". constexpr std::string_view kOn = "arac."; const std::string_view k{kimlik}; return "ayar.arac.pencere." + std::string(k.starts_with(kOn) ? k.substr(kOn.size()) : k); } // Pencere başlık çubuğunun anlamlı bir kısmı sanal masaüstünde mi (çok monitörlü // kurulumda tüm ekranların birleşimi). Değilse kullanıcı pencereyi göremez/tutamaz. bool konumEkranda(int x, int y, int g, int yk) { const int vx = GetSystemMetrics(SM_XVIRTUALSCREEN), vy = GetSystemMetrics(SM_YVIRTUALSCREEN); const int vg = GetSystemMetrics(SM_CXVIRTUALSCREEN), vy2 = GetSystemMetrics(SM_CYVIRTUALSCREEN); constexpr int kPay = 60; // en az bu kadar piksel görünür kalmalı (tutulabilsin) if (x + g < vx + kPay || x > vx + vg - kPay) return false; if (y + yk < vy + kPay || y > vy + vy2 - kPay) return false; return true; } } // namespace AracPencereGeo aracPencereGeoOku(const std::string& kimlik) { AracPencereGeo geo; const std::string s = ayarOku(geoAnahtar(kimlik).c_str(), ""); if (s.empty()) return geo; int x = 0, y = 0, g = 0, yk = 0; if (std::sscanf(s.c_str(), "%d %d %d %d", &x, &y, &g, &yk) != 4) return geo; if (g >= 200 && yk >= 200) { geo.genislik = g; geo.yukseklik = yk; geo.boyutGecerli = true; } // Konum doğrulaması: dış pencere ölçüsü tam bilinmiyor (çerçeve payı) — istemci // ölçüsü yeterli yaklaşım; amaç "tamamen ekran dışında mı" sorusunu yanıtlamak. if (geo.boyutGecerli && konumEkranda(x, y, g, yk)) { geo.x = x; geo.y = y; geo.konumGecerli = true; } return geo; } void aracPencereGeoYaz(const std::string& kimlik, int x, int y, int g, int y2) { if (g < 200 || y2 < 200) return; // saçma ölçü yazma if (!konumEkranda(x, y, g, y2)) { x = 0; y = 0; } // ekran dışıysa konumu sıfırla char b[64]; std::snprintf(b, sizeof(b), "%d %d %d %d", x, y, g, y2); ayarYaz(geoAnahtar(kimlik).c_str(), b); } void aracKayitlariKur() { if (g_kuruldu) return; g_kuruldu = true; AracSistemi& s = aracSistemi(); // Somut araçlar. Kimlik = lisans kimliği (lisans_kimlikler.cpp ile BİREBİR aynı // dize) → komut-bazlı satış altyapısı araç kipini de kapsar, ikinci katalog yok. s.kaydet({"arac.diagonal_kafa", "FikoYT Diagonal Kafa", "🔧", [] { kafaAc(KafaTip::Diagonal); }}); s.kaydet({"arac.ozmo_kafa", "FikoYT Ozmo Kafa", "🔩", [] { kafaAc(KafaTip::Ozmo); }}); // Lisans kapısı: hak VAR mı + paket süresi GEÇERLİ mi. Lisans hiç hak tanımlamıyorsa // (haklar_ boş) komutIzinli true döner → geliştirme/tam sürüm davranışı korunur. s.lisansKapisiAyarla([](const std::string& kimlik) { LisansSistemi& l = lisansSistemi(); return l.komutIzinli(kimlik) && l.komutHakkiGecerli(kimlik); }); } bool aracOtomatikBaslat() { aracKayitlariKur(); AracSistemi& s = aracSistemi(); const std::string cevre = cevreArac(); const AracSistemi::Sonuc r = s.otomatikBaslat(g_komutSatiri, cevre, g_lisanstanOtomatik); if (r == AracSistemi::Sonuc::Tamam) { gunluk::bilgi("Araç kipi: {}", s.aktif()->ad); return true; } // İstenen araç belirtilmişse sessiz kalma: kullanıcı kısayola tıklayıp tam CAD // açılınca "çalışmadı" sanır. Hiçbir şey istenmediyse (normal açılış) sessiz. const std::string istenen = !AracSistemi::komutSatirindanArac(g_komutSatiri).empty() ? AracSistemi::komutSatirindanArac(g_komutSatiri) : cevre; if (!istenen.empty()) { const bool lisanssiz = r == AracSistemi::Sonuc::Lisanssiz; const std::string mesaj = lisanssiz ? "Lisansınız \"" + istenen + "\" aracını kapsamıyor.\n\nProgram tam " "sürüm olarak açılıyor." : "\"" + istenen + "\" adında bir araç yok.\n\nProgram tam sürüm olarak " "açılıyor."; gunluk::uyari("Araç kipi açılmadı ({}): {}", lisanssiz ? "lisans" : "bulunamadı", istenen); MessageBoxA(nullptr, mesaj.c_str(), "FikoCAD — Araç Kipi", MB_OK | MB_ICONWARNING); } return false; } } // namespace fiko