DVB.NET 4.0 Konzepte: Glossar

Bevor ich demnächst einiges zum aktuellen Stand von DVB.NET 3.5.1 erzähle (zur Erinnerung: hier werden nur erste Teile von 4.0 enthalten sein) einige Worte zur veränderten / verallgemeinerten Nomenklatur.

Eine Quelle bezeichnet eine DVB Sendeeinheit und ist im Allgemeinen entweder ein Fernseh- oder ein Radiosender, technisch sind aber auch Datendienste vorgesehen. Repräsentiert wird eine Quelle in DVB.NET durch die Klasse SourceIdentifier, in etwa dem alte Identifier entsprechend. Eine Quelle wird eindeutig durch ein Tripel (Originale Netzwerkkennung, Datenstromkennung, Dienstkennung) gekennzeichnet – ein über DVB-C empfangens ZDF hat in diesem Sinne im Allgemeinen die gleiche Quelle wie das über DVB-S empfangene.

DVB.NET selbst unterstützt allerdings keine Datendienste, sondern nur Sender, die durch die Klasse Station repräsentiert werden. Ein Sender ist nichts anderes als eine erweiterte Quelle – auch im Sinne der .NET Vererbungsachse. Zusätzlich zu den Daten der Quelle enthält ein Sender Informationen zur Auswahl durch den Anwender (Anzeigename, Name des Dienstanbieters) und zur Planung von Aufzeichnungen (Entschlüsselung notwendig). Ein Sender enthält aber keine Datenstromkennungen zum Empfang selbst (PID des Bildsignals etwa). Wie früher bereits einmal erwähnt soll DVB.NET 4.0 sehr viel dynamischer auf Änderung dieser technischen Daten reagieren können. Tatsächlich wird eine DVB.NET 4.0 Senderliste nur diese reduzierte Fassung eines Senders enthalten!

Quellen werden zu Quellgruppen zusammengefasst, früher als Transponder bezeichnet. Eine Quellgruppe beschreibt die technischen Empgfangsdaten wie Frequenz und Modulation in drei unterschiedlichen Basisklassen für DVB-S (SatelliteGroup), DVB-C (CableGroup) und DVB-T (TerrestrialGroup), alle von einer gemeinsamen .NET Basisklasse SourceGroup abgeleitet. Neben den technischen Daten sind alle Quellen enthalten, die von der jeweiligen Quellgruppe angeboten werden.

Speziell für DVB-S wurde zusätzlich das Konzept des Ursprungs eingeführt, am besten mit den alten DiSEqC Varianten zu vergleichen. Jede Quellgruppe hat einen Ursprung, der beschreibt, wie die Gruppe empfangen werden kann. Die .NET Klasse SatelliteLocation ist von einer Basisklasse GroupLocation abgeleitet, die auch über generische Varianten zu entsprechenden DVB-C und DVB-T Klassen führt – wobei es hier im allgemeinen nur einen einzigen Ursprung (Default Location) gibt. Jeder Ursprung enthält neben den Empfangsdaten alle Quellgruppen, die nach Auswahl empfangen werden können.

Eine DVB.NET 4.0 Senderliste ist im Wesentlichen die als XML serialisierte Form einer Liste von Ursprüngen.

Tschüss

Jochen

Spaß mit Extensionmethoden – hier: zyklische Referenzen von Assemblies

Man stelle sich eine Anwendung vor, die aus zwei Assemblies besteht. Die eine enthält ausschließlich Klassen, die zur Konfiguration dienen und etwa in die XML Repräsentation serialisiert werden. Als Beispiel eine Klasse StationInformation, die zu einem Fernsehsender alle Informationen für einen DVB Empfang beinhaltet (PIDs, um es konkret zu machen). Diese Assembly ist von nichts ausser .NET abhängig. Eine andere DLL implementiert einen DVB Zugriff über BDA und ist reichlich von diversen Bibliotheken abhängig. Natürlich auch von unserer ersten Assembly. In der zweiten Assembly gibt es etwa eine Klasse DVBHardware mit einer Methode UpdateStation, die eine StationInformation als Parameter erhält und die Empfangsdaten auf den aktuellen Stand bringt (etwa gibt es nur zeitweise einen Videotext wie bei KiKa).

