Roku Developer Program

Join our online forum to talk to Roku developers and fellow channel creators. Ask questions, share tips with the community, and find helpful resources.
cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 
developer34
Channel Surfer

BRIGHTSCRIPT: ERROR: roSGNode: Failed to create roSGNode with type LoginTask

this is my loginscreen.brs

   sub init()
      m.LoginParser = createObject("roSGNode","LoginTask")
      'm.LoginParser.observeField("msg", "returnMsg")
      m.top.backgroundURI = "pkg:/images/login_bg.png"
      m.keyboard = m.top.findNode("keyboard")
      m.fullkeyboard = m.top.findNode("fullkeyboard")
      m.username = m.top.findNode("username")
      m.usernameLabel = m.top.findNode("usernameLabel")
      m.password = m.top.findNode("password")
      m.passwordLabel = m.top.findNode("passwordLabel")
      m.loginBtn = m.top.findNode("loginBtn")
      m.loginBtn.observeField("buttonSelected", "btnSelected")
      m.loginLabel = m.top.findNode("btnLabel")
      m.loader = m.top.findNode("loader")
      m.loaderLabel = m.top.findNode("loaderLabel")
      m.urlfield = m.top.findNode("urlfield")
      m.keyboard.textEditBox.maxTextLength = 22
     
      m.username.text = m.global.username
      m.password.text = m.global.password
      
      m.username.cursorPosition = Len(m.username.text)
      m.password.cursorPosition = Len(m.password.text)
      
      m.backup = ""
      m.blocked = false
      m.top.setFocus(true)
    end sub

function onKeyEvent(key as String, press as Boolean) as Boolean
        
        if m.blocked then return true
   
        if m.loader.visible and ( key="up" or key="down" ) then m.loader.visible = false
               
        
        if m.fullkeyboard.visible then
            if m.username.active and (key = "OK" or key = "replay")  then
                m.username.text = m.keyboard.textEditBox.text
                m.username.cursorPosition = m.keyboard.textEditBox.cursorPosition
                return true
            else if m.password.active and (key = "OK" or key = "replay") then
                m.password.text = m.keyboard.textEditBox.text
                m.password.cursorPosition = m.keyboard.textEditBox.cursorPosition
                return true
            else if m.urlfield.active and (key = "OK" or key = "replay") then
                m.urlfield.text = m.keyboard.textEditBox.text
                m.urlfield.cursorPosition = m.keyboard.textEditBox.cursorPosition
                return true    
            else if key = "back" and m.username.active then
                m.backup = m.username.text
                m.fullkeyboard.visible = false
                m.keyboard.setFocus(false)
                m.username.setFocus(true)
                return true
            else if key = "back" and m.password.active then
                m.backup = m.password.text
                m.fullkeyboard.visible = false
                m.keyboard.setFocus(false)
                m.password.secureMode="true"
                m.password.setFocus(true)
                return true 
            else if key = "back" and m.urlfield.active then
                m.backup = m.urlfield.text
                m.fullkeyboard.visible = false
                m.keyboard.setFocus(false)
                m.urlfield.setFocus(true)
                return true     
            endif
            return true
        endif
        
        if key = "back" and press then
            m.top.goback = true
            return true
        endif
       
        if press then
            if key = "up" then
                if m.loginBtn.hasFocus() then
                   m.password.backgroundUri = "pkg:/images/text_field_on_hover.png"
                   m.password.active = true
                   m.username.active = false
                   m.loginBtn.setFocus(false)
                   m.password.setFocus(true)
                   m.backup = m.password.text
                   m.password.cursorPosition = Len(m.password.text)
                else if m.password.active then
                   m.password.active = false 
                   m.password.backgroundUri = "pkg:/images/text_field.png"    
                   m.username.backgroundUri = "pkg:/images/text_field_on_hover.png"
                   m.username.active = true
                   m.password.setFocus(false)
                   m.username.setFocus(true)
                   m.backup = m.username.text
                   m.username.cursorPosition = Len(m.username.text)
                   else if m.username.active then
                   m.username.active = false     
                   m.urlfield.backgroundUri = "pkg:/images/text_field_on_hover.png"
                   m.username.backgroundUri = "pkg:/images/text_field.png"
                   m.urlfield.active = true
                   m.username.setFocus(false)
                   m.urlfield.setFocus(true)
                   m.backup = m.urlfield.text
                   m.username.cursorPosition = Len(m.username.text)   
                endif
                
            else if key = "OK" then
                if m.username.active then
                    m.keyboard.textEditBox.text = m.username.text
                    m.keyboard.textEditBox.cursorPosition =  m.username.cursorPosition
                    m.keyboard.setFocus(true)
                    m.fullkeyboard.visible = true
                else if m.password.active then
                    m.password.secureMode = false
                    m.keyboard.textEditBox.text = m.password.text
                    m.keyboard.textEditBox.cursorPosition =  m.password.cursorPosition
                    m.keyboard.setFocus(true)
                    m.fullkeyboard.visible = true
                else if m.urlfield.active then
                    m.keyboard.textEditBox.text = m.urlfield.text
                    m.keyboard.textEditBox.cursorPosition =  m.urlfield.cursorPosition
                    m.keyboard.setFocus(true)
                    m.fullkeyboard.visible = true
                endif
            endif
           
           return true     
       endif
       
       if not press then     
            if key = "down" then
                 if m.password.active then
                    m.password.text = m.backup
                    m.password.active = "false"
                    m.password.backgroundUri = "pkg:/images/text_field.png"     
                    m.loginBtn.setFocus(true)
                 else if m.username.active then
                    m.username.text = m.backup
                    m.username.active = "false"     
                    m.username.setFocus(false)
                    m.password.active = "true"
                    m.password.setFocus(true)
                    m.password.backgroundUri = "pkg:/images/text_field_on_hover.png"
                    m.username.backgroundUri = "pkg:/images/text_field.png"
                    m.backup = m.password.text
                 else if m.urlfield.active then
                    m.urlfield.text = m.backup
                    m.urlfield.active = "false"     
                    m.urlfield.setFocus(false)
                    m.username.active = "true"
                    m.username.setFocus(true)
                    m.username.backgroundUri = "pkg:/images/text_field_on_hover.png"
                    m.urlfield.backgroundUri = "pkg:/images/text_field.png"
                    m.backup = m.username.text   
                 endif
            endif

        endif
        return true
