123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198 |
- (* ETH Oberon, Copyright 2001 ETH Zuerich Institut fuer Computersysteme, ETH Zentrum, CH-8092 Zuerich.
- Refer to the "General ETH Oberon System Source License" contract available at: http://www.oberon.ethz.ch/ *)
- MODULE PlugInDocs IN Oberon; (** portable *) (* ejz *)
- IMPORT FileDir, Win32FS:=WinFS IN A2, Objects, Oberon, Attributes, Gadgets, PlugIns, Documents, Out;
- TYPE
- Request = POINTER TO RECORD (Objects.Object)
- plugin: PlugIns.PlugIn;
- url: PlugIns.URLStr;
- obj: Objects.Object
- END;
- PROCEDURE Exchange(old, new: Documents.Document);
- VAR name: Objects.Name; w, h: INTEGER;
- BEGIN
- Gadgets.GetObjName(old, name); w := old.W; h := old.H;
- old^ := new^;
- Gadgets.NameObj(old, name); old.W := w; old.H := h;
- Gadgets.Update(old); Gadgets.Update(old.dsc)
- END Exchange;
- PROCEDURE GetStream(doc: Documents.Document; R: Request; stream: PlugIns.Stream; state: LONGINT): BOOLEAN;
- VAR new: Documents.Document;
- BEGIN
- Out.String("GetStream "); Out.Int(state, 0); Out.Ln();
- IF state # PlugIns.Transfering THEN
- doc.handle := R.handle; doc.obj := R.obj;
- IF state # PlugIns.Done THEN
- IF stream = NIL THEN
- NEW(stream); COPY(R.url, stream.url); stream.state := state
- END;
- PlugIns.StreamError(R.plugin, stream)
- ELSIF stream # NIL THEN
- new := Documents.Open(stream.file);
- Out.String("GetStream "); Out.String(stream.file); Out.Ln();
- IF (new # NIL) & (new.dsc # NIL) THEN
- Exchange(doc, new)
- ELSE
- HALT(100);
- stream.state := PlugIns.OtherError; PlugIns.StreamError(R.plugin, stream)
- END
- ELSE (* wait for update *)
- RETURN FALSE
- END;
- RETURN TRUE
- END;
- RETURN FALSE
- END GetStream;
- PROCEDURE GetHandler(doc: Objects.Object; VAR M: Objects.ObjMsg);
- VAR R: Request; stream: PlugIns.Stream;
- BEGIN
- WITH doc: Documents.Document DO
- R := doc.obj(Request); doc.handle := R.handle; doc.obj := R.obj;
- IF M IS Gadgets.UpdateMsg THEN
- WITH M: Gadgets.UpdateMsg DO
- IF (M.obj # NIL) & (M.obj IS PlugIns.Stream) THEN
- stream := M.obj(PlugIns.Stream);
- IF PlugIns.SameURL(stream.url, R.url) & GetStream(doc, R, stream, stream.state) THEN
- RETURN
- END
- END
- END
- END;
- doc.handle(doc, M);
- doc.handle := GetHandler; doc.obj := R
- END
- END GetHandler;
- (* name url *)
- PROCEDURE Load*;
- VAR
- S: Attributes.Scanner; R: Request;
- obj: Objects.Object; doc: Documents.Document;
- res: LONGINT;
- BEGIN
- Attributes.OpenScanner(S, Oberon.Par.text, Oberon.Par.pos);
- Attributes.Scan(S);
- IF S.class IN {Attributes.Name, Attributes.String} THEN
- Out.String("PlugInDocs.Load name "); Out.String(S.s); Out.Ln();
- NEW(R);
- obj := Gadgets.FindObj(Gadgets.context, S.s);
- R.plugin := PlugIns.CurrentPlugIn(Gadgets.context);
- IF (R.plugin # NIL) & (obj # NIL) & (obj IS Documents.Document) THEN
- Attributes.Scan(S); doc := obj(Documents.Document);
- IF S.class IN {Attributes.Name, Attributes.String} THEN
- COPY(S.s, R.url); PlugIns.MakeFullURL(R.plugin, R.url);
- Out.String("PlugInDocs.Load URL "); Out.String(R.url); Out.Ln();
- R.handle := doc.handle; R.obj := doc.obj; doc.obj := R;
- doc.handle := GetHandler;
- res := R.plugin.getURL(R.plugin, R.url);
- IF (res # PlugIns.Done) & GetStream(doc, R, NIL, res) THEN
- END
- END
- END
- END
- END Load;
- PROCEDURE PostStream(doc: Documents.Document; R: Request; stream: PlugIns.Stream; state: LONGINT): BOOLEAN;
- BEGIN
- Out.String("PostStream "); Out.Int(state, 0); Out.Ln();
- IF state # PlugIns.Transfering THEN
- doc.handle := R.handle; doc.obj := R.obj;
- IF state # PlugIns.Done THEN
- IF stream = NIL THEN
- NEW(stream); COPY(R.url, stream.url); stream.state := state
- END;
- PlugIns.StreamError(R.plugin, stream)
- END;
- RETURN TRUE
- END;
- RETURN FALSE
- END PostStream;
- PROCEDURE PostHandler(doc: Objects.Object; VAR M: Objects.ObjMsg);
- VAR R: Request; stream: PlugIns.Stream;
- BEGIN
- WITH doc: Documents.Document DO
- R := doc.obj(Request); doc.handle := R.handle; doc.obj := R.obj;
- IF M IS Gadgets.UpdateMsg THEN
- WITH M: Gadgets.UpdateMsg DO
- IF (M.obj # NIL) & (M.obj IS PlugIns.Stream) THEN
- stream := M.obj(PlugIns.Stream);
- IF PlugIns.SameURL(stream.url, R.url) & PostStream(doc, R, stream, stream.state) THEN
- RETURN
- END
- END
- END
- END;
- doc.handle(doc, M);
- doc.handle := PostHandler; doc.obj := R
- END
- END PostHandler;
- PROCEDURE PostNames(VAR url, file: ARRAY OF CHAR);
- VAR i, j, k, l: LONGINT;
- BEGIN
- Win32FS.GetTempDirectory(file);
- l := 0; WHILE file[l] # 0X DO INC(l) END;
- i := 0; j := l; k := 0;
- WHILE url[i] # 0X DO
- IF url[i] = FileDir.PathChar THEN
- j := l; k := i
- END;
- file[j] := url[i]; INC(j); INC(i)
- END;
- url[k] := 0X; file[j] := 0X
- END PostNames;
- (* name url *)
- PROCEDURE Store*;
- VAR
- S: Attributes.Scanner; R: Request;
- obj: Objects.Object; doc: Documents.Document;
- file, name: FileDir.FileName; res: LONGINT;
- BEGIN
- Attributes.OpenScanner(S, Oberon.Par.text, Oberon.Par.pos);
- Attributes.Scan(S);
- IF S.class IN {Attributes.Name, Attributes.String} THEN
- Out.String("PlugInDocs.Store name "); Out.String(S.s); Out.Ln();
- NEW(R);
- obj := Gadgets.FindObj(Gadgets.context, S.s);
- R.plugin := PlugIns.CurrentPlugIn(Gadgets.context);
- IF (R.plugin # NIL) & (obj # NIL) & (obj IS Documents.Document) THEN
- Attributes.Scan(S); doc := obj(Documents.Document);
- IF S.class IN {Attributes.Name, Attributes.String} THEN
- COPY(S.s, R.url); PlugIns.MakeFullURL(R.plugin, R.url);
- file := ""; PostNames(R.url, file);
- Out.String("PlugInDocs.Store "); Out.String(file); Out.String(" => "); Out.String(R.url); Out.Ln();
- COPY(doc.name, name); COPY(file, doc.name);
- doc.Store(doc); COPY(name, doc.name);
- R.handle := doc.handle; R.obj := doc.obj; doc.obj := R;
- doc.handle := PostHandler;
- res := R.plugin.postURL(R.plugin, R.url, file);
- IF (res # PlugIns.Done) & PostStream(doc, R, NIL, res) THEN
- END
- END
- END
- END
- END Store;
- END PlugInDocs.
- Packages.Build
- PACKAGE test.oaf 2.4 "doc:PlugInDocs.Panel" ~
- PlugInDocs.Panel PlugInDocs.Lib
- EditTools.OpenAscii test.html
- ftp://zeller@lillian/home/zeller/Test.Panel
- Packages.Build
- PACKAGE Hello.oaf 2.4 "lib:Hello.TextArea" ~
- Hello.Lib
|