content: ' *********************************************************
  ' **  Roku Registration Demonstration App
  ' **  Support routines
  ' **  May 2009
  ' **  Copyright (c) 2009 Roku Inc. All Rights Reserved.
  ' *********************************************************
  
  '******************************************************
  'Perform the registration flow
  '
  'Returns:
  '    0 - We're registered. Proceed
  '    1 - We're not registered. The user canceled the process.
  '    2 - We're not registered. There was an error
  '******************************************************
  
  Function doRegistration() As Integer
  
     'xml responses are static, but there are a few flavors available for testing
     'Generic case: getRegResult (always returns success)
     'Failure case: getRegResult_failure (always returns failure)
     'Success case: getRegResult_success (always returns success)
  
      m.UrlBase         = "http://app.berzuk.com/app/videos/roku"
      m.UrlGetRegCode   = m.UrlBase + "/code"
      m.UrlGetRegResult = m.UrlBase + "/link"
      m.UrlWebSite      = "http://app.berzuk.com/roku/pin/videos/"
  
    
      regscreen = displayRegistrationScreen()
  
      'main loop get a new registration code, display it and check to see if its been linked
     
     
       duration = 0
  
       sn = GetDeviceESN() 
       regCode = getRegistrationCode(sn)
  
          'if we've failed to get the registration code, bail out, otherwise we'll
          'get rid of the retreiving... text and replace it with the real code       
       if regCode = "" then return 2
       regscreen.SetRegistrationCode(regCode)
       
       print "Enter registration code " + regCode + " at " + m.UrlWebSite + " for " + sn
     
       sleep(5000)
       status = checkRegistrationStatus(sn, regCode)
       
      return status
     
  
  End Function
  
  
  '********************************************************************
  '** display the registration screen in its initial state with the
  '** text "retreiving..." shown.  We'll get the code and replace it
  '** in the next step after we have something onscreen for teh user 
  '********************************************************************
  Function displayRegistrationScreen() As Object
  
      regsite   = "go to " + m.UrlWebsite
      
      regscreen = CreateObject("roCodeRegistrationScreen")
      regscreen.SetMessagePort(CreateObject("roMessagePort"))
  
      regscreen.SetTitle("")
      regscreen.AddParagraph("Please link your Roku player to your account by visiting")
      regscreen.AddFocalText(" ", "spacing-dense")
      regscreen.AddFocalText("From your computer,", "spacing-dense")
      regscreen.AddFocalText(regsite, "spacing-dense")
      regscreen.AddFocalText("and enter this code to activate:", "spacing-dense")
      regscreen.SetRegistrationCode("retrieving code...")
      regscreen.AddParagraph("This screen will automatically update as soon as your activation completes")
      regscreen.Show()
  
      return regscreen
  
  End Function
  
  
  '********************************************************************
  '** Fetch the prelink code from the registration service. return
  '** valid registration code on success or an empty string on failure
  '********************************************************************
  Function getRegistrationCode(sn As String) As String
  
      if sn = "" then return ""
  
      http = NewHttp(m.UrlGetRegCode)
      http.AddParam("partner", "roku")
      http.AddParam("deviceID", sn)
      http.AddParam("deviceTypeName", "roku")
  
      rsp = http.Http.GetToString()
      xml = CreateObject("roXMLElement")
      print "Reason: " + http.Http.GetFailureReason()
  
      if not xml.Parse(rsp) then
          print "Can't parse getRegistrationCode response"
          ShowConnectionFailed()
          return ""
      endif
  
      if xml.GetName() <> "result"
          Dbg("Bad register response: ",  xml.GetName())
          ShowConnectionFailed()
          return ""
      endif
  
      if islist(xml.GetBody()) = false then
          Dbg("No registration information available")
          ShowConnectionFailed()
          return ""
      endif
  
      'default values for retry logic
      retryInterval = 30  'seconds
      retryDuration = 900 'seconds (aka 15 minutes)
      regCode       = ""
  
      'handle validation of response fields 
      for each e in xml.GetBody()
          if e.GetName() = "regCode" then
              regCode = e.GetBody()  'enter this code at website
          else if e.GetName() = "retryInterval" then
              retryInterval = strtoi(e.GetBody())
          else if e.GetName() = "retryDuration" then
              retryDuration = strtoi(e.GetBody())
          endif
      next
  
      if regCode = "" then
          Dbg("Parse yields empty registration code")
          ShowConnectionFailed()
      endif
  
      m.retryDuration = retryDuration
      m.retryInterval = retryInterval
      m.regCode = regCode
  
      return regCode
  
  End Function
  
  
  '******************************************************************
  '** Check the status of the registration to see if we've linked
  '** Returns:
  '**     0 - We're registered. Proceed.
  '**     1 - Reserved. Used by calling function.
  '**     2 - We're not registered. There was an error, abort.
  '**     3 - We're not registered. Keep trying.
  '******************************************************************
  Function checkRegistrationStatus(sn As String, regCode As String) As Integer
  
      http = NewHttp(m.UrlGetRegResult)
      http.AddParam("partner", "roku")
      http.AddParam("deviceID", sn)
      http.AddParam("regCode", regCode)
  
      print "checking registration status"
      
      token = ""
  
      while true
          sleep(1000)
          
          rsp = http.Http.GetToString()
          xml = CreateObject("roXMLElement")
          if not xml.Parse(rsp) then
              print "Can't parse check registration status response"
              ShowConnectionFailed()
              return 2
          endif
  
          if xml.GetName() <> "result" then
              print "unexpected check registration status response: ", xml.GetName()
              ShowConnectionFailed()
              return 2
          endif
  
          if islist(xml.GetBody()) = true then
              for each e in xml.GetBody()
                  if e.GetName() = "regToken" then
                      token = e.GetBody()
                  end if
              next
          end if
  
  
  
  
              if token <> "" and token <> invalid then
                  print "obtained registration token: " + validstr(token)
                  saveRegistrationToken(token) 'commit it
                  m.RegistrationToken = token
                  'showCongratulationsScreen()
                  exit while
               endif
  
      end while
  
      print "result: " + validstr(token)
  
      return 0
  
  End Function
  
  
  '***************************************************************
  ' The retryInterval is used to control how often we retry and
  ' check for registration success. its generally sent by the
  ' service and if this hasn't been done, we just return defaults 
  '***************************************************************
  Function getRetryInterval() As Integer
      if m.retryInterval < 1 then m.retryInterval = 30
      return m.retryInterval
  End Function
  
  
  '**************************************************************
  ' The retryDuration is used to control how long we attempt to 
  ' retry. this value is generally obtained from the service
  ' if this hasn't yet been done, we just return the defaults 
  '**************************************************************
  Function getRetryDuration() As Integer
      if m.retryDuration < 1 then m.retryDuration = 900
      return m.retryDuration
  End Function
  
  
  '******************************************************
  'Load/Save RegistrationToken to registry
  '******************************************************
  
  Function loadRegistrationToken() As dynamic
      m.RegToken =  RegRead("RegToken", "Authentication")
      if m.RegToken = invalid then m.RegToken = ""
      return m.RegToken 
  End Function
  
  Sub saveRegistrationToken(token As String)
      RegWrite("RegToken", token, "Authentication")
  End Sub
  
  Sub deleteRegistrationToken()
      RegDelete("RegToken", "Authentication")
      m.RegToken = ""
  End Sub
  
  Function isLinked() As Dynamic
      if Len(m.RegToken) > 0  then return true
      return false
  End Function
  
  '******************************************************
  'Show congratulations screen
  '******************************************************
  Sub showCongratulationsScreen()
      port = CreateObject("roMessagePort")
      screen = CreateObject("roParagraphScreen")
      screen.SetMessagePort(port)
  
      screen.AddHeaderText("Congratulations!")
      screen.AddParagraph("You have successfully linked your Roku player to your account")
      screen.AddParagraph("Select 'start' to begin.")
      screen.AddButton(1, "start")
      screen.Show()
  
      while true
          msg = wait(0, screen.GetMessagePort())
  
          if type(msg) = "roParagraphScreenEvent"
              if msg.isScreenClosed()
                  print "Screen closed"
                  exit while                
              else if msg.isButtonPressed()
                  print "Button pressed: "; msg.GetIndex(); " " msg.GetData()
                  exit while
              else
                  print "Unknown event: "; msg.GetType(); " msg: "; msg.GetMessage()
                  exit while
              endif
          endif
      end while
  End Sub
  
  