end function

sub btnSelected()
    m.blocked = true
    if m.username.text = "" or m.password.text = "" then
        m.loader.color = "0xb40579FF"
        m.loaderLabel.color = "0xFFFFFFFF"
        m.loaderLabel.text = "Username or password is empty"
        m.blocked = false        
    else
        'm.registry.Write("username", m.username.text)
        'm.registry.Write("password", m.password.text)
        m.loader.color = "0xDDDDDD80"
        m.loaderLabel.color = "0x000000FF"
        m.loaderLabel.text = "Loading..."
        m.LoginParser.username = m.username.text
        m.LoginParser.password = m.password.text
        m.LoginParser.control = "RUN"
    endif
    m.loader.visible = true
end sub

sub returnMsg()
    m.loaderLabel.text = m.LoginParser.msg
    if m.LoginParser.msg <> "OK" then
        m.loader.color = "0xb40579FF"
        m.loaderLabel.color = "0xFFFFFFFF"
    else
        m.loader.visible = false
        m.top.visible = false
        m.top.ready = true
    endif
    m.blocked = false
endsub

 this is my loginscreen.xml

<?xml version = "1.0" encoding = "utf-8" ?>
<component name="LoginScreen" extends = "Group" initialFocus = "loginBtn" >
<interface> 
  <field id="ready" type="bool" alwaysNotify="true" />
  <field id="goback" type="boolean" alwaysNotify="true" />
