0010 REM Newton Jabber Copyright (c) 2000 Eric M. Schneck, Inc 0020 LET appSpec={goto:'endProgram,title:"NewtJab"} 0030 window app,appSpec,"APP" 0040 show app 0050 widgetdef Layout_0:={btnSendMessage:{widgetType:"textButto n"B ,order:0,viewBounds:{left:9,top:99,right:39,bottom:116},vieB wFlags:514,text:"Send",viewFont:{family:'espy,face:1,size:9B },viewFormat:67109456,gosub:'SendMessage},txtMyID:{widgetTyB pe:"text",order:1,viewClass:81,viewBounds:{top:3,bottom:20,B left:3,right:113},viewFlags:0,viewFormat:12625,viewJustify:B 0,viewLineSpacing:16,text:"",viewFont:12289,tabs:[20,40,60,B 80,120,140,160,180]},txtServer:{widgetType:"text",order:2,vB iewClass:81,viewBounds:{top:3,bottom:20,left:208,right:316}B ,viewFlags:0,viewFormat:12625,viewJustify:0,viewLineSpacingB :16,text:"",viewFont:12289,tabs:[20,40,60,80,120,140,160,18B 0]},txtMessage:{widgetType:"text",order:3,viewClass:81,viewB Bounds:{left:44,top:70,right:312,bottom:120},viewFlags:6502B 4,viewFormat:12625,viewJustify:0,viewLineSpacing:16,text:"HB i! How are you?",viewFont:12289,tabs:[20,40,60,80,120,140,1B 60,180]},txtSentMessages:{widgetType:"Scroller",order:4,texB t:"",boxTitle:"Messages",editOK:TRUE,viewBounds:{top:122,boB ttom:412,left:10,right:312}},lbMessage:{widgetType:"labelPiB cker",order:5,checkCurrentItem:TRUE,indent:60,viewBounds:{lB eft:11,top:48,right:314,bottom:72},labelCommands:["(loadingB )"],text:"Message",viewValue:0,gosub:'SetMessage},btnkbd:{wB idgetType:"pictureButton",order:6,viewBounds:{left:9,top:75B ,right:39,bottom:92},viewFlags:514,icon:NIL,gosub:'OpenKeybB oard},lbAddress:{widgetType:"labelInput",order:7,currLabelCB ommand:0,entryFlags:14849,labelFont:{family:'espy,face:1,siB ze:9},indent:60,labelCommands:[""],viewBounds:{left:11,top:B 22,right:322,bottom:46},label:"Send To",text:"(loading)",gosub:' setAddress}} 0055 if GetOrientation()<>2 then layout_0.txtSentMessages.viewB ounds.bottom=300 0056 setvalue(layout_0.btnKbd,'icon,@434.icon) 0060 window wlist,Layout_0 0200 show wlist 0250 gosub Initialize // 0300 rem check for input from server or user 0350 do while TRUE 0475 for t=1 to 50 0477 gosub CheckInput // 0500 wait 10 0510 next t 0520 if xml<>"" then gosub ProcessInput 0550 loop 0600 Initialize: REM 0650 LET BIT:=getroot().|bit:nsbasic| 0700 let xml="" 0725 let lastaddr="" 0750 gosub GetUserName // and server 0775 gosub LoadMessages // 0800 let bit.fconfigRAddr=server 0850 LET bit.fconfigRPort=5222 0900 gosub Connect // Open BIT & wait for connection 0950 gosub LoginToServer // 0970 gosub SetPresence // 1000 gosub RefreshContacts // 1100 return 1150 GetUserName: REM 1200 let f:={name:"",password:"",resource:"",server:"",port:""} 1250 open chan,"JabberData" 1300 if FSTAT=0 then get chan,f 1305 if fstat <> 0 then 1315 chain "SetJab" 1320 return 1325 end if 1350 close chan 1400 let resource=f.resource 1450 let username=f.name 1500 let password=f.password 1550 let server=f.server 1600 let port=stringtonumber(f.port) 1650 Setvalue(layout_0.txtMyId,'text,username) 1700 Setvalue(layout_0.txtServer,'text,server) 1750 return 1800 rem 1850 LoginToServer: REM 1900 let l="" 1950 rem let l="" 2000 gosub Send // 2050 let l=""&username&"

