Shockwave – Internet im Direktzugriff

Document Sample
Shockwave – Internet im Direktzugriff Powered By Docstoc
					Shockwave – Internet im
Direktzugriff
                                                                           4
„Director 7 Shockwave Internet Studio“ – der Name des Programmpa-
ketes, das Sie wahrscheinlich im Regal stehen haben, will bereits aller-
hand über den Inhalt aussagen. Ohne Internet – und folglich die Inter-
net-Tauglichkeit von Software – geht heute nichts mehr, und tatsäch-
lich bietet Director 7 eine Fülle von Möglichkeiten, Multimedia für das
Internet zu produzieren oder aber Internet-Inhalte und -Technologien
in Multimediaproduktionen zu integrieren.

Ende 1995 – Director 4 und Netscape Navigator 2 waren gerade aktuell
– wurde das Shockwave-Plug-in eingeführt. Seitdem hat Macromedia
die Nase vorn, wenn es um interaktive Webinhalte geht. Der Gratis-
Player wurde von vornherein mit starken Partnern vertrieben, und bis
heute verfolgt Macromedia eine Vertriebspolitik, die – beispielsweise
durch Bundling mit Internet-Zugangssoftware und Betriebssystemsoft-
ware – eine relativ breite installierte Basis sicherstellt.

Der Funktionsumfang und die Integration von Shockwave in die Direc-
tor-Architektur hat sich mit jedem Director-Release verbessert: Heute
können Shockwave-Filme einfach über Menübefehle erstellt und im
Browser gesichtet werden; sie unterstützen alle Director-Funktionen,
soweit dem nicht Sicherheitsbedenken entgegenstehen (s.u. L INGO-EIN-       334
SCHRÄNKUNGEN). Xtras werden – ebenfalls mit gewissen Einschränkun-
gen – ebenso unterstützt wie das automatische Update des Shockwave-
Players und seiner Komponenten.

Die „Schockwelle mit Nachbrenner“, wie ich im Februar 1996 über ei-
nen Artikel in der Zeitschrift Screen Multimedia schrieb, ist nach vier
Jahren immer noch nicht aufzuhalten. Doch auch für CD-ROM-Produk-
tionen haben Sie heute diverse Möglichkeiten, Internet-Inhalte anzu-
zeigen oder Ihre Anwendung mit Online-Daten zu versorgen.

Im Lieferumfang Ihres „Studio“-Paketes befindet sich auch der Multi-
user-Server: Damit bietet Director 7 eine eigene Client-Server-Architek-
tur, die es ermöglicht, Informationspakete zwischen Shockwave-An-
wendungen hin und her zu schicken. Mit den entsprechenden Lingo-
Erweiterungen in Director 7 sind auch Peer-to-peer-Verbindungen zwi-
schen zwei Rechnern bzw. zwei Shockwave-Anwendungen möglich.

                                                                                   313
      Kapitel   4   Shockwave – Internet im Direktzugriff


                    Anmerkung: In den folgenden Ausführungen werden Sie an manchen Stellen
                    Einschränkungen wie „Wenn der verwendete Browser dies unterstützt, ...“ lesen.
                    Leider sind nicht alle Techniken in allen Browser-Typen und -Versionen möglich.
                    Wenn Sie mit Shockwave arbeiten, werden Sie mit den gleichen Inkompatibilitä-
                    ten und sorgsam gepflegten Unterschieden bei Browser-Funktionen zu tun be-
                    kommen wie jeder HTML- und JavaScript-/VBScript-Autor. Auch wenn wir versu-
                    chen, möglichst genau die Einschränkungen darzustellen, sollten Sie auf eigene
                    Tests – insbesondere mit neueren Browser-Versionen – nicht verzichten.


                    4.1 Arten der Online-Einbindung
                    Browser-Kontrolle
                    Browser-Aufruf im Projektor
                    Während externe Programme gewöhnlich mit dem open-Befehl geöff-
                    net werden, bietet Netlingo für den Aufruf einer URL eine bessere Mög-
                    lichkeit: Der Befehl goToNetPage öffnet, aus einem Projektor aufgeru-
                    fen, die entsprechende URL nämlich im Standard-Browser des jeweili-
                    gen Systems. In der Authoring-Umgebung wird die URL statt dessen in
                    dem Browser geöffnet, der im Menü DATEI / VOREINSTELLUNGEN / NETZ-
                    WERK eingetragen wurde. Voraussetzung ist allerdings, daß ein entspre-
                    chender Browser erkannt wird. Da Sie den Erfolg einer goToNetPage-Ak-
                    tion nicht überprüfen können, sollten Sie daher vorher mit der Funk-
                    tion browsername() prüfen, ob ein Browser zur Verfügung steht, und –
                    falls nötig – dem Anwender eine Ausweichmöglichkeit bieten.

                    Das folgende Skript überprüft zunächst browsername(); falls kein
                    Name zurückgegeben wird, wird der Anwender aufgefordert, in einem
                    Dialogfeld den Browser selbst anzugeben. Dieser Dialog wird mit FileX-
                    tra erzeugt; auch FileIO wäre natürlich möglich.


                     on goURLwithCheck URLoc
                       if browsername() = "" then
                         if the platform contains "Mac" then
                           browsername(FileOpenDialog("", "APPL"))
                         else browsername(FileOpenDialog ("c:\programme",¬
                         "Programme/*.EXE", "Bitte Browser wählen", 0, 1))
                         if browsername() = "" then return 0
                         -- Plausibilitäts-Check hier einfügen
                       end if
                       goToNetPage(URLoc)
                       return browserName()
                     end


                    Liefert der Aufruf 0 zurück, so wurde kein Browser angegeben, sondern
                    ABBRECHEN im Dialog gewählt. Falls Sie es für nötig erachten, können
                    Sie einen Plausibilitätscheck einfügen, da der Anwender grundsätzlich


314
                                          Arten der Online-Einbindung


jede Applikation angeben kann. Falls ein Browser gefunden bzw. ange-
geben wurde, wird die Seite aufgerufen und der Browser-Name zurück-
gegeben.



                                   Abbildung 4.1:
Datei-Öffnen-Dialog mit FileXtra oder FileIO-Xtra:
  Der Anwender kann selbst eine Applikation als
                     Standard-Browser angeben.




goToNetPage kann mit http-, https- und file-URLs in den gängigen Brow-
sern genutzt werden. Nur wenn der Browser entsprechend konfigu-
riert ist, können auch andere URLs – wie mailto: und ftp: – so aufgeru-
fen werden. Leider können Sie das auf dem Zielrechner im Normalfall
nicht vorher überprüfen, so daß Sie insbesondere zum Versenden von
E-Mail einen anderen Weg wählen sollten (s.u.). Der Aufruf einer File-     362
URL, die auf eine HTML-Seite auf der lokalen Festplatte oder CD-ROM
verweist, stellt kein Sicherheitsproblem dar (vgl. nächsten Abschnitt);    317
die HTML-Datei muß nicht in einem DSWMEDIA-Verzeichnis liegen.

