I don't want "read from socket" to be blocking

Dar Scott dsc at swcp.com
Fri Aug 1 00:44:00 EDT 2003


On Thursday, July 31, 2003, at 08:55 PM, Björnke von Gierke wrote:

> I use read socket to access a pop3 server (email) I need to repeat  
> certain commands several times. How can I make them non-blocking while  
> still repeating them? I just don't get it :(

Normally when you read from a socket in a repeat loop you want blocking  
and would not use 'with message'.  You might want to make sure all is  
working well with blocking before making a non-blocking version.

If you are concerned that your handler (which may cause confusion if  
named 'handler') is taking a long time and keeping you or Revolution  
from doing anything else, you may want to take another approach.  You  
want non-blocking and 'with message'.

>   repeat with x = 1 to (the second word of theData) --number of  
> messages
>     write ( "TOP" && x && "0" & crlf  ) to socket server & ":110"  
> --TOP 0 =get only headers
>     read from socket server & ":110" until crlf & "." & crlf --should  
> be non-blocking but isn't
>     if theMessage contains "Reply-To: use-revolution at lists.runrev.com"  
> then
-- I assume 'theMessage' means 'it'.
>       put x & "," after theList --gather all runrev messages
>     end if

Sarah or Shao Sean can better comment on whether this is good POP3.

The equivalent using 'read ... with message' is below.  This off the  
top of my head, so you might need to make adjustments.  The handler  
startGettingHeaders will get the headers based on its parameter and sor  
it away in the headerList.  Error handling is ignored to keep this  
simple.

local pop3socketID
local currentRecord
local lastRecord
local headerList

on startGettingHeaders numberOfMessages
   put numberOfMessages into lastRecord
   put 1 into currentRecord
   put empty into headerList
   queryHeader
end startGettingHeaders

on queryHeader
   write ("TOP" && currentRecord && "0" & CRLF) to socket pop3socketID
   read from socket pop3socketID until CRLF & "." & CRLF with message  
"processHeader"
end queryHeader

on processHeader socketID, headerData
   if headerData contains "Reply-To: use-revolution at lists.runrev.com"  
then
      put currentRecord & "," after headerList
   end if
   add 1 to currentRecord
   if currentRecord <= lastRecord then
      queryHeader
   else
      -- process header list (or send a message to process it)
   end if
end processHeader

Eventually you will want to write handlers for socketClosed,  
socketError and socketTimeout and examine the result on write and read.

Dar Scott

************************************************************************ 
****
   Dar Scott Consulting    http://www.swcp.com/dsc/    Programming  
Services
************************************************************************ 
****



More information about the use-livecode mailing list