Referenzimplementation - Arbeitsweise der Implementation
Referenzimplementation - Arbeitsweise der Implementation Beschreibung der Arbeitsweise der Referenzimplementation
Die Referenzimplementation besteht aus fünf Prozeduren. Die Prozeduren sind in zwei Schichten organisiert. Änderungen dürfen nur an den Prozeduren der oberen Schicht (DrvEvt und DrvDef) erfolgen.
In der Prozedur DrvDef sind Konstanten vorhanden, die für jede Anfrage des Laufwerkstreiber eine Funktion in der Prozedur DrvEvt definieren. Durch Änderungen in den Definitionen können andere Funktionen aufgerufen werden, ohne dass Änderungen in der Prozedur DrvMain notwendig werden. Die Prozedur muss lediglich neu übersetzt werden.

Die Prozedur DrvMain wird durch den SOA-Service aufgerufen, sobald vom Laufwerkstreiber eine Nachricht (Request) eintrifft. Innerhalb der Prozedur wird der Inhalt der Nachricht in globale Variablen übertragen. Anschließend wird auf Grund des eingegangenen Nachrichtentyps die entsprechende Funktion in DrvEvt aufgerufen.
Die Funktionen in DrvEvt schreiben mit Hilfe der Funktionen in DrvSend eine Antwort-Nachricht (Response) auf den Socket. Das Abschließen und Versenden der Nachricht erfolgt dann wieder in der DrvMain nach der Rückkehr aus den Funktionsaufrufen in die Prozedur DrvEvt.

Verarbeitung am Beispiel des _DrvReqInit
Wird eine Nachricht von Typ _DrvReqInit empfangen, wird in der DrvMain das gesamte Datenpaket gelesen. In dem Datenpaket befinden sich Informationen über den Laufwerkstreiber, den Computer auf dem der Laufwerkstreiber installiert ist und die Version des installierten Treibers. Die Informationen werden in die entsprechenden globalen Variablen gelesen und der Kopf des Antwort-Pakets geschrieben. Der Keep-alive der Verbindung wird auf 60 Sekunden gesetzt. Anschließend wird die Funktion DrvEvt:EvtInit aufgerufen.
In dieser Funktion wird ein Laufwerksbuchstabe, ein Freigabename, das temporäre Verzeichnis und die Größe des Caches angegeben. Durch Aufrufe der Funktionen DrvSend:DrvCfgMountLocal(), DrvSend:DrvCfgMountNetwork() und DrvSend:DrvCfgCacheDisk() werden die Informationen direkt in das Antwort-Paket geschrieben.
Nach der Rückkehr der Funktion in die DrvMain-Prozedur wird das Resultat der aufgerufenen Funktion geschrieben und das Datenpaket abgeschlossen und versendet. Der Laufwerkstreiber kann mit den Informationen das Laufwerk erstellen und den Cache einrichten. Nach einigen Sekunden steht das Laufwerk anderen Applikationen zur Verfügung.
Nach der Initialisierung werden sofort weitere Anfragen duch den Laufwerkstreiber erzeugt, da das Betriebssystem Informationen über das Laufwerk anfordert. Durch das Einrichten eines Keep-alive bei der Verbindung, entfällt der Verwaltungsaufwand, für diese Anfragen erneut eine Verbindung herzustellen. Daraus resultiert eine erhebliche Verbessung der Performanz gegenüber Verbindungen ohne Keep-alive.
Verarbeitung am Beispiel des _DrvReqGetFileEntries
Bei einer Nachricht von Typ _DrvReqGetFileEntries wird der Benutzername und die Domäne des am Betriebssystem angemeldeten Benutzers, sowie das Verzeichnis übertragen, dessen Inhalt gelesen werden soll.
Die Antwort gliedert sich in zwei Teile. Zunächst wird überprüft, ob sich Änderungen ergeben haben. Sollte das nicht der Fall sein, wird nur ein kurzes Datenpaket mit den Bereichen _DrvItemContentChanged und _DrvItemTimeout übertragen. Der Laufwerkstreiber erstellt das Verzeichnis aus dem Inhalt seines Caches.
Hat sich das Verzeichnis verändert, müssen alle Verzeichniseinträge übermittelt werden. Der Änderungszustand und das Timeout werden übertragen. Anschließend werden für jeden Eintrag der Dateiname, die Attribute, die Dateizeiten (Erstellungsdatum, letzter Zugriff und letzte Änderung) und die Berechtigungen aller Zugriffs-Ids angegeben. Handelt es sich um einen Verzeichniseintrag, wird angegeben, ob das Verzeichnis leer (keine weiteren Unterverzeichnisse oder Dateien enthalten) ist, bei einer Datei wird die Dateigröße angegeben. Die Angabe der Zugriffsberechtigungen kann entfallen, wenn keine Änderungen aufgetreten sind. Die einzelnen Einträge werden durch ein _DrvResGetFileEntryData voneinander getrennt. Sind alle Einträge in dem Verzeichnis übertragen, wird als Resultat _rNoRec gesetzt.
