[Oberon] Mail.GetUIDLs

Chris Glur easlab at absamail.co.za
Thu Jan 19 19:45:23 CET 2012


> >        PROCEDURE GetUIDLs(S: NetTools.Session; VAR T: Texts.Text);
> >                VAR
> >                        F: Files.File;
> >                        R: Files.Rider;
> >        BEGIN
> >                SendCmd(S, "UIDL", "");
> >                IF ReadState(S) THEN
> >                        F := Files.New(""); Files.Set(R, F, 0);   <-- initFile
> >                        ReadText(S, R);                     <--  ?presume? S=>R
> >                        NEW(T); Texts.LoadAscii(T, F)
> >                ELSE
> >                        T := NIL  <-- perhaps at error-flag for callingProc
> >                END
> >        END GetUIDLs;
> >
> > Files.New("") creates an anonymous file.  What becomes of this file when
> > GetUIDLs exits?  Why is the file involved rather than the data from Session
> > put directly into T?
> >
> > Thanks,                        ... Peter E.
> >
> >
> > --
        PROCEDURE GetUIDLs(S: NetTools.Session; VAR T: Texts.Text);
S              SendCmd(S, "UIDL", "");
               IF ReadState(S) THEN
                      F := Files.New(""); Files.Set(R, F, 0);   <-- initFile
S=>R                   ReadText(S, R);                     <--  ?presume? S=>R

Aubrey McIntosh wrote:-
> This code has the same interpretation under V4 or Component Pascal, so I
> think my comment will be true for the ETH / PC Native.
> 
> A Text is not a sequence of bytes.  It is more abstract than a file is.  It
> is a sequence of "Runs" where each run has attributes such as font, color,
> length, and a source file and the starting position.
> 
> This structure makes it very fast to copy from one viewer to another.
> 
> When a Text is saved to a file, the separate runs are all written anew to
> that file.  At that time it is very easy to confuse the concepts of Text
> and File, so I always try to think of a text that is displayed in a viewer
> after it has had items copied from other texts whenever I am writing code.
> 
> So, there has to be a file that is referenced in the Run data structure.
>  In this code snippet, the new anonymous file is created to fill that role.
> 
> In Component Pascal, Converters all appear to contain code that looks
> almost identical this.

I always understood that such low-level implementation details were hidden,
and that the interface [to other modules] couldn't see that.
=================
For no obvious reason Alexander Iljin
wrapped his mail in inconvenient base64 encoding, that:
]  The anonymous file will be garbage-collected at a later time.
]  I would guess that Texts.LoadAscii contains some important data conversion, 
]  e.g. it may ensure that there are no garbage characters, etc. 
]  One has to look at the procedure to find out.

======> Lets see if switching from LEO to LNO can show N-O:Mail.Mod  ?
OK, LNO can mount my decades old N-O:<Source>.Mod
 and can write Mail.Mod to a linux file; but the <select BIG text via 2 viewers
via shift-key> doesn't work. So I've just copied 	PROCEDURE ReadState
 and 	PROCEDURE ReadText


I'm particularly interested in this, because I had to modify/extend the
<mail> code to handle <Send Authenticate>.
And now I remember that I discovered that Mail.Mod was terrible code,
whereas TextMail.Mod was nicely structured  --  which I used.

When I started ETHO in the late 90's I couldn't get Mail.Panel to work;
so I used TextMail.* and have been using it since then.
It's call inertia and it's the reason why 98% of the population uses M$
even though it is such garbage.

== Chris Glur.

PS. for convenience I'm just going to mail this my: /home/Mail.Mod
Don't bother to read the 2 attatched PROCs. Of course I could cut them.
BTW, of course you can't see how I've coloured this text to help in the
analysis [mental process aid].

IMO this <object view> of computing is powerful and flexible:
you don't think ito applications like mailers and browsers.
You think rather ito of files [& lines & bytes].
And being-emailed is just one of the actions that the object:file can do.
So what is valuable and 'permanent' is YOUR data, and the applications
which it uses are just transitory.  So eg. *this* discussion about Mail.GetUIDLs
doesn't belong to email, Usenet , http, *.pdf-apps ..etc. It is data that belongs
at a suitable place in your data-repository [currently in a file directory]
and what ever applications become suitable and available can use the 
data and add value.
===========================================================


	PROCEDURE ReadState(S: NetTools.Session): BOOLEAN;
	BEGIN
		NetSystem.ReadString(S.C, S.reply);
		IF trace THEN
			Texts.WriteString(W, "RCV: "); Texts.WriteString(W, S.reply);
			Texts.WriteLn(W); Texts.Append(Oberon.Log, W.buf)
		END;
		IF S.reply[0] = "+" THEN
			S.status := NetTools.Done; S.res := NetTools.Done
		ELSE
			S.status := NetTools.Failed; S.res := NetTools.Failed
		END;
		RETURN S.status = NetTools.Done
	END ReadState;
================
	PROCEDURE ReadText(S: NetTools.Session; VAR R: Files.Rider);
		VAR
			buffer: ARRAY BufLen OF CHAR;
			len, rlen, i, offs: LONGINT;
			state: INTEGER;
			ch, old: CHAR;
	BEGIN
		old := 0X; offs := 1;
		len := NetSystem.Available(S.C);
		state := NetSystem.State(S.C);
		WHILE (len > 0) OR (state = NetSystem.inout) DO
			IF len > (BufLen-2) THEN
				rlen := BufLen-2
			ELSE
				rlen := len
			END;
			NetSystem.ReadBytes(S.C, 0, rlen, buffer);
			i := 0;
			WHILE i < rlen DO
				ch := buffer[i];
				IF ch = Strings.CR THEN
					Files.Write(R, ch);
					IF (offs = 2) & (old = ".") THEN
						Files.Write(R, Strings.LF);
						RETURN
					END;
					offs := 0
				ELSE
					IF (offs > 0) OR (ch # ".") THEN
						Files.Write(R, ch)
					END;
					INC(offs)
				END;
				old := ch; INC(i)
			END;
			DEC(len, rlen);
			IF len <= 0 THEN
				len := NetSystem.Available(S.C);
				state := NetSystem.State(S.C)
			END
		END
	END ReadText;
================> LEO:  *Mail*Mod*




More information about the Oberon mailing list