Die Abhängigkeit der Assemblies zwingt nun erst einmal einen Anwender der Bibliotheken, die DVBHardware Instanzen ins Zentrum seines Denkens zu stellen: nur hier kann es Methoden geben, die beide Assemblies nutzen. Mit einer Extensionmethode läßt sich aber nun einfach eine Flexibilität erreichen, die eine natürlicher Sicht auf die Dinge erlaubt (eigentlich interessiert mich der Empfang eines Senders, die verwendete Hardware ist eigentlich zweitrangig): mit

public static void Update
(
this StationInformation station,
DVBHardware hardware
)
{
hardware.Update(station);
}

kann nun alternativ auch StationInformation.Update(hardware) aufgerufen werden. Aus Sicht des Anwenders, der beide Assemblies gleichzeitig verwendet und beim IntelliSense nicht so genau hinschaut sieht es fast aus, als würden sich die beiden Assemblies hier gegenseitig (zyklisch) referenzieren.

Wie dem auch sei und unabhängig davon, ob das Beispiel trägt: Extensionmethoden machen es beim Design von Bibliotheken einfacher, sich nicht schon früh auf eine Sichtweise festlegen zu müssen. Eine vollständig symmetrische Sicht ist zwar nicht immer notwendig und man kann es dabei auch leicht übertreiben, aber in Einzelfällen halte ich das für eine durchaus interessante Option – ausserhalb der trivialen Bedeutung, scheinbar abgeschlossene Klassen mit neuen Instanzmethoden erweitern zu können.

Happy Coding

Jochen

DVB.NET 4.0 ½

Leider reicht es für die nächste Version (geplant bis Silvester 2008) doch nicht mehr für eine grunderneuerte 4.0. Ich habe daher die in Entwicklung befindliche Version erst einmal 3.5.1 getauft. Der kleine Versionssprung ist gerechtfertigt, da sich im Kern gegenüber 3.5 wenig ändern wird – vor allem im Bereich VCR.NET und DVB.NET / VCR.NET Viewer. Aber DVB.NET wird um die ersten 4.0 Schnittstellen und Konzepte erweitert. Das Ziel sind im Besonderen folgende Aspekte:

  • Ergänzung von DVB-S2 Informationen in der Senderliste (etwa für die Nova-S2 HD, die dann vollständig unterstützt werden soll)
  • NIT gestützter Sendersuchlauf
  • Höhere Dynamik bei der Nutzung der Senderdaten (e.g. alternative Tonspuren) und Entschlackung der Senderlisten
  • Bessere Auswahl der DVB Hardware für den Einsatz mehrerer gleichartiger Karten in einem Rechner
  • Neue Schnittstellen ohne die ursprünglich enge Kopplung an die Denkweise der TechnoTrend API für die Nexus
  • Einfacherer Zugang zur Nutzung von DVB.NET für Aufzeichnungen in eigenen Programmen (Anzeigen hat weiterhin niedrigere Priorität)
  • Vereinfachungen in VCR.NET durch Verlagerung der Kernfunktionalitäten für die Aufzeichnung in die DVB.NET Bibliothek

Für die eigentlichen Tools wird sich vermutlich wenig tun. VCR.NET wird vor Allem von der Umstellung bei den Senderlisten profitieren können. Beim Viewer könnte man sich höchstens vorstellen, dass die Favoritenliste und Senderauswahl beim Einsatz von mehreren Karten präziser wird (für eine Nexus macht es etwa keinen Sinn, DVB-S2 Transponder überhaupt anzubieten).

So isses

Jochen

Multi-File Upload (3): Zusätzliche Eingaben pro Document Library aktivieren

