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="<?xml version='1.0' ?><stream:stream to='"&server&"
' xmlns='jabber:client' xmlns:stream='http:/"&"/etherx.jabber.or
g/streams'>"
1950  rem let l="<?xml version='1.0' ?><stream:stream to='jabber
.org' xmlns='jabber:client' xmlns:stream='http:/"&"/etherx.jabbe
r.org/streams'>"
2000  gosub Send //
2050  let l="<iq type=\"set\" id=\""& numberstr(ticks())&"\"><qu
ery xmlns=\"jabber:iq:auth\"><username>"&username&"</username><p
assword>"&password&"</password><resource>"&resource&"</resource>
</query></iq>"
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<address>
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="<message id='"&numberstr(ticks())&"' type='normal'"
2700  let l=l&" to='"&addr&"'><subject></subject>"
2750  let l=l&"<body><![CDATA["&msg&"]]></body></message>"
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="<iq type='get'><query xmlns='jabber:iq:roster'/></i
q>"
3200  gosub Send //
3250  return
3300 SetPresence: REM
3350  let l="<presence ><status >Online</status></presence>"
3400  gosub Send //
3450  return
3500 ProcessInput: REM
3525  print xml
3550  gosub GetTag //
3600  if BeginsWith(tag,"<message") then gosub ParseFrom
3650  if BeginsWith(tag,"<body") then gosub ParseBody
3700  if BeginsWith(tag,"<ext") then gosub ParseExt
3750  if BeginsWith(tag,"<item") then gosub ParseItem
3760  if BeginsWith(tag,"<presence") then gosub ParsePresence
3770  if BeginsWith(tag,"<error") then gosub ParseError
3800  return
3850 ParseFrom: REM
3900  let spos=strpos(tag,"from=",0)+6
3950  let epos=strpos(tag,"'",spos+1)
4000  let lastaddr=substr(tag,spos,epos-spos)
4040  let layout_0.lbAddress.labelCommands[0]="+reply<"&lastaddr
&">"
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="</stream:stream>"
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