HowTo:
"Gestalt"-Abfragen am Mac
|
|
Home
Workshop-Seite
english
version
Download
gestalt.sit
|
Die interessante Frage,
wie der doch recht philosophisch-deutsche Gestalt-Begriff
es geschafft hat, in die Tiefen des MacOS-Codes Eingang zu finden,
erörtere ich bei Gelegenheit. Für dieses Arbeitsbeispiel
ist es ausreichend zu wissen, daß mit Abfragen an den MacOS-Gestaltmanager
Systemeigenschaften wie installiertes RAM, System- oder QuickTime-Version,
Existenz und Status von Open Transport, Remote Access (PPP) und
AppleScript und vieles mehr in Erfahrung gebracht werden kann. Eine
brauchbare Liste der Gestalt Descriptors ist schwer zu finden; hier
das beste Download-Link.
Eine Gestalt-Abfrage kann
Ergebnisse in zahlreichen unterschiedlichen Formaten zurückliefern.
Das Beispiel hier interpretiert einige davon; es kann z.B.
mit Hilfe der Gestaltlab-Applikation (Link oben) einfach
ergänzt werden.
Ursprünglich ist
das Script geschrieben für ein altes Xtra namens AppleScriptXtra
(das inzwischen vom ZScript-Xtra von Zeus
productions abgelöst wurde); es schickt einfach einzeilige
AppleScripts mit Gestaltabfragen ans System und interpretiert die
Antworten. Nicht der schnellste Weg, aber es funktioniert.
Das gleiche funktioniert
auch mit BuddyApis baGestalt()-Funktion und mit OSUtil dann
um einiges schneller. Übrigens sind die Gestalt-Calls ein Weg,
den genannten Xtras Funktionen beizubringen, für die kein "hardgecodeter"
Aufruf zur Verfügung steht. In das Script unten auf der Seite
können Sie einfach auch andere Xtras einbinden, wenn diese
Gestalt-Abfragen unterstützen. Im Download-Movie sind zScript
und OSUtil bereits eingearbeitet.
|


 |