Vorweg: die aktuelle Lösung ist sicher nicht die geschickteste, da sie eine individuelle Konfiguration für jede Document Library erfordert. Aber im Rahmen des Proof-Of-Concept Ansatzes sollte das erst mal reichen. Eine erweiterte Konfiguration ist kein technisches Problem, sondern nur eine Frage des Fleisses.

Im Beispiel habe ich mir eine Document Library namens WSS Uploader Demo Library angelegt. In dieser habe ich vier neue Felder angelegt, drei davon sind Pflicht (Wahrheitswerte können nicht als Pflichteigenschaft markiert werden, sind zwar de facto immer welche, haben aber auch immer einen Vorgabewert): einen einzeiligen Text (A Text), eine Zahl (A Number), eine Auswahl (A Choice, mit den Werten Choice 1 und Choice 2) sowie den erwähnten Wahrheitswert (A Flag) – in Klammern immer die Namen der jeweiligen Felder, die gleich noch eine wichtige Rolle spielen.

Ohne weitere Konfiguration wird nun der alte Mechanismus verwendet und die ausgewählten Dateien ausgecheckt ohne weitere Eigenschaften in die Library eingespielt (man siehe die erste Zeile im folgenden Bild, die zweite wurde mit der gleich beschriebenen Konfiguration eingespielt):

So sieht das dann aus

Die Konfiguration für den Multi-File Upload geschieht über HTLM Fragmente, die im _app_data Unterverzeichnis der jeweiligen WSS Site abgelegt werden – etwa c:\Inetpub\wwwroot\wss\VirtualDirectories\80\_app_data für die Defaultsite auf dem Standard HTTP Port 80, _app_data exitistiert im Allgemeinen noch nicht und muss neu angelegt werden. Schon einmal wichtig am Rande: die Konfiguration wird immer beim Aufbau der Auswahlseite für Dateien ausgelesen und Änderungen erfordern keinen Neustart des Web Servers.

Für jede Document Library, die zusätzliche Eigenschaften beim Einspielen mehrerer Dateien verwendet soll, wird eine Datei der Form (für das konkrete Beispiel) MUpload_WSS Uploader Demo Library.html angelegt. Extrem wichtig sind der Anfang (MUpload_), die Dateiendung (.html) sowie die exakte Schreibweise des Namens der Library (WSS Uploader Demo Library). Für mein kleines Beispiel habe ich folgende Datei verwendet:

<table>
<tr>
<td>A Text:</td>
<td><input type="text" id="meta_A Text" value="<Please Enter>"/></td>
</tr>
<tr>
<td>A Number:</td>
<td><input type="text" id="meta_A Number" value="42" /></td>
</tr>
<tr>
<td>A Choice:</td>
<td><select id="meta_A Choice">
<option value="" selected="selected"></option>
<option value="Choice 1">Choice 1</option>
<option value="Choice 2">Choice 2</option>
</select> </td>
</tr>
<td>A Flag:</td>
<td><input type="checkbox" id="meta_A Flag" checked="checked" /></td>
</tr>
</table>

Hier sind der Kreativität des HTML Kenners keine Grenzen gesetzt. Lediglich die Datentypen der Eingabefelder (text, checkbox, select) und die Namen (id) der Eingabefelder müssen exakt eingegeben werden. Bei den Namen ist grundsätlich der Zusatz meta_ am Anfang zu ergänzen (meta_A Flag). Das war es schon!

Leider sieht man hier auch schon eines der größten Mankos, mit denen man vielleicht leben kann – schön ist es nicht: die Alternativen für mein Auswahlfeld (A Choice) werden nicht aus der WSS Konfiguration übernommen, sondern sind hier redundant eingepflegt. Sicher wäre es schöner, wenn die Eingabefelder dynamisch aus der durchaus zugänglichen Konfiguration aufgebaut würde, das ist aber mehr Aufwand, als ich für diesen Proof-Of-Concept betreiben kann und will. Der neue Seitentyp, der genau dieses HTML Fragment an die Platzhalter Position in die UPLOAD.ASPX einmischt, hat zumindest alles da, um dies theoretisch tun zu können.

