On Aug 10, 2011, at 8:33 AM, Gregory Lypny wrote:

> Hello everyone,
> 
> I’m building a standalone for my students.  It will allow them to upload 
> quizzes and small assignments to my Mac via FTP as well as participate in 
> various experiments and surveys.  I have a few Internet-related questions 
> that I hoping someone can answer.
> 
> Is there a handler I can include in the stack that would allow it to detect 
> whether the user is connected to the Internet?  That would allow me to give 
> them the option of working offline.
> 
> How can I get the current date and time from either a time server or my 
> remote Mac?  I need to timestamp student submissions and want the time coming 
> from one source, not their own machines.
> 
> What is the best way to catch common FTP errors, such as a file not existing, 
> so that I can relay a message back to the users?
> 
> 
> 
> Much obliged,
> 
> Gregory
> _______________________________________________
> use-livecode mailing list
> [email protected]
> Please visit this url to subscribe, unsubscribe and manage your subscription 
> preferences:
> http://lists.runrev.com/mailman/listinfo/use-livecode


Hi Gregory,


> What is the best way to catch common FTP errors, such as a file not existing, 
> so that I can relay a message back to the users?
After doing an FTP transaction, put the result into a variable.  If the 
variable is empty then the transaction was successful.  If there was an error, 
the variable will contain the exact error that occurred.  You can then return 
that error to the user.


> How can I get the current date and time from either a time server or my 
> remote Mac?  I need to timestamp student submissions and want the time coming 
> from one source, not their own machines.
Timestamping from the perspective the client is very easy.  Doing it from a 
central clock is a bit more complex.  Two solutions I can think of would be to 
pull the time from the internet or running a CGI on the server and pulling it 
from the server. If the Macs are set to keep their timing in sync with the 
internet then using the local time on each system should be accurate enough 
though.  


Here is how you can check for the internet.  The csDebugOutput lines can be 
removed.  They are used to log the function.  I have included that handler in 
the event you want to log it as well.  This function scales nicely for users 
that have higher latency connections.  Users that have lower latency 
connections will not be penalized and will normally return a true or false 
value within 20 milliseconds.  I have seen affordable dsl connections take as 
much as 1500 milliseconds.  Some international users may need as much as 3000 
milliseconds on dial up connections.  The function allows for up to 6000 
milliseconds.  This value can be modified as needed.  The tSiteToCheck variable 
can be set to any website.  We used to use Google, but found testing against 
our own sever served us in two ways.  We could see if the client would have 
issues resolving a connection to our server as well as testing for the ability 
to communicate with the Internet.


local lInternetFirstCheck, lInternetFirstCheckTiming


function checkInternetStatus
      --INITIALIZE VARIABLES
      put 6000 into tFallbackTime
      put "www.canelasoftware.com" into tSiteToCheck
      put false into lInternetFirstCheck
       
      csDebugOutput ("Starting checkInternetStatus...") 
      put hostNameToAddress(tSiteToCheck,"checkInternetStatus_Callback") into 
tThrowAway
       
      --GIVE SYSTEM TIME TO RUN THE hostNameToAddress FUNCTION
      put the milliseconds into lInternetFirstCheckTiming --GATHER TIMING FOR 
ACCURATE LOGGING
      repeat until lInternetFirstCheck is true
            wait 1 milliseconds with messages
            if the milliseconds - lInternetFirstCheckTiming > tFallbackTime 
then exit repeat
      end repeat
       
      --lInternetFirstCheck: true = DEFINITELY NOT CONNECTED TO ROUTER WITH NO 
WAN
      --lInternetFirstCheck: false = PROBABLY CONNECTED TO ROUTER WITH NO WAN 
(OR WE HAVE POOR LATENCY)
       
      --hostNameToAddress DID NOT RUN AND THUS RETURN NO INTERNET
      --PROBABLY CONNECTED TO ROUTER WITH NO WAN (OR WE HAVE POOR LATENCY)
      if lInternetFirstCheck is false then
            csDebugOutput ("First internet check failed after:" && the 
milliseconds - lInternetFirstCheckTiming & "ms")
            csDebugOutput ("Probably connected to a router with no WAN (or we 
have poor latency).")
            return false
      end if
       
      --CHECK IF THE ROUTER HAS A VALID INTERNET CONNECTION
      put hostNameToAddress(tSiteToCheck) into tInternetSecondCheck
       
      --WE HAVE A VALID INTERNET CONNECTION
      set the itemdel to "."
      if item 2 of tInternetSecondCheck is a number then
            csDebugOutput ("Second internet check passed after:" && the 
milliseconds - lInternetFirstCheckTiming & "ms")
            return true
      end if
       
      --WE ARE NOT CONNECTED TO A VALID INTERNET CONNECTION
      csDebugOutput ("Second check failed after:" && the milliseconds - 
lInternetFirstCheckTiming & "ms")
      return false
end checkInternetStatus


on checkInternetStatus_Callback pParam1
     csDebugOutput ("First internet check passed after:" && the milliseconds - 
lInternetFirstCheckTiming & "ms")
     put true into lInternetFirstCheck
end checkInternetStatus_Callback


command csDebugOutput pMessage
     global gDebugModeOn
     
     --BUILD LOG URL
     if the platform is "Win32" then put ("file:" & (specialFolderPath(26) & 
slash & kDebugLog)) into tLogURL
     if the platform is "MacOS" then put ("file:" & 
(specialFolderPath("preferences") & slash & kDebugLog)) into tLogURL
     if tLogURL is empty then exit csDebugOutput
     
     --CREATE TIMESTAMP
     put (the long date && the long time && ": ") into tTimestamp
     
     if gDebugModeOn is true then
          if char 5 of pMessage = "#" then put (lf & lf & lf) before pMessage 
--PREPEND MAJOR SECTIONS WITH LF*3
          put 0 into x
          repeat (the num of chars of pMessage)
               add 1 to x
               put char x of pMessage into tChar
               if tChar is not lf and tChar is not cr and tChar is not crlf 
then 
                    put tTimestamp before char x of pMessage --PUT THE 
TIMESTAMP AFTER THE SPACES, AND BEFORE THE CONTENT
                    exit repeat
               end if
          end repeat
           
          put (pMessage & cr) after URL tLogURL --WRITE TO THE LOG
     end if
end csDebugOutput



Best regards,

Mark Talluto
http://www.canelasoftware.com




_______________________________________________
use-livecode mailing list
[email protected]
Please visit this url to subscribe, unsubscribe and manage your subscription 
preferences:
http://lists.runrev.com/mailman/listinfo/use-livecode

Reply via email to