home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 7 / Apprentice-Release7.iso / Source Code / Pascal / Snippets / PNL Libraries / MyScripting.p < prev    next >
Encoding:
Text File  |  1996-05-29  |  8.7 KB  |  327 lines  |  [TEXT/CWIE]

  1. unit MyScripting;
  2.  
  3. interface
  4.  
  5.     uses
  6.         OSA;
  7.  
  8.     function InitScripting: OSAError;
  9.     function FinishScripting: OSAError;
  10.     procedure InitContext;
  11.     procedure SaveContext;
  12.     procedure FinishContext;
  13.     function CompileScript (h: Handle; var id: OSAID): OSAError;
  14.     function DestroyScript (id: OSAID): OSAError;
  15.     function ExecuteScript (id: OSAID): OSAError;
  16.     procedure MyGetScriptErrorInfo (var error: OSAError; var start, fin: integer; var errmsg: Str255);
  17.     function ExecScript (script: Handle; var error: OSAError; var start, fin: integer; var errmsg: Str255): OSErr;
  18.     function EvaluateScript (script: Handle; resultType: DescType; var result: AEDesc): OSAError;
  19.  
  20. implementation
  21.  
  22.     uses
  23.         AppleScript, MyStrings, MyUtils,{}
  24.         MyStrH, QLowLevel,{}
  25.         MyVersionResource, MyNewPreferences, MyMachineNames, MyAEUtils;
  26.  
  27.     type
  28.         XXXAEDescPtr = ^AEDesc;
  29.         
  30.     const
  31.         kComponentNotFound = -2;
  32.  
  33.     var
  34.         gScriptingComponent: ComponentInstance;
  35.         gScriptingName: Str255;
  36.         gContext: OSAID;
  37.  
  38.     function Deque (var p: univ QElemPtr; var head: QHdr): boolean;
  39.     begin
  40.         p := nil;
  41.         while (p = nil) & (head.qHead <> nil) do begin
  42.             p := head.QHead;
  43.             if Dequeue(p, @head) <> noErr then begin
  44.                 p := nil;
  45.             end;
  46.         end;
  47.         Deque := p <> nil;
  48.     end;
  49.  
  50.     procedure InitContext;
  51.         var
  52.             oe, ooe: OSAError;
  53.             h: Handle;
  54.             desc: AEDesc;
  55.     begin
  56.         if gContext <> kOSANullScript then begin
  57.             oe := OSADispose(gScriptingComponent, gContext);
  58.             gContext := kOSANullScript;
  59.         end;
  60.         ReadPrefsHandle(h, kOSAScriptResourceType, 128);
  61.         if h <> nil then begin
  62.             HLock(h);
  63.             oe := AECreateDesc(typeOSAGenericStorage, h^, GetHandleSize(h), desc);
  64.             HUnlock(h);
  65.             DisposeHandle(h);
  66.             h := nil;
  67.             if oe = noErr then begin
  68.                 gContext := kOSANullScript;
  69.                 oe := OSALoad(gScriptingComponent, desc, kOSANullMode, gContext);
  70.                 if oe <> noErr then begin
  71.                     gContext := kOSANullScript;
  72.                 end;
  73.                 AEDestroy(desc);
  74.             end;
  75.         end;
  76.         if gContext = kOSANullScript then begin
  77.             oe := OSAMakeContext(gScriptingComponent,XXXAEDescPtr(nil)^, kOSANullScript, gContext);
  78.             if oe <> noErr then begin
  79.                 gContext := kOSANullScript;
  80.             end;
  81.         end;
  82.     end;
  83.  
  84.     procedure SaveContext;
  85.         var
  86.             desc: AEDesc;
  87.             oe, ooe: OSAError;
  88.     begin
  89.         if gContext <> kOSANullScript then begin
  90.             oe := OSAStore(gScriptingComponent, gContext, typeOSAGenericStorage, 0, desc);
  91.             if oe = noErr then begin
  92.                 WritePrefsHandle(desc.dataHandle, kOSAScriptResourceType, 128);
  93.                 AEDestroy(desc);
  94.             end;
  95.         end;
  96.     end;
  97.  
  98.     procedure FinishContext;
  99.         var
  100.             oe: OSAError;
  101.     begin
  102.         if gContext <> kOSANullScript then begin
  103.             oe := OSADispose(gScriptingComponent, gContext);
  104.         end;
  105.     end;
  106.  
  107.     function InitScripting: OSAError;
  108.         var
  109.             oe: OSAError;
  110.             desc: ComponentDescription;
  111.             mine: Component;
  112.             er: EventRecord;
  113.             named: AEDesc;
  114.     begin
  115.         gContext := kOSANullScript;
  116.  
  117.         desc.componentType := kOSAComponentType;
  118.         desc.componentSubType := kAppleScriptSubtype;
  119.         desc.componentManufacturer := OSType(0);
  120.         desc.componentFlags := kOSASupportsCompiling + kOSASupportsGetSource + kOSASupportsAESending;
  121.         desc.componentFlagsMask := desc.componentFlags;
  122.  
  123.         oe := kComponentNotFound;
  124.         mine := FindNextComponent(nil, desc);
  125.         if mine <> nil then begin
  126.             gScriptingComponent := OpenComponent(mine);
  127.             if gScriptingComponent <> nil then begin
  128.                 gScriptingName := '?';
  129.                 oe := OSAScriptingComponentName(gScriptingComponent, named);
  130.                 if oe = noErr then begin
  131.                     oe := GetStringFromAEDesc(named, gScriptingName);
  132.                     AEDestroy(named);
  133.                 end;
  134.                 if oe = noErr then begin
  135.                     oe := OSAMakeContext(gScriptingComponent, XXXAEDescPtr(nil)^, kOSANullScript, gContext);
  136.                 end;
  137.                 if oe <> noErr then begin
  138.                     gContext := kOSANullScript;
  139.                 end;
  140.                 oe := noErr;
  141.             end;
  142.         end;
  143.  
  144.         InitScripting := oe;
  145.     end;
  146.  
  147.     function FinishScripting: OSAError;
  148.     begin
  149.         FinishScripting := CloseComponent(gScriptingComponent);
  150.     end;
  151.  
  152.     function CompileScript (h: Handle; var id: OSAID): OSAError;
  153.         var
  154.             desc: AEDesc;
  155.             oe, ooe: OSAError;
  156.     begin
  157.         HLock(h);
  158.         oe := AECreateDesc(typeChar, h^, GetHandleSize(h), desc);
  159.         HUnlock(h);
  160.         if oe = noErr then begin
  161.             id := kOSANullScript;
  162.             oe := OSACompile(gScriptingComponent, desc, kOSANullMode, id);
  163.             AEDestroy(desc);
  164.         end;
  165.         CompileScript := oe;
  166.     end;
  167.  
  168.     function DestroyScript (id: OSAID): OSAError;
  169.     begin
  170.         DestroyScript := OSADispose(gScriptingComponent, id);
  171.     end;
  172.  
  173.     function ExecuteScript (id: OSAID): OSAError;
  174.         var
  175.             resultID: OSAID;
  176.             oe, ooe: OSAError;
  177.     begin
  178.         oe := OSAExecute(gScriptingComponent, id, gContext, kOSANullMode, resultID);
  179.         if oe = noErr then begin
  180.             ooe := OSADispose(gScriptingComponent, resultID);
  181.         end;
  182.         ExecuteScript := oe;
  183.     end;
  184.  
  185.     procedure MyGetScriptErrorInfo (var error: OSAError; var start, fin: integer; var errmsg: Str255);
  186.         type
  187.             OSErrPtr = ^OSErr;
  188.             OSErrHandle = ^OSErrPtr;
  189.         var
  190.             errorMessage: Handle;
  191.             desc, recordDesc: AEDesc;
  192.             actualType: DescType;
  193.             actualSize: Size;
  194.             oe: OSAError;
  195.             s: Str255;
  196.     begin
  197.         oe := OSAScriptError(gScriptingComponent, kOSAErrorNumber, typeShortInteger, desc);
  198.         error := OSErrHandle(desc.dataHandle)^^;
  199.         AEDestroy(desc);
  200.  
  201.         oe := OSAScriptError(gScriptingComponent, kOSAErrorRange, typeOSAErrorRange, desc);
  202.         oe := AECoerceDesc(desc, typeAERecord, recordDesc);
  203.         oe := AEGetKeyPtr(recordDesc, keyOSASourceStart, typeShortInteger, actualType, Ptr(@start), sizeOf(start), actualSize);
  204.         oe := AEGetKeyPtr(recordDesc, keyOSASourceEnd, typeShortInteger, actualType, Ptr(@fin), sizeOf(fin), actualSize);
  205.         AEDestroy(desc);
  206.         AEDestroy(recordDesc);
  207.  
  208.         oe := OSAScriptError(gScriptingComponent, kOSAErrorMessage, typeChar, desc);
  209.         HandleToString(desc.dataHandle, errmsg);
  210.         AEDestroy(desc);
  211.     end;
  212.  
  213.     function ExecScript (script: Handle; var error: OSAError; var start, fin: integer; var errmsg: Str255): OSErr;
  214.         var
  215.             err, oe, ooe: OSAError;
  216.             scriptID, resultID: OSAID;
  217.             resultText: AEDesc;
  218.     begin
  219.         error := 0;
  220.         start := 0;
  221.         fin := 0;
  222.         errmsg := '';
  223.         err := CompileScript(script, scriptID);
  224.         SetHandleSize(script, 0);
  225.         if err <> noErr then begin
  226.             if err = errOSAScriptError then begin
  227.                 MyGetScriptErrorInfo(error, start, fin, errmsg);
  228.             end;
  229.         end
  230.         else begin
  231.             err := OSAExecute(gScriptingComponent, scriptID, gContext, kOSANullMode, resultID);
  232.             ooe := OSADispose(gScriptingComponent, scriptID);
  233.             SaveContext;
  234.             if err = noErr then begin
  235.                 err := OSADisplay(gScriptingComponent, resultID, typeChar, kOSANullMode, resultText);
  236.                 ooe := OSADispose(gScriptingComponent, resultID);
  237.                 if err = noErr then begin
  238.                     err := HandAndHand(resultText.dataHandle, script);
  239.                     AEDestroy(resultText);
  240.                 end;
  241.             end
  242.             else if err = errOSAScriptError then begin
  243.                 MyGetScriptErrorInfo(error, start, fin, errmsg);
  244.             end;
  245.             if err <> noErr then begin
  246.                 SetHandleSize(script, 0);
  247.             end;
  248.         end;
  249.         ExecScript := err;
  250.     end;
  251.  
  252.     function EvaluateScript (script: Handle; resultType: DescType; var result: AEDesc): OSAError;
  253.         var
  254.             scriptID, resultID: OSAID;
  255.             err, junk: OSAError;
  256.     begin
  257.         AECreate(result);
  258.         err := CompileScript(script, scriptID);
  259.         if err = noErr then begin
  260.             err := OSAExecute(gScriptingComponent, scriptID, kOSANullScript, kOSANullMode, resultID);
  261.             junk := OSADispose(gScriptingComponent, scriptID);
  262.             if err = noErr then begin
  263.                 err := OSACoerceToDesc(gScriptingComponent, resultID, resultType, kOSANullMode, result);
  264.                 junk := OSADispose(gScriptingComponent, resultID);
  265.             end;
  266.         end;
  267.         EvaluateScript := err;
  268.     end;
  269.  
  270. end.
  271. function ValidatePassword (username, password: Str255): boolean;
  272.     procedure QuoteStuff (var s: Str255);
  273.         var
  274.             i: integer;
  275.     begin
  276.         i := 1;
  277.         while (i < length(s)) do begin
  278.             if s[i] = '"' then begin
  279.                 Insert('\', s, i);
  280.                 i := i + 1;
  281.             end;
  282.             i := i + 1;
  283.         end;
  284.     end;
  285.     var
  286.         script: Handle;
  287.         s: Str255;
  288.         scriptID, resultID: OSAID;
  289.         resultDesc: AEDesc;
  290.         oe, ooe: OSAError;
  291. begin
  292.     ValidatePassword := false;
  293.     if IUEqualString(username, GetOwnerName) = 0 then begin
  294.         QuoteStuff(username);
  295.         QuoteStuff(password);
  296.         SPrintS3(s, GetIndStr(128, 5), username, password, '');
  297.         script := NewHandle(0);
  298.         StringToHandle(s, script);
  299.         oe := CompileScript(script, scriptID);
  300.         DisposeHandle(script);
  301.         if oe = noErr then begin
  302.             oe := OSAExecute(gScriptingComponent, scriptID, kOSANullScript, kOSANullMode, resultID);
  303.             ooe := OSADispose(gScriptingComponent, scriptID);
  304.             if oe = noErr then begin
  305.                 oe := OSACoerceToDesc(gScriptingComponent, resultID, typeBoolean, kOSANullMode, resultDesc);
  306.                 ValidatePassword := resultDesc.dataHandle^^ <> 0;
  307.                 ooe := OSADispose(gScriptingComponent, resultID);
  308.                 if oe = noErr then begin
  309.                     AEDestroy(resultDesc);
  310.                 end;
  311.             end;
  312.         end;
  313.     end;
  314. end;
  315.  
  316. procedure ExecScriptOld (script, result: Handle);
  317.     var
  318.         oe: OSAError;
  319.         scriptID, resultID: OSAID;
  320. begin
  321.     oe := CompileScript(script, scriptID);
  322.     writeln(oe);
  323.     oe := ExecuteScript(scriptID);
  324.     writeln(oe);
  325.     oe := DestroyScript(scriptID);
  326.     writeln(oe);
  327. end;