</interface>
<script type="text/brightscript" uri = "pkg:/components/src/loginscreen.brs"/>
  <children>
  <Group translation="[604,400]">
  	<Poster id="loginicon"
  	uri="pkg:/images/login_screen_logo.png"
  	width="500"
  	height="100"
  	translation="[8,-180]" />
	<TextEditBox id="urlfield" translation="[100,100]"  hintText="url" width="500" maxTextLength="24" backgroundUri="pkg:/images/text_field.png" hintTextColor="FAF7F6" />
    <TextEditBox id="username" translation="[100,204]" hintText="username" width="500" maxTextLength="24" backgroundUri="pkg:/images/text_field.png" hintTextColor="FAF7F6"/>
    <TextEditBox id="password" translation="[100,304]" hintText="password" width="500" maxTextLength="24" backgroundUri="pkg:/images/text_field.png" hintTextColor="FAF7F6" secureMode="true"/>
	<Poster id="urlicon"  translation="[50,110]" uri="pkg:/images/url_icon.png" width="30" height="55"/>
	<Poster id="usernameicon"  translation="[50,214]" uri="pkg:/images/username_icon.png" width="30" height="55"/>
	<Poster id="passwordicon"  translation="[50,314]" uri="pkg:/images/password_icon.png" width="30" height="55"/>
    <Button translation="[180,400]" id="loginBtn" showFocusFootprint="true" focusFootprintBitmapUri="pkg:/images/login_button.png" iconUri="" focusedIconUri="" height="90" focusBitmapUri="pkg:/images/login_button.png" minWidth="320" maxWidth="320">
    <Label id="btnLabel" color="0xFFFFFFFF" horizAlign="center" text="Login" width="320" height="90" numLines="1" vertAlign="center"/>
    </Button>
    </Group>
    <Rectangle
    	id = "fullkeyboard"    
  		color="0xb40579DD"
  		width="1416"
  		height="380"
  		translation="[252,680]" visible="false">
    <Keyboard id="keyboard" showTextEditBox="false" keyColor="0xFFFFFFFF"/>
    </Rectangle>
    <Rectangle
    	id="loader"   
  		color="0xDDDDDD80"
  		width="1920"
  		height="60"
  		translation="[0,1020]"
  		 visible="false">
  		<Label id="loaderLabel" color="0x000000FF" horizAlign="center" text="Loading..." width="1920" height="60" numLines="1" vertAlign="center"/>
  	</Rectangle>
  </children>
</component>

this is my logintask.brs

sub init()
    m.top.functionName = "getURL"
end sub
Function getURL()

    url = CreateObject("roUrlTransfer") 
    url.SetPort(CreateObject("roMessagePort"))
    url.SetUrl(m.global.api_url+"/access_path.php")
    
    
    rsp = url.AsyncPostFromString("checkUser=ObjectSol")
    event = wait(5000, url.GetPort())
    if type(event) = "roUrlEvent"
             if event.GetResponseCode() = 200 
                response = ParseJson(event.GetString())
                print response
                if response <> invalid 
                    if response.error_message <> invalid
                     m.global.success_message = response.success_message
                     m.global.data = response.data.ToStr()
                     getToken()                    
                    endif
                else
                    m.top.msg =  "Connection error"
                endif
             else
                m.top.msg =  "Connection error"
             endif
    else if event = invalid
             m.top.msg =  "Connection timeout"
             url.AsyncCancel()
    else
             m.top.msg =  "Connection error"
    endif
End Function


Function getToken()
    sec = CreateObject("roRegistrySection", "Authentication")
    sec.Write("Username", m.top.username)
    sec.Write("Password", m.top.password)
    sec.Flush()
    
    url = CreateObject("roUrlTransfer") 
    url.SetPort(CreateObject("roMessagePort"))
    url.SetUrl(m.global.data+"/stalker_portal/auth/token")
    url.AddHeader("Accept", "application/json")
  
    rsp = url.AsyncPostFromString("grant_type=password&username=" + m.top.username + "&password=" + m.top.password)
    event = wait(5000, url.GetPort())
    if type(event) = "roUrlEvent"
             if event.GetResponseCode() = 200 
                response = ParseJson(event.GetString())
                if response <> invalid
                    if response.error <> invalid
                        m.top.msg = response.error_description                    
                    else if response.access_token <> invalid and response.user_id <> invalid
                        m.global.token = response.access_token.Trim()
                        m.global.user_id = response.user_id.ToStr()
                       getVodCategories()
                    endif
                else
                    m.top.msg =  "Connection error"
                endif
             else
                m.top.msg =  "Connection error"
             endif
    else if event = invalid
             m.top.msg =  "Connection timeout"
             url.AsyncCancel()
    else
             m.top.msg =  "Connection error"
    endif
    
End Function

Function getVodCategories()
    cat = apiCall("video-categories")
    if cat <> invalid then
        m.global.vod_grp = cat
        getTVCategories() 
    else
        m.top.msg = "Connection error"
    endif    
End Function

Function getTVCategories()
    cat = apiCall("tv-genres")
    if cat <> invalid then
        m.global.tv_grp = cat
        m.top.msg = "OK" 
    else
        m.top.msg = "Connection error"
    endif    
End Function

this is my logintask.xml

<?xml version="1.0" encoding="UTF-8"?>

<component name="LoginTask" extends="Task">

    <interface>
        <field id="content" type="node" />
        <field id="username" type="string" />
        <field id="password" type="string" />
        <field id="token" type="string" />
        <field id="user_id" type="string" />
        <field id="msg" type="string" alwaysNotify="true" />
    </interface>
	<script type="text/brightscript" uri = "pkg:/components/src/stalkerapiv2.brs"/>
    <script type="text/brightscript" uri = "pkg:/components/src/logintask.brs"/>