"&password&""&resource&" " 2100 gosub Send // 2200 return 2205 SetMessage: REM 2210 let msg=Layout_0.lbMessage.viewValue 2220 let msg=layout_0.lbMessage.labelCommands[msg] 2230 SetValue(layout_0.txtMessage,'text,msg) 2240 return 2242 SetAddress: REM 2244 let msg=Layout_0.lbAddress.viewValue 2246 let msg=layout_0.lbAddress.labelCommands[msg] 2248 SetValue(Layout_0.lbAddress,'text,clone(msg)) 2249 return 2250 SendMessage: REM 2300 rem format of address list entry is +nickname

2400 let addr=Layout_0.lbAddress.text 2450 let spos=strpos(addr,"<",0) 2455 if spos=nil then spos=-1 2500 let epos=strpos(addr,">",0) 2530 if epos=nil then epos=strlen(addr)+2 2550 let addr=substr(addr,spos+1,epos-spos-1) 2600 let msg=Layout_0.txtMessage.text 2625 if msg="" then return 2650 let l="" 2750 let l=l&"" 2800 setvalue( Layout_0.txtSentMessages,'text,Layout_0.txtSentM essages.text&username&": "&msg&Chr(13)) 2850 setvalue(layout_0.txtMessage,'text,clone("")) 2900 gosub Send // 2950 return 3000 RefreshContacts: REM 3050 LET Roster=[clone("(reply)")] 3100 setvalue(u.Layout_0.lbAddress,'text, "(loading)") 3150 let l="" 3200 gosub Send // 3250 return 3300 SetPresence: REM 3350 let l="Online" 3400 gosub Send // 3450 return 3500 ProcessInput: REM 3525 print xml 3550 gosub GetTag // 3600 if BeginsWith(tag,"" 4050 setvalue( Layout_0.txtSentMessages,'text,Layout_0.txtSentM essages.text&lastaddr&": ") 4100 return 4150 ParseBody: REM 4200 gosub GetTag // 4250 setvalue( Layout_0.txtSentMessages,'text,Layout_0.txtSentM essages.text&stuff&chr(13)) 4300 return 4350 ParseExt: REM 4400 gosub GetTag // 4450 setvalue(Layout_0.txtSentMessages,'text,Layout_0.txtSentMe ssages.text&stuff) 4500 return 4550 ParseItem: REM 4600 gosub ParseJid // 4650 gosub ParseName // 4675 if strpos(jid,"/register",0) <> nil then return 4700 if jid <> "" then AddArraySlot(Roster,"?"&name&&"<"&jid&"> ") 4750 setvalue( Layout_0.lbAddress,'labelCommands,Roster) 4800 if length(roster)>0 then u.Layout_0.lbAddress:updateText(R oster[0]) 4850 return 4900 ParseJid: REM 4950 let jid="" 5000 LET spos=strpos(tag,"jid=",0)+5 5050 if spos=nil then return 5100 LET epos=strpos(tag,"'",spos) 5150 if epos=nil then LET epos=strpos(tag,"\"",spos) 5200 if epos<>nil then LET jid=substr(tag,spos,epos-spos) 5250 return 5300 ParseName: REM 5350 let name="" 5400 LET spos=strpos(tag,"name=",0) 5450 if spos=nil then return 5475 let spos=spos+6 5500 LET epos=strpos(tag,"'",spos) 5550 if epos=nil then LET epos=strpos(tag,"\"",spos) 5600 if epos<>nil then LET name=substr(tag,spos,epos-spos) 5650 return 5652 ParsePresence: REM 5654 let spos=strpos(tag,"from=",0) 5656 if spos=nil then return 5658 let epos=strpos(tag,".",spos+1) 5660 let stuff=substr(tag,spos+6,epos-(spos+6)) 5662 let prefix="+" 5664 if strpos(tag,"unavailable",0)<>nil then prefix="-" 5666 for i=1 to length(roster) 5668 let r=roster[i-1] 5670 if strpos(r,stuff,0) <> nil then 5672 let roster[i-1]=prefix&substr(r,1,strlen(r)-1) 5674 setvalue( Layout_0.lbAddress,'labelCommands,Roster) 5675 if i=1 then u.Layout_0.lbAddress:updateText(roster[0]) 5676 exit for 5677 end if 5678 next i 5680 return 5690 parseError: REM 5692 gosub GetTag // 5694 let stuff="Error:"&&stuff 5696 setvalue(Layout_0.txtSentMessages,'text,Layout_0.txtSentMe ssages.text&stuff) 5698 return 5700 GetTag: REM 5750 let spos=strpos(xml,"<",0) 5800 if spos = nil then 5850 let stuff=xml 5900 let xml="" 5950 let tag="" 6000 return 6050 end if 6100 let epos=strpos(xml,">",spos) 6150 if epos=nil then epos = strlen(xml) - 1 6200 LET stuff=substr(xml,0,spos) 6250 let tag=substr(xml,spos,epos-spos+1) 6300 let xml=substr(xml,epos+1, nil) 6350 return 6400 CheckInput: REM 6450 u.bit.fEndpoint:Input() 6500 let m= u.bit:Receive() 6550 if strLen(m)=0 then return 6600 rem print "RCVD:"&&strlen(m)&&m 6650 let xml=clone(xml)&m 6750 return 6800 rem 6850 Send: REM 6900 gosub CheckInput // Send() will clr rcv bfr 6920 if xml<>"" then gosub ProcessInput 6950 u.bit:Send(l) 7000 wait 500 7050 return 7100 rem 7150 Connect: REM 7200 if bit.fendPointState=1 then return 7250 LET temp:=u.bit:mConnect() 7300 for try = 1 to 100 7350 if bit.fEndpointState=1 then return 7400 wait 1000 7450 next try 7500 print "Failed to connect" 7550 return 7600 DisconnectFromServer: REM 7650 let l="" 7700 if bit.fEndpointState=1 then gosub Send 7750 u.bit:Cleanup() 7800 if bit.fEndpointState<>1 then return 7850 do while bit.fEndpointState=1 7900 wait 1000 7950 loop 8000 return 8050 WaitForOneLine: REM 8100 do while strLen(bit.fReceiveBuffer)=0 8150 wait 1000 8200 loop 8250 return 8300 OpenKeyboard: REM 8350 getroot().alphakeyboard:open() 8400 return 8450 LoadMessages: REM 8500 let Messages=[] 8510 AddArraySlot(Messages,"(Choose a message)") 8515 AddArraySlot(Messages,"Hi, how are you?") 8550 AddArraySlot(Messages,"Yes, that's right") 8555 AddArraySlot(Messages,"Yes, I do") 8575 AddArraySlot(Messages,"Yes") 8580 AddArraySlot(Messages,"No") 8600 AddArraySlot(Messages,"No, I don't think so") 8650 AddArraySlot(Messages,"Maybe") 8652 AddArraySlot(Messages,"OK") 8655 AddArraySlot(Messages,"How did that turn out?") 8700 AddArraySlot(Messages,"Could you send that via email?") 8720 AddArraySlot(Messages,"Thank you") 8747 AddArraySlot(Messages,"Best wishes") 8748 AddArraySlot(Messages,"Bye for now") 8750 setvalue( Layout_0.lbMessage,'labelCommands,Messages) 8800 u.Layout_0.lbMessage:updateText(Messages[0]) 8850 return 8900 endProgram: rem 8950 gosub DisconnectFromServer // 9000 hide 9050 bye