|
|
Diese Liste dient (nachdem
die Returns entfernt wurden) als Grundlage für die Gestaltabfragen
im Script weiter unten. Sie enthält eine Benennung des Features
im Klartext, den Gestalt-Call (die 4-Buchstaben-Codes; Leerzeichen
dürfen nicht weggelassen werden!) sowie Angaben, wie das Ergebnis
zu interpretieren ist.
[
"PowerPC": ["ppc ", #bool, #int],
"CPU-Typ": ["cput", #int],
"Maschinentyp": ["mach", #int],
"Busspeed in Hz": ["bclk", #int],
"RAM in Bytes": ["ram ",#int],
"Virtueller Speicher": ["vm ", #bool],
"Logisches Ram in Bytes": ["lram", #int],
"Systemversion": ["sysv", #base16],
"OS": ["os ", #int],
"Quicktime-Version": ["qtim", #numVers],
"QuickTime Power-Plug": ["qtrs", #bool],
"QuickTime VR 2": ["qtvr", #bool],
"QuickTime VR-Version": ["qtvv", #numvers],
"Open Transport": ["otan", [1: "OT
present", 2: "OT loaded", 4: "AppleTalk
present", 8: "AT loaded", 16: "TCP present",
32: "TCP loaded", 64: "IPXSPX present",
128: "IPXSPX loaded"]],
"Remote Access": ["otra", [1: "RA present",
2: "RA loaded", 4: "Client only", 8: "PServer",
16: "MPServer", 32: "PPP present", 64: "ARA
present"]],
"Open Transport-Version": ["otvr", #numvers],
"Filesystem": ["fs ", #int],
"AppleScript": ["ascr", [0: "AS present",
1: "PowerPC support"]],
"AppleScript-Version": ["ascv", #numVers],
"Event-Support": ["evnt", [1: "AE present",
2: "Scripting Support", 4: "OSL in System"]],
"Audio-CD-Support": ["aucd", #bool, #base16]
] |
|


 |
|
|
Das ist das Film-Script.
Es greift auf obige Liste zu; entfernen Sie die returns und nennen
Sie den Darsteller "Gestalt Selectors". Außerdem
benötigen Sie einen Text- oder Felddarsteller "display"
auf der Bühne. Rufen Sie dann einfach getsysprofile im Nachrichtenfenster
auf. Oder nutzen Sie das Download-Beispiel ;-)
Sie können getgestalt()
auch direkt aufrufen: es benötigt den Gestalt Selector und
ein Symbol für das zu benutzende Xtra (#AS or #BUD) als Parameter:
put getgestalt("otan",
#BUD).
Das Script überprüft
nicht explizit, ob ein Gestalt Selector überhaupt existiert
(was je nach Rechner und Systemversion unterschiedlich sein kann).
Zu erwarten ist, daß es 0 zurückliefert, wenn er nicht
existiert.
--
uses a premade gestalt selectors & formatting table
-- stored in member "Gestalt Selectors"
-- places output into text member "display"
global myinst
-- checks for Xtra availability, sets the
output formatting
-- and calls the gestalt engine for information
on getsysprofile anXtra
-- plug-in other Xtras here and
in getgestalt()
if checkXtra ("Buddy API Xtra") and
not(anXtra = #AS) then
anXtra = #Bud
else if checkXtra ("AppleScriptXtraFat") then
anXtra = #AS
else
alert "Neither BudAPI nor AppleScriptXtra
are present. This script won't work."
return
end if
sellist = value(member("Gestalt Selectors").text)
max = sellist.count()
member("display").text = ""
repeat with i = 1 to max
member("display").text = member("display").text
& RETURN & ¬ sellist.getpropat(i)&": "
member("display").text = member("display").text
& ¬ evalGestalt(sellist[i], anXtra)
updatestage
end repeat
cleanupXtra
end
--
Xtra independent gestalt call & formatting call
on evalGestalt
aList, WhichXtra
gestaltval = getgestalt(aList[1], whichXtra)
gestaltform = aList
return transform(gestaltval, gestaltform)
end
--
get the raw gestalt value with the xtra available
-- AppleScriptXtra or BudAPI
on getgestalt
which, whichxtra
if whichXtra = #Bud then return baGestalt(which)
else if whichxtra = #AS then
scrtext = "tell application ""e&"Finder""e
& ¬
" to return computer "
scrtext = scrtext & quote & which
& quote
return evalAS(scrtext)
end if
end
--
AppleScriptXtra function
on evalAS
aText
if voidP(myinst) then myinst = new(xtra "AppleScriptXtra")
myinst.setScriptText(atext)
myinst.run()
retval = myinst.getresult()
return retval
end
--
Close Xtra
on cleanupXtra
if voidp(myinst) then return
myinst.forget()
myinst = VOID
end
--
Transforms the raw gestalt value into human readable form (needs
-- work)
-- The info for interpretion is stored in the text member "Gestalt
-- Selectors"
on transform
myval, aList
myform = aList[2]
case TRUE of
(myform = #int):
return string(myval)
(myform = #bool):
temp = "nein"
if myval > 0 then temp =
"ja"
if aList.count() > 2 then
if aList[3] = #int
then return temp && ",Wert: "&string(myval)
else if aList[3]
= #base16 then return temp && ",Wert: " &
¬ base16(myval)
else return temp
else
return temp
end if
(myform = #base16):
return string(base16(myval))
(myform = #numVers):
return string(getNumVers(myval))
(listP(myform)):
return string(getbytes(myval,
myform))
otherwise
return "unknown format"
end case
end
-----------------------------------
-- Helper functions for transform()
-----------------------------------
on getBytes
anint, aform
temp = []
repeat with i = aform.count() down to 1
if anint >= aform.getpropat(i) then
temp.append(aform[i])
anint = anint - aform.getpropat(i)
end if
end repeat
temp2 = ""
repeat with i = temp.count() down to 1
temp2 = temp2 & temp[i] & ",
"
end repeat
return temp2.char[1..temp2.length - 2]
end
on getnumVers
anint
set the itemdelimiter = "."
myretval = base16(integer(item 1 of base16(anint)))
set temp = item 4 of myretval
myretval = myretval.char[1..5]
case integer(temp) of:
8: myretval = myretval &&"final"
6: myretval = myretval && "beta"
4, 2: myretval = myretval && "alpha/development"
end case
return myretval
end
on base16 anInt
x0 = string(integer(anInt)/4096)
x1 = string((integer(anInt) mod 4096)/256)
x2 = string((integer(anInt) mod 256) / 16)
x3 = string(integer(anInt) mod 16)
return x0&"."&x1&"."&x2&"."&x3
end
--------------------------------------------------
-- Helper function for checking Xtra availability
--------------------------------------------------
on checkXtra
anXtra
temp = the xtralist
repeat with i = 1 to temp.count()
if temp[i].name = anxtra then return TRUE
end repeat
--alert "Das Xtra ""e&&anXtra"e&"
ist nicht vorhanden."
return FALSE
end
Joachim
Gola
|


 |
|