Hyppää sisältöön

Arkkitehtuurin yleiskuva

Liitännäisjärjestelmä on rakennettu kolmesta komponentista, jotka kaikki ovat kansiossa Components/:

Komponentti Näkyvyys Vastuu
PluginApi Julkinen Puhtaita abstrakteja rajapintoja ja arvotyyppejä. Ei Qt:tä, ei Scintillaa, ei MTE:n sisäisiä otsikkotiedostoja — vain standardikirjasto.
PluginHost Sisäinen Lataa, omistaa ja välittää liitännäisille. Qt on täällä toteutusyksityiskohta (se käyttää kulissien takana luokkaa QPluginLoader).
Plugins Omatekoiset Esimerkki- ja sisäänrakennettuja liitännäisiä; kukin oma CMake-kohteensa, joka riippuu vain kohteesta PluginApi (ja Qt:stä, kun natiivia taustajärjestelmää käytetään).

Suunnitteluperiaatteet

  • Taustajärjestelmästä riippumaton sopimus. Kaikki PluginApi-tyypit sijaitsevat nimiavaruudessa MTE::plugin eivätkä ne saa sisällyttää mitään Qt-, Scintilla- tai MTE:n sisäistä otsikkotiedostoa. Tämä on se, mikä antaa tulevan Python-taustajärjestelmän toteuttaa saman sopimuksen ilman Qt:n vastarintaa.
  • Ei kolmannen osapuolen tyyppejä julkisen API:n yli. Liitännäiset eivät koskaan näe Scintilla- tai Qt-tyyppejä; isäntä sovittaa sisäisen IEditorView-rajapinnan ja julkisen IEditorService-rajapinnan välillä.
  • RAII kaikkialla. Komennon, valikkokohdan, telakkapaneelin tai tapahtumatilauksen rekisteröinti palauttaa poletin tai tilauskahvan. Sen tuhoaminen poistaa panoksen rekisteröinnin. Liitännäiset pitävät poletteja jäseninään, joten kaikki puretaan automaattisesti funktiossa shutdown().

Elinkaari

Kukin liitännäinen toteuttaa yhden rajapinnan, IPlugin:

class IPlugin {
public:
    virtual ~IPlugin() = default;
    virtual PluginInfo info() const = 0;
    virtual bool       initialize(IPluginContext& ctx) = 0;
    virtual void       shutdown() noexcept = 0;
};
  • info() palauttaa POD-metatietoja (id, name, version, vendor, description, apiVersion).
  • initialize(ctx) vastaanottaa IPluginContext-palveluhakemiston. Liitännäinen nappaa tarvitsemansa palvelut ja rekisteröi komentonsa, valikkonsa, paneelinsa ja tapahtumatilauksensa.
  • shutdown() ajetaan poistuttaessa; koska panokset ovat RAII-poletteja, tavanomainen purkaminen on yleensä vain jäsenten tuhoutumisen sallimista.

Ei kuumaa uudelleenlatausta

Liitännäisen ottaminen käyttöön, poistaminen käytöstä, asentaminen ja poistaminen tulevat kaikki voimaan seuraavalla käynnistyksellä. Isäntä ei koskaan lataa tai poista liitännäiskoodia ajon aikana — tämä pitää mallin yksinkertaisena ja kiertää Windowsin ongelman, jossa »ladattua DLL:ää ei voi poistaa«.

Etsintä

Isäntä käy läpi järjestyksessä:

  1. <exe-dir>/Plugins/ — mukana tulevat omatekoiset liitännäiset.
  2. <AppLocalData>/Plugins/ — käyttäjäkohtainen asennushakemisto.
  3. Polut ympäristömuuttujasta MTE_PLUGIN_PATH.

Kukin hakemisto käydään läpi irrallisten kirjastojen ja yhden tason välittömien alihakemistojen osalta (liitännäiskohtainen <id>/-rakenne, jonka asennusohjelma tuottaa). Etsintä ei etene syvemmälle.