Ich hoffe, diese vier Artikel reichen als Einführung.

Viel Spaß

Jochen

Multi-File Upload (2): Aktivieren der neuen Seitentypen

An dieser Stelle kommt der etwas kniffelige Teil, der mit größter Vorsicht auszuführen ist. Es ist nun eine Anpassung der Standardeinspielseite für multiple Dateien UPLOAD.ASPX notwendig – diese befindet sich im Allgemeinen im Seitenverzeichnis von WSS (c:\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\LAYOUTS). Ich empfehle dringend, erst einmal eine Sicherheitskopie der Datei anzulegen.

Die Änderungen umfasst drei Teile: die UPLOAD.ASPX wird an den neuen Seitentypen gebunden, es wird ein Platzhalterbereich für zusätzliche Eingaben vorbereitet und das Script zum Anstossen des Einspielvorgangs wird verändert. Bei den Veränderungen (mit NOTEPAD.EXE zum Beispiel – XML Editoren sind für HTML / ASP.NET Seiten nicht zwingend geeignet) ist zu beachten, dass nicht immer ganze Zeilen betroffen sind. Ich beschreibe im Folgende das Vorgehen basierend auf meiner lokalen Installation (WSS 3.0 mit SP1 Englisch auf Windows 2003 R2 SP2).

Gemäß den notwendigen Veränderungen finden sich im Source\Fragments Unterverzeichnis des Installationsverzeichnisses drei UPLOAD.ASPX Dateien mit den Zusätzen HEAD, FORM und SCRIPT. Diese Fragmente können zum einfachen Anpassen der UPLOAD.ASPX verwendet werden – die Zeilen mit den drei Punkten sind IMMER zu entfernen!

HEAD: Die erste Zeile der originalen UPLOAD.ASPX beginnt (!) mit einer Sequenz

<%@ Assembly Name="Microsoft.SharePoint.ApplicationPages, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c"%> <%@ Page Language="C#" Inherits="Microsoft.SharePoint.ApplicationPages.UploadPage" MasterPageFile="~/_layouts/application.master" %>

Nur dieser Beginn ist durch das HEAD Fragment (ohne die letzte … Zeile) zu ersetzen.

FORM: Das FORM Fragment kann eigentlich nach Lust und Laune eingesetzt werden, wenn man sich etwas auskennt. Ich habe mich entschieden, die zusätzlichen Eingabefelder direkt unter der ‚Nicht überschreiben‘ Auswahl vorzunehmen. Dazu ersetzt das FORM Fragment (ohne die beiden … Zeilen) folgenden HTML Ausschnitt:

<Template_Control>
<asp:CheckBox id="OverwriteMultiple" Checked="true" Text="<%$Resources:wss,upload_document_overwrite_version%>" runat="server" />
</Template_Control>

Hier ein Beispiel (ohne den Versuch einer Formatierung):
Neue Einspielseite

SCRIPT: Das alles bringt aber gar nichts, wenn nicht auch der Scriptcode beim Einspielen so verändert wird, dass er die Eingabewerte auch berücksichtigt und den neuen Einspielvorhang aktiviert. Dazu ersetzt das SCRIPT Fragment das vorhandene Script einfach vollständig (wieder ohne die beiden … Zeilen):

function _spFormOnSubmit()
{
var putoptsElement = document.getElementById("putopts");
var overwriteElement = document.getElementById("&ld;<%= OverwriteMultiple.ClientID %>");
putoptsElement.value = overwriteElement.checked ? "true" : "false";
document.getElementById("idUploadCtl").MultipleUpload();
return false;
}

Das war es erst einmal. Die Veränderungen werden nach einem Neustart des Web Servers (IISReset aufrufen) aktiv. Werden keine weiteren Schritte unternommen, sollte sich alles wie vorher verhalten. Allerdings lauern die neuen Möglichkeiten im Hintergrund gleich um die Ecke.

Soweit dazu

Jochen