D7WS HOMEPAGE WORKSHOP NEUE XTRAS GALERIE WORKSHOP Automatic Translation LESERSERVICE BUCH NEWS

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 "&quote&"Finder"&quote & ¬
" 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 "&quote&&anXtra&quote&" ist nicht vorhanden."
  return FALSE
end

Joachim Gola




 


Directorworkshop.de ist © Joachim Gola & Gerd Gillmaier 1998-2002. Alle Rechte vorbehalten.