Mehr Kontrolle bei der Auswahl des Browsers haben Sie, wenn Sie die
Xtras MasterApp oder BudAPI benutzen. Um beispielsweise eine HTML-
Seite mit Netscape zu öffnen, auch wenn auf dem Zielrechner mögli-
cherweise ein anderer Standard-Browser eingetragen ist, und eine Net-
scape-Installation zu starten, falls dieser Browser auf dem Anwender-
rechner nicht vorhanden ist, können Sie folgende Skripte verwenden.
Zunächst eine Lösung für Windows, die auch die Browser-Version be-
achtet:


 -- Aufruf: openwithNetscape("http://www.director7.de",3)

 on openwithNetscape url, minVers
   if checkForNetscape(minVers) = TRUE then
     browserName(getNetscapePath())
     goToNetPage url
   else
     -- Installer starten
   end if
 end


                                                                                  315
      Kapitel   4       Shockwave – Internet im Direktzugriff


                         on getNetscapePath
                           return baReadRegString ("Software\Microsoft\Windows\¬
                           CurrentVersion\App Paths\netscape.exe","","",¬
                           "HKEY_LOCAL_MACHINE")
                         end

                         on checkforNetscape minVers
                           -- 0: kein NS oder Version < minVers
                           -- 1: Version ist minVerS oder höher
                           nsv = baReadRegString("Software\Netscape\Netscape
                           Navigator", "CurrentVersion", "", "HKEY_LOCAL_MACHINE")
                           if value(char 1 of nsv) >= minVers then return 1
                           else return 0
                         end

                        Am Macintosh können Sie mit baFindApp("MOSS") den Pfad für Net-
                        scape Navigator, mit baFindApp("MSIE") den zum Internet Explorer
                        und mit baFindApp("AOp3") den zur AOL-Zugangssoftware Version 3
                        erhalten. Eine Versionsüberprüfung ist mit BudAPI für MacOS momen-
                        tan noch nicht möglich, ein Befehl baFileVersion() ist aber geplant.

                        Hier noch zwei weitere kleine Windows-Tricks für BudAPI (Ausgabe im
                        Nachrichtenfenster):


                         -- Version des Standard-Browsers ermitteln
                         put baFindApp("htm")
                         -- "C:\PROGRA~1\INTERN~1\iexplore.exe"
                         put bafileversion(bafindapp("htm"))
                         -- "5.00.2014.200"

                         -- Internet Explorer suchen
                         put bareadregstring ("Software\Microsoft\Windows\¬
                         CurrentVersion\App Paths\iexplore.exe", "", "",¬
                         "HKEY_LOCAL_MACHINE")
                         -- "C:\PROGRA~1\INTERN~1\iexplore.exe"


                        Auch mit MasterApp und eventuell weiteren Xtras können Sie entspre-
                        chende Überprüfungen vornehmen.
                 386   Für den Aufruf von AOL-Inhalten bzw. die Steuerung von Browsern
                        über die AOL-Zugangssoftware finden Sie ein Arbeitsbeispiel weiter un-
                        ten in diesem Kapitel.

                        Beachten Sie außerdem, daß URLs auf lokale Dateien ("file:///...")
                        unter Windows mit einem senkrechten Strich ("|", numToChar(124))
                        anstelle des Doppelpunktes nach dem Laufwerksbuchstaben geschrie-
                        ben werden müssen. Eine Datei "C:\TEST.HTML" würde in Lingo so aufge-
                        rufen:


                         goToNetPage("file:///c"&numToChar(124)&"/test.html")

316
                                    Arten der Online-Einbindung


Browser-Kontrolle aus Shockwave-Filmen
Soll ein Shockwave-Film im Browser die Steuerung von HTML-Seiten
übernehmen, so können Sie dafür ebenfalls gotoNetPage() verwenden.
Besonders nützlich ist dabei, daß Sie auch ein Target, sprich einen
Frame oder ein Fenster mit bestimmtem Namen, angeben können:


 gotoNetPage("eineURL", "einTarget")


Damit ist es möglich, daß Ihr Shockwave-Film aus einem Frame Ihres
HTML-Framesets heraus die Inhalte anderer Frames steuert. Die Frames
der HTML-Seite müssen entsprechend benannt werden (name-Parame-
ter):


 <HTML>
 <FRAMESET rows="50,*" cols="*" border="1">
   <FRAME src="frame1content.html" name="frame1">
   <FRAME src="frame2content.html" name="frame2">
 </FRAMESET>
 <NOFRAMES><BODY></BODY></NOFRAMES>
 </HTML>


Die Standard-Targets ("_blank", "_parent", "_top", "_self") können
Sie selbstverständlich ebenfalls angeben.

Wie alle asynchronen Netlingo-Aktionen erhält auch ein Aufruf mit
gotoNetPage eine netID; zumindest eine grundsätzliche Überprüfung
im Sinne von „Die Aktion ist abgeschlossen/ist noch nicht abgeschlos-
sen“ ist damit möglich. Ein Erfolg – es wurde tatsächlich die richtige
Seite aufgerufen – ist indessen nicht überprüfbar.


 -- Behaviors eines Aufruf-Buttons
 property myID1, myID2
 on mouseup me
   set myID1 = gotoNetPage("http://www.director7.de", ¬
 "frame1")
   set myID2 = gotoNetPage("http://www.updatestage.com", ¬
 "frame2")
 end

 on exitframe me
   if netDone(myID1) then
     put "frame1 wurde geladen"
   end if
   if netDone(myID2) then
     put "frame2 wurde geladen"
   end if
 end



                                                                         317
         Kapitel       4          Shockwave – Internet im Direktzugriff


 „BrowserSniff.dir“ finden Sie    JavaScript-Funktionen aufrufen
   im Verzeichnis WORKSHOP \      In Netscape-Browsern können Sie getNetText verwenden, um Java-
 KAPITEL04 \ JAVASCRIPT auf der   Script-Funktionen aufzurufen, und die Rückgabewerte direkt in Ihrem
                      CD-ROM      Shockwave-Film verwenden. Der Film „BrowserSniff“ von Kalle Wik
                                  nutzt dies, um Browser-Name und -Version abzufragen. Da der Internet
                                  Explorer hierbei einen spezifischen Fehler produziert, kann über die-
                                  sen Umweg auch dieser Browser erkannt werden.



                                                   Abbildung 4.2:
                                                   Browser-Erkennung über Umweg mit „BrowserSniff.dir“: Inter-
                                                   net Explorer akzeptiert keine „javascript:“-URLs, so daß über
                                                   einen entsprechenden netError auch dieser Browser erkannt
                                                   werden kann.




                                  Die betreffenden JavaScript-Aufrufe heißen:


                                   NetID1 = getNetText ("javascript:navigator.appName")

                                   NetID2 = getNetText ("javascript:navigator.appCodeName")

                                   NetID3 = getNetText ("javascript:navigator.appVersion")

                                   NetID4 = getNetText ("javascript:navigator.userAgent")

                                  Da getNetText() eine asynchrone Aktion ist, werden diese Aktionen
                                  zunächst gestartet (on beginsprite, on mouseup o.ä.); dann wird im
                                  exitframe-Handler abgefragt, ob der Prozeß beendet ist (vgl. auch
                         342     „Asynchrones Skripting“ in diesem Kapitel):


                                   on exitframe me
                                     if netDone(NetID1) then
                                       if netError(NetID1) = "OK" then
                                         set gNavAppName = netTextResult(NetID1)

                                  Weitere Kommunikationsmöglichkeiten zwischen Browser und Shock-
                                  wave-Film werden im Abschnitt „Shockwave-Kommunikation“ in die-
                         393     sem Kapitel vorgestellt.




318
                                      Arten der Online-Einbindung


BrowserCtrl-Xtra
Der Name des Xtras BrowserController ist Programm beim Produkt der
Firma Magister Ludi (http://www.magisterludi.com). Das Xtra ist auf die
Kontrolle des Web-Browsers unter Windows spezialisiert und bietet
hier weitergehende Möglichkeiten als beispielsweise die universelleren
Xtras MasterApp oder BudAPI. Die Handhabung gestaltet sich unkom-
pliziert. So ist z.B. die Suche nach Netscape für den Fall, daß der Inter-
net Explorer als Standard-Browser definiert ist, deutlich unkomplizier-
ter als z.B. in MasterApp, wie das folgende Skript illustriert.


 on startMovie
   if browserName() contains "iexplore" then
     -- IE ist Standardbrowser,
     -- nach Netscape suchen
     set netscPath = bctlGetPathFromRegistry("netscape")
     if netscPath <> "" then
       -- Netscape ist installiert, also verwenden
       browserName(netscPath)
     end if
   end if
 end


Den Aufruf einer URL in einem neuen Browser-Fenster übernimmt die
Funktion bctlGoToURLinaNewWindow.


 bctlGoToURLinaNewWindow("http://www.director7.de")


Die Abfrage der aktuellen URL des Browsers ist eine Funktion, die an-
dere Xtras nicht bieten.


 put bctlGetCurrentURL()
 -- "http://www.director7.de/html/buch.html"


Weitergehende Kontrolle ermöglicht das sogenannte Tracing. Hier
„schreibt“ Director bzw. der Projektor alle mit dem Browser abgerufe-
nen Seiten mit, wie der folgende Test im Nachrichtenfenster zeigt.


 bctlStartTracing()
 put bctlGetTracedInfo()
 -- [["http://www.director7.de/html/wtexpl.html", "text/
 html"], ["http://www.director7.de/html/
 workshop.html", "text/html"], ["http://www.director7.de/
 html/buch.html", "text/html"]]
 bctlStopTracing()




                                                                             319
      Kapitel   4   Shockwave – Internet im Direktzugriff


                    Insbesondere für den Einsatz in Intranets eröffnet die von BrowserCon-
                    troller gebotene Option, eigene Protokolle für den Datenaustausch
                    zwischen Director-Projektor und Browser zu definieren, interessante
                    Möglichkeiten.

                    Das Shockwave-Plug-in/-ActiveX-Control
                    Systemvoraussetzungen
                    Die Shockwave-Abspielsoftware besteht aus Komponenten, welche die
                    Wiedergabe von Director-Shockwave-Filmen systemweit ermöglichen.
                    Um diese Funktionalität in Netscape Navigator zur Verfügung zu stel-
                    len, wird ein Plug-in verwendet, unter Windows 95, 98 und NT dient
                    ein ActiveX-Control für Microsoft Internet Explorer diesem Zweck.
                    Shockwave funktioniert auch mit Browsern, die mit der Plug-in-Archi-
                    tektur von Netscape Navigator (ab Version 3) kompatibel sind, also bei-
                    spielsweise auch mit den internen Browsern von AOL (vgl. aber Ta-
                    belle).

                    Shockwave kann Director-Filme in den folgenden Browsern wiederge-
                    ben:


                    Browser                                 Version
                    Netscape Navigator (Windows und         3.0 oder neuer
                    MacOS)
                    Microsoft Internet Explorer (Windows)   3.0 oder neuer
                    Microsoft Internet Explorer (MacOS)     4.01 oder neuer
                    America Online (Windows)                3.0 oder neuer
                    America Online (MacOS)                  4.0 (in Deutschland nicht
                                                            verfügbar; d.h. nur mit Navigator/
                                                            Explorer als externem Browser)


                    Der Director 7 Shockwave-Player kann auch Shockwave-Filme abspie-
                    len, die mit den Director-Versionen 5 und 6 erstellt wurden.

                    Marketing-Talk
                    Ein potentieller Auftraggeber für eine Webapplikation wird sich im
                    Normalfall sehr genau dafür interessieren, was die Zugangshinder-
                    nisse sind, die eine technische Lösung – in unserem Fall möglicher-
                    weise eine Shockwave-Lösung – mit sich bringen. Plug-ins gelten dabei
                    häufig immer noch als Showstopper: Wenn der Endanwender – also
                    der Besucher einer Website – erst eine komplizierte Installation eines
                    Plug-ins oder ActiveX-Controls durchlaufen muß, bevor er überhaupt
                    etwas sieht, so werden viele Auftraggeber zurückschrecken.

                    Andererseits ist diese Haltung vielleicht ein willkommener Anlaß zur
                    Selbstkontrolle: Für ein Menü mit animierten Buttons ist beim besten


320
                                            Arten der Online-Einbindung


Willen keine Shockwave-Anwendung nötig – da gibt es genügend an-
dere Lösungen, angefangen beim JavaScript-Rollover. Wer für Director-
Shockwave argumentieren möchte, hat die besten Karten, wenn er
Funktionen, die nur mit Shockwave zu realisieren sind, zeigen kann –
und derer gibt es genug.

Auf der anderen Seite ist es gut zu wissen, welche Distributionsan-
strengungen Macromedia selbst unternimmt, um den Director-Shock-
wave-Player an den Websurfer und die Websurferin zu bringen. Unter
http://www.macromedia.com/shockwave/productinfo/partners/ finden Sie eine
Aufstellung der aktuellen Vertriebskooperationen (vgl. Abbildung 4.3).
Doch Vorsicht: Nicht alle Angaben sind 1 zu 1 auf den deutschen Markt
zu übertragen, hier sind noch eigene Recherchen vonnöten. Eindrucks-
volle Gesamtzahlen an distribuierten Shockwave-Playern finden Sie
unter http://www.macromedia.com/support/shockwave/info/distribution/. Wie
wenig eindrucksvoll die Zahlen dagegen sind, wenn die Gesamtheit
der Anwenderrechner als Basis genommen wird, zeigt beispielsweise
die Statistik auf http://www.statmarket.com/: Shockwave ist demnach auf
5 Prozent der Rechner installiert – zum Vergleich: LiveAudio 12 %,
QuickTime 11 %, Flash 9 %, RealPlayer G2 4 %.


                                 Abbildung 4.3:
   Unter http: //www.macromedia.com/shock-
    wave/productinfo/partners finden Sie eine
aktuelle Liste der Vertriebspartner für Director-
  (zweite Spalte) und Flash-Shockwave-Player
                                  (dritte Spalte)




                                                                            321
      Kapitel   4   Shockwave – Internet im Direktzugriff


                    Lizenzierung des Plug-ins
                    Wenden Sie sich direkt an Macromedia, wenn Sie das Browser-Plug-in/
                    ActiveX-Control auf CD-ROM und/oder zum Download von Ihrem Web-
                    Server lizensieren wollen. Macromedia bietet diesen Weg, schreckt al-
                    lerdings die Interessenten durch hohe Kosten bereits frühzeitig ab. Der
                    übliche Distributionsweg ist daher der Download des Installers von der
                    Website durch den Endanwender; durch die entsprechende HTML-Ein-
                    bindung von Shockwave-Inhalten stellen Sie als Enwickler sicher, daß
                    ein Endanwender ohne Shockwave auf die Download-Seite von
                    Macromedia geleitet wird.

                    Nur zur groben Information soll die folgende Angabe dienen: Bei einer
                    Anfrage zur Lizenzierung des Director-Players für eine CD-ROM (HTML-
                    Inhalte und Shockwave zur Ansicht im Browser, 501 bis 5000 Exem-
                    plare, Eigen-Promotion) nannte Macromedia Lizenzkosten in Höhe von
                    7.000 US-Dollar.

                    Alternativ haben Sie in einem solchen Fall natürlich auch die Möglich-
                    keit, einen normalen Director-Projektor für die Anzeige der Shock-
                    wave-Inhalte zu nutzen und die Steuerung der HTML-Inhalte mit dem
                    Projektor vorzunehmen.

                    Installation
                    Ein Endanwender, der auf eine Website mit Director-Shockwave-Inhal-
                    ten kommt und noch keinen Shockwave-Player (Plug-in oder ActiveX-
                    Control) installiert hat, durchläuft eine zweistufige Installation:

                    1.   Download eines „Stub“-Installers von ca. 250 KByte (MSIE Win-
                         dows), 300 KByte (Netscape Windows) oder 600 KByte (MacOS).

                    2.   Automatisches Ausführen des Installers (MSIE Windows) bzw. ma-
                         nueller Start der Applikation (Netscape und MacOS). Bei letzterem
                         geben Sie auch an, für welchen Browser Shockwave installiert wer-
                         den soll. Der Browser wird beendet und neu gestartet. Am MacOS
                         wird die Speicherzuteilung des Browsers angepaßt, falls nötig.

                    Im Verlauf von Schritt 2 legen Sie bei erstmaliger Installation das „Par-
                    ticipation Level“ fest und können Informationen über die Daten-
                    schutzpolitik von Macromedia abrufen. Als mögliche Participation Le-
                    vels stehen „None“ und „Anonymous“ zur Verfügung. Der Modus „An-
                    onymous“ beinhaltet die Auto-Update-Funktion, welche die Shock-
                    wave-Installation aktuell hält.

                    Xtras: Die Standardausstattung
                    Um den Umfang des initialen Downloads klein zu halten, werden
                    nicht alle Xtras bereits bei der erstmaligen Installation von Director-
                    Shockwave übertragen. Mit der Shockwave-Version 2.05 (Director 7.01)
                    ist die Xtras-Grundausstattung die folgende:



322
                                       Arten der Online-Einbindung


MacOS               Windows         Erläuterung
Cbrowser PPC Xtra   Cbrowser.x32    http-Unterstützung im Browser
Flash Asset Xtra    FlashAsset.x32 Playback für Flash- und Vectorshape-
                                   Darsteller
Font Asset Xtra     FontAsset.x32   Unterstützung für komprimierte
                                    Schriftdarsteller (benötigt FontXtra)
FontXtra            FontXtra.x32    TrueDoc Font engine
InetUrl PPC Xtra    –               http-Services außerhalb des Browsers
                                    (bzw. für MSIE 4 Mac)
–                   Macromix.x32    Windows-Soundmixing und -Playback
                                    (Director-internes Soundmixing)
Multiusr            Multiusr.x32    Server-Client- und Peer-to-peer-
                                    Verbindungen
Netfile PPC Xtra    Netfile.x32     Unterstützung für Netzwerk-Streaming
                                    und -Cacheing
Netlingo PPC Xtra   Netlingo.x32    Netzwerk-Lingo-Funktionalität
Prefs PPC Xtra      Prefs.x32       Zugriff auf Shockwave-Voreinstellungen
                                    (vgl. Einstellung des Participation Levels
                                    u.ä.); Funktionen für zukünftige Erweite-
                                    rungen des Shockwave-Players (s.u.)
SWA Decomp PPC      Swadcmpr.x32    Dekomprimierung von Shockwave
Xtra                                Audio; nötig auch für internes Audio in
                                    Shockwave-Filmen
SWA Streaming PPC Swastrm.x32       Unterstützung für Streaming von Shock-
Xtra                                wave Audio
TextAsset PPC       TextAsset.x32   Anzeige von Rich-Text-Darstellern
TextXtra PPC        TextXtra.x32    Paige 3 Text Engine
WinSock Lib         –               Benötigt für alle Netlingo-/
                                    NetXtras-Funktionen

Unter MacOS finden Sie die Shockwave-Komponenten im Ordner (STAR-
TUP-DISK):SYSTEMORDNER:SYSTEMERWEITERUNGEN:MACROMEDIA:SHOCKWAVE;
unter Windows werden die Komponenten im Verzeichnis C:\WIN-
DOWS\SYSTEM\MACROMED\SHOCKWAVE\ abgelegt. Die Shockwave-Grund-
ausstattung hat – je nach Plattform und Browser – eine Gesamt-Down-
load-Größe von ca. 1,4 bis 1,8 MB.

Folgende Macromedia-Xtras werden nicht automatisch installiert; sie               386
können aber über Auto-Download (vgl. unten) bei Bedarf geladen wer-
den. Sie werden für den Download in einem zertifizierten und ZIP-
komprimierten Paket zur Verfügung gestellt, das automatisch ent-
packt wird und sofort zur Verwendung im aktuellen Film zur Verfü-
gung steht.




                                                                                         323
      Kapitel   4   Shockwave – Internet im Direktzugriff


                    MacOS                Windows           Erläuterung
                    Animated GIF Asset   AnimatedGIF       Anzeige von animierten GIFs
                                         Asset.x32
                    Cursor Asset         CursorAsset.x32   Anzeige von animierten/farbigen
                                                           Cursorn
                    –                    DirectSound.x32   Windows-Soundmixing und -Play-
                                                           back (benötigt DirectSound 5; neu
                                                           eingeführt mit Director 7.01; ver-
                                                           bessert in 7.02; wird in Shock-
                                                           wave-Versionen ab 7.02 zum
                                                           Standard-Download gehören)
                    MIX Services         MIXServices.x32   Unterstützung für grundlegende
                                                           Import-/Export-Funktionen
                    MPEG3 Import Export MPEG3 Import       Wiedergabe von MP3-Audio.
                                        Export.x32         Benötigt MIX Services und Sound
                                                           Import Export (ab 7.02 auch Strea-
                                                           ming via SWA Streaming Xtra)
                    QuickTime Asset      QT3Asset.x32      QuickTime 3, 4-Wiedergabe (Win-
                                                           dows: auch Soundmixing )
                    Sound Import Export Sound Import       Formatkonversion für Sound-
                                        Export.x32         formate beim Playback
                    Sun AU Import Export Sun AU Import     Wiedergabe von Sun AU (Java)
                                         Export.x32        Audio. Benötigt MIX Services und
                                                           Sound Import Export
                    XMLParser PPC Xtra   XMLParser.x32     XML Parser-Funktionalität


                    Das Prefs-Xtra. Wie immer lohnt es sich, Funktionen der Macromedia-
                    Xtras genau anzuschauen, insbesondere wenn sich diese Xtras un-
                    scheinbar im Xtras-Ordner der Shockwave-Installation verstecken. Nut-
                    zen Sie XtraList (auf der CD-ROM im Verzeichnis WORKSHOP \ KAPITEL09\
                    XTRALIST) im Browser, um ein Listing der Funktionen des Prefs-Xtras zu
                    erhalten. Wir ermutigen nicht dazu, es in eigenen Filmen zu benut-
                    zen, da von Macromedia keinerlei Dokumentation für das Xtra erhält-
                    lich ist; allerdings ist absehbar, daß zukünftige Shockwave-Player in
                    größerem Umfang von den hier zur Verfügung stehenden Funktionen
                    Gebrauch machen als die momentane Version 2.05 (Mai 99).

                    Auto-Update, Privacy
                    Die Auto-Update-Funktion Ihrer Shockwave-Installation überprüft
                    beim Aufruf eines Shockwave-Filmes im Browser, ob ein festgelegter
                    Zeitraum seit der letzten Überprüfung (zur Zeit – nach Angaben von
                    Macromedia – zwei Wochen) verstrichen ist. Ist dies der Fall, wird ein
                    Webserver bei Macromedia befragt, ob neue Softwarekomponenten
                    zum Download zur Verfügung stehen. Wenn ja, so wird ein Dialog wie
                    in Abbildung 4.5 präsentiert, der die neuen Komponenten benennt
                    und die voraussichtliche Download-Zeit anzeigt.


324
                                   Arten der Online-Einbindung


                 Abbildung 4.4:
  Mit dem Tool XtraList, das Sie
 auf der CD-ROM finden, können
    Sie auch die Funktionen des
   Prefs-Xtras Ihrer Shockwave-
        Installation analysieren




                                                        Abbildung 4.5:
                                                        Shockwave-Aktualisierung via Auto-Download




                 Abbildung 4.6:
 Wenn benötigte Dateien fehlen,
  kann Shockwave in gewissem
Umfang eine automatische Repa-
              ratur durchführen



In einem gewissen Umfang kann auch eine automatische „Reparatur“
der Shockwave-Installation stattfinden, z.B. wenn notwendige Kompo-
nenten gelöscht wurden. Auto-Update und Auto-Reparatur sind Fea-
tures, die für den Endanwender maximalen Komfort bei der Pflege sei-
ner Shockwave-Installation bedeuten.

Auto-Update wird bei der Shockwave-Installation vom Endanwender
aktiviert bzw. deaktiviert. Sollen die Einstellungen später geändert




                                                                                                 325
      Kapitel   4   Shockwave – Internet im Direktzugriff


                    werden, so muß der Anwender entweder einen Download mit „Nie“ ab-
                    lehnen oder spezielle Seiten auf der Macromedia-Site besuchen, um
                    seine Preferences zu ändern (vgl. Abbildung 4.7).



                                                   Abbildung 4.7:
                                                   Auto-Update ein- oder ausschalten unter
                                                   http: //www.macromedia.com/support/
                                                   shockwave/installation/autoupdate.html




                    Die Shockwave-Installation sendet mit der Auto-Update-Anfrage einen
                    anonymen Report, der folgende Bestandteile enthält:

                    s   Browser-Version

                    s   Plattform/Betriebssystem

                    s   Version des Shockwave-Players

                    s   URLs der Shockwave-Filme, die der Anwender gesehen hat, samt ei-
                        niger Informationen über diese Filme (Größe, Director-Version, die
                        zur Erstellung benutzt wurde, Dauer der Nutzung durch den An-
                        wender). Verbesserungen dieser URL-Sammlung wurden mit
                        Shockwave 2.05 eingeführt. Zuvor war nicht ausgeschlossen, daß
                        CGI-Aufrufe mit User-Parametern auch übergeben wurden.
                        Macromedias Aussage zufolge werden diese Informationen für
                        „allgemeine statistische Reports“ genutzt.

                    Problematisch ist hierbei die Verquickung der Datensammelei mit
                    dem Auto-Update-Feature. Wer keine URLs weitergeben möchte, wird
                    kein Auto-Update nutzen können. Außerdem sollten Entwickler im
                    Hinterkopf behalten, daß Macromedia zumindest bis März 1999 wei-
                    tergehende Pläne hatte, personalisierte Informationen beim Auto-Up-
                    date zu übergeben. Ein „Participation Level“ mit der Einstellung „full“
                    zeugte in frühen Shockwave 7-Installationen davon. Diese Option
                    wurde dann entfernt.




326
                                     Arten der Online-Einbindung


Shockwave-Authoring: Konzepte und Arbeitshilfen
Director-Hilfsmittel
Shockwave als Dateiformat. Shockwave-Filme sind Director-Dateien,
auf die eine Reihe von Kompressionsverfahren (für Grafik, für spezielle
Darsteller wie Flash Assets, für Shockwave Audio) angewendet und de-
ren Skripte auf den kompilierten, nicht mehr editierbaren Code redu-
ziert wurden. Das „Shocken“ von Director-Filmen bringt häufig eine
Größenersparnis im Verhältnis 4:1 bis 20:1 – je nach Ausgangsmaterial.
Um das Streaming von Shockwave-Filmen zu optimieren, sind bereits
beim Authoring einige Vorkehrungen zu treffen – siehe unten im Ab-           367
schnitt „Streaming“.

Director 7 bietet eine Reihe von Menübefehlen, die den aktuell geöffne-
ten Director-Film oder aber eine ganze Reihe von Filmen und Castlibs
in das Shockwave-Format umwandeln.

Menübefehl DATEI / VORSCHAU IM BROWSER:
Komprimiert den aktuellen Film und zeigt ihn direkt im Standard-
Browser an. Dieses Vorgehen ist sehr praktisch, um einfache, allein
lauffähige Filme während der Produktion immer wieder im Browser
zu testen. Es wird eine temporäre Datei mit einem willkürlichen Na-
men (z.B. TEMP5.DCR) geschrieben, die beim Beenden von Director auto-
matisch gelöscht wird.

Menübefehl DATEI / ALS SHOCKWAVE-FILM SICHERN...:
Sichert einen einzelnen Film (und eventuell vorhandene externe Beset-
zungsdateien). Auf Wunsch kann auch ein einfaches HTML-Dokument
mit der entsprechenden Einbindung des Shockwave-Filmes erstellt
werden. Da der Name der Shockwave-Datei von Ihnen festgelegt wird,
ist dieses Vorgehen prinzipiell für alle Anwendungsfälle geeignet.

Menübefehl XTRAS / FILME AKTUALISIEREN...:
Erlaubt Ihnen, eine ganze Reihe von Filmen und Besetzungsdateien
zur Umwandlung anzugeben. Sie haben die Möglichkeit, dabei eine
Backup-Datei zu erzeugen oder das Original zu löschen.

Die bei der Shockwave-Umwandlung entstehenden Filme und Beset-
zungsdateien (.DCR, .CCT) sind beim besten Willen nicht mehr bearbeit-
bar. Mit Tricks lassen sich zwar bestimmte Darstellertypen retten (vgl.
Kapitel 8, „Arbeitshilfen“); Sie sollten aber dafür sorgen, daß Sie stets    639
ein bearbeitbares Backup zur Verfügung haben.

Menübefehl DATEI / PROJEKTOR ERSTELLEN:
Auch im Dialogfeld PROJEKTOROPTIONEN haben Sie eine Option „Media:
Komprimieren (Shockwave-Format)“. Da wir – vgl. Kapitel 8 – generell         626
davon abraten, Director-Dateien in den Projektor zu integrieren, ist
diese Option zu vernachlässigen. Zur Funktion eines „Shockwave-Pro-
jektors“ lesen Sie mehr weiter unten in diesem Abschnitt.                    341


                                                                                    327
      Kapitel   4   Shockwave – Internet im Direktzugriff


                    Audio-Kompression. Interne Sounddarsteller werden beim SICHERN ALS
                    SHOCKWAVE automatisch in Shockwave Audio umgewandelt, wenn die
                    entsprechende Option (vgl. Abbildung 4.8) aktiviert ist. Es empfiehlt
                    sich also, von vorneherein Soundmaterial einzubinden, auf das die
                    Shockwave-Audio-Komprimierung mit möglichst geringen Verlusten
                    angewandt werden kann.

                    Ideales Ausgangsmaterial sind unkomprimierte AIFFs mit einer Bit-
                    tiefe von 16 Bit und einer Sampling-Rate von 22.050 Hz. Eine Monokon-
                    vertierung erfolgt bei Bitraten bis 48 Kbit/s zwangsweise; bei höheren
                    Bitraten können Sie eine automatische Stereo- in Monokonvertierung
                    anwählen. Sie können die Reduzierung auf Mono natürlich auch vor
                    dem Einbinden in einem Soundeditor selbst vornehmen. Die Kompres-
                    sionseinstellungen unter XTRAS / SHOCKWAVE FÜR AUDIO-EINSTELLUNGEN
                    bieten Zieldatenraten zwischen 32 und 160 Kilobits/Sekunde (ent-
                    spricht 4 bis 20 KByte/Sekunde).



                                                              Abbildung 4.8:
                                                              Die Voreinstellungen für die
                                                              Kompression von internen
                                                              Sounddarstellern (Menübefehl
                                                              XTRAS / SHOCKWAVE FÜR AUDIO-EIN-
                                                              STELLUNGEN)




                    Da für interne Sounddarsteller kein Streaming möglich ist (d.h. es wird
                    vor dem Abspielen der ganze Darsteller geladen), empfiehlt sich die in-
                    terne Ablage nur für relativ kleine Sounddarsteller. Externe Shock-
                    wave-Audio-Files (.swa) können dagegen mit Streaming in der Shock-
                    wave-Anwendung verwendet werden. Zur Erstellung dienen die im
                    Shockwave Internet Studio mitgelieferten Soundeditoren (Peak LE für
                    MacOS und SoundForge für Windows), unter Windows können Sie au-
                    ßerdem den Befehl WAV-DATEIEN IN SWA-DATEIEN KONVERTIEREN im Menü
                    XTRAS nutzen. Das Exportmodul für die externen Programme bietet
                    Zieldatenraten zwischen 8 und 160 Kilobits/Sekunde. Vergessen Sie
                    nicht, daß Sie externe Shockwave-Audio-Files in Director nicht loopen
                    können.

                    Shockwave Audio beruht – ebenso wie das weitverbreitete MP3-Format
                    – auf dem Audio-Kompressionsstandard MPEG 1 Layer 3. SWA und MP3
                    sind weitgehend identisch, insbesondere was die Kompressionsratio
                    und -qualität angeht. Unterschiede liegen in den Zusatzinformatio-
                    nen, die ein SWA-File enthält und die Sie aus Lingo nutzen können. Fol-


328
                                      Arten der Online-Einbindung


gende Darstellereigenschaften sind verfügbar, sobald die Header-Infor-
mation des SWA-Files übertragen wurde: cuepointNames, cuepointTi-
mes, currentTime, duration, percentPlayed, percentStreamed, bi-
tRate, sampleRate und numChannels. Sie können die Wiedergabe
einer SWA-Datei anhalten (pause member "soundSWA") und weiterspie-
len lassen (play member "soundSWA").



                              Abbildung 4.9:
             SWA-Export in Peak LE für MacOS




Das Streaming von SWA-Darstellern können Sie beeinflussen, indem
Sie the preloadTime of member auf einen bestimmten Sekundenwert
einstellen. Dieser Wert wird vom Befehl preloadBuffer member ge-
nutzt, um das entsprechende Stück der SWA-Datei in den Speicher zu
laden.

MP3 kann in Director 7 (bis einschließlich der deutschen Version 7.01)
nicht mit Streaming abgespielt werden. Spätere Versionen (ab Version
7.02) sollen dies nach Aussagen von Macromedia ermöglichen; aller-
dings sind die Funktionen, die auf bestimmten Header-Informationen
einer SWA-Datei beruhen, natürlich weiterhin nicht für MP3 verfüg-
bar. Ab Version 7.02 kann Sound im MPEG Layer 2-Format (MP2) direkt
in Director importiert werden.

Zur Erstellung von CuePoints in SWA-Dateien vergleichen Sie bitte Ka-     217
pitel 2. Zum lokalen Testen von Shockwave-Titeln mit externen Medien
lesen Sie mehr weiter unten in diesem Abschnitt.                          341

HTML-Einbindung und Server-Setup
Die grundlegendste HTML-Einbindung für Director-Shockwave-Inhalte
sieht folgendermaßen aus:


 <html>
 <head><title>Example.dcr</title></head>
 <body><center><h1>Example.dcr</h1><br>

 <object classid="clsid:166B1BCA-3F9C-11CF-8075-
 444553540000" codebase="http://download.macromedia.com/
  pub/shockwave/cabs/director/
 sw.cab#version=7,0,0,0" width="640" height="480"

                                                                                 329
      Kapitel   4   Shockwave – Internet im Direktzugriff


                       <param name="src" value="Example.dcr">
                       <embed src="Example.dcr" pluginspage="http://
                     www. macromedia.com/shockwave/download/
                     " width="640" height= "480"></embed>
                     </object>
                     </center></body></html>

                    Dieses Grundgerüst enthält den sogenannten <object>-Tag für Micro-
                    soft Internet Explorer auf Windows (also für die Einbindung mit dem
                    Shockwave-ActiveX-Control) sowie den <embed>-Tag für die Einbindung
                    mit dem Shockwave-Plug-in für Netscape-kompatible Browser. Er enthält
                    die nötigen Informationen, damit Anwender ohne Shockwave-Engine
                    beim Besuch der Seite zur richtigen Download-Seite geleitet werden.

                    Aftershock 2.5. Eine ganze Reihe weiterer Einstellungen bietet After-
                    shock 2.5, eine Applikation, die sich im Lieferumfang von Director 7
                    befindet. Damit können Sie

                    s   eine „intelligente“ HTML-Einbindung für Ihren Shockwave-Con-
                        tent erstellen, die auf Shockwave-Dateien, Java und eine Alternati-
                        vabbildung (JPEG) zurückgreifen kann

                    s   festlegen, ob ein Besucher Ihrer Seite das ActiveX-Control oder das
                        Netscape-Plug-in downloaden soll oder ob ihm ein alternativer In-
                        halt (Java/JPEG) angezeigt werden soll

                    s   die Erscheinung Ihres Shockwave-Filmes (Größe, Hintergrund-
                        farbe) festlegen

                    s   Parameter angeben, die Sie über Lingo mit Ihrem Shockwave-Film
                        auslesen können

                    s   festlegen, daß Ihr Shockwave-Film mit dem Browser kommunizie-
                        ren können soll

                    s   festlegen, für welche Browser Ihre Shockwave-Anwendung als Java-
                        Applet angeboten werden soll

                    s   festlegen, welcher Frame Ihrer Shockwave-Anwendung als „Stand-
                        bild“ (JPEG) angezeigt werden soll, wenn weder Plug-in/ActiveX-
                        Control noch Java zum Abspielen zur Verfügung stehen

                    s   das Java-Applet und die nötigen Player-Dateien einbinden (nutzen
                        Sie zum Erstellen den Director-Menübefehl DATEI / ALS JAVA SPEI-
                        CHERN...

                    Der von Aftershock produzierte HTML-/JavaScript-Code kann im Nor-
                    malfall direkt in Ihre HTML-Seiten eingefügt werden. Ausführliches Te-
                    sten auf möglichst vielen verschiedenen Browsern und Plattformen
                    versteht sich – wie bei allen HTML-Anwendungen – von selbst. Selbst-
                    verständlich können Sie den HTML- und JavaScript-Code auch beliebig
                    bearbeiten und an Ihre Bedürfnisse anpassen.

330
                                          Arten der Online-Einbindung


                       Abbildung 4.10:
Aftershock: HTML-Einbindung für fortge-
         schrittene Anwendungszwecke




Parameter für den <embed>- und <object>-TAG. <embed>- und <object>-
Tag der HTML-Seite können Parameter enthalten, die Sie mit external-
ParamValue() und weiteren Funktionen in Ihrem Shockwave-Film aus-
lesen können (vgl. unten NETLINGO). In Netscape sind dabei alle Parame-    358
terbenennungen möglich; da der <object>-Tag in Microsoft Internet
Explorer aber nur die folgenden definierten Parameternamen erlaubt,
sollten Sie sich auch darauf beschränken. Grundsätzlich kann jeder Pa-
rameter jede von Ihnen gewünschte Information enthalten.

Dies sind die vordefinierten Parameternamen:

swURL, swText, swForeColor, swBackColor, swFrame, swColor, sw-
Name, swPassword, swBanner, swSound, swVolume, swPreloadTime,
swAudio, swList, sw1 bis sw9.

Im <object>-TAG verwenden Sie folgende Syntax:


 PARAM NAME="sw1" VALUE="Value"


Im <embed>-Tag geht es kürzer:


 sw1="VALUE"


Aftershock 2.5 bietet eine komfortable Oberfläche, um die Parameter
zu konfigurieren.




                                                                                  331
          Kapitel       4           Shockwave – Internet im Direktzugriff


                                                                        Abbildung 4.11:
                                                                        Aftershock 2.5 erlaubt das Setzen der Para-
                                                                        meter für <embed>- und <object>-TAG




                                    Spezielle Parameter. Weitere Parameter bestimmen direkt das Abspiel-
                                    verhalten des Shockwave-Filmes im Browser:


Parameter (<embed>-TAG)                               Erläuterung

swLiveConnect=false                                   Standard: TRUE. Erlaubt die Browser-Shockwave-Kommuni-
                                                      kation. Da in Netscape für LiveConnect Java gestartet wird,
                                                      ist es sinnvoll, den Parameter auf FALSE zu setzen, wenn
                                                      keine Kommunikation benötigt wird.
PALETTE=foreground                                    Standard: background. Erlaubt, in Netscape die Filmpalette
                                                      zur Standardpalette zu machen. Nicht empfehlenswert.
AUTOSTART=false                                       Standard: TRUE. Startet den Film nach dem Laden nicht
                                                      automatisch. Wird nicht von allen Browsern unterstützt.
swBackColor="#000000"                                 Funktion unklar
swForeColor="#FFFFFF"                                 Funktion unklar
REDIRECT=URL                                          Funktion unklar
swRemote="swSaveenabled=’true’"                       Standard: FALSE. Ermöglicht es in Shockwave-Versionen ab
                                                      7.02, die „Sichern“-Funktion des „Remote-Controls“ auszu-
                                                      schalten. Eine Einstellung von allowSaveLocal = FALSE im
                                                      Shockwave-Film geht vor dieser Einstellung.
swRemote="swTarget=’false’"                           Standard: TRUE. Ermöglicht es in Shockwave-Versionen ab
                                                      7.02, die Anzeige des „Remote-Controls“ auszuschalten.
Tabelle 4.1:   Aktuelle Ergänzung: Steuerung der „Remote“ genannten Fernbedienung ab Shockwave 7.02




332
                                     Arten der Online-Einbindung


Server-Setup. Falls Sie einen Webserver neu einrichten oder erstmals
Shockwave-Content auf einem Webserver zur Verfügung stellen, so
stellen Sie sicher, daß die entsprechenden MIME-Zuordnungen (MIME
type mappings) eingetragen sind. Ein häufiges Format für diese Ein-
träge ist das folgende:


 AddType application/x-director dir
 AddType application/x-director dcr
 AddType application/x-director dxr


Je nach Servertyp kann die Formatierung variieren; der Inhalt der Ein-
träge ist jedoch stets der gleiche. Der folgende Eintrag wäre richtig für
die Datei MIME.TYPES auf Netscape-Servern:


 type=application/x-director exts=dir,dxr,dcr


Um zu testen, ob Ihr Webserver bereits für die entsprechenden MIME-
Typen konfiguriert ist, rufen Sie einen Director-Film vom Server ohne
HTML-Einbindung direkt im Browser auf. Wird das Plug-in genutzt, um
den Film darzustellen, so sind die nötigen MIME-Zuordnungen auf
dem Server bereits erfolgt.

Internet-Sicherheit von Shockwave
Das Konzept. Lingo ist eine Scripting-Sprache, die – für sich genom-
men, vor allem aber im Zusammenwirken mit den zahlreichen Xtras,
die als Erweiterungen zur Verfügung stehen – zahlreiche Funktionen
hat, die in einem Internet-Umfeld zu einer potentiellen Gefahr auf
dem Gastrechner werden können. Das Sicherheitskonzept von Shock-
wave schränkt von daher die mögliche Destruktivität von Shockwave-
Anwendungen ein. Es verhindert insbesondere, daß

s   lokale Daten von einer Shockwave-Anwendung ausgespäht werden

s   Daten von einer Shockwave-Anwendung auf den Gastrechner ge-
    schrieben werden (mit der Ausnahme von einfachen Preferences)

s   Aktionen ausgelöst werden, die Schaden für den Benutzer nach
    sich ziehen können (shutDown, restart, printFrom und andere)

Die Einschränkungen, auf die wir gleich noch im einzelnen eingehen,
gelten automatisch für einen Shockwave-Film, der im Browser läuft;
ein normaler Projektor hingegen unterliegt nicht diesem Sicherheits-
konzept, da im allgemeinen davon ausgegangen werden kann, daß der
Hersteller/Publisher einer Anwendung auf CD-ROM o.ä. hinreichend
identifizierbar ist, um für bewußt oder unbewußt herbeigeführte
Schäden geradezustehen.




                                                                            333
      Kapitel   4       Shockwave – Internet im Direktzugriff


                        Mit der Lingo-Zeile


                         the safePlayer = 1


                        läßt sich allerdings jeder Director-Film oder Projektor in den Safe-Mo-
                        dus versetzen; er unterliegt dann allen im folgenden dargestellten Ein-
                        schränkungen. Sinnvoll ist das zum einen zu Testzwecken (auch ein
                        Film in der Authoring-Umgebung läßt sich entsprechend einschrän-
                        ken); außerdem sollten Projektoranwendungen, die wiederum Direc-
                        tor-Filme ungeklärter Herkunft aus dem Internet ziehen und diese lo-
                        kal abspielen, sinnvollerweise entsprechend eingeschränkt sein.

                        Wie Sie sehen, hat die Entscheidung für das safePlayer-Konzept etwas
                        damit zu tun, wie weit man bereit ist, der Quelle von Director-Shock-
                        wave-Daten Vertrauen entgegenzubringen. Shockwave-Inhalte im In-
                        ternet sind – vom Konzept her – nicht vertrauenswürdig. Dieser Ansatz
                 338   setzt sich bei der Zertifizierung von Xtras fort; siehe unten.

                        Einschränkungen beim Standard-Lingo. Die folgenden Lingo-Befehle
                        sind im Shockwave- oder safePlayer-Modus insofern eingeschränkt,
                        daß Sie entweder eine URL als Pfad übergeben oder im Falle von loka-
                        len Pfaden Daten in einem DSWMEDIA-Ordner aufrufen müssen. Das gilt
                        für alle Grafikdarsteller ebenso wie für Flash-, Animated GIF- und
                        QuickTime-Darsteller. Zum Gebrauch von DSWMEDIA-Ordnern siehe den
                        Abschnitt „Zusammenspiel von Online-/Offline-Medien“ in diesem Ka-
                        pitel.


                         set the fileName of castLib
                         set the fileName of member
                         importFileInto
                         sound playFile channel
                         play movie
                         preLoadMovie
                         go to movie


                        Die folgenden Lingo-Befehle können keine lokalen Pfade oder Pfade
                        zum Cache-Ordner zurückmelden; sie funktionieren aber mit URLs
                        oder Medien im DSWMEDIA-Ordner:


                         put the fileName of castLib
                         put the fileName of member
                         unloadMovie
                         put the moviePath
                         put the movieName
                         put the pathname




334
                                   Arten der Online-Einbindung


Die folgenden Befehle funktionieren nicht mit URLs:


 openXlib, closeXlib, showXlib
 saveMovie
 getNthFilenameInFolder(folderpath, fileNumber)
 open window
 forget window
 set the fileName of window to


Folgende Befehle funktionieren nicht im safePlayer-Modus bzw. im
Browser:


 restart
 shutdown
 open
 MCI
 save castLib
 quit
 the searchCurrentFolder
 the searchPath
 the searchPaths
 getNthFileNameInFolder
 printFrom
 set the safePlayer = 0
 downloadNetThing
 pasteClipboardInto --(mit Abfrage möglich)
 open window -- und alle MiaW-bezogenen Befehle
 installMenu



                Abbildung 4.12:
          Rückfrage beim Befehl
           „pasteClipboardInto“




Die beiden folgenden Befehle können – auch im safePlayer-Modus –
ohne Einschränkung lokale Daten aufrufen, da sie diese nur darstellen
und keine Rückmeldung über lokale Dateistrukturen zurückgeben:


 GotoNetPage
 GotoNetMovie

                                                                        335
      Kapitel   4   Shockwave – Internet im Direktzugriff


                    Spätere Erweiterungen der Shockwave-Engine werden außerdem er-
                    lauben, daß Shockwave-Filme lokal gespeichert werden und beim Ab-
                    spielen über ein Kontextmenü gesteuert werden. Die entsprechenden
                    Lingo-Befehle sind im deutschen 7.01-Release von Director bereits vor-
                    handen; die Entsprechung zu diesen Properties finden Sie in den Be-
                    dienelementen der Fernsteuerung von Shockwave 7.02:


                     allowCustomCaching
                     allowGraphicMenu
                     allowSaveLocal
                     allowTransportControl
                     allowVolumeControl
                     allowZooming
                     on savedLocal


                    Bei Zugriffen auf Daten, die auf einer fremden Domain liegen, wird
                    Shockwave den Anwender stets warnen, da ein solcher Zugriff ein po-
                    tentielles Sicherheitsrisiko darstellt (vgl. Abbildung 4.13). Der Anwen-
                    der muß einen solchen Zugriff ausdrücklich erlauben.



                                                       Abbildung 4.13:
                                                       Shockwave-Warnung: Wird versucht, auf
                                                       Daten von anderen Webservern zuzugrei-
                                                       fen, so wird der Anwender gewarnt. Die
                                                       deutsche Übersetzung ist leider irrefüh-
                                                       rend.




                    Shockwave-safe Xtras und Auto-Download von Xtras. Die wichtigste Ein-
                    schränkung des safePlayer-Modus ist der Ausschluß von Xtras, die
                    nicht ausdrücklich als Safe-for-Shockwave gekennzeichnet wurden. Da
                    dieses Konzept mit Director 7 neu eingeführt wurde, können Sie keine
                    Xtras aus früheren Versionen in einer Shockwave- bzw- safePlayer-Um-
                    gebung nutzen.

                    Xtras-Entwickler finden detaillierte Informationen zur Erstellung von
                    Shockwave-safe Xtras unter http://www.macromedia.com/support/xtras/ts/
                    documents/swsafe1.htm. Damit der automatische Download des Xtras ge-


336
                                         Arten der Online-Einbindung


nutzt werden kann, muß der Xtra-Entwickler ein VeriSign-Zertifikat
erwerben, das ihn eindeutig identifizierbar macht, und das Xtra mit
einem speziellen Packaging-Tool von Macromedia zu einem Download-
Paket verpacken.

Für den Entwickler von Shockwave-Content ist es sehr einfach, solche
Xtras in seiner Shockwave-Produktion zu verwenden.

s   Öffnen Sie die Datei XTRAINFO.TXT in Ihrem Director 7-Ordner. Ver-
    gewissern Sie sich, daß das Xtra, das Sie nutzen wollen, dort be-
    reits aufgeführt ist, oder tragen Sie die entsprechende Informa-
    tion nach. Eventuell müssen Sie den Entwickler Ihres Xtras
    kontaktieren, um zu erfahren, unter welcher URL das Download-
    Paket zur Verfügung steht. Ein normaler Eintrag in XTRAINFO.TXT
    sieht folgendermaßen aus:


 ; Animated GIF Asset
 [#namePPC:"Animated GIF Asset", #nameW32:"Animated GIF Asse
 t.X32", #package:"http://download.macromedia.com/ pub/
 shockwave/xtras/AnimatedGIFAsset/
 AnimatedGIFAsset", #info:"http://www.macromedia.com/
 shockwave/xtras/AnimatedGIFAsset/index.html"]


Die Dokumentation innerhalb der Datei        XTRAINFO.TXT   enthält weitere
Informationen zum Eintrag eines Xtras.

s   Öffnen Sie anschließend Director 7 und betätigen Sie den Men-
    übefehl MODIFIZIEREN / FILM / XTRAS...

s   Wird Ihr Xtra nicht in der Xtra-Liste aufgeführt, klicken Sie auf
    HINZUFÜGEN und fügen es aus der Liste hinzu.


                       Abbildung 4.14:
    Auto-Download von Xtras aktivieren




s   Wählen Sie das Xtra an und aktivieren Sie die Option BEI BEDARF
    HERUNTERLADEN.

s   Sichern Sie Ihren Director-Film, und sichern Sie als Shockwave.


                                                                              337
          Kapitel       4             Shockwave – Internet im Direktzugriff


                                      Wird der Film im Browser aufgerufen und verfügt der Anwender nicht
                                      über das entsprechende Xtra, so weist ein Dialog auf die Notwendig-
                                      keit eines Downloads hin; der Anwender kann sich das Zertifikat des
                                      Herstellers ansehen und den Download erlauben oder abbrechen (vgl.
                                      Abbildung 4.15).



                  Abbildung 4.15:
        Xtras, die von Shockwave
   automatisch heruntergeladen
      werden sollen, müssen aus
    Sicherheitsgründen von Veri-
Sign zertifiziert sein. Das Verfah-
   ren soll sicherstellen, daß der
  Urheber von – möglicherweise
    schädlichen – Xtras jederzeit
       festgestellt werden kann.




                                      Wird ein Xtra heruntergeladen, so steht es zur weiteren Verwendung –
                                      auch von anderen Shockwave-Filmen oder Shockwave-Projektoren –
                                      zur Verfügung.

                                      Da auch Projektoren auf die auf einem Rechner vorhandene Shock-
                                      wave-Installation zugreifen können, ist es grundsätzlich möglich, ma-
                                      nuell weitere Xtras (auch solche, die nicht Shockwave-safe sind) in den
                                      Shockwave-Support-Ordner zu kopieren. Xtras, die nicht Shockwave-
                                      save sind, können von Projektoren genutzt werden, wenn sie nicht im
                                      safePlayer-Modus ausgeführt werden; sie können selbstverständlich
                                      nicht von Shockwave-Filmen genutzt werden.

                                      Tip: Achten Sie bei der Erstellung von Shockwave-Filmen darauf, daß Sie keine
                                      unbenutzten Darsteller in der Besetzung haben. Zum einen erhöhen diese unnö-
                                      tig die Dateigröße, zum anderen können Sie – wie im Falle eines animierten
                                      GIFs oder anderer „spezieller“ Darsteller, die ein Xtra benötigen – eine Xtra-Feh-
                                      lermeldung hervorrufen, auch wenn sie nie angezeigt werden.

                                      Definiertes Protokollumfeld. Nur die folgenden Internet-Protokolle kön-
                                      nen von Lingo aus genutzt werden; alle anderen sind automatisch aus-
                                      geschlossen. Auch das schützt den Anwender vor möglichen Angriffen.




338
                                   Arten der Online-Einbindung


 javascript:
 mailto:
 telnet:
 gopher:
 http://
 https://
 ftp://
 file://

Das file://-Schema kann mit einigen Lingo-Befehlen nur für Daten
im DSWMEDIA-Ordner genutzt werden.

Zusammenspiel von Online-/Offline-Medien
Die Nutzung von lokalen Medien ist – wie im vorangehenden Ab-
schnitt ausgeführt – durch das Shockwave-Sicherheitskonzept einge-
schränkt. Mit Hilfe des DSWMEDIA-Ordners bzw. des Shockwave-Support-
Ordners können Sie diese Einschränkungen umgehen, was wir in die-
sem Abschnitt zeigen wollen. Wo und zu welchem Zweck wäre eine
Nutzung von lokalen Medien bei Shockwave-Produktionen aber über-
haupt sinnvoll?

s   Eine CD-ROM könnte speicherintensive Medien (wie beispielsweise
    Videos oder große Soundfiles) enthalten, die von einem Shock-
    wave-Film im Browser genutzt werden.

s   Eine CD-ROM könnte eine Kombination aus HTML- und Shock-
    wave-Inhalten enthalten, die im Browser abgespielt und so einfach
    durch (aktuellere) Webinhalte ergänzt werden können.

s   Shockwave-Filme könnten auf externe Castlibs zugreifen, die lokal
    (auf CD-ROM) vorliegen.

Zugegebenermaßen sind solche Anwendungen noch nicht sehr ver-
breitet – dennoch bietet die Grundidee – speicherintensive Medien lo-
kal auf CD-ROM zur Verfügung zu stellen – einiges an Potential, das
sich Entwickler durchaus vergegenwärtigen sollten.

Alle Netlingo-Befehle, mit Ausnahme von goToNetPage und goToNetMo-
vie, aber auch Standard-Lingo wie set the filename of member(m)
oder set the filename of castlib(c) unterliegen im safePlayer-Mo-
dus den Sicherheitseinschränkungen. Das heißt:

s   Daten auf lokalen Laufwerken müssen in einem DSWMEDIA benann-
    ten Verzeichnis oder einem Unterverzeichnis desselben liegen, da-
    mit der Shockwave-Film oder die savePlayer-Applikation darauf
    zugreifen können.

s   Ein spezieller DSWMEDIA-Ordner kann im Shockwave-Support-
    Verzeichnis angelegt werden (Windows: C:\WINDOWS\SYSTEM\
    MACROMED\SHOCKWAVE\DSWMEDIA\; Mac: (STARTUP DISK):SYSTEM-


                                                                        339
      Kapitel   4   Shockwave – Internet im Direktzugriff


                          ORDNER:SYSTEMERWEITERUNGEN:MACROMEDIA:SHOCKWAVE:DSWMEDIA:).
                          Medien in diesem sogenannten Support Folder sind direkt mit
                          URLs wie file://filename aufrufbar.

                    Damit haben Sie zwei Möglichkeiten: Sie können Ihre lokalen Medien
                    in den Support Folder installieren (Vorteil: einfacher Zugriff) – oder Sie
                    haben auf Ihrer CD-ROM einen DSWMEDIA-Folder, in dem die aufzuru-
                    fenden Medien liegen. Wie immer beim Zugriff auf CD-ROMs ist es un-
                    ter Windows nötig, den Laufwerksbuchstaben selbst zu ermitteln. Un-
                    ter Shockwave-Bedingungen können Sie das mit dem folgenden Skript
                    tun:


                     --   Aufruf: put checkCD("myMacCD:", "dswmedia:test.jpg", ¬
                     --   "dswmedia\test.jpg")
                     --   Benötigt einen internen Darsteller "Test" und die
                     --   Datei test.jpg am angegebenen Ort auf der CD-ROM

                     on checkCD macVol, macPath, winPath
                       if the platform contains "Mac" then
                         checkpath = macVol & macPath
                         member("test").filename = checkPath
                         if member("test").filename = checkPath then
                            return macVol
                         else return "CD nicht vorhanden"
                       else
                         letterlist = ["d","e","f","g","h","i","j","k","l",¬
                         "m","n","o","p","q","r","s","t","u","v","w","x","y",¬
                         "z"]
                         repeat with letter in letterlist
                            checkPath = letter &":\" & winPath
                            member("test").filename = checkPath
                            if member("test").filename = checkPath then ¬
                              return letter&":\"
                         end repeat
                         return "CD nicht vorhanden."
                       end if
                     end


                    Das Skript macht sich den Umstand zunutze, daß the filename of
                    member von Director nur dann geändert wird, wenn die entsprechende
                    Datei wirklich existiert. Deshalb überprüfen wir, ob der Darsteller
                    „Test“ tatsächlich den gewünschten Pfad angenommen hat. Unter
                    Windows müssen notfalls alle möglichen Laufwerksbuchstaben durch-
                    gegangen werden, bevor ein Erfolg oder Mißerfolg gemeldet werden
                    kann.

                    Eine weitere Möglichkeit, Shockwave den Pfad zu einem (Windows-)
                    CD-Laufwerksbuchstaben mitzuteilen, liegt darin, bei der Installation
                    der CD-ROM eine Preferences-Datei in den PREFS-Ordner im Shockwave-
                    Support-Ordner zu schreiben, also in C:\WINDOWS\SYSTEM\


340
                                     Arten der Online-Einbindung


MACROMED\SHOCKWAVE\PREFS\. Heißt die von Ihnen geschriebene Da-
tei „CDDRIVE.TXT“, so können Sie sie aus Shockwave einfach mit fol-
gender Lingo-Zeile auslesen:


 theDrive = getPref("CDDRIVE.TXT")


Wenn Sie die Preferences-Datei aus einem Director-Projektor schreiben
wollen, so können Sie FileIO nutzen, um das Windows-Verzeichnis zu
ermitteln (getOSdirectory()) und dann die Preferences-Datei in den
Shockwave-Prefs-Ordner zu schreiben:


 -- Original von Gretchen MacDowall
 -- nutzt das FileIO-Xtra

 on writePath
   letter = (the moviepath).char[1]
   theFile = new(xtra "fileio")
   system = getOsDirectory()
   filePath = system & ¬
     "\System\MACROMED\Shockwave\Prefs\CDDRIVE.TXT"
   -- evtl. bereits vorhandenes File löschen
   openFile(theFile,filePath,1)
   delete(theFile)
   createFile(theFile,filePath)
   openFile(theFile,filePath,2)
   -- fortfahren, falls kein Fehler aufgetreten ist
   if status(theFile) = 0 then
     writeChar(theFile,letter)
     closeFile(theFile)
   end if
 end


Lokale Medien beim Testing
Wollen Sie Shockwave-Produktionen im Browser oder Anwendungen
im safePlayer-Modus mit lokalen Medien testen, so gilt ebenfalls: Mit
wenigen Ausnahmen können externe Medien nur genutzt werden,
wenn sie sich in einem DSWMEDIA-Ordner (oder einem Unterordner des-
selben) befinden. file-URLs müssen, wie oben beschrieben, unter Win-
dows mit einem „|“ (numToChar(124)) statt des Doppelpunktes nach
dem Laufwerksbuchstaben bezeichnet werden.

Projektor, Shockwave-Projektor, komprimierter Projektor
Neben den Standardprojektoren, welche die gesamte Player-Funktiona-
lität enthalten, bietet Director 7 eine Möglichkeit, sogenannte Shock-
wave-Projektoren („system level players“) zu erstellen. Diese Minimalpro-
jektoren, die nur wenige hundert Kilobytes groß sind, nutzen die beste-
hende Shockwave-Installation, die ja systemweit für alle Anwendun-
gen zur Verfügung steht. Falls ein Shockwave-Projektor auf einem

                                                                            341
      Kapitel   4   Shockwave – Internet im Direktzugriff


                    Rechner abgespielt wird, auf dem noch keine Shockwave-Installation
                    erfolgt ist, so wird er versuchen, über eine Internet-Verbindung die nö-
                    tigen Player-Bestandteile zu laden. Auf einem Rechner ohne Internet-
                    Verbindung ist ein Shockwave-Projektor daher nicht verläßlich lauf-
                    fähig.



                                             Abbildung 4.16:
                                             Projektoroptionen (Menü DATEI / PROJEKTOR ERSTELLEN,
                                             Button OPTIONEN)




                    Shockwave-Projektoren bieten sich vor allem als Ergänzung zu Shock-
                    wave-Internet-Angeboten an. Eine Jukebox, die aktuelle Informationen
                    und Shockwave-Audio aus dem Internet bezieht, aber als Applikation
                    vertrieben werden soll, die auch ohne Browser funktioniert, ist ein gu-
                    tes Beispiel für einen sinnvollen Einsatzzweck.

                    Komprimierte Projektoren enthalten dagegen die volle Abspiel-Engine
                    (inklusive eventuell eingebetteter Xtras); ein Großteil der Player-Be-
                    standteile wird bei der Projektorerstellung komprimiert und beim Aus-
                    führen des Projektors dekomprimiert. Dies führt zu signifikant kleine-
                    ren Projektoren, die allerdings beim Starten für die Dekompression ei-
                    nige Zeit benötigen. Für CD-ROM mag dies eine ungeeignete Distributi-
                    onsform sein; Disketten- oder Internet-Distribution von Projektoren
                    profitiert von dieser neuen Möglichkeit.

                    Asynchrones Scripting
                    Ein Befehl, der für eine Shockwave-Anwendung im Browser oder Pro-
                    jektor Daten aus dem Internet laden soll, wird nie sofort ein Ergebnis
                    haben. Das unterscheidet „Internet-Scripting“ fundamental von den al-
                    lermeisten gewöhnlichen Lingo-Skripten: „Internet-Scripting“ ist asyn-
                    chron; das Losschicken des Befehls und die Erledigung können zeitlich
                    mehr oder weniger weit auseinanderliegen.

                    Ein gewöhnlicher Funktionsaufruf in Lingo kann in eine Kette anderer
                    Befehle eingereiht werden; er liefert sofort ein Ergebnis, und die weite-
                    ren Befehle können direkt auf dieses Ergebnis zurückgreifen. Eine Net-
                    lingo-Aktion dagegen wird gestartet, und ob tatsächlich ein Ergebnis
                    eingegangen ist, muß in der Folge regelmäßig überprüft werden. Erst
                    bei Erledigung der Aktion kann das Ergebnis weiterverwendet werden.

                    Im wesentlichen lassen sich zwei Ansätze unterscheiden, wie mit die-
                    ser Asynchronität umgegangen werden kann:

                    s   Der „Überprüfungs“-Ansatz: In regelmäßigen Abständen (z.B. in ei-
                        nem exitFrame- oder stepFrame-Handler) überprüft ein Skript, ob


342
                                     Arten der Online-Einbindung


    die Netzaktion ein Ergebnis gebracht hat. Falls das so ist, weiß das
    exitFrame-Skript, welchen Befehl es mit dem Ergebnis der Netzak-
    tion ausführen soll.

s   Der „Callback“-Ansatz: Die Anwendung definiert sogenannte Call-
    back-Skripte, die bei der Rückmeldung einer Netzaktion automa-
    tisch ausgeführt werden. Jedes Callback-Skript kann wiederum
    weitere Aktionen auslösen, die vom Inhalt der Rückmeldung ab-
    hängen können.

Typische asynchrone Aktionen sind die, die mit den Befehlen des
Netlingo-Xtras ausgelöst werden, wie downloadNetThing, gotoNet-
Page, getNetText(), postNetText(), gotoNetMovie und preload-
NetThing().

Asynchrone Aktionen starten und überprüfen. Um zu überprüfen, ob
und wieweit ein Vorgang bearbeitet ist, stehen Ihnen eine Reihe von
Lingo-Funktionen zur Verfügung:


 netDone()
 getStreamStatus()
 netAbort
 netTextResult()
 netError()


Die folgenden Ausführungen sollen Ihnen zeigen, wie Sie von einem
einfachen Skript zur Überprüfung von Netzaktionen zu einem Ansatz
kommen, der universell einsetzbar und vom Prinzip her leistungsfähi-
ger ist. Kurz, wir wollen hier das Grundprinzip von Callbacks aus „klas-
sischem Scripting“ heraus entwickeln:

Die einfachste Überprüfung, ob beispielsweise ein Befehl wie


 global netID
 netID = getnetText("http://director7.de/index.html")


erledigt wurde, könnte so aussehen (als Frame-Skript):


 global netID
 on exitframe
   if netDone(netID) then
     if netError(netID) = "OK" then
       doStuff netTextResult(netID)
     else
       -- Fehlerbehandlung
     end if
   else go to the frame
 end



                                                                           343
        Kapitel       4          Shockwave – Internet im Direktzugriff


                                 Der Handler doStuff müßte in einem Movie-Skript definiert werden;
                                 durch das Konstrukt mit netDone() und netError() ist sichergestellt,
                                 daß der Handler erst aufgerufen wird, wenn netTextresult() wirklich
                                 ein Ergebnis enthält.

                                 Der Nachteil dieses Ansatzes liegt auf der Hand: Sie haben zwei Skript-
                                 bestandteile, die für die gleiche Aktion zuständig sind; und im Grunde
                                 müssen Sie für jeden Aufruf ein eigenes Frame-Skript schreiben, um
                                 die jeweils adäquate Aktion (hier doStuff) auszulösen. Das folgende
                                 Parent-Skript erledigt genau das gleiche, beinhaltet aber Aufruf und
                                 Überprüfung gleichermaßen:


                                  -- GetNetText Object
                                  -- Aufruf: new(script "GetNetText Object", "http://
                                  director7.de/index.html")

                                  property netID
                                  on new me, url
                                    set netID = getNetText(url)
                                    add the actorList, me
                                    return me
                                  end

                                  on stepFrame me
                                    if netDone(netID) then
                                      if netError(netID) = "OK" then
                                        doStuff me, netTextResult(netID)
                                      else
                                        myError me, netError(netID)
                                      end if
                                      deleteOne the actorList, me
                                    end if
                                  end

                                  on doStuff me, aText
                                    -- hierher Ergebnisbehandlung
                                  end

                                  on myerror me, anError
                                    -- hierher Fehlerbehandlung
                                  end

  Vgl. Sie Kapitel 5, „Objekt-   Sie sehen einen Vorteil der objektorientierten Programmierung: Die
orientierte Programmierung“      Skriptinstanz beinhaltet alles, was zur Erledigung der asynchronen
                                 Aufgabe nötig ist (= Enkapsulation); und sie „räumt sich selber auf“,
                                 d.h. sie löscht sich von der actorList, wenn der Netzwerkvorgang be-
                        433     endet ist. Mehrere Vorgänge können parallel gestartet werden, ohne
                                 daß sie sich ins Gehege kommen.




344
                                     Arten der Online-Einbindung


Ein Callback-Ansatz. Statt die beiden Handler doStuff und myError fest
in das Parent-Skript zu verankern, wäre es allerdings sinnvoller, einen
Modus zu implementieren, der es erlaubt, ein Skriptobjekt mit zu
übergeben, das entsprechende Funktionen enthält.


 -- GetNetText Object
 -- mit Callback
 -- Aufruf: siehe unten

 property callbackProps
 property netID

 on new me, URL, cbProps
   -- Kopie der Callback-Properties anlegen
   callbackProps = duplicate(cbProps)
   -- Netzoperation starten
   netID = getNetText(URL)
   add the actorList, me
   return me
 end

 on stepFrame me
   if netDone(netID) then
     deleteOne the actorList, me
     cbObj = callbackProps.getaProp(#cbObj)
     errObj = callbackProps.getaProp(#errObj)
     cbMethod = callbackProps.getaProp(#cbMethod)
     errMethod = callbackProps.getaProp(#errMethod)
     if netError(netID) = "OK" then
       call cbMethod, cbObj, netTextResult(netID)
     else
       call errMethod, errObj, netError(netID)
     end if
   end if
 end


Der Aufruf dieses Skriptobjektes könnte so aussehen:


 myCallback = (script "EinCallBackScript")
 cbprops = [#cbObj:myCallback, #cbMethod:#myText, #errObj:my
 Callback, #errMethod:#myError]
 new(script "GetNetText Object", "http://www.director7.de/
 index.html", cbProps)


In diesem Fall müßten Sie sicherstellen, daß das Skript EinCallBackS-
cript die beiden angegebenen Handler myText und myError enthält.
Dieser letzte Ansatz ist der universellste, da wir mit jedem Aufruf einer
asynchronen getNetText-Aktion auch gleich angeben können, welches
Skript das Ergebnis mit welchen Handlern im Erfolgs- oder Fehlerfall
bearbeiten soll.

                                                                            345
      Kapitel   4       Shockwave – Internet im Direktzugriff


                        Um noch einen Schritt weiterzugehen, können wir natürlich auch eine
                        Liste von Callback-Skripten übergeben, die vom call-Handler im Skript
                        GetNetText Object aufgerufen werden:


                         cbprops = [#cbObj: [myCallback1, myCallback2, myCallback3],
                          #cbMethod:#myText, #errObj:myErrorCallback, #errMethod:#my
                         Error]
                         new(script "GetNetText Object", "http://www.director7.de/
                         index.html", cbProps)


                        Die Listenmethode bietet einen weiteren Vorteil: Wird ein call-Befehl
                        nämlich an eine Liste von Objekten geschickt, so wird keine Fehlermel-
                        dung erzeugt, wenn der aufgerufene Handler nicht existiert. Dies gilt
                        auch, wenn ein einzelnes Objekt als einziger Listenbestandteil überge-
                        ben wird.

                        on streamStatus. Neben Callback-Skripten, wie wir sie in einem sol-
                        chen Objektskript selbst erstellen können, besteht mit dem Event-
                        Handler on streamStatus ein Netlingo-interner Callback, der mit dem
                        Befehl tellStreamStatus(TRUE) eingeschaltet wird. Lingo – respektive
                        das Netlingo-Xtra – generiert dann in regelmäßiger Folge Systemnach-
                        richten, die Sie mit on streamStatus auffangen und entsprechend aus-
                        werten können.


                         -- Filmskript

                         on streamStatus URL, state, bytesSoFar, bytesTotal, error
                           put URL&&state&&"Bytes:"&&bytesSoFar&&"von"&&bytesTotal
                           if error <> "" then put URL&&error
                         end

                        Da streamStatus für alle laufenden Ladeprozesse ausgegeben wird, ist
                        es entscheidend, die Daten anhand der mitgelieferten URL zu interpre-
                        tieren. state kann die Werte "Connecting", "Started", "InPro-
                        gress", "Complete" und "Error" annehmen; bytesSoFar und byte-
                        sTotal zeigen die aktuell übertragenen Bytes und die Gesamtgröße des
                        Streams an; wenn letzteres vom HTTP-Server nicht geliefert wird, kann
                        der Wert von bytesTotal 0 sein. error kann einen leeren String anzei-
                        gen (Ladevorgang läuft noch), "OK" (Ladevorgang wurde abgeschlossen)
                        oder einen Fehlercode. Zur Interpretation von Fehlercodes siehe den
                 359   Abschnitt „NetError“ in diesem Kapitel.

                        Ein sinnvoller Einsatzzweck für den on streamStatus-Handler ist bei-
                        spielsweise eine Fortschrittsanzeige beim Laden eines Shockwave-Fil-
                        mes. Ein Beispiel finden Sie in den Arbeitsbeispielen in diesem Kapitel.

                        Die Systemnachricht streamStatus wird von Director in idle-Vorgän-
                        gen erzeugt und verschickt. Wenn Sie die Abspiel-Engine sehr stark
                        auslasten, kann es sein, daß über längere Zeit keine entsprechende

346
                                     Arten der Online-Einbindung


Nachricht erfolgt. Um gezielt den Status von bestimmten Aktionen ab-
zufragen, ergänzt daher die Funktion getStreamStatus() die obige
Callback-Funktion. getStreamStatus(netID) bezieht sich dabei auf die
NetID eines zuvor mit Lingo gestarteten Netzvorganges, getStreamSta-
tus(URL) kann auch beim Streaming von externen Darstellerreferen-
zen eingesetzt werden.


 put getStreamStatus(netID)
 --
  [#URL: "www.macromedia.com", #state: "InProgress", #bytesS
 oFar: 250, #bytesTotal: 50000, #error: ""]


Callbacks in einer Multiuser-Umgebung. Bei Verwendung des Multiuser-
Xtras wird man sich als Director-Anwender vollständig auf die Call-
back-Technik beim Scripting einlassen müssen. Um Nachrichten des
Servers oder anderer Teilnehmer der Multiuser-Anwendung auffangen
zu können, muß zumindest ein Callback-Skript definiert werden.
Meist ist es aber sinnvoller, bereits nach Inhalt der netmessage zu fil-
tern und für bestimmte Nachrichtentypen jeweils eigene Callbacks an-
zulegen.

Im Datenbankbeispiel weiter unten in diesem Kapitel werden z.B. fol-
gende Callbacks definiert:


   setNetMessageHandler( gConnectionInstance, #SelectDatabas
 eHandler, script "myCallbacks", "selectDatabase")
   setNetMessageHandler( gConnectionInstance, #GetrecordCoun
 tHandler, script "myCallbacks", "getrecordcount")
   setNetMessageHandler( gConnectionInstance, #DefaultMessag
 eHandler, script "myCallbacks")


Mit setNetMessageHandler() wird für eine Xtra-Instanz (d.h. eine be-
stehende Verbindung zum Server oder Host), hier gConnectionIn-
stance, ein Handler und ein Skript (oder eine Instanz eines Skriptob-
jektes) festgelegt, in dem sich der Handler befindet, hier beispielsweise
#SelectDatabaseHandler im Skript "myCallbacks". Soll der Handler
nur bei netMessages eines besonderen Typs (z.B. "selectDatabase")
aufgerufen werden, so ist der Typ als weiterer Parameter anzugeben.
Der #defaultMessageHandler in der letzten Zeile enthält keine solche
Typangabe, er wird also alle Nachrichten auswerten, die nicht von an-
deren Callback-Handlern aufgefangen werden.

Auch jede netmessage, die eine Director-Anwendung an den Multiuser-
Server oder den Partner in einer Peer-to-peer-Verbindung gesendet
wird, wird vom Gegenüber bestätigt bzw. beantwortet. Die obigen
Skriptzeilen setzen tatsächlich fest, was passieren soll, wenn der Server
auf eine Anforderung wie #selectDatabase mit einer Serverantwort
des Typs "selectDatabase" (und einer Statusmeldung) antwortet.

                                                                            347
      Kapitel   4       Shockwave – Internet im Direktzugriff


                        Browser-spezifische Einschränkungen
                        Druck im Browser. Mit dem Druckbefehl des Browsers kann Shockwave
                        in der derzeitigen Version (Mai 99) nicht verläßlich gedruckt werden.
                        Die meisten Browser-Versionen werden zwar die HTML-Seite drucken,
                        im Anzeigebereich des Shockwave-Filmes aber eine leere Fläche oder
                        einen schwarzen Block ausgeben. Einige Browser (Berichten zufolge
                        Microsoft Internet Explorer auf Windows) können beim Versuch, Sei-
                        ten mit Shockwave zu drucken, abstürzen.

                        Als Alternative wäre es möglich, eine spezielle HTML-Seite für den
                        Druck anzubieten, die statt des Shockwave-Filmes eine Grafik enthält.
                        Für die erste Jahreshälfte 1999 ist außerdem eine Version von Printo-
                        matic angekündigt, die Shockwave-safe ist und es ermöglichen würde,
                        im Browser direkt aus dem Shockwave-Film zu drucken. Aktuelle Infor-
                        mationen finden Sie unter http://www.director7.de/html/xtras.html.

                        Netlingo
                        Netlingo-Funktionen in Director 7 bieten weitgehende Möglichkeiten,
                        Daten aus dem Internet zu nutzen, den Übertragungsstatus und even-
                        tuelle Fehler zu kontrollieren und auf die lokale Netzwerkumgebung
                        oder den Browser Einfluß zu nehmen. Die folgende Auflistung hat das
                        Ziel, die Befehle im Zusammenhang zu präsentieren; aufgeführt sind
                        alle Befehle, die durch das Netlingo-Xtra zur Verfügung gestellt wer-
                        den, sowie einige Standard-Lingo-Funktionen, die im Zusammenhang
                        mit Netzwerkaufgaben eine wichtige Funktion haben.

                        Damit das Netlingo-Xtra ordnungsgemäß funktioniert, sind – je nach
                        Plattform unterschiedliche – weitere Xtras bzw. Libraries notwendig
                 320   (vgl. den Abschnitt „Das Shockwave-Plug-in/ActiveX-Control“).

                        Netzwerkparameter überprüfen und setzen

                        netPresent(); the netpresent

                        Diese Funktion und System-Property gibt TRUE zurück, wenn die Direc-
                        tor-Netzwerkfunktionen zur Verfügung stehen, d.h. die Netzwerk-Xtras
                        geladen wurden.

                        browserName(); browserName(“vollständigerPfad”); browserName(#
                        enabled,TrueOrFalse)

                        Diese Funktionen sind nur im Projektor und in der Authoring-Umge-
                        bung sinnvoll einsetzbar. Im Projektor erhalten Sie mit browserName()
                        den Standard-Browser des jeweiligen Systems; die Überprüfung if
                        browserName <> "" ist sinnvoll beispielsweise als Voraussetzung für ei-
                        nen goToNetPage-Befehl. In der Authoring-Umgebung gibt browser-
                        Name() die Einstellung zurück, die Sie unter DATEI / VOREINSTELLUNGEN /
                        NETZWERK unter BEVORZUGTER BROWSER gemacht haben. Wenn Sie brow-


348
                                     Arten der Online-Einbindung


serName() mit einem vollständigen Pfad zu einer Applikation aufru-
fen, so wird diese Applikation als Ziel von Netlingo-Befehlen wie goTo-
NetPage() genutzt. Stellen Sie daher sicher, daß die entsprechende Ap-
plikation zum Aufruf von HTML-Seiten und anderen Internet-Inhalten
geeignet ist. browserName(#enabled,0) schaltet den automatischen
Aufruf der jeweiligen Applikation aus.

proxyServer #typ, “adresse”, port; proxyServer(#typ); proxySer
ver(#typ, #port); proxyServer(#typ, #stop)

Manche Internet-Zugänge erfordern, daß sogenannte Proxy-Server für
bestimmte Protokolle angegeben werden. Das gilt insbesondere für Fir-
mennetzwerke hinter einem Firewall, aber auch manche Internet Ser-
vice Providers (ISPs) setzen die Verwendung eines Proxy-Servers voraus.
Mit dem Befehl proxyServer() können Sie für die Protokolle #http und
#ftp einen Proxy-Server und Port angeben; der Parameter #stop sorgt
dafür, daß für weitere Anfragen des entsprechenden Protokolls kein
Proxy-Server verwendet wird.


 proxyServer #http, "proxy.joice.net", 8080
 put proxyserver(#http)
 -- "proxy.joice.net"
 put proxyserver(#http, #port)
 -- 8080
 put proxyServer(#ftp)
 -- ""
 proxyServer #http, #stop
 put proxyServer(#http)
 -- ""


clearCache()
cacheSize KiloBytes; cacheSize()
cacheDocVerify(#OnceOrAlways); cacheDocVerify()

Alle Cache-Befehle haben keine Funktion innerhalb des Browsers, da
Shockwave dort die Voreinstellungen des jeweiligen Browsers und des-
sen Cache benutzt. Eine Projektoranwendung bzw. ein Film in der Au-
thoring-Umgebung hat dagegen ihren eigenen Internet-Cache, den Sie
mit clearCache() entleeren können und dessen Größe Sie mit cache-
Size() abfragen bzw. mit cacheSize und der Angabe einer Kilobyte-
Größe setzen können. Mit cacheDocVerify(#once) wird eine Überprü-
fung, ob im Internet eine neuere Version der Datei als die im Cache vor-
handene vorliegt, nur einmal pro Sitzung durchgeführt, mit cache-
DocVerify(#always) erfolgt die Überprüfung bei jeder Abfrage. cache-
DocVerify() gibt die aktuelle Einstellung zurück.

(the environment).internetConnected




                                                                           349
      Kapitel   4   Shockwave – Internet im Direktzugriff


                    Die System-Property the environment gibt ab Director-Version 7.01
                    auch einen Wert für die Property #internetConnected zurück. Der
                    Wert dieser Property kann #online sein (eine aktive Internetverbin-
                    dung besteht), #offline (keine aktive Verbindung) oder #unknown
                    (keine Aussage möglich). Letzteres ist unter MacOS bis Version 7.01
                    noch die einzige Aussage, die Director macht.

                    Daten aus dem Netzwerk anfordern
                    Wie oben im Abschnitt „Asynchrones Scripting“ beschrieben, besteht
                    ein Netlingo-Aufruf im allgemeinen aus zwei Bestandteilen: einer An-
                    forderung von Internet-Daten und einer anschließenden regelmäßi-
                    gen Überprüfung, ob die Anfrage abgeschlossen wurde und ein Ergeb-
                    nis vorliegt. Sinnvollerweise werden alle folgenden Befehle daher in
                    der Form


                     netID = befehl(Parameter)


                    aufgerufen; netID enthält sodann eine eindeutige Identifikation des
                    Netzwerkvorganges, die Sie für die folgenden Überprüfungen nutzen
                    können.

                    getNetText("url"); getNetText("url", "Zeichensatz")
                    postNetText("url", [postList]), postNetText("url", "postString
                    ")
                    postNetText("url", ListOrString, "ServerOS", "Zeichensatz")

                    getNetText() und postNetText() ähneln sich in vielen Belangen. Beide
                    Befehle dienen dazu, Textinformationen an einen Server zu übertra-
                    gen und diesem Server abzurufen. Das Ergebnis, das der Webserver zu-
                    rückmeldet, erhalten Sie bei beiden mit dem Befehl netTextRe-
                    sult(netID).

                    Um HTML- oder Textdateien in einen Shockwave-Film einzulesen, ge-
                    nügt normalerweise getNetText(). Ein vollständiger Aufruf inklusive
                    Kontrolle, ob die Daten angekommen sind, sollte folgende Elemente
                    enthalten (hier als Behavior für ein Textsprite, das sich selbst aktuali-
                    siert):


                     property netID

                     on beginsprite me
                       sprite(me.spriteNum).text = "Aktualisiere den Text."
                       netID = ¬
                       getNetText("http://www.director7.de/index.html")
                     end




350
                                    Arten der Online-Einbindung


 on exitframe me
   if netDone(netID) then
     if netError(netID) = "OK" then
       myhtml = netTextResult(netID)
       sprite(me.spritenum).html = myhtml
     else
       sprite(me.spritenum).text = ¬
       "Fehler beim Aktualisieren!"
     end if
   end if
 end

getNetText() wie auch postNetText() können genutzt werden, um ein
CGI auf dem Server aufzurufen und diesem Parameter zu übergeben.
Sie entsprechen dabei der Vorgehensweise, die mit Formularen (und
den Methoden GET und POST) auch in HTML zu realisieren sind. Nähe-
res zu CGI-Aufrufen finden Sie weiter unten in diesem Abschnitt.           360
postNetText() wird alternativ mit einer Property-Liste oder einem
String als Übergabeparameter aufgerufen. Sie können außerdem als
optionale Parameter einen String für das Serverbetriebssystem überge-
ben (Standard: "Unix", möglich: "Win", "Mac"); dieser beeinflußt, wie
eventuell im Übergabeparameter enthaltene Return-Zeichen an den
Server gesendet werden. Ein weiterer optionaler Parameter beinhaltet
den Zeichensatz des Servers ("JIS", "EUC", "ASCII" oder "AUTO"). Stan-
dardeinstellung ist "AUTO", wählen Sie eine andere Einstellung, so wer-
den die Rückgabewerte vom Server entsprechend in das Zeichensystem
des Rechners übersetzt, auf dem die Anwendung läuft.

goToNetMovie("url"), goToNetMovie("url#marker")

Dieser Befehl lädt und spielt einen neuen Shockwave-Film von einem
HTTP- oder FTP-Server. Der aktuelle Film wird so lange weiter abge-
spielt, bis der neue Film verfügbar ist. Wenn Sie eine Marker-Bezeich-
nung angeben, so springt der aufgerufene Film an die entsprechende
Stelle. Lokale Daten, die Sie mit goToNetMovie() aufrufen wollen, müs-
sen sich im Shockwave-Support-Ordner oder in einem anderen DSWME-
DIA-Ordner befinden (vgl. „Internet-Sicherheit“ im vorangehenden Ab-
schnitt). Sie können den Ladevorgang bei goToNetMovie() nicht direkt
überprüfen; nutzen Sie preloadNetThing(), falls Sie Kontrolle über
den Ladevorgang haben müssen.


 property myMovie, netID

 on beginSprite me
   myMovie = "http://www.eineDomain.de/einmovie.dcr"
   netID = preloadNetthing(myMovie)
 end



                                                                                  351
      Kapitel   4       Shockwave – Internet im Direktzugriff


                         on exitframe me
                           if netDone(netID) then
                             goToNetMovie(mymovie&"#meinMarker")
                           else
                             put getStreamStatus(netID)
                             -- oder eine andere Fortschrittsanzeige
                           end if
                         end

                        goToNetPage("url"), goToNetPage("url", "target")

                        Ruft eine Webseite im Browser bzw. in einem durch "target" festgeleg-
                        ten Fenster oder Frame auf und nutzt dafür den in browsername() fest-
                        gelegten Browser. Falls es sich um eine Projektoranwendung handelt
                        und es unsicher ist, ob ein Browser auf dem Abspielrechner zur Verfü-
                        gung steht, sollten Sie vor dem Aufruf sicherstellen, daß browserName
                        <> "" ist. Ein Beispiel finden Sie im Abschnitt „Browser-Kontrolle“ in
                 314   diesem Kapitel.

                        url kann jede Datei sein, die vom Browser dargestellt werden kann; sie
                        kann mit lokalem Pfad oder Internet-URL angegeben werden. Wollen
                        Sie einen Shockwave-Film in einem anderen Frame oder Fenster laden,
                        so nutzen Sie ebenfalls goToNetPage().

                        preloadNetThing("url")

                        Der Befehl lädt die angegebene URL in den Projektor- bzw. Browser-Ca-
                        che. Danach greifen Sie weiterhin mit der URL (und nicht mit einer lo-
                        kalen Pfadangabe) auf die Datei zu. Es ist häufig empfehlenswert, Da-
                        teien auf diese Weise vorauszuladen, bevor ein Befehl aufgerufen wird,
                        der die Medien anzeigt (wie set the filename of member, goToNetMo-
                        vie(), getNetText()).

                        downloadNetThing("url", "PfadUndDateiname")

                        Im Gegensatz zu preloadNetThing() funktioniert dieser Befehl nicht
                        mit einem Shockwave-Film im Browser oder in einem Projektor, der im
                        safePlayer-Modus läuft. downloadNetThing() legt eine lokale Kopie
                        der Netzwerkdatei an, die sodann mit einer lokalen Pfadangabe aufge-
                        rufen werden kann. Dies bietet in einigen Fällen Vorteile gegenüber
                        preloadNetthing(): Sie können dem Anwender eine Datei zur Verfü-
                        gung stellen, die er lokal weiter nutzen kann – wie ein ReadMe oder
                        eine PDF-Datei. Sie können außerdem Shockwave-Filme oder -Beset-
                        zungen lokal ablegen, so daß die Befehle saveMovie sowie save cast-
                        lib in der Folge funktionieren.

                        downloadNetThing() kann auch benutzt werden, um Dateien lokal zu
                        kopieren. Folgender Befehl läßt einen Projektor auf CD-ROM die Datei
                        MEINCAST.CXT von der CD auf die Festplatte kopieren:



352
                                     Arten der Online-Einbindung


 on copyIt
   if the platform contains "Mac" then
     the itemdelimiter = ":"
     theDisk = getOSdirectory().item[1]&":"
     cdPath = the moviePath&"libs:"
   else
     theDisk = "c:\"
     cdpath = the moviePath&"libs\"
   end if
   downLoadNetThing(cdPath&"meinCast.cxt"; theDisk&¬
   "meinCast.cxt"
 end

Im Abschnitt „Netzwerk-Operationen überprüfen“ in diesem Kapitel             354
lesen Sie, wie Sie eine Fortschrittsanzeige – auch für einen solchen
Kopiervorgang – implementieren können.

netAbort(netID), netAbort("url")

Benutzen Sie netAbort() vorzugsweise mit einer netID aus einer voran-
gehenden Netzwerkaktion. netAbort() bricht das Laden von Internet-
Daten ab. Ein sinnvoller Einsatz wäre ein eigenes Time-out-Skript, das
einen Ladevorgang abbricht, falls dieser nicht in einer festgelegten Zeit
beendet wird:


 -- Button-Skript

 property myticks, netID
 on mouseup me
   netID= getNetText("http://www.director7.de/index.html")
   myticks = the ticks
 end

 on exitframe me
   if not(voidP(myticks)) then
     if netDone(netID) then
       if netError(netID) = "OK" then
          myhtml = netTextResult(netID)
       end if
     else
       -- 10 Sekunden Time-out
       if (the ticks – myticks > 10*60) then
          netAbort(netID)
          alert "Datei konnte nicht geladen werden."
          myticks = VOID
       end if
     end if
   end if
 end




                                                                                    353
      Kapitel   4       Shockwave – Internet im Direktzugriff


                        member(m).linked

                        Diese Darstellereigenschaft für Flash- und animierte GIF-Darsteller
                        können Sie dazu nutzen, einen internen Darsteller darauf vorzuberei-
                        ten, daß er mit einer externen Datei (aus dem Netzwerk) verbunden
                        wird. Folgendes Skript erzeugt einen neuen Darsteller des Typs #anim-
                        Gif:


                         newMbr = new(#animGif)
                         newMbr.linked = 1
                         newMbr.fileName = the moviePath & "myanimation.gif"


                        Folgendes Skript dagegen importiert das animierte GIF und legt nur
                        das erste Bild als Bitmap-Darsteller ab:


                         newMbr = new(#animGif)
                         newMbr.fileName = the moviePath & "myanimation.gif"


                        Da ein animiertes GIF grundsätzlich als #bitmap oder als #animGif im-
                        portiert werden kann und #bitmap die Standardeinstellung ist, ist die
                        zusätzliche Skriptzeile im ersten Skript nötig. Flash-Darsteller hinge-
                        gen werden automatisch richtig gelinkt, auch wenn newMbr.linked =
                        1 fehlt.

                        Netzwerkoperationen überprüfen und Ergebnisse anzeigen
                        Da Netzwerkaktionen grundsätzlich asynchron verlaufen, können Sie
                        nicht direkt mit dem Ergebnis eines Lingo-Befehls arbeiten, sondern
                        müssen zunächst auf die Rückmeldung vom Web- oder FTP-Server war-
                 342   ten (vgl. Abschnitt „Asynchrones Skripting“ in diesem Kapitel). Net-
                        lingo bietet eine Reihe von Funktionen, um den Erfolg, eventuelle Feh-
                        ler und das Ergebnis einer Netzaktion zu überprüfen.

                        netDone(netID)
                        netError(netID)

                        In allen Beispielen in diesem Kapitel sehen Sie diese beiden Funktio-
                        nen in Aktion. Sie sollten stets beide überprüfen, da netdone() = true
                        nur bedeutet, daß die Aktion abgeschlossen wurde, aber nicht, daß
                        kein Fehler aufgetreten ist. Zu neterror() lesen Sie mehr im nachfol-
                        genden Abschnitt „NetError()“.

                        netTextResult(netID)

                        Diese Funktion liefert das (Text-)Ergebnis von getNetText() und post-
                        NetText() zurück.

                        netLastModDate(netID)
                        netMime(netID)


354
                                    Arten der Online-Einbindung


Dateien, die aus dem Internet (via HTTP oder FTP) geladen werden, ha-
ben ein Änderungsdatum und einen MIME-Typus. Die beiden Funktio-
nen liefern Ihnen die entsprechenden Informationen.

Das folgende Beispiel liest die Eingabe in einem Textfeld "URLEingabe"
und erlaubt unterschiedliche Aktionen, je nach MIME-Type des Ergeb-
nisses.


 property netID, theURL

 on mouseUp me
   theURL = member("URLEingabe").text
   netID = preloadNetThing(theURL)
 end

 on exitframe me
   checkNetOperation me
 end

 on checkNetOperation me
   if netDone(netID) then
     if netError(netID) = "OK" then
       set myMimeType = netMIME(netID)
       case myMimeType of
          "image/jpeg","image/gif": go frame "Display"
          "application/x-director": goToNetMovie theURL
          "text/html": goToNetPage theURL
          otherwise: alert "Bitte wählen Sie ein ¬
          anderes Objekt."
       end case
     else
       go the frame
     end if
   end if
 end


getLatestNetID()

Der Befehl ist nur aus Kompatibilitätsgründen zu Director 5-Filmen
vorhanden. Director 6- und 7-Netlingo-Funktionen geben die netID au-
tomatisch zurück; üblicher Aufruf ist daher:


 netID = getNetText("url")


tellStreamStatus(trueOrFalse)
on streamStatus URL, state, bytesSoFar, bytesTotal, error

Mit tellStreamStatus(TRUE) schalten Sie die Ausgabe der Systemmel-
dung streamStatus ein; ein entsprechender Handler on streamStatus
kann diese Meldungen dann auffangen und entsprechend auswerten.
URL enthält die URL, für die eine streamStatus-Meldung ausgegeben

                                                                         355
      Kapitel   4       Shockwave – Internet im Direktzugriff


                        wird; state gibt den Status der Netzoperation an ("Connecting",
                        "Started", "InProgress", "Complete" oder "Error"); bytesSoFar und
                        bytesTotal können im Status "InProgress" genutzt werden, um ge-
                        naue Angaben zum Download-Fortschritt zu erhalten. error enthält ei-
                        nen leeren String oder die Code-Nummer des aufgetretenen Fehlers. on
                        streamStatus wird automatisch aufgerufen; benötigen Sie dieselben
                        Statusangaben auf Anforderung, so können Sie getStreamStatus() be-
                        nutzen.

                        getStreamStatus(url), getStreamStatus(netID)

                        Die Funktion getStreamStatus() liefert Statusinformationen in dersel-
                        ben Form zurück wie die Systemmeldung streamStatus. Sie können
                        getStreamStatus() allerdings jederzeit aufrufen, wenn Sie die entspre-
                        chenden Informationen benötigen.

                        frameReady(), frameReady(einFrame), frameReady
                        (startFrame, endFrame), member(m).mediaReady,
                        sprite(s).mediaReady

                        Die Funktion frameReady() und die Darsteller- und Sprite-Property me-
                        diaReady können im Anschluß an preload-Befehle genutzt werden, um
                        zu überprüfen, ob bestimmte Frames, Frame-Bereiche oder der ganze
                        Film bzw. bestimmte Darsteller sich im Speicher befinden.
                 373   frameReady() kann auch für Flash-Darsteller genutzt werden; siehe Ab-
                        schnitt „Streaming“ in diesem Kapitel.

                        Mit dem Browser kommunizieren
                        Lingo enthält Befehle, die direkt Funktionsaufrufe oder Parameter an
                        den Browser (bzw. die dort aktive Skripting-Umgebung) übergeben kön-
                        nen. Entsprechend gibt es Befehle, um aus JavaScript und VBScript den
                        Shockwave-Film anzusprechen und im Film die Übergabewerte auszu-
                        lesen. Auch Parameter des <embed>- bzw. <object>-TAGs lassen sich aus-
                        lesen.

                        netStatus "Eine Nachricht"

                        Im Browser, aber nicht im Projektor verfügbar. netStatus zeigt eine
                        Nachricht in der Statusleiste des Browsers an (in Internet Explorer
                        Windows erst ab Version 4). In der Authoring-Umgebung wird der
                        String ins Nachrichtenfenster ausgegeben.

                        externalEvent("string"), on evalScript

                        Die beiden Lingo-Elemente erlauben Shockwave, Befehle an den Brow-
                        ser zu senden und ebensolche von ihm zu empfangen. Obwohl ganz
                        unterschiedliche Technologien diese Kommunikation ermöglichen (Li-
                        veConnect für Netscape, ActiveX-Scripting im Internet Explorer), bietet
                        Lingo auf diese Weise eine browser-unabhängige Schnittstelle.

356
                                    Arten der Online-Einbindung


externalEvent("funktionsaufruf") nutzt den übergebenen String,
um eine Funktion in JavaScript (Netscape) oder VBScript (MSIE Win-
dows) aufzurufen. "funktionsaufruf" kann auch Parameter enthalten,
die an die Funktion übergeben werden:


 externalEvent("JSFunktion()")
 externalEvent("JSFunktion('param1', 'param2')")

In der HTML-Seite müssen entsprechende Skripte definiert sein, die
diese Funktionsaufrufe auswerten können. Näheres finden Sie im Ar-
beitsbeispiel KOMMUNIKATION MIT DEM BROWSER in diesem Kapitel.             393
on evalScript argString wertet in der Shockwave-Anwendung einen
JavaScript-/VBScript-Funktionsaufruf aus. Das JavaScript


 document.myMovie.EvalScript("#lingo, beep")


könnten Sie mit folgendem on evalScript-Handler auswerten:


 on evalScript argString
   the itemdelimiter = ","
   if argString.item[1] = "#lingo" then
     do argString.item[2]
     return argString.item[2]&&"-- OK"
   else nothing
 end


Der return-Wert kann von JavaScript wiederum genutzt werden.

JavaScript/VBScript:
EvalScript(“param1, param2”), Play(), Stop(), Rewind(), GetCur
rentFrame(), GotoFrame(), GotoMovie()

JavaScript und VBScript (letzteres ist die Scripting-Sprache des Micro-
soft Internet Explorers) können mit einem in die HTML-Seite eingebun-
denen Shockwave-Film mit diesen Befehlen kommunizieren. Verglei-
chen Sie hierzu das Arbeitsbeispiel KOMMUNIKATION MIT DEM BROWSER in       393
diesem Kapitel. Die Voraussetzungen, die erfüllt sein müssen, damit
die Browser-Shockwave-Kommunikation funktioniert, sind:

s   Netscape-Browser, mindestens Version 3, Java und JavaScript einge-
    schaltet

s   MSIE Windows, mindestens Version 3, JScript/VBScript eingeschal-
    tet

s   kein MSIE Mac, kein Windows 3.1 oder Mac 68K




                                                                                  357
      Kapitel   4   Shockwave – Internet im Direktzugriff


                    EvalScript() kann von Shockwave nur ausgewertet werden, wenn ein
                    entsprechender on evalScript-Handler im Filmskript des Shockwave-
                    Filmes vorhanden ist (s.o.). Die anderen Befehle sind direkt nutzbar;
                    Ihr Shockwave-Film muß also nicht besonders angepaßt werden.

                    Am einfachsten lassen sich die Befehle in der HTML-Seite nutzen, wenn
                    Sie im <object>- bzw. <embed>-TAG der Shockwave-Einbindung ein
                    name-Attribut für das Shockwave-Movie-Objekt angeben.


                     <object andereAttribute name="myMovie">
                       <embed src="extevent.dcr" andereAttribute
                       name="myMovie"></embed>
                     </object>


                    Ein solches Attribut macht die Shockwave-Objekte direkt adressierbar;
                    in JavaScript können Sie dann beispielsweise folgende Aufrufe verwen-
                    den:


                     onClick="myMovie.GotoFrame(5)
                     myMovie.EvalScript("#lingo, beep")
                     document.myMovie.EvalScript("#lingo, beep")


                    Beachten Sie, daß JavaScript case-sensitiv ist, also Groß- und Klein-
                    schreibung der Befehle und Objektnamen exakt so erwartet, wie hier
                    dokumentiert.

                    externalParamCount(), externalParamName(nummer), externalParam
                    Name("name"), externalParamValue(nummer), externalParamValue("
                    name")

                    Es gibt eine ganze Reihe von vordefinierten und auch von freien Para-
                    metern, die Sie in der HTML-Seite in den <embed>- und <object>-Tags
                    nutzen können. Der Shockwave-Film kann diese Parameter dann ausle-
                    sen und entsprechend nutzen. Der Effekt ist, daß Sie durch Ihre HTML-
                    Seite Shockwave eine Grundkonfiguration übergeben können, ähnlich
                    wie das mit der DIRECTOR.INI bzw. PROJEKTORNAME.INI im Projektor mög-
                    lich ist.

                    Folgendes Skript liest alle Parameter in die globale Variable konfigList
                    ein:


                     on startMovie
                       getParams()
                     end




358
                                          Arten der Online-Einbindung


    on getParams
      global konfigList
      konfigList = [:]
      mycount = externalParamCount()
      if mycount > 0 then
        repeat with i = 1 to mycount
          konfiglist[externalParamName(i)] = ¬
          externalParamValue(i)
        end repeat
      end if
    end

Sie können mit konfiglist.paramName dann an jeder Stelle Ihres Fil-
mes auf die Werte zugreifen.

Die Funktionen sind auch für Java-Applets nutzbar; über spezifische
Unterschiede finden Sie mehr im Lingo-Handbuch von Director 7.

netError()
Die folgende Liste von Macromedia beinhaltet eine Zuordnung der
wichtigsten Fehlercodes, die von der Funktion netError() zurückgege-
ben werden, samt Erläuterung. Weitere Fehlercodes im Bereich von
4144 bis 4168 zeigen generell eine fehlgeschlagene Netzwerkoperation an.
Kursiv eingetragene Fehlernummern und Erklärungen sind von uns
hinzugefügt.


Error    Beschreibung
"OK"     (kein Fehler)
4        Bad MOA Class (Bedeutet im allgemeinen, daß benötigte Network-
         Xtras falsch oder gar nicht installiert sind. Der Fehler kann auch von
         anderen, nicht netzwerkbezogenen Xtras generiert werden.)
5        Bad MOA Interface (wie Fehler 4)
6        (fehlerhafte URL/Protokoll nicht unterstützt)
20       Internal error (Wird von Shockwave im Browser zurückgegeben, wenn
         der Browser einen Netzwerkfehler oder einen internen Fehler erkennt.)
905      Bad filespec
4146     Connection could not be established with the remote host
4149     Data supplied by the server was in an unexpected format
4150     Unexpected early closing of connection
4154     Operation could not be completed due to timeout
4155     Not enough memory available to complete the transaction
4156     Protocol reply to request indicates an error in the reply
4157     Transaction failed to be authenticated
4159     Invalid URL



                                                                                  359
      Kapitel   4   Shockwave – Internet im Direktzugriff


                    Error   Beschreibung
                    4164    Could not create a socket
                    4165    Requested object could not be found (URL may be incorrect)
                    4166    Generic proxy failure
                    4167    Transfer was intentionally interrupted by client
                    4242    Download stopped by netAbort(url)
                    4836    Download stopped for an unknown reason (Möglicherweise Netzwerk-
                            fehler oder Timeout)

                    Falls netError() in bestimmten Fällen nicht die erwartete Fehlermel-
                    dung zurückgibt, so kann das an dem Sachverhalt liegen, daß be-
                    stimmte Server neben der Fehlermeldung eine HTML-Seite zurückgeben,
                    die unter bestimmten Umständen als adäquate Antwort auf einen Net-
                    lingo-Befehl interpretiert wird. Mit den neuesten Netlingo-Xtras (ab Ver-
                    sion 7.01) konnten wir dieses Problem aber nicht mehr reproduzieren.

                    Ein Workaround bietet sich dann an, wenn der erwartete Inhalt auf
                    eine Netzanfrage nicht vom MIME-Typ text/html ist, sondern eine Gra-
                    fik oder ein Director-Film bzw. eine Besetzungsdatei heruntergeladen
                    werden soll. Überprüfen Sie dann neben netError() einfach auch net-
                    Mime(). Für Filme und Besetzungen sollte netMime() "application/x-
                    director" ergeben, für JPEGs oder GIFs "image/einZusatz". "text/
                    html" ist in einem solchen Fall mit großer Sicherheit eine Fehlernach-
                    richt des Servers.

                    Aufruf von CGIs
                    Mit getNetText() und postNetText() können Sie ausführbare Skripte
                    auf dem Webserver (sogenannte CGIs) mit den nötigen Parametern auf-
                    rufen. Die beiden Lingo-Befehle entsprechen den aus HTML-Formula-
                    ren bekannten Methoden GET und POST; sie bieten die gleichen Mög-
                    lichkeiten und Einschränkungen.

                    Sammlungen von (meist frei erhältlichen) CGIs finden Sie im Internet
                    beispielsweise an folgenden Stellen:

                    s   http://www.freescripts.com/
                    s   http://www.cgi-scripts.com/
                    s   http://mikesworld.net/
                    s   http://www.icemall.com/free/free_perl_scripts.html
                    s   http://www.worldwidemart.com/scripts/
                    s   http://dreamcatchersweb.com/scripts/download.html
                    s   http://www.digitalcenter.com/Toolbox/cgi.html
                    s   http://easy.web66.com/office.htm
                    s   http://perl-scripts.virtualave.net/


360
                                     Arten der Online-Einbindung


In den Arbeitsbeispielen finden Sie ein Highscore-CGI, das Spielstände      416
aus Shockwave-Anwendungen auf dem Server speichert und diese zu-
rückmeldet. Im Abschnitt „Andere Internet-Protokolle nutzen“ in die-       362
sem Kapitel finden Sie Hinweise zum Versenden von E-Mail via CGI.

Mit getNetText() ist ein CGI-Aufruf über Parameter realisierbar, die di-
rekt in die URL integriert werden. Übergeben Sie mit getNetText()
keine Parameter, deren Länge Sie nicht absehen können, da die maxi-
male Länge einer URL begrenzt ist (meist 1 KByte). Außerdem ist es nö-
tig, Texte, die Leerzeichen, Returns oder Sonderzeichen enthalten, mit
der Funktion urlEncode() für die Verwendung in einer URL umzuwan-
deln.


 actionstring = "http://www.eineDomain.de/¬
   cgi-bin/eincgi.pl"
 paramstring = "?name="&urlEncode(member("Name").text)&¬
   "spielstand="&member("Punktzahl").text
 netID = getNetText(actionstring&paramstring)


postnettext() bietet die komfortable Möglichkeit, eine Property-Liste
als Parameter zu übergeben. Dieses Verfahren entspricht der POST-Me-
thode eines HTML-Formulars. Sie können als optionale Parameter bei
postNetText() einen String für das Serverbetriebssystem übergeben
(Standard: "Unix", möglich: "Win", "Mac"); dieser beeinflußt, wie even-
tuell im Übergabeparameter enthaltene Return-Zeichen an den Server
gesendet werden. Ein weiterer optionaler Parameter beinhaltet den
Zeichensatz des Servers ("JIS", "EUC", "ASCII" oder "AUTO"). Standard-
einstellung ist "AUTO", wählen Sie eine andere Einstellung, so werden
die Rückgabewerte vom Server entsprechend in das Zeichensystem des
Rechners übersetzt, auf dem die Anwendung läuft.

Das einfache getNetText-Beispiel von oben läßt sich mit postNetText()
so umsetzen:


 actionString = "http://www.eineDomain.de/¬
   cgi-bin/eincgi.pl"
 paramlist = [:] -- Property-Liste
 paramList[#name] = member("Name").text
 paramList[#spielstand] = member("Punktzahl").text
 serverOS = "Win"
 netID = postNetText(actionString, paramList, serverOS)


Die Größe der Parameter in der übergebenen Property-List oder im al-
ternativ zu übergebenden String ist bei postNetText() nicht be-
schränkt.




                                                                                   361
      Kapitel   4       Shockwave – Internet im Direktzugriff


                        Pseudo-CGI (eindeutige URL)
                        Mit Shockwave-Filmen, die im Browser laufen, können Sie keinen Ein-
                        fluß auf den Browser-Cache nehmen. Um den Cache zu „überlisten“
                        und immer einen Download aus dem Internet zu erzwingen, auch
                        wenn die Datei eigentlich bereits im Cache ist, bietet sich eine Me-
                        thode an, die wir „Pseudo-CGIs“ nennen wollen. Die Idee ist, Dateina-
                        men über einen angehängten Parameter-String eindeutig zu machen
                        und so Shockwave vorzugaukeln, daß es die Datei noch nicht im Cache
                        hat. Sie finden ein Einsatzbeispiel dieser Technik im Abschnitt „Web-
                 398   cam-Bilder in Shockwave anzeigen“ in diesem Kapitel.

                        Einen eindeutigen Parameter-String konstruieren Sie am einfachsten
                        mit der Lingo-Property the ticks, welche die Zeit seit Start der Anwen-
                        dung angibt:


                         paramstring = string(the ticks)
                         member(m).filename = "http://www.eineDomain.de/¬
                           test.jpg?"&paramstring


                        Der Webserver ignoriert den Parameter (was sollte ein JPEG auch mit
                        einem CGI-Parameter anfangen?). Für die Cache-Verwaltung ist auf
                        diese Weise aber jede Anfrage neu, so daß tatsächlich jedesmal eine
                        neue Datei geladen wird. Sie können diese Technik am einfachsten mit
                        the fileName of member nutzen, Cacheing-Befehle wie preload-
                        NetThing() sind zwar grundsätzlich möglich, allerdings ist nicht wirk-
                        lich sichergestellt, daß Director bei einem anschließenden set the fi-
                        lename of member die Datei nicht erneut lädt, selbst wenn dieselbe URL
                        angegeben wurde.

                        Andere Internet-Protokolle nutzen
                        SMTP. Das Versenden von E-Mail dürfte gleich nach dem Zurückmel-
                        den von Spielständen via CGI (siehe unten) zu den beliebtesten Aufga-
                        ben für Shockwave gehören. Bekanntlich unterstützt Shockwave URLs
                        in der Form mailto:. Damit ist mit einem einfachen goToNetPage-Be-
                        fehl ein Aufruf des Mailprogrammes möglich:


                         goToNetPage("mailto:hans@eineDomain.de")
                         goToNetPage("mailto:hans@eineDomain.de?subject=Ein%20Mail-
                         Thema&cc=peter@eineDomain.de&body=Das%20ist%20eine%20 Testm
                         ail")


                        Allerdings funktioniert das nur, wenn der Browser des Anwenders so
                        konfiguriert ist, daß er automatisch ein Mailprogramm öffnet. Für Di-
                        rector-Anwendungen, die im Projektor abgespielt werden, kommt der
                        Umstand hinzu, daß mit dem goToNetPage-Befehl auf jeden Fall zu-
                        nächst der Browser geöffnet wird; falls der Anwender ein externes


362
                                    Arten der Online-Einbindung


Mailprogramm nutzt, wird der Browser wiederum dieses öffnen – also
ein bißchen viel Overhead für das Absenden einer einfachen E-Mail.

Mit dem für MacOS und Windows verfügbaren DirectEmail Xtra (http://
www.directxtras.com) haben Sie eine weitere, sehr komfortable Möglich-
keit, E-Mails aus Director-Projektoren zu versenden. Folgendes Beha-
vior übernimmt das Abschicken und die Erfolgskontrolle:


 property emx

 on mouseup me
   sendemail me
 end

 on sendemail me
   emx = new(xtra "DirectEmail", getUserEmailPref(2),¬
   "", "") -- Params: server, mailbox, password
   emx.sendemail(getUserEmailPref(1),¬
   "empfänger@andereDomain", "","","testmail", ¬
   "Hallo, das ist ein Test.", "")
   -- Params: from, to, cc, bcc, subj, body, attachment
   put "Send-Befehl ausgeführt"
 end

 on exitframe me
   if objectP(emx) then
     if emx.emailDone() then
       put "Email wurde verschickt"
       put emx.emailerrormessage()
       emx = VOID
     end if
   end if
 end


Die Funktion getUserEmailPref() ermittelt die Voreinstellung für
Mailserver (mit Parameter 2) und Absenderadresse (mit Parameter 1).
Selbstverständlich können Sie alle Angaben auch den Anwender in ent-
sprechende Eingabefelder eintragen lassen. Das DirectEmail-Xtra ist
Shockwave-safe; bestimmte Funktionen – wie getUserEmailPref() –
stehen in Shockwave allerdings nicht zur Verfügung.

Der Aufruf eines Sendmail-CGIs ist eine weitere Möglichkeit, E-Mail aus   Ein Beispiel-CGI finden Sie auf
Director und Shockwave heraus zu versenden. Mit den NetLingo-Funk-        der CD-ROM im Verzeichnis
tionen getNetText() oder postNetText() können Sie das CGI mit den         WORKSHOP \ KAPITEL04 \ CGIS
entsprechenden Übergabeparametern aufrufen. Das folgende Beispiel
nutzt das CGI eines kommerziellen Internet-Providers; andere Send-
mail-CGIs finden Sie online beispielsweise unter http://www.worldwide-
mart.com/scripts/ („Formmail“).




                                                                                                    363
      Kapitel   4   Shockwave – Internet im Direktzugriff


                    Wird das genannte CGI aus einem HTML-Formular aufgerufen, so sieht
                    das Skript so aus:


                     <HTML><HEAD><TITLE>Formtest</TITLE></HEAD>
                     <BODY>
                     <FORM ACTION="../../cgi-bin/mailmanager.pl" METHOD=POST>
                     <INPUT TYPE="hidden" NAME="recipient" value="hans@eineDomai
                     n.de">
                     <INPUT type=hidden name="subject" value="Testmail">
                     <INPUT type=hidden name="redirect" value="http://
                     www.eineDomain.de/back.txt">
                     <INPUT type=hidden name="print_blank_fields" value="1">

                     <INPUT TYPE=text NAME="Name">
                     <P>E-Mail-Adresse: <INPUT TYPE=text NAME="Mail">
                     <P><INPUT TYPE=submit VALUE="Abschicken">
                     </FORM>
                     </BODY></HTML>


                    Das diesem Formular entsprechende Lingo-Skript, das die Eintragun-
                    gen aus zwei Textdarstellern ("Name" und "Email") per postNetText()
                    verschickt, würde als Behavior für einen Send-Button so aussehen:


                     property netID
                     on mouseUp me
                       sendEmail me
                     end
                     on sendEmail me
                       postlist = [:]
                       postlist[#recipient] = "hans@eineDomain.de"
                       postlist[#subject] = "Testmail"
                       postlist[#redirect]="http://www.eineDomain.de/back.txt"
                       postlist[#print_blank_fields] = "1"
                       postlist[#Name] = member("Name").text
                       postlist[#Mail] = member("Email").text
                       netID = postNetText("../../cgi-bin/mailmanager.pl", ¬
                       postlist, "UNIX", "ASCII")
                     end

                     on exitFrame me
                       if not voidP(netID) then
                         if netDone(netID) then
                           if netError(netID) = "OK" AND ¬
                           netTextResult(netID) = "Mail OK" then
                              put "Mail erfolgreich verschickt"
                           else put "Fehler beim Verschicken der Mail"
                           netID = VOID
                         end if
                       end if
                     end



364
                                     Arten der Online-Einbindung


Das Skript stellt zunächst eine Property-Liste der Parameter zusammen
(postlist); mit dem postNetText-Befehl werden die Parameter an das
CGI auf dem Webserver übertragen. Die Abfrage im exitFrame-Handler
überprüft netDone() und netError() und prüft dann, ob es vom CGI
den erwarteten String (hier den Inhalt der Textdatei http://www.eineDo-
main.de/back.txt, die nur die Worte "Mail ok" enthält) zurückbekom-
men hat.

Beachten Sie, daß Sendmail-CGIs häufig – und sinnvollerweise – so ein-
geschränkt sind, daß sie nur Aufrufe von der eigenen Domain akzep-
tieren. Ihr Shockwave-Film muß in diesem Fall also auf dem gleichen
Server liegen wie das Sendmail-CGI. Shockwave selbst produziert eine
Sicherheitsabfrage, falls Netlingo-Befehle auf Daten zugreifen wollen,
die auf einer fremden Domain liegen.

FTP. FTP gehört zu den von Director und Shockwave unterstützten Pro-
tokollen; Online-Medien können über FTP-URLs in Director-Besetzun-
gen gelinkt oder mit NetLingo-Befehlen zur Laufzeit geladen werden.
FTP-URLs bieten gegenüber HTTP-URLs einen entscheidenden Vorteil:
Es ist möglich, Username und Paßwort mit in der URL zu übergeben.
So können Sie paßwortgeschützte Daten via FTP in Ihre Produktion
einbinden:


 getnettext("ftp://user:pword@domain.de/test.txt")
 member(m).filename="ftp://user:pword@domain.de/test.dcr"


Mit dem Zusatz user:pword@ können Sie Ihren FTP-Username und Ihr
Paßwort mit in die FTP-URL integrieren. Obwohl dies in aktuellen
Browsern auch mit paßwortgeschützten HTTP-URLs funktioniert,
schlägt der Aufruf von entsprechend aufbereiteten URLs in Director
fehl.

Ein FTP-Upload ist in Netlingo nicht vorgesehen. Das für Windows ver-
fügbare Xtra DirectFTP (http://www.directxtras.com) schließt diese Lücke
zumindest teilweise. Das Freeware-Xtra XtraNet (http://www.human-
code.com/) bietet plattformübergreifend entsprechende Funktionalität
(vgl. Kapitel 9, „Xtra-Essentials“), ist aber äußerst dürftig dokumen-      702
tiert. Außerdem haben Sie mit postNetText() und getNetText() in
Verbindung mit entsprechenden CGIs sowie über die Datenbankfunk-
tionen des Multiuser-Xtras Möglichkeiten, Daten vom Anwenderrech-
ner auf Ihren Web- oder Multiuser-Server zu übertragen.

HTTPS. Das https-Protokoll wird von Shockwave nicht direkt unter-
stützt, vielmehr nutzt Shockwave den Browser und seine Fähigkeit, si-
chere Verbindungen herzustellen. Eine Shockwave-Anwendung im Pro-
jektor kann demnach für sich keine sicheren Verbindungen aufbauen;
ein Shockwave-Film im Browser kann es, insofern der Browser dazu in
der Lage ist. Da Shockwave 7 unter Microsoft Internet Explorer am Ma-


                                                                                   365
      Kapitel   4       Shockwave – Internet im Direktzugriff


                        cOS nicht die Browser-Implementierung von Internet-Protokollen
                        nutzt, ist HTTPS für Shockwave-Filme in diesem Browser nicht verfüg-
                        bar.



                                                Abbildung 4.17:
                                                Browser weisen beim Aufbau einer Verbindung zu
                                                einem „sicheren“ Server darauf hin




                        Da Macromedia um die Bedeutung von HTTPS auch für den Projektor
                        weiß, ist zu erwarten, daß in späteren Director-Versionen ein entspre-
                        chendes Feature eingebaut wird.

                        Shockwave-Kommunikation via Prefs
                        Shockwave-Filme im Browser – ob nun in unterschiedlichen Frames
                        der gleichen Seite oder auf mehrere Fenster verteilt – können über die
                        Preferences im Shockwave-Support-Ordner miteinander kommunizie-
                        ren. Diese einfache Technik ermöglicht erstaunliche Effekte. Ein Ar-
                 390   beitsbeispiel finden Sie in diesem Kapitel im Abschnitt „Kommunika-
                        tion zwischen Shockwave-Filmen“.

                        Das Prinzip ist einfach: Der „Sender“ schreibt einen String in eine Pre-
                        ferences-Datei mit


                         setPref "NameDerPrefsDatei", "String"


                        Der „Empfänger“ liest regelmäßig die Preferences-Datei mit


                         getPref("NameDerPrefsDatei")


                        und nutzt die übergebenen Daten. Soll eine beidseitige Kommunika-
                        tion erfolgen, so könnten die Nachrichten mit einer Property-Liste
                        übergeben werden, oder die unterschiedlichen Sender könnten jeweils
                        Ihre Nachrichten in unterschiedliche Zeilen der Preferences-Datei ein-
                        tragen.

                        Der setPref-Befehl funktioniert im Projektor nur eingeschränkt: Es
                        wird ein Ordner im Verzeichnis des Projektors erstellt, in den die Prefe-
                        rences-Datei geschrieben wird. Das heißt, eine Kommunikation des

366
                                    Arten der Online-Einbindung


Projektors mit Browser-Shockwave-Filmen ist so nicht möglich; genau-
sowenig kann ein Projektor auf CD-ROM oder anderen schreibge-
schützten Medien den Befehl setPref nutzen.

Streaming
Mit Streaming wird im allgemeinen eine spezielle Art des Ladevorgan-
ges beschrieben: Die bereits geladenen Teile des Films werden ange-
zeigt, noch während der Rest lädt. In diesem Sinn ist Shockwave eine
Streaming-Technologie. Ein anderer Aspekt von Streaming ist das Ein-
laden von externen Medien in einen laufenden Film: Zahlreiche Medi-
entypen, namentlich alle Grafikformate, müssen zunächst vollständig
heruntergeladen werden, bevor sie angezeigt werden können. Anders
verhält es sich mit externen Flash- und Shockwave-Audio-Dateien und
– unter bestimmten Voraussetzungen – QuickTime-Filmen. Hier ist
ebenfalls Streaming möglich.

Director-Filme und -Besetzungen
Um das Streaming eines Films zu aktivieren, wählen Sie im Dialog des
Befehls MODIFIZIEREN / FILM / ABSPIELEN die Option „Abspielen, während
Film geladen wird“. Auch ein Vorausladen einer bestimmten Anzahl
von Frames kann hier als Filmeigenschaft angegeben werden (vgl. Ab-
bildung 4.18).



                Abbildung 4.18:
Einfache Streaming-Kontrolle: In
   den Filmeigenschaften (Menü
 MODIFIZIEREN / FILM / ABSPIELEN)
setzen Sie die globalen Optionen




Diese globalen Einstellungen sind für sich allein genommen nur einge-
schränkt nützlich: Bei verzweigten, interaktiven Filmen müssen Sie
den Ladezustand bestimmter Bildbereiche überprüfen und steuern
können, und auch bei linearen Filmen ist die globale Option, eine ge-
wisse Anzahl Frames vorauszuladen, häufig nicht ausreichend.




                                                                         367
         Kapitel       4            Shockwave – Internet im Direktzugriff


                                    Streaming-Behaviors. Die mitgelieferte Behavior-BIBLIOTHEK hält in der
                                    Rubrik Internet/Streaming für einige häufige Anforderungen vorgefer-
                                    tigte Lösungen bereit. Beachten Sie, daß die Filmabspieleigenschaften
                                    für den Einsatz dieser Behaviors sinnvollerweise die in Abbildung 4.18
                                    gezeigten Einstellungen haben sollten.

                                    Die Behaviors nutzen preload-Befehle und entsprechende Statusabfra-
                                    gen, um die Verfügbarkeit von Bildbereichen oder Darstellern sicher-
                                    zustellen, bevor eine Abspielaktion ausgelöst wird:

                                    s   preload member(m) und member(m).mediaReady: Vorausladen von
                                        Darstellern

                                    s   preload(startFrame,endFrame) und frameReady(startFrame,
                                        endFrame): Vorausladen von Bildbereichen

                                    s   preload(Frame) und frameReady(Frame): Vorausladen eines Fra-
                                        mes

                                    s   preload() und frameReady(): Vorausladen des gesamten Films

                                    s   the idleLoadMode: Wird diese System-Property auf 0 gesetzt, so fin-
                                        det kein Laden während der idle-Events beim Abspielen statt; 2 er-
                                        laubt Ladevorgänge während aller Director-idle-Events. the idle-
                                        LoadMode wird in Zusammenhang mit preload-Vorgängen benutzt.

                                    s   getStreamStatus(url): Statusinformationen zu einem bestimm-
                                        ten Ladevorgang abfragen. Zurückgegeben wird eine Property-Liste
                                        mit den Properties #url, #state, #bytesSoFar, #bytesTotal,
                                        #error, die Sie beispielsweise für einen Fortschrittsbalken nutzen
                                        können. Vergleichen Sie auch den Handler on streamStatus im Ab-
                         355           schnitt „Netlingo“.



                 Abbildung 4.19:
   BIBLIOTHEK / INTERNET / STREA-
MING: nützliche Behaviors für das
      Fein-Tuning von Streaming




                                    Besonderheiten beim Streaming. Beachten Sie beim Streaming von
                                    Shockwave-Filmen folgende Besonderheiten:


368
                                    Arten der Online-Einbindung


s     Bestimmte Filminformationen und Darstellertypen werden in
      Director-Shockwave-Filmen automatisch an den Dateianfang
      sortiert und heruntergeladen, bevor die Wiedergabe des Fil-
      mes beginnt. Dazu gehören alle Drehbuchinformationen, alle
      Skripte und alle eingebetteten Schriften. Wenn Sie Fonts in
      Shockwave-Produktionen verwenden, sollten Sie daher nach
      Möglichkeit Subsets anlegen, um die initiale Wartezeit zu ver-
      kürzen.

s     Macromedia empfiehlt zur Optimierung des Streamings, die
      Darsteller in der Besetzung in der zu ladenden Reihenfolge ab-
      zulegen.

s     Bei der Verwendung gelinkter Darsteller sollten Sie berück-
      sichtigen, daß für die Wiedergabe im Browser eine Grenze für
      die Anzahl gleichzeitiger Streams existiert (häufig: 4 Streams),
      wobei beim Start des Downloads ein Stream vom Film selbst
      beansprucht wird. Ein fünfter Stream wird demnach erst
      dann bedient, wenn einer der ersten vier Streams abgeschlos-
      sen werden konnte.

s     Für externe Besetzungsdateien gilt sowohl das genannte Pro-
      blem simultaner Streams als auch ein weiteres, das mit der
      Art der Informationen in den Shockwave-Dateien von Filmen
      und Besetzungen zu tun hat. Sie sollten externe Besetzungen
      in Shockwave-Produktionen grundsätzlich nicht nutzen.
      Wenn es vom Design der Anwendung her nötig ist, empfiehlt
      es sich, interne „Dummy“-Castlibs anzulegen und dann zu
      den externen Castlibs zur Laufzeit zu linken. Externe (unge-
      linkte) Castlibs können Sie dann auch mit preloadNetThing()
      entsprechend vorausladen.

s     Ein Shockwave-Film mit externen, gelinkten Castlibs benötigt
      zunächst strukturelle Informationen, die auch die Informa-
      tion enthalten, daß gelinkte Castlibs vorliegen („|“ zeigt in Ab-
      bildung 4.20 den Zeitpunkt an, an dem diese Informationen
      vorliegen). Sodann müssen die Strukturinformationen aller
      gelinkten Castlibs geladen werden; erst bei „*“ liegen diese In-
      formationen für die einzelnen Bestandteile vor. Der Film kann
      erst nach Beendigung aller dieser Ladevorgänge mit dem Ab-
      spielen einer Animation beginnen.



                                  Abbildung 4.20:
    Streaming-Verhalten eines Shockwave-Films mit
                      externen, gelinkten Castlibs




                                                                          369
      Kapitel     4         Shockwave – Internet im Direktzugriff


                            Platzhalter. Aus gestalterischen Gründen ist es manchmal sinnvoll, an-
                            stelle der von Director angebotenen Platzhalter in Form von Rechtek-
                            ken (siehe Dialog MODIFIZIEREN / FILM / ABSPIELEN) mit der späteren Größe
                            des Sprites eigene Platzhalter (z.B. skalierte Bitmaps mit 1 Bit Farbtiefe
                            oder Vectorshapes) einzublenden, die durch den Originaldarsteller er-
                            setzt werden, sobald dieser vollständig geladen ist. Das folgende Beha-
                            vior zeigt eine mögliche Vorgehensweise.


                             property spr, mem
                             on beginsprite me
                               spr = the spritenum of me
                               mem = "Menue"
                             end

                             on prepareFrame me
                               if member(mem).mediaReady then
                                 sprite(spr).member = member mem
                                 updatestage
                               else
                                 go to the frame
                               end if
                             end


                            Sobald der in der Property mem gespeicherte Darsteller geladen ist, wird
                            er mit dem Sprite spr verknüpft und die Wiedergabe des Films im
                            nächsten Bild fortgesetzt.

                            Video
      Aktuelle Ergänzung!   Wenn Sie folgende Voraussetzungen erfüllen, können Videos mit Stre-
                            aming in Director 7 Shockwave verwendet werden:

                            s   der Shockwave-Film wurde in Director 7.02 oder neuer erstellt
                            s   das Video wurde über eine URL eingebunden
                            s   in den Einstellungen des Videofilmes ist „Faststart“ aktiviert
                    186    Zum QuickTime 4-RTSP-Streaming vgl. Sie Kapitel 2, „Video“.

                            Die Darsteller-Property streaming können Sie nur mit Lingo setzen; es
                            gibt keine Entsprechung in den Eigenschaftsdialogen für QuickTime-
                            Darsteller:


                             member("MyQtMember").streaming = TRUE


                            Sind diese Voraussetzungen erfüllt, so können Sie den Fortschritt beim
                            Streaming des QuickTime-Darstellers mit der Sprite-Property percent-
                            Streamed abfragen:


                             put sprite(x).percentStreamed


370
                                     Arten der Online-Einbindung


Eventuell wurden nach Redaktionsschluß dieses Buches weitere Pro-
perties definiert; informieren Sie sich in der Director-Hilfe.

Wollen Sie CuePoints in QuickTime-Filmen verwenden, die mit Strea-          Zu CuePoints in QuickTime-
ming abgespielt werden sollen, so müssen Sie die Option „Beim Öffnen        Filmen vgl. Kapitel 2
laden“ für den Text-Track des QuickTime-Filmes in einem Video-Editor         217
(z.B. Movie Player Pro) aktivieren. Dies stellt sicher, daß die CuePoint-
Informationen beim Start des Filmes bereits vollständig zur Verfügung
stehen.

Für das Streaming ist in Director 7 weiterhin das QT3Asset-Xtra zustän-
dig. Allgemeine Arbeitstechniken zum Umgang mit QuickTime-Dar-
stellern in Director-Produktionen, wie sie in Kapitel 2 beschrieben
sind, gelten daher weiterhin. Einige Besonderheiten sind bei der Ver-
wendung von QT3-Assets in Shockwave zu beachten:

s   Das Abspielen von QT3-Assets erfordert, daß das QT3Asset-Xtra in-
    stalliert ist. Um auf Gastrechnern, auf denen das Xtra noch nicht
    vorhanden ist, einen Auto-Download auszulösen, sollten sie im
    Dialog MODIFIZIEREN / FILM / XTRAS das QT3Asset-Xtra auswählen und
    die Option „Bei Bedarf herunterladen“ aktivieren.

s   Da Sie auch nicht davon ausgehen können, daß QuickTime 3 oder
    4 auf dem Gastrechner installiert ist, sollten Sie die Funktion
    quickTimeVersion() des Asset-Xtras nutzen, um die vorhandene
    QuickTime-Version zu überprüfen. quickTimeVersion() gibt 0 zu-
    rück, wenn nicht mindestens QuickTime 3 installiert ist.

s   Shockwave 7 stellt QuickTime-Filme, die mit der Darstellereigen-
    schaft member(m).directToStage = TRUE in einen Shockwave-Film
    eingebunden wurden, möglicherweise außerhalb der Begrenzung
    des Filmes und – bei kleiner Darstellungsfläche des Browsers –
    auch außerhalb dieser Darstellungsfläche dar.

s   Soll ein QuickTime-Film vorgeladen und erst dann angezeigt wer-
    den, nutzen Sie wie bei anderen externen Medien preload-
    NetThing("url") und member(m).filename = "url".

s   Um das Streaming von „Faststart“-QuickTime-Filmen auszuschal-
    ten, setzen Sie member(m).streaming = FALSE.

Für die Einbindung von RealVideo gibt es keine Xtra-Lösung. Allerdings
gilt hier wie bei anderen Technologien, die über Browser-Scripting
steuerbar sind, daß Sie mit entsprechendem JavaScript-/VBScript-Auf-
wand eine Steuerung der Inhalte eines zweiten Browser-Fensters aus ei-
nem Shockwave-Film heraus erreichen können.

Flash
Beim Anlegen eines Flash-Darstellers können Sie festlegen, ob ein ge-
linkter Darsteller angelegt oder ob der Shockwave-Flash-Film impor-



                                                                                                    371
      Kapitel   4   Shockwave – Internet im Direktzugriff


                    tiert werden soll. Ein gelinkter Darsteller wird standardmäßig mit Stre-
                    aming abgespielt; nur, wenn Sie die Option „Vorausladen“ anwählen,
                    wird der ganze Darsteller vor der Wiedergabe vorgeladen.



                                         Abbildung 4.21:
                                         Flash-Darstelleroptionen: Nur verknüpfte Darsteller
                                         können mit Streaming abgespielt werden




                    Lingo bietet zahlreiche Möglichkeiten, auf das Streaming von Shock-
                    wave-Flash-Dateien Einfluß zu nehmen.

                    member(FlashMember).preload

                    Diese Darsteller-Property muß den Wert 0 haben, damit ein Flash-Film
                    gestreamed werden kann. member(FlashMember).preload = 1 lädt den
                    gesamten Darsteller vor.

                    member(FlashMember).streamMode

                    Diese Darstellereigenschaft legt fest, wie oft Director nach neuen Da-
                    ten für einen Darsteller nachfragt. member(FlashMember).streamMode =
                    #frame ist die Standardeinstellung; pro Director-Frame findet ein Lade-
                    vorgang statt, in dem Daten des Darstellers gestreamed werden. #idle
                    lädt zumindest einmal pro Frame, möglicherweise aber öfter. Für
                    beide Modi muß sich das Sprite auf der Bühne befinden, in dem sich
                    der Abspielkopf befindet. #manual streamt nur dann einen Teil des Dar-
                    stellers in den Speicher, wenn ein stream-Befehl für diesen Darsteller
                    erfolgt.

                    stream(member(FlashMember), numberOfBytes), stream(member(Flas
                    hMember))

                    Diese Funktion erlaubt es, gezielt eine bestimmte Anzahl von Bytes ei-
                    nes Flash-Darstellers zu laden, unabhängig davon, ob sich der Darstel-
                    ler auf der Bühne befindet oder nicht. streamMode muß dabei den Wert
                    #manual haben. Ist numberOfBytes nicht angegeben, so wird statt des-
                    sen der in der Darsteller-Property bufferSize angegebene Wert ge-
                    nutzt. Die Funktion gibt die Anzahl an Bytes zurück, die tatsächlich ge-
                    laden wurden, so daß auch eine genaue Kontrolle des Streaming-Vor-
                    gangs möglich ist.

                    member(FlashMember).bytesStreamed,
                    member(FlashMember).percentStreamed,
                    member(FlashMember).streamSize




372
                                     Arten der Online-Einbindung


streamSize gibt die Gesamtgröße der Flash-Datei an; die beiden ande-
ren Properties können für Fortschrittsanzeigen und ähnliches genutzt
werden.

member(FlashMember).state

Die state-Eigenschaft kann für gestreamte Flash-Darsteller folgende
Werte annehmen:

s   -0        Der Darsteller ist nicht im Speicher.

s   -1        Das Laden der Header-Information hat begonnen.

s   -2        Der Header ist geladen.

s   -3        Das Laden der Darsteller-Media hat begonnen.

s   -4        Die Darsteller-Media sind geladen.

s   -1        Es ist ein Fehler aufgetreten.

member(FlashMember).linked,
member(FlashMember).pathName,
member(FlashMember).url

Die Darstellereigenschaft linked erlaubt es zu überprüfen, ob es sich
um externe oder interne Darsteller handelt, bzw. externe Darsteller zu
importieren. Die Pfadangaben zu externen Darstellern können alterna-
tiv mit pathname oder url angegeben werden.

member(FlashMember).frameCount,
frameReady(sprite(FlashSprite), frameNumber)

Die Darstellereigenschaft frameCount gibt die Gesamtzahl der Frames
eines Flash-Darstellers zurück. Die Funktion frameReady überprüft, ob
die Daten zur Darstellung eines bestimmten Frames bereits geladen
wurden.

Audio
Shockwave Audio. Das Streaming von Shockwave Audio-Darstellern
kann ohne jedes Scripting erreicht werden. Legen Sie zunächst mit
dem Menübefehl EINFÜGEN / MEDIAELEMENT / SHOCKWAVE AUDIO einen
neuen Darsteller an und geben Sie die URL („Verknüpfungsadresse“)
an. Im selben Dialog können Sie auch die Lautstärke, den Soundkanal,
in dem der Darsteller abgespielt werden soll (Standard: „Irgendeiner“)
und die Vorausladezeit des Darstellers einstellen. Dies entspricht den
Darstellereigenschaften URL, volume, soundChannel und preloadTime.
Klicken Sie auf Abspielen, so erhalten Sie zusätzlich Eigenschaften der
betreffenden SWA-Datei angezeigt (entsprechend duration, bitRate,
sampleRate, bitDepth und numChannels).




                                                                          373
      Kapitel   4   Shockwave – Internet im Direktzugriff


                                                       Abbildung 4.22:
                                                       SWA-Darstellereigenschaften: Klicken
                                                       Sie auf „Abspielen“, um die URL und das
                                                       Streaming des Darstellers zu überprüfen




                    Ziehen Sie den Darsteller in einen der Sprite-Kanäle im Drehbuch –
                    nicht in einen Soundkanal. Erreicht der Abspielkopf das Sprite, so wird
                    das Abspielen des SWA-Darstellers gestartet. Das schließt ein, daß zu-
                    nächst die in „Vorausladezeit“ angegebene Zeitspanne des Sounds gela-
                    den wird, bevor die Wiedergabe beginnt. Mit folgendem Skript loopt
                    der Abspielkopf auf einem Frame, bis die Wiedergabe des SWA-Darstel-
                    lers beendet ist. Die Abfrage von mytimer erfolgt, um Situationen abzu-
                    fangen, in denen keine Verbindung zustande kommt oder der Preload
                    bereits unverhältnismäßig lange dauert.


                     property mytimer
                     on exitFrame me
                       if voidp(mytimer) then mytimer = the ticks
                       put member(1,1).state&return&member(1,1).¬
                     percentStreamed&&return&member(1,1).percentPlayed&¬
                     return&member(1,1).duration
                       case member(1,1).state of
                         0: put "stopped"
                         1,2,3,4: go to the frame
                         5: go to the frame + 1
                         9,10: put getErrorString(member(1))
                       end case
                       -- Preloadphase maximal das Vierfache der preloadTime
                       if (the ticks – mytimer > member(1,1).preloadtime*4*60¬
                       and member(1,1).state < 2 then
                         go to the frame + 1
                         alert "Keine Verbindung."
                       end if
                     end


                    Mit folgenden Lingo-Befehlen können Sie das Streaming und die Wie-
                    dergabe von SWA-Darstellern beeinflussen oder Statusinformationen
                    abfragen:

                    preLoadBuffer member(meinSWA), member(m).preLoadTime

                    Der Befehl preloadBuffer lädt den in member(m).preloadTime angege-
                    benen Abschnitt eines SWA-Files in den Arbeitsspeicher. preloadTime
                    spezifiziert die Zeit (in Sekunden), die vorgeladen werden soll; erst
                    wenn der Bereich geladen ist, beginnt die Datei zu spielen.

374
                                         Arten der Online-Einbindung


member(meinSWA).state

Diese Darstellereigenschaft können Sie nur überprüfen, nicht setzen.
Für gestreamte SWA-Darsteller kann state folgende Werte annehmen:

s    0        Streaming angehalten/kein Streaming.

s    1        Preload läuft.

s    2        Preload erfolgreich beendet.

s    3        Darsteller wird abgespielt.

s    4        Darsteller ist pausiert.

s    5        Streaming (und Wiedergabe) des Darstellers beendet.

s    9        Ein Fehler ist aufgetreten.

s   10        Mangelnder Speicherplatz.

getError(member(meinSWA)),
getErrorString(member(meinSWA))

Beide Funktionen geben eventuell aufgetretene Fehler – als Fehlercode
oder als String – zurück. Dies sind die möglichen Werte:

s    0        „OK“

s    1        „memory“

s    2        „network“

s    3        „playback device“

s   99        „other“

member(meinSWA).URL, member(meinSWA).streamName

Legt die Datei fest, die einem SWA-Darsteller zugeordnet werden soll.
In beiden Fällen geben Sie eine http- oder file-URL an.

member(meinSWA).percentPlayed,
member(meinSWA).percentStreamed,
member(meinSWA).bytesStreamed

Darstellereigenschaften, die beispielsweise in Fortschrittsanzeigen ge-
nutzt werden können, um dem Nutzer Rückmeldung über den Ab-
spiel- bzw. Stream-Status zu geben.

play member(meinSWA), pause member(meinSWA),
stop member(meinSWA)

Die Befehle steuern das Abspielen von SWA-Darstellern. Die state-Pro-
perty wird durch play auf 3 gesetzt, falls der Sound mit preloadBuffer
vorausgeladen wurde; ansonsten wird zunächst der Preload gestartet.
pause setzt state auf 4, stop auf 0.

                                                                          375
      Kapitel     4         Shockwave – Internet im Direktzugriff


                            Weitere Befehle und Properties, die Sie mit SWA-Dateien verwenden
                            können, sind in Kapitel 2 beschrieben. Insbesondere gibt es verschie-
                            dene Properties, die Informationen über die SWA-Datei zurückgeben
                            (duration, bitRate, bitsPerSample, sampleRate, numChannels,
                            copyrightInfo, cuePointTimes, cuePointNames) und Möglichkeiten,
                            Abspieleigenschaften zu setzen (volume, soundChannel) oder abzufra-
                            gen (isPastCuepoint(), mostRecentCuePoint()).

                            Beachten Sie folgende Besonderheiten beim Streaming von Shockwave-
                            Audio-Daten:

                            s   Die Darsteller-Properties streamName, URL und preLoadTime können
                                nur verändert werden, wenn der Darsteller angehalten wurde und
                                state den Wert 0 hat.

                            s   Folgende Properties eines SWA-Files können nur abgefragt wer-
                                den, wenn der Preload des Darstellers beendet wurde, also state
                                größer als 1 ist: cuepointNames, cuepointTimes, currentTime,
                                duration, percentPlayed, percentStreamed, bitRate, sample-
                                Rate und numChannels.

                            s   Das Shockwave-Audio-Decompression-Xtra erlaubt nicht, mehrere
                                simultane Audio-Streams zu dekomprimieren. Sie sollten also
                                nicht versuchen, zwei oder mehr streamende Audio-Dateien in ei-
                                ner Shockwave-Anwendung zu mixen.
      Aktuelle Ergänzung!   MP2, MP3. In Director-Versionen neuer als Version 7.01 ist es möglich,
                            auch MPEG 1 Layer 3 Audio (kurz: MP3) abzuspielen und über Netzver-
                            bindungen zu streamen. Wenn Ihre Director-Installation das Xtra
                            MPEG 3 Import Export enthält, ist das Programm sehr wahrscheinlich
                            dazu in der Lage.

                            MP3-Dateien sind nach dem gleichen Grundprinzip komprimiert wie
                            Shockwave-Audio. Allerdings enthalten MP3-Dateien die Shockwave-
                            Audio-spezifischen Header-Informationen nicht, so daß bestimmte Sta-
                            tus- und Dateiinformationen nicht verfügbar sind. Für MP3-Dateien
                            gilt ebenso wie für Shockwave-Audio, daß die Datenrate so gewählt
                            werden sollte, daß ein Streaming über die Internet-Verbindung des
                            Nutzers auch wirklich möglich ist.

                            Stellen Sie außerdem sicher, daß Sie das benötigte Xtra für den Auto-
                            Download durch den Shockwave-Player markieren (vgl. Abschnitt „Das
                    320    Shockwave Plug-in“ in diesem Kapitel). Leider können wir derzeit nicht
                            mit Sicherheit sagen, welche Xtras zum Abspielen und Streamen von
                            MP3-Dateien genutzt werden; das oben genannte Xtra MPEG 3 Import
                            Export wird aber sehr wahrscheinlich benötigt.

                            Dateien im Vorgängerformat MP2 können ebenfalls importiert und ab-
                            gespielt werden, ein Streaming ist aber nicht möglich.




376
                                     Arten der Online-Einbindung


QuickTime (Audio-only). Wie Video können auch QuickTime-Filme, die
nur einen Audio-Track enthalten, unter den oben genannten Voraus-
setzungen mit Streaming abgespielt werden.

RealAudio. RealAudio, die am weitesten verbreitete Audio-Streaming-
Technologie, konnte in Director 6 über ein Xtra eingebunden werden.
Das Xtra wurde für Director 7 nicht aktualisiert; auch war über ent-
sprechende Pläne der Herstellerfirma RealNetworks nichts zu erfah-
ren. Zum Redaktionsschluß dieses Buches müssen wir daher davon
ausgehen, daß RealAudio – zumindest eingebunden in Shockwave-
Filme – nicht mehr verwendet werden kann.

Multiuser-Xtra und -Server
Multiuser-Funktionalität wird durch zwei Komponenten bereitgestellt:
eine Multiuser-Server-Applikation (derzeit verfügbar für MacOS und
Windows; eine UNIX-Version ist geplant) und ein Multiuser-Xtra für Di-
rector und Shockwave. Der Server kann folgende Funktionen überneh-
men:

s   Verbindungsmanagement, paßwortgeschützter Zugriff

s   Routing der netMessages der Clients, Verteilung je nach Empfän-
    ger(-gruppe)

s   Generierung eigener system-Messages.

s   Datenbankfunktionen (basierend auf dBase-Datenbankdateien
    mit Indizierung; Erweiterung um Memo-Felder für Text und „Me-
    dien“)

s   Vermittlung der IP-Nummern von Clients für Peer-to-peer-Verbin-
    dungen

Die Konfiguration des Servers erfolgt mit der Datei MULTIUSR.CFG. Sollen
spezielle Konfigurationseinstellungen für einzelne Filme gelten, so
werden entsprechende zusätzliche Konfigurationsdateien mit der Be-
zeichnung Filmname.cfg erstellt. In den Konfigurationsdateien werden
auch die Datenbankdateien angegeben, die der Server nutzen soll
(s.u.).

Das Multiuser-Xtra unterstützt zwei Typen von Verbindungen: Server-
Client-Anwendungen nutzen den Multiuser-Server als Vermittler für
alle Nachrichten zwischen den Shockwave-Applikationen; sie können
dadurch auch die erweiterten Server-Funktionen wie Datenbankzu-
griff nutzen. Peer-to-peer-Anwendungen stellen eine Verbindung zwi-
schen zwei oder mehr Rechnern her, von denen einer als Host fungiert
und seine Bereitschaft signalisiert, Verbindungen entgegenzunehmen.
Die Funktionen des Multiuser-Xtra lassen sich in folgende Gruppen fas-
sen:



                                                                           377
         Kapitel        4         Shockwave – Internet im Direktzugriff


                                  s   Instanz des Xtras für eine neue Verbindung erzeugen: new()

                                  s   Verbindungsaufnahme mit dem Server bzw. dem Host einer Peer-
                                      to-peer-Verbindung: ConnectToNetServer()

                                  s   Nachrichten an den Server, Host oder andere Clients senden: Send-
                                      NetMessage()

                                  s   Callback-Handler für Nachrichten vom Server einrichten: SetNet-
                                      MessageHandler()

                                  s   Peer-to-peer-Verbindungen verwalten: GetNetAddressCookie(),
                                      WaitForNetConnection(), BreakConnection(), GetPeerConnec-
                                      tionList()

                                  s   Handling von Nachrichten und Fehlermeldungen: GetNetMes-
                                      sage(), CheckNetMessages(), GetNumberWaitingMessages(),
                                      GetNetOutgoingBytes(), GetNetErrorString()

                                  s   Voreinstellungen ändern: SetNetBufferLimits()

                                  Lassen Sie sich nicht täuschen von diesem begrenzten Inventar an Be-
                                  fehlen. Sie bieten lediglich den Rahmen, innerhalb dessen die Nach-
                                  richten zwischen den Shockwave-Applikationen und mit dem Server
                                  ausgetauscht werden. Insbesondere die Befehle SendNetMessage() und
                                  SetNetMessageHandler() sind universale „Container“, die alle Arten
                                  von Nachrichten adressieren (an den Server, namentlich an einzelne
                                  User, an User-Gruppen, an alle User) und verschicken können. Als
                                  Nachrichten gelten dabei vordefinierte Funktionsaufrufe für Server-
                                  oder Movie-Funktionen oder auch selbstdefinierte Lingo-Handler.
      Sie finden die Multiuser-   Falls Ihr Director 7-Handbuch kein Kapitel zum Multiuser-Server ent-
 Dokumentation auch auf der       hält, so können Sie es als PDF vom Macromedia-Webserver herunterla-
   CD-ROM unter WORKSHOP \        den. Die URLs sind http://download.macromedia.com/pub/director/d7/win/
         KAPITEL04 \ MULTIUSER    multiuser.zip (als ZIP-Archiv für Windows) bzw. http://download.macrome-
                                  dia.com/pub/director/d7/mac/multiuser.sea.hqx (für MacOS). Die Archive ent-
                                  halten auch einen Beispielfilm.

                                  Das Handbuch enthält eine Liste der speziellen Errorcodes des Multi-
                                  user-Xtras und Servers sowie ein vollständiges Listing der mit SendNet-
                                  Message() aufrufbaren Funktionen. Einiges davon finden Sie im Ar-
                         402     beitsbeispiel MULTIUSER-DATENBANK in diesem Kapitel.

                                  Einsatzbeispiele
 Alle genannten Beispiele fin-    Die ersten im Internet verfügbaren Beispiele für Multiuser-Anwendun-
 den Sie online im Director 7-    gen in Shockwave waren naheliegenderweise Chat-Anwendungen (vgl.
      Developer-Showcase auf      Abschnitt „Multiuser-Jump-Start“ in diesem Kapitel). Chat wird außer-
http://www.director7.de/html/     dem häufig mit anderen Multiuser-Komponenten kombiniert. Brett-
              9812shock.html      spiele sind ebenfalls ein dankbares Thema und relativ einfach umzu-
                                  setzen, insbesondere, wenn die Logik des Spieles nicht zu kompliziert
                                  ist: Hier gibt es bereits zahlreiche Beispiele von Go, Reversi und ähnli-


378
                                    Arten der Online-Einbindung


chem. Quizanwendungen, bei denen mehrere Teilnehmer gegeneinan-
der antreten, sind ebenso realisierbar. Anspruchsvollere Multiuser-An-
wendungen sind beispielsweise eine Live-Jam-Musikmaschine, an der
mehrere Teilnehmer gemeinsam das Mixing eines Musikstückes beein-
flussen können, sowie Quad-3d-Welten, in denen sich mehrere Figuren
bewegen.

Diese kurze Liste zeigt bereits, daß Multiuser-Anwendungen in vielen
Bereichen möglich sind, die heute von „normalen“ Shockwave-Anwen-
dungen abgedeckt werden. Dahinter steht der Gedanke, daß es un-
gleich motivierender ist, gegen oder mit realen Personen zu spielen
und zu interagieren, als eine Online-Anwendung alleine zu bedienen.

Als Einschränkung für Multiuser-Anwendungen steht nur die Daten-
menge im Raum, die für jede Aktion oder Statusänderung ausge-
tauscht werden muß. Der Programmierer einer Multiuser-Anwendung
wird großen Wert darauf legen, daß nur minimale Statusmeldungen
ausgetauscht werden (dies aber möglichst häufig); die datenintensiven
Teile einer Anwendung (Grafik, Sound, Skripte) werden im Normalfall
nicht versendet. Soll beispielsweise eine Tafel programmiert werden,
auf der eine Arbeitsgruppe schreiben und malen kann, so wird die Her-
ausforderung für den Director-Programmierer darin liegen, diese Ak-
tionen und ihre Parameter beschreibbar zu machen, er wird nicht – ob-
wohl das grundsätzlich möglich wäre – das Bild der Tafel jeweils an die
gesamte Arbeitsgruppe verschicken.

Lizenzierung des Servers
Eine Lizenz des Multiuser-Servers für 50 simultane Anwender gehört
zum Lieferumfang des Director 7 Shockwave Internet Studio-Paketes.
Benötigen Sie eine Lizenz für mehr simultane Anwender, so haben Sie
die Möglichkeit, entsprechende Lizenzen (für maximal 100, 500 oder
1.000 simultane User) von Macromedia zu erwerben. Rechnen Sie mit
Kosten in Höhe von etwa 10 US-Dollar pro User-Einheit. Nähere Infor-
mationen finden Sie unter http://www.macromedia.com/products/director/
multiuser/.

Multiuser-Jump-Start: Die Chat-Behaviors
Die bei Director 7 mitgelieferte Behavior-Library (BIBLIOTHEK) birgt
echte Schätze. So können Sie die im Submenü MULTIUSER versammelten
Behaviors nutzen, um in fünf Minuten Ihre erste eigene Multiuser-An-
wendung zu erstellen: einen voll funktionsfähigen Chat-Room.

Um die Behaviors zu nutzen, sollten Sie einen Film mit zwei getrenn-
ten Bereichen anlegen: einem Login-Bereich (Frames 2 bis 9 in Abbil-
dung 4.24) und einem Chat-Bereich (Frames 10 bis 19). Auf dem letzten
Frame der beiden Bereiche befindet sich jeweils ein go to the frame-
Frame-Skript.



                                                                          379
      Kapitel      4            Shockwave – Internet im Direktzugriff



                                                      Abbildung 4.23:
                                                      Fünf Behaviors für Ihre erste Multiuser-Anwendung:
                                                      einer der Höhepunkte unter den Behaviors in der
                                                      BIBLIOTHEK




                               Abbildung 4.24:
      Einfaches Drehbuch für den Multiuser-Chat




                                Im Login-Bereich brauchen Sie zwei (editierbare) Eingabefelder für
                                Name und Paßwort (hier „Username“ und „UserPW“ genannt) sowie ei-
                                nen Button, der das Behavior „Connect To Netserver“ erhalten soll (Ab-
                                bildung 4.25). In dem Behavior geben Sie die Namen der Eingabefelder,
                                das Framelabel des Chat-Bereiches (hier „connected“), die IP-Adresse
                                oder die URL Ihres Multiuser-Servers sowie die Port-Nummer desselben
                                (standardmäßig „1626“) an. Die weiteren Angaben sind für den Anfang
                                unwichtig.

                                Der Chat-Screen enthält die Elemente aus Abbildung 4.26; das Chat-
                                Eingabefeld ist ein editierbares Textfeld. Weisen Sie die entsprechen-
                                den Behaviors zu, die Sie nicht weiter konfigurieren müssen. Außer-
                                dem sollten Sie dem Disconnect-Button ein Behavior zuweisen, das auf
                                mouseUp wieder auf Frame 1 der Anwendung springt.




380
                                   Arten der Online-Einbindung



                Abbildung 4.25:
Login-Screen: Sie benötigen Ein-
gabefelder für den Login-Namen
  (1) und das Paßwort (2) sowie
   einen Connect-Button (3) mit
 dem Behavior „Connect to Net-
                        server“




                                                                      Abbildung 4.26:
                                                                      Chat-Screen: Liste der angemel-
                                                                      deten User (4) mit Behavior
                                                                      „Display Group Member
                                                                      Names“, Chat-Eingabe (5) mit
                                                                      Behavior „Chat Input“, Chat-Aus-
                                                                      gabe (6) mit Behavior „Chat Out-
                                                                      put“ und Disconnect-Button (7)
                                                                      mit Behavior „Disconnect From
                                                                      Server“ und einem weiteren
                                                                      Behavior „go to frame 1“




Damit ist Ihr Chat-Movie im Prinzip fertiggestellt. Aus Gründen der
Übersichtlichkeit sollten Sie noch ein Movie-Skript hinzufügen, das
beim Anhalten des Filmes die Prozedur destroy im Server-Verbin-
dungsskript aufruft:


 on stopmovie
   call(#destroy, the actorList)
 end




                                                                                                    381
      Kapitel   4       Shockwave – Internet im Direktzugriff


                        Alle Instanzen des Chat-Managers (die im Skript „Connect to Netser-
                        ver“ erzeugt werden) werden damit aus der actorList entfernt; die Ver-
                        bindung Ihres Filmes zum Server wird unterbrochen.

                        Den Multiuser-Server müssen Sie für das Chat-Beispiel nicht besonders
                        konfigurieren. Starten Sie ihn auf einem Rechner in Ihrem lokalen
                        Netzwerk oder auf einem Rechner mit fester IP-Adresse und Internet-
                        Verbindung; und geben Sie jeweils die IP-Adresse im Konfigurations-
                        dialog des Skriptes „Connect to Netserver“ an.

                        Die in den Arbeitsbeispielen vorgestellte Technik, member(m).media als
                        Inhalt einer Netmessage zu übertragen, können Sie beim Chat nutzen,
                        um zusätzlich zu Textnachrichten beispielsweise auch Bilder u.ä. zu
                        übertragen.

                        Datenbankfunktionen des Multiuser-Servers
                        Datenbank einrichten (Server). Datenbanken, die Sie mit dem Multi-
                        user-Server nutzen wollen, müssen im dBase-Format angelegt werden.
                        Neben zahlreichen Datenbankprogrammen bietet beispielsweise auch
                        Microsoft Excel eine entsprechende Exportoption. Um Such- und Sor-
                        tierfunktionen des Multiuser-Servers nutzen zu können, muß eine In-
                        dexdatei erstellt werden. Der Server ist zwar in der Lage, Indizes zu ak-
                        tualisieren, greift dabei aber auf eine bereits bestehende Index-Datei
                        zu. Spezielle Memo-Felder für längere Texte oder auch für Binärinfor-
                        mationen (Bilder etc.) können Sie mit dem Programm Fox Pro anlegen
                        (für MacOS und Windows verfügbar).

                        Um die erstellte Datenbank (bzw. Datenbankstruktur) über den Multi-
                        user-Server nutzbar zu machen, sind entsprechende Einträge in der
                        Datei MULTIUSER.CFG oder der entsprechenden Movie-Konfigurationsda-
                        tei nötig. Tragen Sie hinter dem Schlüsselwort Databases die vollstän-
                        digen Pfade zu den Datenbankdateien ein. Sie dürfen keine Leerzei-
                        chen enthalten:


                         Databases = Macintosh_HD:D7_MU:Database:Memobin.dbf           \
                         Macintosh_HD:D7_MU:Database:MemoText.dbf \
                         Macintosh_HD:D7_MU:db2:sampdata.dbf

                        Außerdem können Sie für jede Datenbankaktion (Suchen, Neu eintra-
                        gen, Löschen etc.) ein User-Level eintragen; damit läßt sich der Zugriff
                 402   auf die Datenbank gezielt steuern (vgl. Arbeitsbeispiel „Multiuser-Da-
                        tenbank“).

                        Datenbank nutzen (Client). Auch der Datenbankzugriff mit dem Multi-
                        user-Xtra und Server ist – wie oben bereits geschildert – asynchron. An-
                        ders als bei anderen Datenbank-Xtras (vgl. Kapitel 3) müssen Sie hier
                        bei Befehlsfolgen den Ergebniswert jedes einzelnen Befehls abwarten
                        und überprüfen. Das führt zu einer recht umständlichen Scripting-


382
                                   Arten der Online-Einbindung


Technik, die zusammen mit der eingeschränkten Funktionalität des
DBF-Datenbankformats eher vom Einsatz des Multiuser-Servers als On-
line-Datenbank zurückschrecken läßt. Dennoch lassen sich einfache
Datenbanken mit dem Multiuser-Server problemlos realisieren.

Der Multiuser-Server versteht folgende an "SYSTEM" gerichtete Daten-
bankbefehle:


#Subject                          #Content
selectDatabase                    "Datenbankname"
getReadableFieldList
getWritableFieldList
getRecordCount
goToRecord                        1 (Record-Nummer)
skip                              1 (Anzahl zu überspringen)
seek                              "Suchwort"
getRecords                        2 (Anzahl)
getFields                         [#Feldname1, ...]
setFields                         [#Feldname1: Wert1, ...]
lockRecord
unlockRecord
deleteRecord
recallRecord
isRecordDeleted
pack
appendRecord
selectTag                         "Feldname"
reIndex


Typische Codezeilen, die Datenbankfunktionen aufrufen, sind bei-
spielsweise:


 errCode = sendNetMessage(gConnectionInstance, "System", "se
 lectDatabase", "myDataBase")
 errCode = sendNetMessage(gConnectionInstance, "System", "go
 ToRecord", 1)
 errCode = sendNetMessage(gConnectionInstance, "System", "ge
 tRecords", 1)

Da es sich um asynchrone Aktionen handelt, müssen Sie stets das Er-
gebnis eines sendNetMessage() abwarten, bevor die nächste Aktion ge-
startet werden kann. Dies geschieht beim Multiuser-Server mit Call-
back-Handlern (vgl. Abschnitt „Asynchrones Scripting“ und Arbeitsbei-    342, 402
spiel „Multiuser-Datenbank“).




                                                                                     383
      Kapitel   4   Shockwave – Internet im Direktzugriff


                    Peer-to-peer-Verbindungen
                    Multiuser-Verbindungen, bei denen kein Server beteiligt ist, sind mit
                    dem Multiuser-Xtra ebenfalls möglich. Diese sogenannten Peer-to-peer
                    Verbindungen können natürlich nicht die speziellen Funktionen des
                    Multiuser-Servers verwenden (Serverbefehle, Datenbankfunktionen).

                    Bei einer Peer-to-peer-Verbindung tritt ein Director-Film als „Host“ auf;
                    d.h. er wartet auf eingehende Verbindungen und leitet eingehende
                    Nachrichten weiter. Bis zu 16 Teilnehmer können sich auf Peer-to-peer-
                    Basis bei einem Host-Film einloggen. Die Netzwerkadresse des Hosts
                    (IP-Adresse) muß den anderen Teilnehmern bekannt sein.

                    Einige Multiuser-Lingo-Befehle sind nur bei Peer-to-peer-Verbindungen
                    einsetzbar: WaitForNetConnection(), BreakConnection(), GetPeerCon-
                    nectionList().

                    waitForNetConnection(connectionObject, "userIDString", portNum
                    ber{,maxNumberOfConnections, "encryptionKeyString"})

                    Mit waitForNetConnection() weist sich ein Film als Host aus: andere
                    können sich sodann einloggen. userIDString ist der Name, mit dem
                    sich der Host selbst ausweist; portNumber ist der TCP-Port, auf dem der
                    Host empfängt (standardmäßig sollte 1626 verwendet werden). Außer-
                    dem kann die Maximalzahl der Verbindungen und ein optionaler Key
                    für die Verschlüsselung des Verbindungsaufbaus angegeben werden.

                    breakConnection(connectionObject, "userIDString")

                    BreakConnection() gibt dem Host die Möglichkeit, die Verbindung zu
                    einzelnen Teilnehmern zu unterbrechen.

                    getPeerConnectionList(connectionObject)

                    gibt eine Liste aller bestehenden Peer-to-peer-Verbindungen zurück. Im
                    Fehlerfall ist das Ergebnis eine leere Liste.

                    getNetAddressCookie(connectionObject {,encryptFlag})

                    Der Befehl erzeugt ein verschlüsseltes „Cookie“, das die eigene IP-
                    Adresse enthält. Typischerweise könnte ein Film während einer Client-
                    Server-Session einem anderen Teilnehmer der Session ein solches Coo-
                    kie zusenden, um mit ihm eine Peer-to-peer-Verbindung aufzubauen.
                    Der Film, der das Cookie versendet, könnte so, ohne seine IP-Adresse öf-
                    fentlich zu machen, als Host einer Peer-to-peer-Verbindung zur Verfü-
                    gung stehen.

                    Wird encryptFlag auf Null gestellt, so gibt getNetAddressCookie() die
                    unverschlüsselte IP-Adresse zurück. Dieser Funktion wird im Shock-
                    wave- und safePlayer-Modus nicht unterstützt.




384
                                       Arten der Online-Einbindung


Alle weiteren Funktionen und Arbeitsweisen, insofern sie nicht spezi-
elle Fähigkeiten des Multiuser-Servers verwenden, können auch bei
Peer-to-peer-Verbindungen verwendet werden.

Zukunftsmusik: Java, XML und mehr
Wenn Sie den folgenden Abschnitt gelesen haben, werden Sie sich
wahrscheinlich denken: Da haben es sich die Autoren aber leicht ge-
macht. Ich möchte daher schon im Vorgriff feststellen: Es gibt bei ei-
nem breit angelegten Thema wie Director & Internet tatsächlich Berei-
che, in denen beide Autoren noch nicht – oder zumindest nicht erfolg-
reich – gearbeitet haben oder auch nur Arbeitstechniken erproben
konnten.

Save As Java?
Tatsächlich sind Java-Anwendungen, die mit Director erstellt wurden,
nicht viel mehr als Studien; uns sind nur wenige kommerziell einge-
setzte Director-Java-Applikationen im Internet bekannt. Auch mit Di-
rector 7 gilt: selbst wenn Macromedia – z.B. durch die Benennung von
Menüs (ALS JAVA SICHERN...) – suggeriert, daß Director-Anwendungen 1:1
in Java übersetzt werden können, ist dies nicht der Fall. Massive Ein-
schränkungen des Funktionsumfangs, des nutzbaren Lingo-Codes, der
einbindbaren Medien und vor allem die je nach OS- und Browser-Platt-
form unterschiedliche, aber im Vergleich zu Shockwave durchgängig
mangelhafte Performance, machen dem Director-Programmierer das
Leben schwer.

Deshalb wird hier eher umgekehrt ein Schuh daraus: wenn Sie Java-
Programmierer sind und Director als Animations-Engine nutzen wol-
len, möglicherweise auch eigenen Code einbinden können und wollen
– dann lohnt es sich vielleicht, einen tieferen Blick in die Java-Fähigkei-
ten von Director zu werfen.

Wenn Sie sich als Director-Anwender auf das Abenteuer Java einlassen,         Auf der CD-ROM (WORKSHOP \
studieren Sie – im Handbuch und in den auf dieser CD-ROM vorliegen-           KAPITEL04 \ JAVA):
den zusätzlichen Dokumentationen von Macromedia – nicht die Ein-              zusätzliche Dokumentation zu
schränkungen beim Export von Director-Produktionen in Java, son-              Java in Director 7
dern richten Sie Ihr Augenmerk auf die Möglichkeiten, die Ihnen die
Java-Player-Engine bietet. Und legen Sie Projekte, die Sie als Java-Applet
nutzen wollen, von Grund auf den Möglichkeiten des Java-Exports ent-
sprechend an.

XML-Parser-Xtra
Ebenfalls einen Vorgriff auf die Zukunft stellt das XML-Parser-Xtra dar,      Auf der CD-ROM finden Sie im
das sich im Lieferumfang von Director 7 befindet. XML (Extensible Mar-        Verzeichnis WORKSHOP \
kup Language), eine Sprache zur hierarchischen Beschreibung von Do-           KAPITEL04 \ XML weiterge-
kumentstrukturen und zur Trennung von Inhalt und Formatierung,                hende Dokumentation zum
ist in den neuesten Internet-Browser-Versionen bereits im Grundsatz           Thema XML


                                                                                                       385
        Kapitel      4         Shockwave – Internet im Direktzugriff


                               integriert; eine weitere Verbreitung ist mit Sicherheit zu erwarten. Ge-
                               genüber HTML bietet XML beim Cross-Media-Publishing (z.B. Print –
                               Web – Multimedia) und bei auf Datenbanken basierenden Medienbe-
                               ständen Vorteile; hier in Director eine Schnittstelle zu haben, ist mit Si-
                               cherheit von Vorteil. Auch Macromedia promotet die Verwendung von
                               XML und unterstützt das Format in seinen Produkten – möglicher-
                               weise wird es in späteren Director-Versionen eine stärkere Integration
                               der Sprache geben.

                               Das Parser-Xtra liest XML-Dokumente ein und stellt sie in Director als –
                               je nach Dokumentstruktur – tief gestaffelte Liste von Property-Listen
                               zur Verfügung. Um damit etwas Sinnvolles anfangen zu können, benö-
                               tigen Sie detaillierte Kenntnisse in XML.


                               4.2 Techniken und Arbeitsbeispiele
                               AOL aus Director heraus steuern
 Das gesamte Arbeitsbeispiel   AOL-Anwender müssen zunächst mit dem AOL-Client eine Internet-
finden Sie auf der CD-ROM im   Verbindung herstellen, bevor Internet-Adressen oder AOL-Inhalte auf-
      Verzeichnis WORKSHOP \   gerufen werden können. Das ist unter Windows möglich, indem beim
             KAPITEL04 \ AOL   Aufruf von AOL.EXE URL oder AOL-Kennwort als Parameter mit überge-
                               ben werden; Mac-seitig gibt es dank AppleScript-Unterstützung eben-
                               falls eine Lösung, die allerdings ein AppleScript-Xtra wie zScript erfor-
                               dert (als Demo-Version erhältlich unter http://www.zeusprod.com). Beide
                               Ansätze erlauben der AOL-Zugangssoftware, eine Verbindung herzu-
                               stellen und die gewünschte URL aufzurufen. Bei http-URLs wird der
                               AOL-eigene Browser benutzt.

                               Bei der folgenden Vorstellung der Windows-Lösung kommt das Xtra
                               BudAPI gleich zweimal zum Einsatz: um den Pfad zur AOL-Zugangs-
                               software aus der WIN.INI zu extrahieren und für den eigentlichen Auf-
                               ruf der Applikation. Bei letzterem ist der Vorteil, daß BudAPI der Direc-
                               tor-Anwendung zurückmeldet, ob der Aufruf erfolgreich verlaufen ist.

                               Alternativ können Sie natürlich den open-Befehl, also Standard-Lingo,
                               verwenden; ebenso können Sie mit Lingo (getNthFilenameInFolder())
                               überprüfen, ob sich AOL in seinem Standardverzeichnis befindet
                               (C:\AOL\AOL.EXE), und, falls dies nicht der Fall ist, den Anwender mit ei-
                               nem Dialog (FileIOXtra oder FileXtra) auffordern, den Ort der Applika-
                               tion selbst zu suchen.


                                -- Aufruf: AOLAufruf("http://www.director7.de") oder
                                -- AOLAufruf("SERVICE")




386
                            Techniken und Arbeitsbeispiele


on AOLAufruf myURL
  if myURL contains "http" then filler = "-u"
  else filler = "-s"
  set Param = filler & myURL
  set Aufruf = getaolpath()&"aol.exe" && Param
  myerr = baRunProgram(aolprg, "maximised", false )
  if myerr < 32 then alert "Fehler beim Aufruf von AOL" ¬
  & RETURN & getRunErr(myerr)
end

on getAOLpath()
  -- benötigt BudAPI Xtra
  temp = baReadIni( "WAOL", "AppPath", "", "win.ini" )
  if temp = "" then
    -- Fehler: kein AOL gefunden
    abort
  else
    return temp&"\"
  end if
end

on getrunerr err
  case err of
    0 : return "System was out of memory, executable file
was corrupt, or relocations were invalid."
    1 : return "Unspecified error."
    2 : return "File was not found."
    3 : return "Path was not found."
    5 : return "Attempt was made to dynamically link to¬
 a task, or there was a sharing or network-protection¬
 error."
    6 : return "Library required separate data segments¬
 for each task."
    8 : return "There was insufficient memory to start¬
 the application."
    10 : return "Windows version was incorrect."
    11 : return "Executable file was invalid. Either it¬
 was not a Windows application or there was an error in¬
 the .EXE image."
    12 : return "Application was designed for a¬
 different operating system."
    13 : return "Application was designed for MS-DOS 4"
    14 : return "Type of executable file was unknown."
    15 : return "Attempt was made to load a real-mode¬
 application (developed for an earlier version of¬
 Windows)."
    16 : return " Attempt was made to load a second¬
 instance of an executable file containing multiple data¬
 segments that were not marked read-only."
    19 : return "Attempt was made to load a compressed¬
 executable file. The file must be decompressed before¬



                                                             387
         Kapitel       4         Shockwave – Internet im Direktzugriff


                                   it can be loaded."
                                      20 : return "Dynamic-link library (DLL) file was¬
                                   invalid. One of the DLLs required to run this¬
                                   application was corrupt."
                                      21 : return " Application requires 32-bit¬
                                   extensions."
                                    end case
                                  end

      Vgl. Sie zum Einsatz von   Die AOL-Software für MacOS ist vollständig mit AppleScript steuerbar.
  AppleScript auch Kapitel 7,    Die Lösung erfordert ein Xtra, das AppleScripts nutzen kann und Rück-
„Plattformspezifische Arbeits-   gabewerte für aufgerufene AppleScript-Funktionen liefert (z.B. zScript);
                     weisen“     außerdem muß natürlich AppleScript auf dem Abspielrechner instal-
                                 liert sein. Einen Beispielfilm finden Sie auf der beiliegenden CD-ROM;
                                 er überprüft diverse Showstopper, um dem Anwender im Fehlerfall
                                 Rückmeldung geben zu können:

                                 s   Ist AppleScript installiert?

                                 s   Ist AOL installiert und der Anwender bei AOL registriert?

                                 s   Reicht der freie Speicher, ist virtueller Speicher aktiviert?

                                 s   Können evtl. andere Applikationen geschlossen werden, um Spei-
                                     cher frei zu machen?

                                 Der Hauptteil des AppleScripts (im Textdarsteller „SKRIPT_3“) nutzt
                                 den Befehl getURL aus dem AppleScript-Verzeichnis der AOL-Software;
                                 außerdem überprüft das Skript, ob die Software „registriert“ ist, d.h.
                                 ob der Anwender den Anmeldeprozeß bei AOL durchlaufen hat:


                                  tell application "AOL"
                                    activate
                                    if registered then
                                      try
                                         GetURL myurl
                                         return "scriptable,url:"&myurl
                                      on error
                                         return "scriptable,errorlogging"
                                      end try
                                    else
                                      return "scriptable,errorNotRegistered"
                                    end if
                                  end tell


                                 Da myurl erst dynamisch gebildet wird, muß im Director-Skript eine
                                 entsprechende Zeile vor dieses Skript eingefügt werden, die myurl defi-
                                 niert. Der Aufruf gibt in zwei Fällen – falls die Software nicht registe-
                                 red ist oder wenn der Anmeldevorgang abgebrochen wurde – einen



388
                                Techniken und Arbeitsbeispiele


Fehler zurück, der in einem exitFrame-Skript abgefragt werden kann.
(Dieses Skriptbeispiel mit „alter Syntax“ funktioniert problemlos auch
in Director 5 und 6.)


 -- Movie-Skript

 on AOLAufruf myURL
   -- myURL enthält entweder eine http-URL oder
   -- ein AOL-Kennwort
   if myURL contains "http" then set a = myURL
   else set a = "aol://1722:"&myURL
   set mytext = "set myurl to"&&quote&a&quote&return
   doscript("SKRIPT_3",mytext)
 end

 on doScript scriptname,addendum -- returns scriptresult
   -- kombiniert addendum und ein Skript im Textdarsteller
   -- scriptname und führt das kombinierte Skript aus.
   global waitfor, myobj
   set waitfor = 0
   set myobj = 0
   if voidP(addendum) then set addendum = ""
   set mytext = addendum&the text of member scriptname ¬
   of castlib "standard.cst"
   set myobj = new(xtra "zScript")
   setscripttext(myobj, mytext)
   run(myobj)
 end

 -- Frame-Skript

 on exitframe
   global waitfor, myobj
   put getresult(myobj) into waitfor
   if waitfor <> 0 then
     if waitfor contains "Error" then
       -- Fehlermeldung/-Handling
     else
       -- Logging und Aufruf erfolgreich
     end if
   end if
 end


Noch ein Wort zu AOL-eigenen Seiten: Ihre URLs beginnen stets mit
„aol:“; für internationale Angebote empfiehlt es sich, ein entspre-
chendes Bookmark anzulegen und die URL über dessen Informations-
dialog in Erfahrung zu bringen; deutsche Angebote werden im allge-
meinen über das Konstrukt „aol://1722:”&AOLKennwort aufgerufen.
Testen Sie diese URLs in AOL, indem Sie sie direkt in den Kennwortdia-
log ((Strg) (K) bzw. (°)(K)) eingeben.



                                                                         389
      Kapitel   4   Shockwave – Internet im Direktzugriff


                    Kommunikation zwischen Shockwave-Filmen
                    Im folgenden Arbeitsbeispiel geht es um die grundsätzliche Möglich-
                    keit der Kommunikation zwischen zwei oder mehr Shockwave-Filmen
                    mit Hilfe des gemeinsamen Zugriffs auf eine Shockwave-Preferences-
                    Datei.

                    Shockwave-Filmen bleibt der schreibende Zugriff auf die Speicherme-
                    dien des Anwenders aus Sicherheitsgründen verwehrt. Eine Ausnahme
                    bilden die Befehle setPref() und getPref(). Mit Hilfe von set-
                    Pref(<Dateiname>, <Inhalt>) können Sie Textdateien speichern und
                    mit getPref (<Dateiname>) auslesen. Wird der Film im Browser abge-
                    spielt, speichert der Befehl setPref die Preferences-Datei im Plug-in-
                    Support-Ordner.



                                   Abbildung 4.27:
                                   Eine Prefs-Datei im Shockwave-Support-Ordner




                    Läuft der Film hingegen in einem Projektor, wird beim Aufruf von set-
                    Pref im aktuellen Ordner des Projektors ein Ordner PREFS erzeugt und
                    die als Parameter angegebene Datei dort gespeichert.

                    Da die Dateinamen der Prefs-Dateien frei wählbar sind, kann ein Film
                    ohne weiteres auf die Prefs-Datei eines anderen Films zugreifen. Die-
                    sen Umstand nutzen wir im folgenden Beispiel. In einem Frameset ent-
                    halten der linke und der obere Frame einen Shockwave-Film. Der linke
                    Frame dient als Navigationsleiste. Beim Überfahren eines Buttons wird
                    dieser rot unterlegt, und es erscheint im oberen Frame ein kurzer, er-
                    läuternder Text. Bei Mausklick wird der Inhalt des mittleren Frames
                    ausgetauscht und der aktive Button durch eine weiße Umrandung aus-
                    gezeichnet.

                    Die Schriftzüge sind mit unsichtbaren QuickDraw-Darstellern belegt,
                    die alle das folgende Behavior besitzen. In der Prozedur beginsprite
                    werden neben der Kanalnummer und der Bühnenposition die Kanäle
                    der roten Fläche sowie der weißen Umrandung in Properties gespei-


390
                                  Techniken und Arbeitsbeispiele


chert. Um bei einer eventuellen Verschiebung der Sequenz im Dreh-
buch nicht mehrere Kanalnummern ändern zu müssen, wird dann
vom aktuellen Kanal sp ausgehend ein Index id im Bereich von 1 bis 8
gebildet. Mit der anschließenden case-Anweisung erhält jetzt jeder
Button – abhängig von seinem Index – zwei weitere Properties: url und
comment. Letzteres ist der Text, der bei Rollover im zweiten Shockwave-
Film erscheinen soll, in url ist der http-Pfad zur der im Frame tar-
getFrame anzuzeigenden Seite enthalten.


                                    Abbildung 4.28:
                    Shockwave-Film I: die Menüleiste




 property sp, myloc, id, url, redBox, whiteFrame, targetFram
 e, comment

 on beginsprite me
   sp = the spritenum of me
   myloc = the loc of sprite sp
   -- score channels
   redBox = 6
   whiteFrame = 21
   -- start in channel 11, also id = 1 ... 8
   id = sp – 10
   --
   targetFrame = "center"
   case id of
     1 :
       url = "welc.htm"
       comment = "Herzlich willkommmen!"



                                                                          391
      Kapitel   4   Shockwave – Internet im Direktzugriff


                         2 :
                           url = "serv.htm"
                           comment = "Alle Dienstleistungen auf einen Blick"
                         3 :
                           url = "prod.htm"
                           comment = "Alle Produkte auf einen Blick"
                         4 :
                           url = "proj.htm"
                           comment = "Aktuelle Projekte"
                         5 :
                           url = "cont.htm"
                           comment = "Telefon, Fax, Snail Mail, etc."
                         6 :
                           url = "faqs.htm"
                           comment = "Viele Fragen und ein paar Antworten"
                         7 :
                           url = "tool.htm"
                           comment = "Jede Menge nützlicher Tools"
                         8 :
                           url = "link.htm"
                           comment = "Einige wirklich tolle Links"
                         otherwise:
                           comment = " "
                       end case
                     end

                    Beim Rollover wird die rote Fläche an die Position des aktuellen Sprites
                    gesetzt, sofern sie sich dort noch nicht befindet. Dann wird der in der
                    Property comment enthaltene Text mit dem Befehl setPref in die Text-
                    datei TEST geschrieben.


                     on mouseEnter me
                       if sprite(redBox).loc <> myloc then
                         sprite(redBox).loc = myloc
                         -- wenn als Shockwave laufend, RolloverText anzeigen
                         if the runmode starts "p" then setPref "test", comment
                         updateStage
                       end if
                     end


                    Klickt der Anwender auf den Button, erhält dieser zusätzlich die weiße
                    Umrandung (whiteFrame), und der Inhalt des Frames targetFrame wird
                    mit Hilfe des Befehls goToNetPage ausgetauscht, sofern der Film nicht
                    im Authoring-Modus läuft, wo zu Testzwecken nur eine Ausgabe im
                    Nachrichtenfenster erfolgt.


                     on mouseDown me
                       sprite(whiteFrame).loc = myloc
                       updateStage

392
                                  Techniken und Arbeitsbeispiele


   if the runmode = "Author" then
     -- in Director nur ins Messagewindow schreiben
     put "jumping to: " & url
   else
     -- HTML-Seite aufrufen
     gotoNetPage url, targetFrame
   end if
 end



            Abbildung 4.29:
         Shockwave-Film II:
            die Textanzeige



Der Film zur Textanzeige besteht aus lediglich einem Textdarsteller,
dessen Inhalt vom folgenden Skriptkanal-Behavior modifiziert wird.
Das Skript arbeitet nach dem Prinzip des Polling. Es prüft zyklisch, ob
der Inhalt der Preferences-Datei TEST vom Inhalt des Textdarstellers ver-
schieden ist und aktualisiert ihn bei Bedarf. So wird ein Flackern der
Anzeige vermieden. Um nicht unnötig oft auf die Datei TEST ZUZUGREI-
FEN, IST IM TEMPOKANAL DES FILMS EINE BILDRATE VON ZWEI BILDERN PRO SE-
KUNDE EINGESTELLT.


 global gText

 on exitFrame
   gText = getPref("test")
   if gText <> member("display").text then ¬
   member("display").text = gText
   go to the frame
 end


Kommunikation mit dem Browser
(oder: Warum einfach, wenn’s auch anders geht?)
Die Kommunikation zwischen dem Browser und Shockwave (Plug-in
bzw. ActiveX-Control) basiert je nach (Browser-)Plattform auf unter-
schiedlichen Technologien, die ihre jeweils spezifischen Einschrän-
kungen und Lösungsmöglichkeiten mit sich bringen. Das hier folgende
Beispiel hat den kleinstmöglichen Anspruch: Es soll lediglich ermögli-
chen, daß sich Shockwave den Inhalt eines Formularfeldes aus der
HTML-Seite „holt“. Das hört sich simpel an – aber es zeigt bereits die
grundsätzlichen Probleme beim Browser-Scripting.




                                                                            393
        Kapitel       4             Shockwave – Internet im Direktzugriff


                Abbildung 4.30:
    Shockwave-Film (oben) und
  HTML-Seite kommunizieren –
 bevor es soweit ist, sind einige
       Probleme zu umschiffen




                                    Problem 1: Unterstützte Browser
                                    Selbst im besten Fall – d.h. wenn wir die Tricks in den folgenden Pro-
                                    blembeschreibungen anwenden – ist die Shockwave-Browser-Kommu-
                                    nikation auf bestimmte Browser-Versionen und weitere Voraussetzun-
                                    gen eingeschränkt.

                                    Die Kommunikation zwischen Browser und Plug-in funktioniert in
                                    Netscape (MacOS und Windows) über eine Technologie namens Li-
                                    veConnect. Sobald der Netscape-Browser wie in unserem Beispiel hier
                                    etwas an das Plug-in zurückmelden soll, sind JavaScript und LiveCon-
                                    nect im Spiel. LiveConnect benötigt Java. Unterstützte Plattformen
                                    sind sodann: Netscape 3 oder neuer mit eingeschaltetem Java auf
                                    PowerPC oder Windows 95, 98, NT, also die gleichen, die auch Shock-
                                    wave 7 unterstützen. Die Startzeiten für Java am MacOS sind – auch in
                                    aktuellen Browser-Versionen – immer noch unverhältnismäßig lang.

                                    Microsoft Internet Explorer ab Version 3 und das Shockwave ActiveX-
                                    Control können über ActiveX-Scripting kommunizieren (vgl. Problem
                                    2). Internet Explorer am MacOS bleibt außen vor: Er nutzt das Net-
                                    scape-Plug-in und bietet keine LiveConnect entsprechende Technologie
                                    zur Kommunikation.

                                    Problem 2: ActiveX und JavaScript
                                    Microsoft Internet Explorer nutzt JScript und VBScript als Scripting-
                                    Sprachen. Beide können Nachrichten an ein ActiveX-Control schicken,
                                    aber nur VBScript kann Nachrichten von einem ActiveX-Control emp-
                                    fangen. Für browser-übergreifendes Scripting ist daher zumindest ein
                                    Router-Skript in der Sprache VBScript nötig, das bei MSIE den Funkti-
                                    onsaufruf von Shockwave an eine JavaScript-Funktion weiterleitet. Im
                                    Beispiel sieht das so aus:


                                     <script language="vbscript">
                                     sub myMovie_ExternalEvent(byVal aCommand)
                                     if aCommand = "GetJSValue()" then
                                       call GetJSValue()


394
                                  Techniken und Arbeitsbeispiele


 elseIf aCommand = "TestFunction()" then
   call TestFunction()
 end if
 end sub
 </script>

Das Skript empfängt das externalEvent aus Lingo und ruft eine der
beiden JavaScript-Funktionen auf, die sich auch im Dokument befin-
den und die auch von Netscape genutzt werden. Selbstverständlich
können Sie auch eine komplexere VBScript-Funktion nutzen, die ohne
eine zweite in JavaScript geschriebene Funktion auskommt. Die Wei-
terleitung hat lediglich den Vorteil, daß das eigentliche Skript nur ein-
mal – nämlich in JavaScript – definiert werden muß und von Explorer
wie auch Navigator genutzt werden kann.

Problem 3: Timing-Problem in Netscape/LiveConnect
Ruft Shockwave mit externalEvent() eine JavaScript-Funktion im Net-
scape Navigator auf, so darf dieselbe Funktion nicht direkt einen Wert
zurückliefern. Dieses etwas seltsam anmutende Problem hängt mit
der Implementierung von LiveConnect zusammen; LiveConnect benö-
tigt eine Atempause zwischen Empfang der Nachricht und Rückmel-
dung. Folgende Lösung verwirklicht daher einen doppelten Funktions-
aufruf: Wird GetJSValue() ohne Argument aus Shockwave aufgerufen,
so wird lediglich ein zweiter Funktionsaufruf GetJSValue(1) mit ei-
nem Timeout von 300 Millisekunden gestartet. Erst die zweite Funk-
tion liefert dem Shockwave-Film den Ergebniswert zurück:


 <script language="javascript">
 function GetJSValue(selfcall) {
   if (selfcall == null) {
     setTimeout("GetJSValue(1)", 300);
   } else {
     if (navigator.appName.indexOf("Microsoft") != -1) {
       movieID = myMovie;
     } else {
       movieID = document.myMovie;
     }
     movieID.EvalScript("#incoming, " +
     document.forms[0].theField.value);
   }
 }
 </script>


Das ist umständlich, aber eine erträgliche Lösung.




                                                                            395
         Kapitel        4         Shockwave – Internet im Direktzugriff


                                  Die Lingo-Schnittstelle
                                  Lingo unterscheidet nicht zwischen LiveConnect und ActiveX-Scrip-
                                  ting. Der Befehl externalEvent("JSFunktionsname()") kann daher
                                  browser-unabhängig die im Argument genannte Funktion aufrufen,
                                  wenn Sie obige Workarounds beachten.

                                  Im Beispiel hat der Button „DOJSCRIPT“ daher nur das Minimalskript:


                                   on mouseUp me
                                     externalEvent("GetJSValue()")
                                   end


                                  Zum Empfangen der Nachricht vom Browser dient das folgende Skript:


                                   on evalScript args
                                     set the itemdelimiter = ","
                                     set commandName to item 1 of args
                                     set theValue to item 2 of args
                                     case value(commandName) of
                                       #incoming:
                                         set the text of field "display" to theValue
                                       otherwise: alert string(commandName)
                                     end case
                                   end


                                  Das JavaScript der Webseite sendet movieID.EvalScript("#incoming,"
                                  +document.forms[0].theField.value), also einen durch Komma ge-
                                  trennten String mit zwei Argumenten. Das erste Argument ist in unse-
                                  rem Fall immer "#incoming".

                                  Die HTML-Seite als Ganzes
                                  Hier für den besseren Überblick noch die ganze HTML-Seite. Der Shock-
                                  wave-Film wurde unter dem Namen „extevent.dcr“ gesichert und wie
                                  üblich in die Seite eingebunden. <object>- und <embed>-TAGs müssen
                                  ein name-Attribut haben, um den Film einfacher als Objekt aus Java-
                                  Script heraus anzusprechen. Die ursprüngliche Beschreibung dieses
                                  Ansatzes stammt von John Dowdell von Macromedia.
Sie finden das Beispiel auf der
                                   <html> <head>
CD-ROM im Verzeichnis WORK-
    SHOP / KAPITEL04 / BROWSER     <script language="javascript">
                                   function GetJSValue(selfcall) {
                                     if (selfcall == null) {
                                       setTimeout("GetJSValue(1)", 300);
                                     } else {
                                       if (navigator.appName.indexOf("Microsoft") != -1) {
                                         movieID = myMovie;



396
                                 Techniken und Arbeitsbeispiele


         } else {
           movieID = document.myMovie;
         }
         movieID.EvalScript("#incoming, " +
         document.forms[0].theField.value);
     }
 }

 function TestFunction() {
 alert("JS test function called");
 }
 </script>

 <script language="vbscript">
 sub myMovie_ExternalEvent(byVal aCommand)
 if aCommand = "GetJSValue()" then
   call GetJSValue()
 elseIf aCommand = "TestFunction()" then
   call TestFunction()
 end if
 end sub
 </script></head>

 <br> <object classid="clsid:166B1BCA-3F9C-11CF-8075-
 444553540000" codebase="http://download.macromedia.com /
 pub/shockwave/cabs/director/
 sw.cab#version=7,0,0,0" width="512" height="100" name="myMo
 vie">
 <param name="src" value="extevent.dcr">
 <embed src="extevent.dcr" pluginspage= "http://
 www.macromedia.com/shockwave/download/"
 width="512" height="100" name="myMovie">
 </embed></object>

 <h3> Type here; see if we can get it in Shockwave</h3>
 <form><p><input type="text" name="theField" value="init"></
 p> <br><p><input type="button" value="tester" onClick="GetJ
 SValue()"></p><br></form>

 </body></html>

Weitere Browser-Befehle
Die Beispielseite auf der CD-ROM enthält auch die Buttons für eine ein-
fache „Fernbedienung“ eines eingebundenen Shockwave-Filmes.
Shockwave versteht die folgenden Befehle (neben EvalScript()), wenn
sie aus JavaScript oder VBScript an das Movie-Objekt gesendet werden:
Play(), Stop(), Rewind(), GetCurrentFrame(), GotoFrame(), GotoMo-
vie(). Beachten Sie, daß JavaScript case-sensitiv ist, also Groß- und
Kleinschreibung exakt so erwartet wie hier dokumentiert.




                                                                          397
      Kapitel   4   Shockwave – Internet im Direktzugriff


                                              Abbildung 4.31:
                                              JavaScript-Fernbedienung für Shockwave-Filme



                    Das JavaScript der Button-Leiste aus Abbildung 4.31 sieht folgenderma-
                    ßen aus (Einbindung in die HTML-Seite exakt wie in der oben abge-
                    druckten Seite):


                     <input type="button" value="stop" onClick="myMovie.Stop()">
                     <input type="button" value="play" onClick="myMovie.Play()">
                     <input type="button" value="rewind" onClick="myMovie.Rewind
                     ()">
                     <input type="button" value="GotoFrame 5" onClick="myMovie.G
                     otoFrame(5)">
                     <input type="button" value="GotoMovie" onClick="myMovie.Got
                     oMovie('secondmovie.dir')">
                     <input type="button" value="Current Frame" onClick="alert(m
                     yMovie.GetCurrentFrame())">


                    Es hält den Film an, startet ihn wieder, spult ihn auf Frame 1 zurück
                    oder springt zu einem bestimmten Frame, springt in einen zweiten
                    Film oder zeigt einen Dialog mit der Angabe des aktuellen Frames.

                    Webcam-Bilder in Shockwave anzeigen
                    Bilder einer Webkamera werden zumeist unter dem immer gleichen
                    Namen auf den Web-Server gespielt. Das bringt das einfache praktische
                    Problem mit sich, daß ein Browser (oder auch eine Shockwave-Anwen-
                    dung) dazu gebracht werden muß, in regelmäßigen Abständen ein
                    neues Bild anzufordern und dabei den lokalen Browser-Cache zu um-
                    gehen.

                    Bereits im Browser ist dies mit den üblichen Ansätzen („Lebensdauer“
                    des HTML-Dokuments beschränken, no-cache etc.) nicht verläßlich zu
                    lösen. Folgender Skriptauszug zeigt allerdings eine JavaScript-Lösung,
                    die verläßlich funktioniert – und die wir anschließend auf Shockwave
                    übertragen wollen. Die Grundidee, die sich hier in der JavaScript-Funk-
                    tion getnew() zeigt, ist, eine eindeutige URL zu konstruieren, indem
                    an den Bildnamen JOS.JPEG ein sogenannter Query-String angehängt
                    wird. Der Inhalt des Query-Strings ist im Grunde egal – er muß nur je-
                    desmal ein anderer sein. Aus diesem Grund empfiehlt es sich, die
                    Funktion getTime() des Datumsobjektes dafür zu benutzen.


                     <HTML><HEAD>
                     <NOSCRIPT><meta http-
                     equiv="refresh" content="10;url=#"><pragma="no-cache"></
                     NOSCRIPT>




398
                                 Techniken und Arbeitsbeispiele


 <SCRIPT LANGUAGE="JavaScript">
 <!-- Hide
 browserok = 0;
 //die Browser-Erkennung: browserok für NS3,NS/IE 4&5
 if (navigator.appVersion.indexOf("4") != -1) browserok=1;
 if (navigator.appVersion.indexOf("5") != -1) browserok=1;
 if ((navigator.appName.indexOf("Netscape") != -1) &&
 (navigator.appVersion.indexOf("3") != -1))
 browserok = 1;
 if (browserok != 1) document.write('<meta http-equiv=
 "refresh" content="10;url=#">');

 function getnew() {
 mydate=new Date();temp=mydate.getTime();
 if (browserok) {
       document.images[0].src = "jos.jpeg?"+temp;
                  } else {
       return "jos.jpeg?"+temp;
                         }
                     }
 //-->
 </SCRIPT>
 <TITLE>anzeige</TITLE>
 </HEAD>
 <BODY BGCOLOR="#FFFFFF"><CENTER>
 <IMG SRC="jos.jpeg" WIDTH="400" HEIGHT="300"
 onLoad="setTimeout ('getnew()', 5000);">
 <P>Dieses Bild wird alle 5 Sekunden neu geladen.
 </CENTER></BODY></HTML>

In Shockwave und Lingo läßt sich dieses Prinzip ebenfalls problemlos       Sie finden eine Beispieldatei
nachbilden. Das Arbeitsbeispiel bezieht ins Netz gespeiste Fernsehbil-     auf der CD-ROM im Verzeichnis
der – allerdings können wir aus verständlichen Gründen keine Garan-        WORKSHOP \KAPITEL04 \ WEBCAM
tie übernehmen, daß diese zum Zeitpunkt Ihres Ausprobierens unter
der entsprechenden URL noch verfügbar sein werden.

Legen Sie Darsteller wie in Abbildung 4.32 an: für jeden Sender eine in-
terne Bitmap mit einem einfachen Rahmen in der Größe des Fernseh-
oder Netcambildes sowie ein gelinktes JPEG von beliebigem Inhalt in
der gleichen Größe. Ins Drehbuch werden die internen Darsteller wie
in Abbildung 4.33 eingefügt (ARD2 etc.); sie erhalten die Einstellung
„Spuren“ (Trails), die Sie im Sprite-Inspektor oder im Drehbuch anwäh-
len können.




                                                                                                    399
       Kapitel     4           Shockwave – Internet im Direktzugriff


                                                           Abbildung 4.32:
                                                           In der Besetzung sind alle Grafikdarsteller dop-
                                                           pelt vorhanden: ARD2 enthält einen leeren Rah-
                                                           men und ist intern; ARD ist ein verlinktes externes
                                                           JPEG, das ebenfalls denselben Dummy-Inhalt hat




                               Der Umweg über zwei Darsteller ist deshalb nötig, weil wir das Laden
                               der Webbilder mit der Lingo-Eigenschaft the filename of member be-
                               werkstelligen wollen; erst wenn der Ladevorgang am externen JPEG
                               (Darsteller ARD etc.) fertiggestellt ist – the mediaReady of member – wer-
                               den die Bildinhalte der Darsteller ausgetauscht und dadurch auf die
                               Bühne gezeichnet. Die „Spuren“ sorgen dafür, daß das Bild auch dann
                               angezeigt wird, wenn das Sprite nicht im Drehbuch liegt – was den Ein-
                               satz von sprite(s).startframe im exitframe-Handler möglich macht.



                       Abbildung 4.33:
  Drehbuch des Webcam-Arbeitsbeispiels




                                 property mysprite, wwwname, myfile, mymembername

                                 on beginsprite me
                                   mymembername = sprite(me.spritenum).member.name
                                   wwwname = mymembername.char[1..3]
                                   myfile = "http://einServer.de/grabs/"&wwwname&".jpg?"
                                 end


400
                                 Techniken und Arbeitsbeispiele


 on exitFrame me
   if the frame = sprite(me.spritenum).startFrame then
     laden = string(the ticks)
     member(wwwname).filename = myfile&laden
   else if the framelabel = mymembername then
     if member(wwwname).mediaReady = 1 then
       member(mymembername).media = member(wwwname).media
     else go the frame
   end if
 end

Den Trick aus dem HTML-Beispiel zu Beginn dieses Abschnitts finden
Sie in den Zeilen


      laden = string(the ticks)
      member(wwwname).filename = myfile&laden


Damit wird eine URL in der Form http://einServer.de/grabs/ARD.jpg?780558
konstruiert, wobei die Zahlenangabe (the ticks) 60 Mal pro Sekunde
einen neuen Wert ergeben kann, also mit Sicherheit eindeutig ist. Die
Zeilen


      if member(wwwname).mediaReady = 1 then
        member(mymembername).media = member(wwwname).media


überprüfen, ob der Darsteller fertig geladen wurde, und übernehmen
den Bildinhalt des externen Darstellers in den internen, sobald dies
der Fall ist.




                                                                           401
         Kapitel      4          Shockwave – Internet im Direktzugriff


                                 Auch ein Shockwave-Beispiel liegt bei – überprüfen Sie damit, ob die
                                 Fernsehquelle noch verfügbar ist, wenn Sie dieses Buch durchlesen.



                                                                Abbildung 4.34:
                                                                Das fertige Shockwave-Beispiel zieht
                                                                Fernsehbilder von drei Sendern aus dem Netz
                                                                und aktualisiert sie im Abstand von etwa
                                                                5 Sekunden




                                 Multiuser-Datenbankeinsatz
Die Beispielanwendung finden     Die folgende Beispielanwendung demonstriert den Zugriff auf Daten-
Sie auf CD-ROM im Verzeichnis    banken, die vom Multiuser-Server zur Verfügung gestellt werden. Der
WORKSHOP \ KAPITEL04 \ MULTI-    Beispielfilm kann beispielsweise nützlich sein, um als Administrator
                          USER   eines Multiuser-Servers vorhandene Datenbanken zu pflegen. Er er-
                                 laubt, verschiedene Datenbanken auszuwählen, durch die Records zu
                                 blättern, neue Records anzulegen, Records zu löschen, die Datenbank
                                 neu zu „packen“ (erst dann werden die gelöschten Einträge wirklich
                                 entfernt) sowie in der Datenbank zu suchen und die Einträge zu sortie-
                                 ren.

                                 Datenbanken öffnen Sie im Multiuser-Server, indem Sie die entspre-
                                 chenden Einträge unter Databases in der Datei MULTIUSR.CFG vorneh-
                                 men.


                                  Databases = Macintosh_HD:D7_MU:Database:Memobin.dbf             \
                                  Macintosh_HD:D7_MU:Database:MemoText.dbf \
                                  Macintosh_HD:D7_MU:db2:sampdata.dbf \
                                  Macintosh_HD:D7_MU:db2:player.dbf \
                                  Macintosh_HD:D7_MU:db2:playerwm.dbf




402
                                   Techniken und Arbeitsbeispiele


Wollen Sie mehrzeilige Einträge vornehmen, so sind diese durch „\“ zu
verbinden. Pfadangaben dürfen keine Leerzeichen enthalten.

Überprüfen Sie mit dem Menübefehl STATUS / DATENBANKEN, ob die ge-
wünschten Datenbanken vom Multiuser-Server geöffnet wurden (Ab-
bildung 4.35).



                Abbildung 4.35:
Statusmeldungen des Multiuser-
Servers: DATENBANKEN gibt Infor-
    mationen zu den geöffneten
 Datenbanken im MULTIUSERSER-
            VER.OUT-Fenster aus.




Im Director-Film erlaubt ein Login-Screen die Name-/Paßworteingabe
sowie die Angabe des Servernamens bzw. dessen IP-Adresse:



                                                                 Abbildung 4.36:
                                                                 Log-in-Screen




                                                                                   403
      Kapitel   4   Shockwave – Internet im Direktzugriff


                    Lediglich der Logon-Button enthält ein Skript. Der Befehl Logon() wird
                    im Filmskript definiert (s.u.):


                     on mouseUp
                       set encryptFlag = member( "Login btn" ).hilite
                       Logon( encryptFlag )
                     end


                    Der Screen mit dem Marker „Databases“ enthält alle Funktionen zum
                    Zugriff auf die vom Multiuser-Server zur Verfügung gestellten Daten-
                    banken (Abbildung 4.37).



                                                              Abbildung 4.37:
                                                              Datenbankpflege: Auswahl der
                                                              Datenbank, Anzeige und Blätter-
                                                              möglichkeit durch die Daten-
                                                              bankeinträge, Anzeige der
                                                              Feldbezeichnungen der jeweili-
                                                              gen Datenbank, Suche und Sor-
                                                              tiermöglichkeit sowie unten eine
                                                              Anzeige der Meldungen, wie sie
                                                              vom Server empfangen werden
                                                              („Status“)




                    Alle Buttons enthalten ein kleines Standardskript:


                     on mouseup me
                       mytext = sprite(me.spritenum).member.text
                       dodbstuff(value("#"&mytext))
                     end


                    dodbstuff() übergibt dabei als Parameter lediglich den Text des jewei-
                    ligen Buttons als Symbol. Zum Verständnis der Button-Aktionen ist al-
                    lerdings das weitere Movie-Setup – insbesondere die Funktion der Call-
                    back-Handler – nötig. Sie finden die Funktion dodbstuff() im An-
                    schluß an die folgenden Erklärungen.

                    Das folgende Movie-Skript „Global Scripts“ enthält das grundlegende
                    Setup des Datenbankfilmes:




404
                                 Techniken und Arbeitsbeispiele


 --------------------------------------------
 -- Global Scripts
 --------------------------------------------

 global gConnectionInstance

 on prepareMovie
   member( "movieName" ).text = the movieName
   member( "status" ).text = " "
   -- Make sure the "Encrypt" button is not on
   member( "Login btn" ).hilite = FALSE
 end

 on stopMovie
   set gConnectionInstance = 0
 end

prepareMovie setzt lediglich Textfelder und den Encrypt-Button auf ei-
nen definierten Ausgangszustand. stopMovie löscht die Instanz des
Multiuser-Xtras, die im Logon-Skript initialisiert wird.

Der Handler Logon wird im Button-Skript des Logon-Buttons auf dem
Start-Screen aufgerufen. Das Skript enthält die für die „Architektur“
der Anwendungen entscheidenden Festlegungen: Hier werden die
„Callbacks“ festgelegt, also die Skripte, die bei Rückmeldungen vom
Server ausgeführt werden.

Zum Verständnis des Callback-Mechanismus ist es wichtig, die Struk-
tur des Datenaustausches zwischen Film und Server zu verstehen. Ein
sendNetMessage() des Filmes wird vom Server stets mit einer Nach-
richt beantwortet, die das gleiche subject enthält; das Callback-Skript
kann speziell auf dieses subject reagieren (und eventuell weitere, zum
Umfang einer Befehlsfolge gehörige Befehle versenden).

setNetMessageHandler(connectionObject, #handlerSymbol, handler
Object, {"subject", {"sender"}})

Die Syntax des Befehls setNetMessageHandler setzt danach für eine
Xtra-Instanz, welche die aktuelle Verbindung handhabt (connectio-
nObject), den Handler (#handlerSymbol), der bei Eingang einer entspre-
chenden Nachricht aufgerufen werden soll, und das Skript, in dem
sich der Handler befindet (ein Movie-Skript oder eine Instanz eines Par-
ent-Skripts). Sind subject oder sender angegeben, so fungieren diese
als „Filter“ für die eingehenden Nachrichten des Servers: Nur Nachrich-
ten mit der entsprechenden subject- (und evtl. sender-) Angabe wer-
den dann von dem entsprechenden Callback-Handler bearbeitet.

Im Logon-Skript werden eine ganze Reihe von Callback-Handlern für
unterschiedliche Server-Nachrichten gesetzt. Falls dabei kein Fehler
auftritt, wird die Verbindung zum Server hergestellt. Alle Callback-



                                                                           405
      Kapitel   4   Shockwave – Internet im Direktzugriff


                    Handler befinden sich im Filmskript "myCallbacks", das Sie im An-
                    schluß finden.


                     -- Callbacks definieren und Verbindung zum Server
                     -- herstellen

                     on Logon encryptFlag
                       gConnectionInstance = 0
                       gConnectionInstance = new (xtra "Multiuser")
                       errCode = setNetMessageHandler( gConnectionInstance, ¬
                     #SelectDatabaseHandler, script "myCallbacks", ¬
                     "selectDatabase")
                       errCode = setNetMessageHandler( gConnectionInstance, ¬
                     #GetrecordCountHandler, script "myCallbacks", ¬
                     "getrecordcount")
                       errCode = setNetMessageHandler( gConnectionInstance, ¬
                     #FieldListHandler, script "myCallbacks", ¬
                     "getreadableFieldlist")
                       errCode = setNetMessageHandler( gConnectionInstance, ¬
                     #GetRecordsHandler, script "myCallbacks", "getRecords")
                       errCode = setNetMessageHandler( gConnectionInstance, ¬
                     #GotoRecordHandler, script "myCallbacks", "gotoRecord")
                       errCode = setNetMessageHandler( gConnectionInstance, ¬
                     #ChangeRecord, script "myCallbacks", "lockRecord")
                       errCode = setNetMessageHandler( gConnectionInstance, ¬
                     #ChangeRecord, script "myCallbacks", "setFields")
                       errCode = setNetMessageHandler( gConnectionInstance, ¬
                     #ChangeRecord, script "myCallbacks", "deleterecord")
                       errCode = setNetMessageHandler( gConnectionInstance, ¬
                     #ChangeRecord, script "myCallbacks", "unlockrecord")
                       errCode = setNetMessageHandler( gConnectionInstance, ¬
                     #appendRecordHandler, script "myCallbacks", ¬
                     "appendRecord")
                       errCode = setNetMessageHandler( gConnectionInstance, ¬
                     #packHandler, script "myCallbacks", "pack")
                       errCode = setNetMessageHandler( gConnectionInstance, ¬
                     #SucheHandler, script "myCallbacks", "selectTag")
                       errCode = setNetMessageHandler( gConnectionInstance, ¬
                     #SucheHandler, script "myCallbacks", "seek")
                       errCode = setNetMessageHandler( gConnectionInstance, ¬
                     #DefaultMessageHandler, script "myCallbacks")
                       -- Fortfahren, wenn kein Fehler aufgetreten ist
                       if ( errCode = 0 ) then
                         set user = member( "username" ).text
                         set passwd = member( "password" ).text
                         set server = member( "server" ).text
                         -- Falls der Encrypt-Button angewählt wurde,
                         -- Server-Login verschlüsseln
                         if ( encryptFlag = FALSE ) then
                           set errCode = connectToNetServer ¬




406
                                Techniken und Arbeitsbeispiele


 ( gConnectionInstance, user, passwd, server, 1626, ¬
 "MarsDatabaseTest" )
     else
        set errCode = connectToNetServer ¬
 ( gConnectionInstance, user, passwd, server, 1626, ¬
 "MarsDatabaseTest", "MySecretEncryptionString" )
     end if
   end if
   if ( errCode = 0 ) then
     go to frame "Databases"
   else
     alert "Creation of Xtra instance failed"
   end if
 end

Zur Ausgabe der Status- und Fehlermeldungen in das Statusfenster ent-
hält das Filmskript "Global Scripts" zwei weitere Handler.


 -- Status- und Fehlermeldungen
 on ShowMessageStatus theMessageString
   -- Status im Scrollfeld anzeigen
   put RETURN & theMessageString & RETURN & "----" ¬
   after member "status"
 end

 on ShowErrorMessage theErrorCode
   -- Fehler im Scrollfeld anzeigen
   put RETURN & GetNetErrorString( gConnectionInstance, ¬
   theErrorCode ) & RETURN & "----" after member "status"
 end


Im Filmskript "myCallbacks" befinden sich die in "Global Scripts"
definierten Callback-Handler. Sie rufen jeweils zunächst die Funktion
checkError() auf, um eventuelle Fehler anzuzeigen und die Weiterbe-
arbeitung abzubrechen, falls ein Fehler aufgetreten ist.


 -------------------------------------------
 -- Skript myCallbacks
 -------------------------------------------

 global gConnectionInstance
 on checkError aMessage
   -- #errorCode der Servermeldung auswerten
   errCode = getaProp ( aMessage, #errorCode )
   -- Status anzeigen
   ShowMessageStatus( aMessage )
   -- Bei Fehler diesen anzeigen
   if ( errCode <> 0 ) then
     ShowErrorMessage( errCode )
   end if

                                                                        407
      Kapitel   4   Shockwave – Internet im Direktzugriff


                       return errCode
                     end

                     -------------------------------------------
                     -- Die Callback-Handler
                     -------------------------------------------
                     on DefaultMessageHandler
                       newMessage = getNetMessage ( gConnectionInstance )
                       if checkError(newmessage) = 0 then
                         mycont = newmessage.content
                         put mycont
                       end if
                     end

                     on SelectDatabaseHandler
                       newMessage = getNetMessage ( gConnectionInstance )
                       if checkError(newmessage) = 0 then
                         errCode = sendnetmessage(gConnectionInstance, "System",
                      "getrecordcount")
                       end if
                     end

                     on GetrecordCountHandler
                       newMessage = getNetMessage ( gConnectionInstance )
                       temp = checkError(newmessage)
                       if temp = 0 then
                         global maxrecord
                         maxrecord = integer(newmessage.content)
                       else if temp = -2147216178 then
                         global currecord, maxrecord
                         currecord = 0
                         maxrecord = 0
                         member("display").text = " "
                         member("fields").text = " "
                       end if
                     end

                     on FieldlistHandler
                       newMessage = getNetMessage ( gConnectionInstance )
                       if checkError(newmessage) = 0 then
                         myflist = newmessage.content
                         member("fields").text = string(myflist)
                       end if
                     end

                     on GetrecordsHandler
                       newMessage = getNetMessage ( gConnectionInstance )
                       if checkError(newmessage) = 0 then
                         member("display").text = string(newmessage.content)
                       end if
                     end




408
                             Techniken und Arbeitsbeispiele


on gotoRecordHandler
  newMessage = getNetMessage ( gConnectionInstance )
  if checkError(newmessage) = 0 then
    global currecord
    currecord = integer(newmessage.content)
    errCode = sendnetmessage(gConnectionInstance, "System",
 "getrecords", 1)
  end if
end

on changeRecord
  newMessage = getNetMessage ( gConnectionInstance )
  if checkError(newmessage) = 0 then
    --
    if newMessage.subject = "lockRecord" then
       global deleteaction
       if voidP(deleteaction) then errCode = sendnetmessage(
gConnectionInstance, "System", "setfields", value(member("d
isplay").text)[1])
       else
          errCode = sendnetmessage(gConnectionInstance, "Syst
em", "deleteRecord")
          deleteAction = VOID
       end if
    else if newMessage.subject = "setFields" OR newMessage.
subject = "deleteRecord" then
       errCode = sendnetmessage(gConnectionInstance, "System
", "unlockRecord")
    else
       --
    end if
    --
  end if
end

on sucheHandler
  newMessage = getNetMessage ( gConnectionInstance )
  if checkError(newmessage) = 0 then
    --
    if newMessage.subject = "selectTag" then
       aword = member("search").line[2]
       if aword = "" then return
       global sortonly
       if voidP(sortonly) then
         errCode = sendnetmessage(gConnectionInstance, ¬
         "System", "seek", aword)
       else
         sortonly = VOID
         dodbstuff(#first)
       end if




                                                                409
      Kapitel   4   Shockwave – Internet im Direktzugriff


                         else if newMessage.subject = "seek" then
                            errCode = sendnetmessage(gConnectionInstance, ¬
                     "System", "getrecords", 1)
                            global currecord
                            set currecord = "?"
                         else
                            --
                         end if
                         --
                       end if
                     end

                     on appendRecordHandler
                       newMessage = getNetMessage ( gConnectionInstance )
                       if checkError(newmessage) = 0 then
                         global currecord, maxrecord
                         maxrecord = maxrecord + 1
                         currecord = maxrecord
                       end if
                     end

                     on packHandler
                       newMessage = getNetMessage ( gConnectionInstance )
                       if checkError(newmessage) = 0 then
                         errCode = sendnetmessage(gConnectionInstance, "System",
                      "getrecordcount")
                         dodbstuff(#first)
                       end if
                     end

                    Die Logik eines komplexen Befehls – wie die Suche nach einem be-
                    stimmten Datensatz und dessen Anzeige – sieht damit folgenderma-
                    ßen aus (die Datenbank ist bereits ausgewählt):

                    1.   Senden einer netMessage mit dem subject "selectTag" (dataone
                         ist ein Feldname in der Datenbank):


                     sendnetmessage(gConnectionInstance, "System", "selectTag",
                     "#DATAONE")


                    2.   Der Film empfängt die Serverantwort:


                     [#errorCode: 0, #recipients: ["Admin"], #senderID: "System"
                     , #Subject: "selectTag", #content: "DATAONE", #timeStamp: 4
                     562300]


                    3.   Anhand des #Subject-Eintrages wird der vordefinierte Callback-
                         Handler für "selectTag" aufgerufen: es ist der Handler suche-
                         Handler, der folgendes Skript ausführt (und dabei eine zweite net-
                         message mit dem subject "seek" losschickt):

410
                                  Techniken und Arbeitsbeispiele


     if newMessage.subject = "selectTag" then
       aword = member("search").line[2]
       if aword = "" then return
       errCode = sendnetmessage(gConnectionInstance, ¬
 "System", "seek", aword)

4.   Der Film empfängt die entsprechende Serverantwort:


 [#errorCode: 0, #recipients: ["Admin"], #senderID: "System"
 , #Subject: "seek", #content: "peter", #timeStamp: 4562533]


5.   Der für "seek" vordefinierte Callback-Handler ist ebenfalls suche-
     Handler. Wiederum wird eine netmessage an „System“ versendet.
     Die globale currecords wird auf „?“ gesetzt, da nach einem Such-
     befehl keine Information über die aktuelle Position des Datensat-
     zes in der Reihenfolge der Einträge vorliegt.


     else if newMessage.subject = "seek" then
       errCode = sendnetmessage(gConnectionInstance, ¬
 "System", "getrecords", 1)
       global currecord
       set currecord = "?"


6.   Die Antwort des Servers lautet:


 [#errorCode: 0, #recipients: ["Admin"], #senderID: "System"
 , #Subject: "getRecords", #content: [[#DATAONE: "peter", #D
 ATATWO: "peter2", #DATATHREE: "peter3", #DATAFOUR: "peter4"
 , #NUMONE: 5.0000, #NUMTWO: 6.0000]], #timeStamp: 4562766]


7.   Daraufhin führt der Film den Callback-Handler für "getrecords"
     aus:


 on GetrecordsHandler
   newMessage = getNetMessage ( gConnectionInstance )
   if checkError(newmessage) = 0 then
     member("display").text = string(newmessage.content)
   end if
 end


Das Ergebnis wird im Darsteller display angezeigt; unsere Suchab-
frage ist beendet.

Die meisten Befehle hangeln sich – ähnlich wie seek – durch eine Reihe
von Callback-Handlern. Im Filmskript dodbstuff, das von den einzel-
nen Buttons ausgelöst wird, finden Sie immer nur den ersten Befehl
der Sequenz; die weitere Folge wird in den Callback-Handlern festge-

                                                                          411
      Kapitel   4   Shockwave – Internet im Direktzugriff


                    legt. Wo mehrere Befehle den gleichen Callback-Handler nutzen (wie
                    beim obigen Suche-Handler, der alle selectTag-Nachrichten auffängt),
                    wird durch das Setzen von globalen Variablen innerhalb des Callbacks
                    verzweigt: wenn sortonly gesetzt ist, wird im Handler ein anderer
                    Skriptteil als bei der Suche ausgeführt.


                     -------------------------------------------
                     -- dodbstuff (von Button-Skripten aufgerufen)
                     -------------------------------------------
                     global gConnectionInstance, currecord, maxrecord
                     on dodbstuff what
                       case what of
                         #select:
                           errCode = sendnetmessage(gConnectionInstance, ¬
                     "System", "selectDatabase", member("db").text)
                         #close:
                           errCode = sendnetmessage(gConnectionInstance, ¬
                     "System", "selectDatabase", "")
                         #first:
                           errCode = sendnetmessage(gConnectionInstance, ¬
                     "System", "gotorecord", 1)
                         #last:
                           errCode = sendnetmessage(gConnectionInstance, ¬
                     "System", "gotorecord", maxrecord)
                         #prev:
                           if voidP(currecord) or currecord = "?" then return
                           if currecord < 2 then return
                           errCode = sendnetmessage(gConnectionInstance, ¬
                     "System", "gotorecord", currecord – 1)
                         #next:
                           if voidP(currecord) or currecord = "?" then
                             dodbstuff(#first)
                             return
                           end if
                           if currecord >= maxrecord then return
                           errCode = sendnetmessage(gConnectionInstance, ¬
                     "System", "gotorecord", currecord + 1)
                         #fields:
                           errCode = sendnetmessage(gConnectionInstance, ¬
                     "System", "getreadablefieldlist")
                         #setval:
                           errCode = sendnetmessage(gConnectionInstance, ¬
                     "System", "lockRecord")
                         #append:
                           errCode = sendnetmessage(gConnectionInstance, ¬
                     "System", "appendRecord")
                         #delete:
                           global deleteaction
                           deleteaction = 1
                           errCode = sendnetmessage(gConnectionInstance, ¬



412
                                 Techniken und Arbeitsbeispiele


 "System", "lockRecord")
     #pack:
       errCode = sendnetmessage(gConnectionInstance, ¬
 "System", "pack")
     #seek:
       atag = member("search").line[1]
       if atag = "" then return
       errCode = sendnetmessage(gConnectionInstance, ¬
 "System", "selectTag", atag)
     #sort:
       atag = member("search").line[1]
       if atag = "" then return
       global sortonly
       sortonly = 1
       errCode = sendnetmessage(gConnectionInstance, ¬
 "System", "selectTag", atag)
     otherwise
       beep
   end case
 end


HTML als Director-Text nutzen
Wenn Sie HTML innerhalb einer Director-Anwendung als Text verwen-
den wollen, haben Sie in Director 7 eine sehr einfache Möglichkeit:


 member(m).html = htmlCode


interpretiert den HTML-Code und zeigt in member(m) formatierten Text
inklusive Hyperlinks an. Benötigen Sie nur den puren Text ohne For-
matierung, so schließen Sie einen zweiten Schritt an:


 member(m).html = htmlCode
 mytext = member(m).text


Ein HTML-Parser wie in folgendem Skriptbeispiel bietet demgegenüber
bei Aufgabenstellungen, wo Sie den gesamten Text einer HTML-Seite
extrahieren wollen, keinen Vorteil. Wenn Sie allerdings gezielt be-
stimmte Teile isolieren wollen, ist das folgende Skript eine geeignete
Grundlage. Insbesondere im handleTag-Handler können Sie mit eige-
nem Code daran gehen, bestimmte HTML-Tags zu identifizieren und in
besonderer Weise zu behandeln.

Im momentanen Zustand bietet das Skript ein Grundgerüst, um Ab-
sätze, Breaks, einige spezielle Character Entities (wie &gt;), vorforma-
tierten Text (<PRE>) und Definition Lists (<dl>) zu interpretieren. Alle
anderen Tags werden einfach weggefiltert.



                                                                           413
         Kapitel       4         Shockwave – Internet im Direktzugriff


                                 Sie sollten das Skript als Parent-Skript sichern; in Ihren Behaviors kön-
                                 nen Sie dann eine ancestor-Property definieren, um die Skriptfunktio-
                                 nen direkt nutzen zu können:


                                  property ancestor

                                  on beginsprite me
                                    set ancestor to new(script "HTMLstrip")
                                  end


                                 Ein entsprechender Aufruf im Behavior könnte dann so aussehen:


                                  on mouseup me
                                    member(m).text = parseHTML(me, eingetNettextResult)
                                  end


                                 Das Parent-Skript von John Dowdell von Macromedia (der Lingo-Code
                                 ist voll Director 6-tauglich, da er noch alte Syntax verwendet; getestet
                                 unter Director 7):
 Sie finden das Skript auf der
                                  property sourceString,finalString,state,whiteSpaceChars
      CD-ROM in der Behavior-
                Library „Text“    on new me
                                    set state to #HTML
                                    set whiteSpaceChars to [numToChar(9), numToChar(10), numT
                                  oChar(13), numToChar(32)]
                                    return me
                                  end

                                  on ParseHTML me, whatText
                                    cursor 4
                                    set oldDelim to the itemDelimiter
                                    set sourceString to whatText
                                    set finalString to ""
                                    DeleteHeader me
                                    repeat while length(sourceString)
                                      if word 1 of sourceString starts "<" then
                                        HandleTag me
                                      else AppendText me
                                    end repeat
                                    set the itemDelimiter to oldDelim
                                    cursor 0
                                    return finalString
                                  end

                                  on DeleteHeader me
                                    delete char 1 to offset("<body", sourceString) of ¬
                                    sourceString
                                    DeleteRestOfTag me
                                  end


414
                            Techniken und Arbeitsbeispiele


on DeleteRestOfTag me
  set the itemDelimiter to ">"
  delete item 1 of sourceString
end

on AppendText me
  set the itemDelimiter to "<"
  set currentChunk to item 1 of sourceString
  delete item 1 of sourceString
  put the itemDelimiter before sourceString
  if currentChunk contains RETURN then set currentChunk to
Softwrapped(currentChunk)
  if currentChunk contains "&" then set currentChunk to Tra
nslateSpecialChars(currentChunk)
  put currentChunk after finalString
end

on HandleTag me
  set the itemDelimiter to ">"
  set theTag to StripLeadingWhiteSpace(item 1 of ¬
  sourceString)
  delete char 1 of theTag
  set theTag to word 1 of theTag
  case theTag of
    "br", "/td", "/tr", "dl", "/dl":
      put RETURN after finalString
    "p", "hr": put RETURN & RETURN after finalString
    "dd": put RETURN & " -- " after finalString
    "PRE":
      set state to #preformatted
    "/PRE":
      set state to #HTML
      put RETURN after finalString
    "script":
      delete char 1 to offset("</script>", sourceString)¬
      of sourceString
    otherwise:
  end case
  DeleteRestOfTag me
end

on Softwrapped dirtyText
  if state = #preformatted then return dirtyText
  set cleanText to ""
  set num to length(dirtyText)
  repeat with i = 1 to num
    set firstChar to charToNum(char 1 of dirtyText)
    if (firstChar = 10) OR (firstChar = 13) then put " " af
ter cleanText
    else put char 1 of dirtyText after cleanText
    delete char 1 of dirtyText



                                                              415
         Kapitel        4         Shockwave – Internet im Direktzugriff


                                     end repeat
                                     return cleanText
                                   end

                                   on TranslateSpecialChars dirtyText
                                     set cleanText to ""
                                     repeat while dirtyText contains "&"
                                       set the itemDelimiter to "&"
                                       put item 1 of dirtyText after cleanText
                                       delete item 1 of dirtyText
                                       set the itemDelimiter to ";"
                                       case (item 1 of dirtyText) of
                                         "#60", "lt": put "<" after cleanText
                                         "#62", "gt": put ">" after cleanText
                                         "#38", "amp": put "&" after cleanText
                                         "#34", "quot": put QUOTE after cleanText
                                         "nbsp": NOTHING
                                         otherwise: put "Routine does not yet translate specia
                                   l encoding " & item 1 of dirtyText
                                       end case
                                       delete item 1 of dirtyText
                                     end repeat
                                     put dirtyText after cleanText
                                     return cleanText
                                   end

                                   on StripLeadingWhiteSpace theChunk
                                     repeat while getOne(whiteSpaceChars, char 1 of ¬
                                     theChunk)
                                       delete char 1 of theChunk
                                     end repeat
                                     return theChunk
                                   end


                                  Highscore
   Sie finden SHOCKFILE im Ver-   Um Highscores o.ä. aus einem Shockwave-Film auf einem HTTP-Server
zeichnis WORKSHOP \ KAPITEL04 \   zu speichern, muß auf der Serverseite eine Anwendung laufen, welche
    HIGHSCORE auf der CD-ROM      die vom Shockwave-Film gesendeten Daten empfängt, gegebenenfalls
                                  weiterverarbeitet und speichert. Im folgenden stellen wir Ihnen eine
                                  von Gretchen MacDowall auf http://www.updatestage.com/previous/
                                  990301.html veröffentlichte Lösung vor, die auf Serverseite mit einem in
                                  Perl geschriebenen CGI arbeitet.




416
                                     Techniken und Arbeitsbeispiele


                                          Abbildung 4.38:
Der Demo-Film ermöglicht das Senden von Datensätzen und
                       den Empfang der gesamten Textdatei




Installation des CGI
Prüfen Sie vorab, ob der in Zeile eins des Perl-Skripts eingetragene lo-
kale Pfad zum Perl-Interpreter korrekt ist. Sofern Ihnen kein Remote-
Zugriff wie z.B. Telnet zur Verfügung steht, müssen Sie den Pfad even-
tuell bei Ihrem Systemadministrator oder Internet-Service-Provider er-
fragen. Die zweite, ebenfalls notwendige Einstellung ist das Setzen der
Variablen $FILEPATH, die den lokalen Pfad zur Textdatei enthält, deren
Inhalt das Perl-Skript schreiben und auslesen soll.

Laden Sie das Skript SHOCKFILE.PL mit einem beliebigen FTP-Programm
in das CGI-Verzeichnis Ihres Servers. Beachten Sie dabei, daß Skripte als
Textdateien übertragen werden müssen. Prüfen Sie nach erfolgtem
Upload, ob die Datei als „ausführbar“ oder „executable“ markiert ist
und ändern Sie gegebenenfalls die Einstellungen. Diese Funktion bie-
ten alle gängigen FTP-Programme. Die folgende Abbildung zeigt bei-
spielsweise die entsprechenden Dialoge in Fetch (MacOS) und dem FTP-
Client des Windows Commanders.

CGI-Input
Die Daten an das CGI kann der Shockwave-Film entweder mit dem Be-
fehl getNetText() oder dem in Director 7 neu hinzugekommenen Be-
fehl postNetText() senden. Letzterer bietet neben dem übersichtliche-
ren Handling der Daten in einer Property-List auch den Vorteil, daß die
Länge der gesendeten Daten nicht wie bei getNetText() von vornher-
ein beschränkt ist (abhängig vom Browser auf 1 bzw. 4 kB).




                                                                            417
      Kapitel   4           Shockwave – Internet im Direktzugriff


                                     Abbildung 4.39:
           Setzen der Ausführungsrechte (Permissions)
                    in verschiedenen FTP-Programmen




                            Aufruf in Director
                            Die Syntax für den Aufruf von postNetText lautet in unserem Beispiel:


                              postNetText (CGI-URL, dataPropertyList)


                            Vor dem Aufruf ist lediglich die als Parameter verwendete Property-Li-
                            ste zu setzen, die notwendige Codierung (entsprechend der Funktion
                            URLEncode() für getNetText) des Texts erfolgt automatisch. (Aus dem
                            String "Ärger über ödes Wetter" würde so z.B. der String "%c4rger+%fc-
                            ber+%f6des+Wetter".)

                            Die verwendete Property-Liste besitzt die beiden Properties name und
                            message, deren Werte aus den entsprechenden editierbaren Textfel-
                            dern ausgelesen werden, z.B.:


                              ["name": "hans", "message": "1024"]


                            Das Behavior des Buttons    SEND TO DATA FILE   realisiert die genannten
                            Funktionen.




418
                            Techniken und Arbeitsbeispiele


-- Gretchen MacDowall, www.updatestage.com
property netID, URL, messageField, errorField
property dataFieldList, lengthLimit
property translation,lineEnds

on mouseUp
  put "" into field messageField
  put "" into field errorField
  dataList = [:]
  repeat with fieldname in dataFieldList
    data = field fieldname
    if length(data) > lengthLimit then
      data = char 1 to lengthLimit of data
    end if
    addProp dataList,fieldname,data
  end repeat
  put datalist
  set netID = postNetText(URL,dataList)
end

on exitFrame
  if netID > 0 then
    if netDone(netID) then
      put netTextResult(netID) into field messageField
      put netError(netID) into field errorField
      netID = 0
    end if
  end if
end

on getPropertyDescriptionList
  p_list = [:]
  sublist = [:]
  addProp sublist,#comment,"URL des CGI-Skripts:"
  addProp sublist,#format,#string
  addProp sublist,#default,¬
  "http://www.yourdomain.com/cgi-bin/shockfile.pl"
  addProp p_list,#URL,duplicate(sublist)
  sublist = [:]
  addProp sublist,#comment,"Lineare Liste der Daten-
  Felder:"
  addProp sublist,#format,#list
  addProp sublist,#default,["Name","Message"]
  addProp p_list,#dataFieldList,duplicate(sublist)
  sublist = [:]
  addProp sublist,#comment,"Daten nach x Buchstaben¬
  abschneiden:"
  addProp sublist,#format,#integer
  addProp sublist,#default,100
  addProp p_list,#lengthLimit,duplicate(sublist)
  sublist = [:]


                                                             419
      Kapitel   4   Shockwave – Internet im Direktzugriff


                       addProp sublist,#comment,"Name des Darstellers für ¬
                       Ergebnis:"
                       addProp sublist,#format,#string
                       addProp sublist,#default,"Display"
                       addProp p_list,#messageField,duplicate(sublist)
                       sublist = [:]
                       addProp sublist,#comment,"Name des Darstellers für ¬
                       Statusanzeige:"
                       addProp sublist,#format,#string
                       addProp sublist,#default,"NetError"
                       addProp p_list,#errorField,duplicate(sublist)
                       return p_list
                     end

                    Das vom Button RETRIEVE DATA FILE initiierte Auslesen der Textdatei rea-
                    lisiert das folgende Behavior mit Hilfe des Befehls getNetText.


                     -- Gretchen MacDowall, www.updatestage.com
                     property netID,URL,contentField,errorField

                     on mouseUp
                       put "" into field contentField
                       put "" into field errorField
                       clearCache
                       set netID = getNetText(URL)
                     end

                     on exitFrame
                       if netID > 0 then
                         if netDone(netID) then
                           put netTextResult(netID) into field contentField
                           put netError(netID) into field errorField
                           set netID = 0
                         end if
                       end if
                     end

                     on getPropertyDescriptionList
                       set p_list = [:]
                       set sublist = [:]
                       addProp sublist,#comment,"Einzulesende URL:"
                       addProp sublist,#format,#string
                       addProp sublist,#default,"http://www.yourdomain.com/¬
                       cgi-bin/shockfile.txt"
                       addProp p_list,#URL,duplicate(sublist)
                       set sublist = [:]
                       addProp sublist,#comment,"Name des Darstellers für¬
                       Ergebnis:"
                       addProp sublist,#format,#string




420
                                Techniken und Arbeitsbeispiele


   addProp sublist,#default,"Fetched text"
   addProp p_list,#contentField,duplicate(sublist)
   set sublist = [:]
   addProp sublist,#comment,"Name des Darstellers für ¬
   Statusanzeige:"
   addProp sublist,#format,#string
   addProp sublist,#default,"Neterror"
   addProp p_list,#errorField,duplicate(sublist)
   return p_list
 end

Wenn Sie die im Text-File gespeicherten Daten wieder in den Shock-
wave-Film einlesen, erfolgt keine automatische Decodierung. Vielmehr
muß diese in Lingo vorgenommen werden.

Die folgende Prozedur übernimmt diese Aufgabe, indem sie die als Pa-
rameter angegebene Zeichenkette nach mit dem Zeichen "%" eingelei-
teten Codes untersucht und diese innerhalb der case-Anweisung deco-
diert.

Das Leerzeichen wird von postnetText (und auch von der Funktion
UR-LEncode()) nicht mit "%20", sondern mit dem Zeichen "+" codiert,
was eine Sonderbehandlung innerhalb der Prozedur notwendig macht.

Die Prozedur erwartet den zu bearbeitenden Text als Parameter beim
Aufruf und liefert die decodierte Zeichenkette als Ergebnis zurück.


 on decode txt
   newtxt = ""
   len = the number of chars of txt
   test = offset("%",txt)
   if not test then
     newtxt = txt
   else
     repeat with x = 1 to len
        thisChar = txt.char[x]
        if thisChar = "%" then
          charCode = thisChar & txt.char[x+1..x+2]
          case charCode of
              -- Translationtable;
              -- gegebenenfalls erweitern!
            "%2B": thisChar = "+"
            "%0A": thisChar = RETURN
            "%0D": thisChar = RETURN
            "%20": thisChar = " "
            "%7B": thisChar = "{"
            "%7D": thisChar = "}"
            "%7C": thisChar = "|"
            "%5C": thisChar = "\"
            "%5E": thisChar = "^"



                                                                       421
      Kapitel   4   Shockwave – Internet im Direktzugriff


                                "%7E": thisChar = "~"
                                "%5B": thisChar = "["
                                "%5D": thisChar = "]"
                                "%27": thisChar = "'"
                                "%23": thisChar = "#"
                                "%25": thisChar = "%"
                                "%3C": thisChar = "<"
                                "%3E": thisChar = ">"
                                "%22": thisChar = QUOTE
                                "%3B": thisChar = ";"
                                "%2C": thisChar = ","
                                "%2F": thisChar = "/"
                                "%3F": thisChar = "?"
                                "%3A": thisChar = ":"
                                "%40": thisChar = "@"
                                "%3D": thisChar = "="
                                "%26": thisChar = "&"
                                "%86": thisChar = "Ü"
                                "%85": thisChar = "Ö"
                                "%80": thisChar = "Ä"
                                "%A7": thisChar = "ß"
                                "%9F": thisChar = "ü"
                                "%9A": thisChar = "ö"
                                "%8A": thisChar = "ä"
                                otherwise
                                  set thisChar = charCode
                              end case
                              x = x + 2
                           else
                              if thisChar = "+" then
                                set thisChar = " "
                              end if
                           end if
                           newTxt = newTxt & thisChar
                         end repeat
                       end if
                       return newtxt
                     end

                    Um mit dieser Prozedur z.B. den Inhalt des Darsteller "showFile" zu
                    decodieren, verwenden Sie die folgende Befehlszeile:


                     member("showfile").text = decode(member("showfile").text)




422
                                   Techniken und Arbeitsbeispiele


Multiuser-Picture-Chat
Wenn Sie am „Multiuser-Jump-Start“, dem einfachen Chat-Beispiel wei-       Den Beispielfilm zum Multi-
ter oben in diesem Kapitel, Spaß hatten, können Sie nun einen Schritt      user-Picture-Chat finden Sie
weitergehen. Versenden Sie zusätzlich zu Textnachrichten the media         auf CD-ROM im Verzeichnis
of member (m), also die Director-interne Repräsentation von Darstel-       WORKSHOP \ KAPITEL04 \ MULTI-
lern wie Bitmaps, Textfeldern, Flash- und Vectorshape-Darstellern, But-    USER.

tons und mehr.



                Abbildung 4.40:
  Picture-Chat: Ebenso wie Text-
   nachrichten können media of
     member versendet werden




Einige wichtige Skriptbestandteile des Beispielfilms finden Sie hier. Im
Handler SetupMyPictMedia wird globalen Variablen the media of mem-
ber und die Darstellernummer eines ausgewählten Darstellers zuge-
wiesen:


 global gMyPictPicture
 -- (...)

 if ( the size of member(gMyPictNum,castName) < (96 * ¬
 1024) ) then
   gMyPictPicture = member(gMyPictNum,castName).media
   gMyPictNum = member(gMyPictNum,castName).membernum


Der Handler SendMyPicture sendet mit sendNetMessage() eine media-
List, bestehend aus der binären Bildinformation und der Darstel-
lernummer, an einen Empfänger. Die Darstellernummer wird dann da-
für benutzt, die Bilder in einer Castlib pictures.cst bei allen Teilneh-



                                                                                                    423
      Kapitel   4   Shockwave – Internet im Direktzugriff


                    mern an dieselbe Darstellerposition zu legen. Da Bilder nur auf Anfor-
                    derung verschickt werden, wird diese Funktion als Antwort auf die
                    Anfrage eines anderen Chat-Teilnehmers aufgerufen:


                     on SendMyPicture target
                       global gConnection, gMyPictPicture
                       global gLastPictSendTime, gMyPictNum
                       set mediaList = [#picture: gMyPictPicture, ¬
                       #number: gMyPictNum ]
                       sendNetMessage( gConnection, target, "myPicture", ¬
                       mediaList )
                       set gLastPictSendTime = the timer
                     end SendMyPicture


                    Nach Verbindungsaufbau zum Server wird – ebenso wie im Multiuser-
                    Datenbankbeispiel weiter oben in diesem Kapitel – das Gerüst von Call-
                    back-Handlern definiert, die bestimmte netmessages bearbeiten sollen.
                    Dies sind die für den Bildaustausch wichtigen Zeilen:


                     on SetupNetMessageHandlers me
                       -- (...) andere Callback-Handler ausgelassen
                       set errCode = SetNetMessageHandler( conn, #INeedYourPictH
                     andler, me, "iNeedYourPict" )
                       checkError( errCode, #INeedYourPictHandler )
                       set errCode = SetNetMessageHandler( conn, #MyPictureHandl
                     er, me, "myPicture" )
                       checkError( errCode, #MyPictureHandler )
                     end SetupNetMessageHandlers


                    INeedYourPictHandler wird aufgerufen, wenn andere Filme (d.h. an-
                    dere Chat-Teilnehmer) eine entsprechende Nachricht ("iNeedYour-
                    Pict") an unseren Film senden; er wird also das Versenden unseres Bil-
                    des an den requestor veranlassen. MyPictureHandler empfängt das
                    Bild eines anderen Filmes und legt es wie oben beschrieben ab.


                     --------------------------------------------------------
                     -- INeedYourPictHandler – unser Bild versenden
                     --------------------------------------------------------
                     on INeedYourPictHandler me
                       global gMyPictPicture, gLastPictSendTime
                       if ( conn <> 0 ) then
                         set newMsg = GetNetMessage( conn )
                         -- Senden, falls innerhalb 30 s nicht gesendet:
                         if ( gLastPictSendTime + (30 * 60) < the timer ) then
                           set requestor = getAProp(newMsg, #senderID)
                           SendMyPicture( requestor )
                         end if
                       end if
                     end INeedYourPictHandler

424
                                 Techniken und Arbeitsbeispiele


 --------------------------------------------------------
 -- MyPictureHandler – fremdes Bild empfangen und
 -- lokal ablegen
 --------------------------------------------------------
 on MyPictureHandler me
   global gGetPictName
   if ( conn <> 0 ) then
     newMsg = GetNetMessage( conn )
     sender = getAProp(newMsg, #senderID)
     newPictList = getAProp(newMsg, #content)
     pictNumber = getAProp( newPictList, #number)
     cacheIndex = FindUserInPictCache(sender, pictNumber)
     if ( cacheIndex = 0 ) then
       PutNewPictureIntoCache( getAProp( newPictList, #pictu
 re ), sender, pictNumber )
     else if ( sender = gGetPictName ) then
       ShowPictureOfUser( sender, pictNumber )
     end if
   end if
 end MyPictureHandler

Mit diesem Gerüst können Sie nun daran gehen, media of member von
allen möglichen Darstellertypen zu versenden – oder sogar in speziel-
len Datenbankfeldern einer Multiuser-Datenbank abzulegen. Noch ein
Tip: Mit media of member können Sie – sei es über die Datenbank, sei es
in einem Client-Server-Setup oder in einer Peer-to-peer-Anwendung –
auch kompilierte Skripte übertragen. Der empfangende Film kann also
auch zusätzliche Verhaltensweisen „lernen“, wenn Sie das entspre-
chende Skript an ihn übertragen.

Wenn Sie umfangreiche media oder andere umfangreiche Werte sen-
den, stellen Sie sicher, daß Sie entsprechend große Buffer für den
Client und den Server eingerichtet haben (setNetBufferLimits im
Film und MaxMessageSize in der Serverkonfiguration).




                                                                          425

				
DOCUMENT INFO
Shared By:
Categories:
Tags:
Stats:
views:2
posted:1/18/2013
language:Unknown
pages:114