</component>

this is my mainscene.brs

' ********** Copyright 2016 Roku Corp.  All Rights Reserved. **********  

sub init()
    m.top.SetFocus(true)
    m.top.backgroundURI = "pkg:/images/login_bg.png"
    'm.loginBtn = m.top.findNode("loginBtn")
    'm.loginscreen =  m.top.findNode("LoginScreen")
    'm.loginscreen.observeField("ready", "onLoginReady")
End sub

 Function OnLoginReady()
    m.loginBtn.setFocus(true)
    m.loginscreen.visible = true
 end function 

this is my mainscene.xml

<?xml version="1.0" encoding="UTF-8"?>

<component name="MainScene" extends="Scene" initialFocus = "LoginScreen">
	<!-- importing main handler -->
    <script type="text/brightscript" uri="pkg:/components/src/MainScene.brs" />
    
    <children>
    	<LoginScreen id="LoginScreen"/>
    </children>
</component>

i am getting an error like this

BRIGHTSCRIPT: ERROR: roSGNode: Failed to create roSGNode with type LoginTask: pkg:/components/src/loginscreen.brs(2)

BrightScript Micro Debugger.
Enter any BrightScript statement, debug commands, or HELP.

Suspending threads...
Thread selected:  1*   ...omponents/src/loginscreen.brs(3)     m.LoginParser.observeField("msg", "returnMsg")

Current Function:
001:     sub init()
002:        m.LoginParser = createObject("roSGNode","LoginTask")
003:*       m.LoginParser.observeField("msg", "returnMsg")
004:        m.top.backgroundURI = "pkg:/images/login_bg.png"
005:        m.keyboard = m.top.findNode("keyboard")
006:        m.fullkeyboard = m.top.findNode("fullkeyboard")
007:        m.username = m.top.findNode("username")
Interface not a member of BrightScript Component (runtime error &hf3) in pkg:/components/src/loginscreen.brs(3)
003:       m.LoginParser.observeField("msg", "returnMsg")
Backtrace:
#0  Function init() As Void
   file/line: pkg:/components/src/loginscreen.brs(3)
Local Variables:
global           Interface:ifGlobal
m                roAssociativeArray refcnt=2 count:3
Threads:
ID    Location                                Source Code
 0    pkg:/source/main.brs(14)                screen.show()
 1*   ...omponents/src/loginscreen.brs(3)     m.LoginParser.observeField("msg", "returnMsg")
  *selected
0 Kudos
3 REPLIES 3
speechles
Roku Guru

Re: BRIGHTSCRIPT: ERROR: roSGNode: Failed to create roSGNode with type LoginTask


m.LoginParser = m.top.findNode("LoginTask")
m.LoginParser.observeField("msg", "returnMsg")

 

When you create the object in brightscript for loginparser you are losing the "msg" field.

 

When you use findNode it will load it from the XML properly. Now it will complete the observer.

0 Kudos
developer34
Channel Surfer

Re: BRIGHTSCRIPT: ERROR: roSGNode: Failed to create roSGNode with type LoginTask

this is my main.brs

' ********** Copyright 2016 Roku Corp.  All Rights Reserved. ********** 

sub Main()
    screen = CreateObject("roSGScreen")
    m.port = CreateObject("roMessagePort")
    
    screen.setMessagePort(m.port)
    scene = screen.CreateScene("MainScene")
   
   
    m.global = screen.getGlobalNode()  
    m.global.addFields( {success_message:"", user_id: "", vod_grp: [], tv_grp: [], api_url: "http://13.58.60.206:88", limit: 50, username: "", password: ""})
    
    screen.show()
     
    while(true)
        msg = wait(0, m.port)
    msgType = type(msg)
        if msgType = "roSGScreenEvent"
            if msg.isScreenClosed() then return
        end if
    end while
end sub

i was not clear what you said can you please tell a bit more

0 Kudos
Bobo1497
Channel Surfer

Re: BRIGHTSCRIPT: ERROR: roSGNode: Failed to create roSGNode with type LoginTask

I think you solved this problem but to clarify what @speechles said, for others to understand, is that when you recreate a component, in this case, a task, you'll have totally new data created so in order to follow an existing data you should use `m.top.findNode("task/component")` so that the data won't be lost.

0 Kudos