Ein neues Plugin von einem bestehenden Plugin programmiertechnisch ableiten? (1 Viewer)

bartmanson

MP Donator
  • Premium Supporter
  • December 28, 2004
    127
    35
    Nuremberg
    Home Country
    Germany Germany
    MediaPortal Version: 0.2.0.3
    MediaPortal Skin: mce
    Windows Version: xp sp2
    CPU Type: P4 1.8
    HDD: Seagate
    Memory: 768MB
    Motherboard: md3001 (MSI-6399 OEM)
    Motherboard Chipset: Intel 845
    Motherboard Bios:
    Video Card: Ati 9550
    Video Card Driver:
    Sound Card: Onboard
    Sound Card AC3: Nope
    Sound Card Driver:
    1. TV Card: PVR350
    1. TV Card Type: hw
    1. TV Card Driver:
    2. TV Card:
    2. TV Card Type:
    2. TV Card Driver:
    3. TV Card:
    3. TV Card Type:
    3. TV Card Driver:
    4. TV Card:
    4. TV Card Type:
    4. TV Card Driver:
    MPEG2 Video Codec: nvidia
    MPEG2 Audio Codec: nvidia
    Satelite/CableTV Provider: kabel deutschland
    HTPC Case: aldi :)
    Cooling: Ja
    Power Supply: auch
    Remote: Hauppauge mit Girder
    TV: Philips CRT
    TV - HTPC Connection: Composite


    Hallo zusammen,

    mein erstes Posting im deutschen Forum. Auch von dieser Stelle nochmal vielen vielen Dank an die MP devs, tester, documentation-schreiber, webmaster, moderatoren und alle anderen, die MP zur besten HTPC-Software machen.

    Dennoch ist es ja work-in-progress und da ich mit meinem Posting im englischen Forum (https://forum.team-mediaportal.com/derive_plugin_another_plugin-t14861.html) bisher keinen Erfolg hatte, probiere ich es hier nochmal...

    Meine Idee ist es, den PowerScheduler so zu erweitern, dass er in der Einstellung "Shutdown" (also nicht "Hibernate" und "Standby") die Option anbietet, das Program CMOSTimer (www.boraxsoft.de) aufzurufen, um den Computer runterzufahren und über das BIOS wieder aufzuwecken. Das hätte den Vorteil, dass man sich irgendwelche Workarounds mit StartOnWake.exe oder ähnlicher Software sparen kann, wenn man Probleme mit Hibernate oder Standby hat (und die Forenbeiträge der vergangenen Tage zeigen, dass es genügend User gibt, die diese Probleme haben ...).

    Für die Umsetzung dieser PowerScheduler-Änderungen sehe ich folgende Alternativen:
    - Einen Patch submitten. Werde ich machen, wenn dieses Posting auch wieder keine Resonanz findet :)
    - Eine Kopie von PowerScheduler erstellen und meine Änderungen daran durchführen. M. E. keine Alternative, weil es immer wieder Änderungen am PS gibt, die ich dann jedesmal nachziehen müsste.
    - Ein Plugin ("BIOSScheduler" oder wie auch immer) von der Klasse MediaPortal.PowerScheduler.PowerScheduler ableiten und nur die Methoden überschreiben, die für die Änderungen relevant sind (PluginName, Shutdown, ...). Das wäre in meinen Augen die eleganteste Lösung, funktioniert aber nicht. Ich vermute, dass es nicht funktioniert, weil die Methoden in PowerScheduler nicht als "virtual" deklariert werden und deshalb in manchen Situationen nicht die mit "new" deklarierten, abgeleiteten Methoden meines BIOSScheduler gezogen werden, sondern die der Basisklasse PowerScheduler.

    Deswegen habe ich die folgenden Fragen:
    - Was haltet ihr von so einer Funktionalität
    - Welches Vorgehen würden die Entwickler bevorzugen? Patch submitten? Oder gibt es Gründe, warum man ein neues Plugin nicht von einem bestehenden Plugin ableiten kann? Oder mache ich etwas falsch?


    Ich weiß, dass das viel Holz ist und ich auch viele Fragen habe... :) Ich hoffe, es ist rübergekommen, um was es mir geht. Wenn nicht, dann sagt mir einfach was unklar ist.


    Viele Grüße,
    BartManson
     

    misterd

    Retired Team Member
  • Premium Supporter
  • April 4, 2006
    1,597
    314
    Home Country
    Germany Germany
    Hallo,
    also die Idee hört sich nicht schlecht an. Das mit dem Ableiten sollte eigentlich funktionieren. Ich gehe nur mal davon aus, dass du den Namen des Plugins ändern musst, um einen Konflikt in MP zu vermeiden. Leider kann ich ohne den Code zu sehen nur schwer sagen, was die Ursache sein könnte.

    Was jetzt den Entwicklern lieber ist kann ich dir natürlich nicht beantworten. Ich denke mal das ein zusätzliches Plugin am Anfang vielleicht mehr Sinn macht, um eine klare Trennung für Bugreports etc. zu haben.

    Gruß
    MisterD
     

    bartmanson

    MP Donator
  • Premium Supporter
  • December 28, 2004
    127
    35
    Nuremberg
    Home Country
    Germany Germany
    Hallo MisterD,

    danke für dein Feedback. Ich habe mir die ganze Sache nochmal genauer angeschaut und bei MS folgendes gefunden (http://msdn.microsoft.com/library/d.../en-us/csspec/html/vclrfcsharpspec_10_5_3.asp):

    ------------------- schnipp -----------------------
    The following example illustrates the differences between virtual and non-virtual methods:

    using System;
    class A
    {
    public void F() { Console.WriteLine("A.F"); }
    public virtual void G() { Console.WriteLine("A.G"); }
    }
    class B: A
    {
    new public void F() { Console.WriteLine("B.F"); }
    public override void G() { Console.WriteLine("B.G"); }
    }
    class Test
    {
    static void Main() {
    B b = new B();
    A a = b;
    a.F();
    b.F();
    a.G();
    b.G();
    }
    }

    In the example, A introduces a non-virtual method F and a virtual method G. The class B introduces a new non-virtual method F, thus hiding the inherited F, and also overrides the inherited method G. The example produces the output:

    A.F
    B.F
    B.G
    B.G
    ---------------- schnapp --------------------

    Bezogen auf meinen Fall bedeutet das:
    A entspricht PowerScheduler
    B entspricht BIOSScheduler
    A.F entspricht z. B. protected void PowerScheduler.ShutDown()
    B.F entspricht protected new void BIOSScheduler.ShutDown()

    Der PluginManager von MP macht nun in seiner Methode LoadPlugin folgendes:
    ...
    plugin = (IPlugin)newObj;
    ...
    Meiner Meinung macht er durch diese Zeile aus meinem BIOSScheduler wieder einen PowerScheduler und ruft auch dessen Methoden auf -> a.F() in obigem Beispiel ergibt als Resultat "A.F".
    Bei mir wäre aber als Resultat "B.F" (also die Methode aus der abgeleiteten Klasse) gewünscht.
    Ich konnte dieses Verhalten auch bereits nachvollziehen: Sobald ich meinen BIOSScheduler in einer eigenen DLL in das plugin\process-Verzeichnis kopiert hatte, erschienen in der MP-Configuration zwei Plugins "PowerScheduler", obwohl ich die relevanten Methoden und Eigenschaften (PluginName, Description, WindowID usw.) in meinem abgeleiteten Scheduler implementiert hatte.

    Deswegen nochmal die Frage (vielleicht liest es ja mal ein Entwickler (Bavarian?)): Ist dieses Verhalten so gewünscht oder soll es in Zukunft möglich sein, Plugins von anderen Plugins abzuleiten?

    Oder hab ich immer noch einen Denkfehler?

    Viele Grüße,
    BartManson
     

    bartmanson

    MP Donator
  • Premium Supporter
  • December 28, 2004
    127
    35
    Nuremberg
    Home Country
    Germany Germany
    Hallo Luna96,

    danke für den Hinweis, aber ich denke, die CMOSTimer-Integration ist eine Sache, die mit sehr geringem Aufwand in MP realisiert werden könnte, ohne ein externes Programm wie PVR-Scheduler zu benötigen. Wie du hier erkennen kannst, beschäftigt mich die Sache schon etwas länger ... :)

    Ciao,
    BartManson
     

    misterd

    Retired Team Member
  • Premium Supporter
  • April 4, 2006
    1,597
    314
    Home Country
    Germany Germany
    Hallo,
    ich hab dein Szenario gerade mal ausprobiert und bin dabei auf folgende Lösung gekommen in der Klassendeklaration gekommen:
    Code:
        public class BIOSScheduler: PowerScheduler, IPluginReceiver, IWakeable, ISetupForm {
            public new string PluginName() {
                return "BIOSScheduler";
            }
    
        }
    Du gibst einfach nochmal an, dass deine Klasse die Interfaces implementiert. Mit obigem Beispiel erscheint dann im Setup der Name "BIOSScheduler".

    Gruß
    MisterD
     

    bartmanson

    MP Donator
  • Premium Supporter
  • December 28, 2004
    127
    35
    Nuremberg
    Home Country
    Germany Germany
    Hallo MisterD,

    danke für den Hinweis, werde es am Wochenende mal ausprobieren ...

    Da wäre ich vermutlich nie draufgekommen. Ich finde es einfach zu "schräg", in einer abgeleiteten Klasse dieselben Interfaces nochmal explizit zu deklarieren, die bereits von der Basisklasse deklariert werden ... Naja, wenns geht :)

    Ciao,
    BartManson
     

    elCutty

    Portal Member
    April 24, 2007
    25
    0
    Home Country
    Germany Germany
    Hallo BartManson,
    wie sieht es denn aus mit deinem "BIOSScheduler"? Die von MisterD gezeigte Möglichkeit müßte doch funktionieren.

    Gruß
    elCutty
     

    bartmanson

    MP Donator
  • Premium Supporter
  • December 28, 2004
    127
    35
    Nuremberg
    Home Country
    Germany Germany
    Hallo elCutty,

    ja, im Prinzip hat die Möglichkeit von MisterD funktioniert, aber letztendlich ist das PowerScheduler-Plugin nicht so konzipiert worden, dass man eine andere Version davon ableiten kann. Ich bin dann immer wieder an Stellen gestoßen, wo ich mir gewünscht hätte, dass etwas "protected" anstatt "private" wäre ... :)

    Letztendlich bin ich zu dem Entschluss gekommen, dass es sinnvoller wäre, den Code zu duplizieren. Darauf habe ich aber irgendwie auch keine Lust, weil sich der PowerScheduler code ja momentan auch noch ziemlich stark verändert (Bugfixing, neue Scheduling-Arten usw.) und ich nicht will, dass ich mit "meinem" scheduler dann immer alle Änderungen nachziehen muss. Vielleicht versuche ich es mal, die Änderungen am aktuellen PS-code durchzuführen und diese Änderungen dann als Patch zu submitten.

    Allerdings weiß ich nicht, wann ich dazu komme, weil ich irgendwann in den nächsten 14 Tagen Vater werde und meine Prioritäten dann erstmal woanders liegen werden :)

    Wenn sich etwas tut werde ich es auf jeden Fall bekannt geben.

    Viele Grüße,
    BartManson
     

    elCutty

    Portal Member
    April 24, 2007
    25
    0
    Home Country
    Germany Germany
    Hallo BartManson,

    da wünsche ich dir erst mal alles Gute für die kommenden Wochen und hoffentlich findest du danach irgendwann mal die Zeit da noch mal rein zuschauen.

    Gruß
    elCutty
     

    Users who are viewing this thread

    Top Bottom