Windows.Oberon.PlugInDocs.Mod 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. (* ETH Oberon, Copyright 2001 ETH Zuerich Institut fuer Computersysteme, ETH Zentrum, CH-8092 Zuerich.
  2. Refer to the "General ETH Oberon System Source License" contract available at: http://www.oberon.ethz.ch/ *)
  3. MODULE PlugInDocs IN Oberon; (** portable *) (* ejz *)
  4. IMPORT FileDir, Win32FS:=WinFS IN A2, Objects, Oberon, Attributes, Gadgets, PlugIns, Documents, Out;
  5. TYPE
  6. Request = POINTER TO RECORD (Objects.Object)
  7. plugin: PlugIns.PlugIn;
  8. url: PlugIns.URLStr;
  9. obj: Objects.Object
  10. END;
  11. PROCEDURE Exchange(old, new: Documents.Document);
  12. VAR name: Objects.Name; w, h: INTEGER;
  13. BEGIN
  14. Gadgets.GetObjName(old, name); w := old.W; h := old.H;
  15. old^ := new^;
  16. Gadgets.NameObj(old, name); old.W := w; old.H := h;
  17. Gadgets.Update(old); Gadgets.Update(old.dsc)
  18. END Exchange;
  19. PROCEDURE GetStream(doc: Documents.Document; R: Request; stream: PlugIns.Stream; state: LONGINT): BOOLEAN;
  20. VAR new: Documents.Document;
  21. BEGIN
  22. Out.String("GetStream "); Out.Int(state, 0); Out.Ln();
  23. IF state # PlugIns.Transfering THEN
  24. doc.handle := R.handle; doc.obj := R.obj;
  25. IF state # PlugIns.Done THEN
  26. IF stream = NIL THEN
  27. NEW(stream); COPY(R.url, stream.url); stream.state := state
  28. END;
  29. PlugIns.StreamError(R.plugin, stream)
  30. ELSIF stream # NIL THEN
  31. new := Documents.Open(stream.file);
  32. Out.String("GetStream "); Out.String(stream.file); Out.Ln();
  33. IF (new # NIL) & (new.dsc # NIL) THEN
  34. Exchange(doc, new)
  35. ELSE
  36. HALT(100);
  37. stream.state := PlugIns.OtherError; PlugIns.StreamError(R.plugin, stream)
  38. END
  39. ELSE (* wait for update *)
  40. RETURN FALSE
  41. END;
  42. RETURN TRUE
  43. END;
  44. RETURN FALSE
  45. END GetStream;
  46. PROCEDURE GetHandler(doc: Objects.Object; VAR M: Objects.ObjMsg);
  47. VAR R: Request; stream: PlugIns.Stream;
  48. BEGIN
  49. WITH doc: Documents.Document DO
  50. R := doc.obj(Request); doc.handle := R.handle; doc.obj := R.obj;
  51. IF M IS Gadgets.UpdateMsg THEN
  52. WITH M: Gadgets.UpdateMsg DO
  53. IF (M.obj # NIL) & (M.obj IS PlugIns.Stream) THEN
  54. stream := M.obj(PlugIns.Stream);
  55. IF PlugIns.SameURL(stream.url, R.url) & GetStream(doc, R, stream, stream.state) THEN
  56. RETURN
  57. END
  58. END
  59. END
  60. END;
  61. doc.handle(doc, M);
  62. doc.handle := GetHandler; doc.obj := R
  63. END
  64. END GetHandler;
  65. (* name url *)
  66. PROCEDURE Load*;
  67. VAR
  68. S: Attributes.Scanner; R: Request;
  69. obj: Objects.Object; doc: Documents.Document;
  70. res: LONGINT;
  71. BEGIN
  72. Attributes.OpenScanner(S, Oberon.Par.text, Oberon.Par.pos);
  73. Attributes.Scan(S);
  74. IF S.class IN {Attributes.Name, Attributes.String} THEN
  75. Out.String("PlugInDocs.Load name "); Out.String(S.s); Out.Ln();
  76. NEW(R);
  77. obj := Gadgets.FindObj(Gadgets.context, S.s);
  78. R.plugin := PlugIns.CurrentPlugIn(Gadgets.context);
  79. IF (R.plugin # NIL) & (obj # NIL) & (obj IS Documents.Document) THEN
  80. Attributes.Scan(S); doc := obj(Documents.Document);
  81. IF S.class IN {Attributes.Name, Attributes.String} THEN
  82. COPY(S.s, R.url); PlugIns.MakeFullURL(R.plugin, R.url);
  83. Out.String("PlugInDocs.Load URL "); Out.String(R.url); Out.Ln();
  84. R.handle := doc.handle; R.obj := doc.obj; doc.obj := R;
  85. doc.handle := GetHandler;
  86. res := R.plugin.getURL(R.plugin, R.url);
  87. IF (res # PlugIns.Done) & GetStream(doc, R, NIL, res) THEN
  88. END
  89. END
  90. END
  91. END
  92. END Load;
  93. PROCEDURE PostStream(doc: Documents.Document; R: Request; stream: PlugIns.Stream; state: LONGINT): BOOLEAN;
  94. BEGIN
  95. Out.String("PostStream "); Out.Int(state, 0); Out.Ln();
  96. IF state # PlugIns.Transfering THEN
  97. doc.handle := R.handle; doc.obj := R.obj;
  98. IF state # PlugIns.Done THEN
  99. IF stream = NIL THEN
  100. NEW(stream); COPY(R.url, stream.url); stream.state := state
  101. END;
  102. PlugIns.StreamError(R.plugin, stream)
  103. END;
  104. RETURN TRUE
  105. END;
  106. RETURN FALSE
  107. END PostStream;
  108. PROCEDURE PostHandler(doc: Objects.Object; VAR M: Objects.ObjMsg);
  109. VAR R: Request; stream: PlugIns.Stream;
  110. BEGIN
  111. WITH doc: Documents.Document DO
  112. R := doc.obj(Request); doc.handle := R.handle; doc.obj := R.obj;
  113. IF M IS Gadgets.UpdateMsg THEN
  114. WITH M: Gadgets.UpdateMsg DO
  115. IF (M.obj # NIL) & (M.obj IS PlugIns.Stream) THEN
  116. stream := M.obj(PlugIns.Stream);
  117. IF PlugIns.SameURL(stream.url, R.url) & PostStream(doc, R, stream, stream.state) THEN
  118. RETURN
  119. END
  120. END
  121. END
  122. END;
  123. doc.handle(doc, M);
  124. doc.handle := PostHandler; doc.obj := R
  125. END
  126. END PostHandler;
  127. PROCEDURE PostNames(VAR url, file: ARRAY OF CHAR);
  128. VAR i, j, k, l: LONGINT;
  129. BEGIN
  130. Win32FS.GetTempDirectory(file);
  131. l := 0; WHILE file[l] # 0X DO INC(l) END;
  132. i := 0; j := l; k := 0;
  133. WHILE url[i] # 0X DO
  134. IF url[i] = FileDir.PathChar THEN
  135. j := l; k := i
  136. END;
  137. file[j] := url[i]; INC(j); INC(i)
  138. END;
  139. url[k] := 0X; file[j] := 0X
  140. END PostNames;
  141. (* name url *)
  142. PROCEDURE Store*;
  143. VAR
  144. S: Attributes.Scanner; R: Request;
  145. obj: Objects.Object; doc: Documents.Document;
  146. file, name: FileDir.FileName; res: LONGINT;
  147. BEGIN
  148. Attributes.OpenScanner(S, Oberon.Par.text, Oberon.Par.pos);
  149. Attributes.Scan(S);
  150. IF S.class IN {Attributes.Name, Attributes.String} THEN
  151. Out.String("PlugInDocs.Store name "); Out.String(S.s); Out.Ln();
  152. NEW(R);
  153. obj := Gadgets.FindObj(Gadgets.context, S.s);
  154. R.plugin := PlugIns.CurrentPlugIn(Gadgets.context);
  155. IF (R.plugin # NIL) & (obj # NIL) & (obj IS Documents.Document) THEN
  156. Attributes.Scan(S); doc := obj(Documents.Document);
  157. IF S.class IN {Attributes.Name, Attributes.String} THEN
  158. COPY(S.s, R.url); PlugIns.MakeFullURL(R.plugin, R.url);
  159. file := ""; PostNames(R.url, file);
  160. Out.String("PlugInDocs.Store "); Out.String(file); Out.String(" => "); Out.String(R.url); Out.Ln();
  161. COPY(doc.name, name); COPY(file, doc.name);
  162. doc.Store(doc); COPY(name, doc.name);
  163. R.handle := doc.handle; R.obj := doc.obj; doc.obj := R;
  164. doc.handle := PostHandler;
  165. res := R.plugin.postURL(R.plugin, R.url, file);
  166. IF (res # PlugIns.Done) & PostStream(doc, R, NIL, res) THEN
  167. END
  168. END
  169. END
  170. END
  171. END Store;
  172. END PlugInDocs.
  173. Packages.Build
  174. PACKAGE test.oaf 2.4 "doc:PlugInDocs.Panel" ~
  175. PlugInDocs.Panel PlugInDocs.Lib
  176. EditTools.OpenAscii test.html
  177. ftp://zeller@lillian/home/zeller/Test.Panel
  178. Packages.Build
  179. PACKAGE Hello.oaf 2.4 "lib:Hello.TextArea" ~
  180. Hello.Lib