Try using this as the rss feed: http://www.nytimes.com/services/xml/rss/nyt/Technology.xml
Is there a way it can be a normal listbox (going down, instead of going on to the right)?
EDIT: wxHtmlWindow updated version, includes another problem, when displaying the description the image does not show, however in firefox (opening the "test.html" file) shows everything correctly.
Is there a way it can be a normal listbox (going down, instead of going on to the right)?
EDIT: wxHtmlWindow updated version, includes another problem, when displaying the description the image does not show, however in firefox (opening the "test.html" file) shows everything correctly.
SuperStrict Framework wx.wxApp Import wx.wxFrame Import wx.wxListCtrl Import wx.wxButton Import wx.wxPanel Import wx.wxTextCtrl Import wx.wxHtmlWindow Import wx.wxSystemSettings Import brl.basic Import brl.blitz Import brl.retro Import brl.system Import BaH.libxml Type rssChannel Global _list:TList = New TList 'channel information Field Title:String 'title of channel Field Description:String 'description of channel Field Pubdate:String 'date channel was created?/updated? 'channel links Field lk_Feed:String 'link to the channel's rss feed Field lk_Link:String 'link to main feed site Field chnItems:TList Method New() chnItems = New TList _list.AddLast(Self) End Method Method SetTitle(_Title:String) Title = _Title End Method Method SetDescription(_Desc:String) Description = _Desc End Method 'fix incoming date for appended timezone data (ex. Thu, 13 Mar 2008 19:26:44 >-0000<) Method SetPubdate(pubdateraw:String) Pubdate = pubdateraw End Method Method SetLink(Link:String, which:Int) Select which Case 0 lk_Feed = Link Case 1 lk_Link = Link End Select End Method Method ReadChannel(root:TxmlNode) Local channel:TxmlNode = TxmlNode(root.GetFirstChild()) If chnItems.Count() > 0 Then Clear() For Local part:TxmlNode = EachIn channel.getChildren() Select Lower(part.GetName()) Case "title" SetTitle(part.getContent()) Case "description" SetDescription(part.getContent()) Case "pubdate" SetPubdate(part.getContent()) Case "link" SetLink(part.getContent(), 1) Case "item" ReadItem(part) Default DebugLog("rchn noparse: ~q" + part.getName() + "~q") DebugLog("~t" + part.getName() + " :: " + part.getContent()) End Select Next End Method Method ReadItem(parent:TxmlNode) Local ritem:rssItem = New rssItem For Local part:TxmlNode = EachIn parent.getChildren() Select Lower(part.GetName()) Case "title" ritem.SetTitle(part.getContent()) Case "description" ritem.SetDescription(part.getContent()) Case "pubdate" ritem.SetPubdate(part.getContent()) Case "link" ritem.SetLink(part.getContent()) End Select Next chnItems.AddLast(ritem) End Method Method Clear() Local ritem:rssItem For ritem = EachIn chnItems ritem.Clear(Self) Next Title = Null ; Pubdate = Null Description = Null lk_Feed = Null ; lk_Link = Null End Method End Type Type rssItem 'item information Field Title:String 'title of item Field Description:String 'description of item Field Pubdate:String 'date event occured 'item links Field lk_Link:String 'referring link to event Method SetTitle(_Title:String) Title = _Title End Method Method SetDescription(_Desc:String) Description = _Desc End Method 'fix incoming date for appended timezone data (Thu, 13 Mar 2008 19:26:44 >-0000<) Method SetPubdate(pubdateraw:String) Pubdate = pubdateraw End Method Method SetLink(Link:String) lk_Link = Link End Method Method Clear(channel:rssChannel) Title = Null Description = Null Pubdate = Null lk_link = Null channel.chnItems.Remove(Self) End Method Function Create:rssItem(Title:String, Desc:String, Pubdate:String, lk_Link:String) Local ritem:rssItem = New rssItem ritem.Title = Title ritem.Description = Desc ritem.SetPubdate(Pubdate) ritem.lk_Link = lk_Link Return ritem End Function End Type Type Thttp Field sock:TSocket Field stream:TStream Field host:String Field agent:String = "BlitzHTTP/1.0" Field autoClose:Int Method Open:Int(host:String, autoClose:Int = False) Self.sock = CreateTCPSocket() If ConnectSocket(Self.sock, HostIp(host), 80) Self.host = host Self.stream = CreateSocketStream(Self.sock) Self.autoClose = autoClose Return True Else Return False End If End Method Method Get:HTTPReturnData(get:String = "") 'def get = "" Local HTRD:HTTPReturnData = New HTTPReturnData, buffer:String, rlnewline:String 'WriteLine(stream, "GET /" + get + " HTTP/1.0~nHost: " + Self.host + "~nUser-Agent: " + Self.agent + "~n~n") WriteLine stream, "GET /" + get + " HTTP/1.0" ' GET / gets Default page WriteLine stream, "Host: " + Self.host WriteLine stream, "User-Agent: " + Self.agent WriteLine stream, "Accept: */*" WriteLine stream, "" Local cExtType:String, cExt:String, cLength:Int ReadLine(stream) While Not Eof(stream) rlnewline = ReadLine(stream) Local spos:Int = Instr(rlnewline, ":") 'Print "rln" + Lower(Left(rlnewline, spos - 1)) + "rln" Select Lower(Left(rlnewline, spos - 1)) Case "content-type" Local prtmp:String = Mid(rlnewline, spos + 2, Instr(rlnewline, ";") - spos - 2), slpos:Int = Instr(prtmp, "/") cExtType = Left(prtmp, slpos - 1) cExt = Right(prtmp, prtmp.Length - slpos) Case "content-length" cLength = Int(Right(rlnewline, rlnewline.Length - spos - 1)) Case "" Exit End Select Wend While Not Eof(stream) rlnewline = ReadLine(stream) buffer:+ rlnewline + "~n" Wend HTRD.Set(Left(buffer, buffer.Length - 1), cExtType, cExt, cLength) If autoClose Close() Return HTRD End Method Method Post:String(page:String = "", keys:String[] , values:String[] ) Local buffer:String Local data:String Local i:Int For i = 0 To keys.Length - 1 data:+ UrlEncode(keys[i] ) + "=" + UrlEncode(values[i] ) + "&" Next data = Left(data, data.Length - 1) WriteLine(stream, "POST /" + page + " HTTP/1.0~nHost: " + Self.host + "~nUser-Agent: " + Self.agent + "~nContent-Length: " + data.Length + "~nContent-Type: application/x-www-form-urlencoded~n~n" + data) While Not Eof(stream) buffer:+ReadLine(stream) + "~n" Wend If autoClose Close() Return Left(buffer, buffer.Length - 1) End Method Method Close() If Self.stream CloseStream(Self.stream) If Self.sock CloseSocket(Self.sock) End Method Function UrlEncode:String(url:String) Local buffer:String Local Char:Int Local i:Int For i = 1 To url.Length Char = Asc(Mid(url, i, 1)) If(Char >= 48 And Char <= 57) Or (Char >= 65 And Char <= 90) Or (Char >= 97 And Char <= 122) Or Char = 43 Or Char = 45 Or Char = 46 Or Char = 95 buffer = buffer + Chr(Char) Else buffer = buffer + "%" + Right(Hex(Char), 2) End If Next Return buffer End Function Function UrlDecode:String(url:String) Local sHex:String = "0123456789ABCDEF" Local buffer:String Local i:Int For i = 1 To url.Length If Mid(url, i, 1) = "%" buffer = buffer + Chr(Instr(sHex, Mid(url, i + 1, 1)) Shl 4 + Instr(sHex, Mid(url, i + 2, 1)) - 17) i:+ 2 Else buffer = buffer + Mid(url, i, 1) End If Next Return buffer End Function End Type Type HTTPReturnData Field Content:String Field ContLength:Int Field ExtensionType:String Field Extension:String Method Set(Cont:String, ExtType:String, Ext:String, CLen:Int) Content = Cont ContLength = CLen Extension = Ext ExtensionType = ExtType End Method Method SaveContent(File:String, useExt:Int = False) If useExt File:+ "." + Extension SaveText(Content, File) End Method Method ToString:String() Return "Content-Type: " + ExtensionType + "/" + Extension + "~nContent-Length: " + ContLength End Method End Type New MyApp.Run() End Type MyApp Extends wxApp Field testframe:MyFrame Method OnInit:Int() testframe = MyFrame(New MyFrame.Create(Null, - 1, "rss Channel reader", - 1, - 1, 575, 390, wxMINIMIZE_BOX | wxCLOSE_BOX | wxSYSTEM_MENU | wxCAPTION | wxCLIP_CHILDREN)) testframe.Show() Return True End Method End Type Type MyFrame Extends wxFrame Field ctrpanel:wxPanel Field TCtr_rssfeedurl:wxTextCtrl Field LCtr_ChannelItems:wxListCtrl 'Field TCtr_rssItemInfo:wxTextCtrl Field Htw_rssItemInfo:wxHtmlWindow Field rchan:rssChannel Method OnInit() ctrpanel = New wxPanel.Create(Self) rchan = New rssChannel TCtr_rssfeedurl = New wxTextCtrl.Create(ctrpanel, idTCtr_rssfeedurl, "www.hulu.com/feed/show/60/episodes", 5, 17, 400, 20, wxTE_PROCESS_ENTER) New wxButton.Create(ctrpanel, idbtnrefresh, "Refresh", 410, 16, 64, 22) LCtr_ChannelItems = wxListCtrl(New wxListCtrl.Create(ctrpanel, idLCtr_ChannelItems, 5, 55, 200, 300, wxLC_LIST | wxLC_SINGLE_SEL | wxSUNKEN_BORDER)) 'LCtr_ChannelItems.InsertColumn(0, "rss items") 'TCtr_rssItemInfo = New wxTextCtrl.Create(ctrpanel, idTCtr_rssItemInfo, "", 210, 55, 350, 300, wxTE_MULTILINE) Htw_rssItemInfo = New wxHtmlWindow.Create(ctrpanel, idHtw_rssItemInfo, 210, 55, 350, 300) RefreshChannel() 'connect events Connect(idbtnrefresh, wxEVT_COMMAND_BUTTON_CLICKED, OnRefreshChannel) Connect(idTCtr_rssfeedurl, wxEVT_COMMAND_TEXT_ENTER, OnRefreshChannel) Connect(idLCtr_ChannelItems, wxEVT_COMMAND_LIST_ITEM_SELECTED, OnSelected) Connect(idHtw_rssItemInfo, wxEVT_COMMAND_HTML_LINK_CLICKED, OnrssLink) 'ConnectAny(wxEVT_CLOSE_WINDOW, OnQuit) Centre() End Method Method RefreshChannel() Local feedurl:String = TCtr_rssfeedurl.GetLineText(0) If Left(feedurl, 7) = "http://" Then feedurl = Right(feedurl, feedurl.Length - 7) Local firstsl:Int = Instr(feedurl, "/"), sitename:String = Left(feedurl, firstsl - 1), getfile:String = Right(feedurl, feedurl.Length - firstsl) Local httpg:Thttp = New Thttp, htrd:HTTPReturnData If httpg.Open(sitename) Local doc:TxmlDoc, root:TxmlNode rchan.Clear() htrd = httpg.Get(getfile) doc = TxmlDoc.parseDoc(htrd.Content) root = doc.GetRootElement() rchan.ReadChannel(root) rchan.lk_Feed = "www.hulu.com/feed/show/60/episodes" LCtr_ChannelItems.ClearAll() Local ritem:rssItem For ritem = EachIn rchan.chnItems Local wxl:wxListItem = New wxListItem.Create() wxl.SetData(ritem) wxl.SetText(ritem.Title) LCtr_ChannelItems.InsertItem(wxl) print ritem.Description Next rssLoadInfo(ritem) Else wxMessageBox("error: can't obtain url, sitename: ~q" + sitename + "~q getfile: ~q" + getfile + "~q") End If End Method Function OnRefreshChannel(evt:wxEvent) Local mfr:MyFrame = MyFrame(evt.parent) mfr.RefreshChannel() End Function Function OnSelected(evt:wxEvent) Local mfr:MyFrame = MyFrame(evt.parent) Local lst:wxListCtrl = mfr.LCtr_ChannelItems mfr.rssLoadInfo(rssItem(wxListEvent(evt).GetItem().GetData())) End Function Method rssLoadInfo(item:rssItem) 'load rssitem info into a browser area | currently a textctrl 'tctr_rssItemInfo.Clear() 'tctr_rssItemInfo.AppendText(item.Title + " date: " + item.Pubdate + "~n") 'tctr_rssItemInfo.AppendText(item.lk_Link + "~n" + item.Description) Local pageCont:String = "<html><body>~r~n" + .. "<a href=~q" + item.lk_Link + "~q>" + item.Title + "</a>~r~n" + .. item.Description + .. "~r~n</body></html>" Htw_rssItemInfo.SetPage(pageCont) SaveText(pageCont, "test.html") End Method Function OnrssLink(evt:wxEvent) OpenURL(wxHtmlLinkEvent(evt).GetLinkInfo().GetHref()) End Function 'Function OnQuit(event:wxEvent) ' wxWindow(event.parent).Close(True) ' 'End Function End Type 'id's Const idTCtr_rssfeedurl:Int = 101 Const idbtnrefresh:Int = 102 Const idLCtr_ChannelItems:Int = 103 Const idTCtr_rssItemInfo:Int = 104 Const idHtw_rssItemInfo:Int = 105