https://wiki.itcollege.ee/api.php?action=feedcontributions&user=Ajastrem&feedformat=atomICO wiki - User contributions [en]2024-03-29T01:30:12ZUser contributionsMediaWiki 1.41.0https://wiki.itcollege.ee/index.php?title=Windows_operatsioon_s%C3%BCsteemi_WiFi_API&diff=8791Windows operatsioon süsteemi WiFi API2010-05-06T08:08:59Z<p>Ajastrem: </p>
<hr />
<div>[[Category:Traadita side alused]]<br />
<br />
Kui teie oskate programmerida ja teil on Windows Vista või kõrgem operatsiooni süsteem, siis saate ligipääs “varjatud” infole. Selleks teil tuleb vahele toppida (Interop) üks windows library “wlanapi.dll”. Kogu vajalik info saab pärida siit:<br />
<br />
<source lang=csharp><br />
[DllImport("wlanapi.dll")]<br />
public static extern int WlanGetNetworkBssList(<br />
[In] IntPtr clientHandle,<br />
[In, MarshalAs(UnmanagedType.LPStruct)] Guid interfaceGuid,<br />
[In] IntPtr dot11SsidInt,<br />
[In] Dot11BssType dot11BssType,<br />
[In] bool securityEnabled,<br />
IntPtr reservedPtr,<br />
[Out] out IntPtr wlanBssList<br />
);<br />
</source><br />
<br />
<br />
Ja näide algorütm millega saab arvestada välja millist wifi kanalit võiks antud võrgus kasutada Access Pointi seadistamiseks.<br />
Algorütm iga kanali jaoks võttab signali tugevust ja liidab juurde kahtee ees pool olevad kanali tugevused ja kahte taga pool olevad kanali tugevused. Siis võrdleb neid ja tagastab neid kanalid millel on kõige vähem "müra".<br />
Algorütm on kirjutatud .NET c# keeles.<br />
<br />
<source lang=csharp><br />
List<WiFiNetwork> NETWORKS = new List<WiFiNetwork>();<br />
<br />
public List<int> AnalyzeResult() {<br />
string routerSSID = tbRouterSSID.Text.Trim();<br />
if (routerSSID == string.Empty) routerSSID = null;<br />
int[] strengthes = new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };<br />
int[] counts = new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };<br />
<br />
foreach (WiFiNetwork wifiNetwork in NETWORKS) {<br />
if (wifiNetwork.Name != routerSSID) {<br />
strengthes[wifiNetwork.Channel - 1] += wifiNetwork.SignalStrength;<br />
counts[wifiNetwork.Channel - 1] += 1;<br />
}<br />
}<br />
<br />
int[] results = new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };<br />
int[] count_results = new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };<br />
<br />
for (int i = 0; i < 11; i++) {<br />
for (int j = -2; j <= 2; j++) {<br />
int o = i + j;<br />
if (o > -1 && o < 11) {<br />
int l = strengthes[o];<br />
int c = counts[o];<br />
if (l > 0) {<br />
results[i] += l;<br />
count_results[i] += c;<br />
}<br />
}<br />
}<br />
}<br />
<br />
for (int i = 0; i < 11; i++) {<br />
results[i] = results[i] * count_results[i];<br />
}<br />
<br />
List<int> result = new List<int>();<br />
int min = results.Min();<br />
for (int i = 0; i < 11; i++) {<br />
if (results[i] == min) result.Add(i + 1);<br />
}<br />
<br />
return result;<br />
}<br />
<br />
public class WiFiNetwork {<br />
public string Name { get; set; }<br />
public int Frequency { get; set; }<br />
public int SignalStrength { get; set; }<br />
<br />
public WiFiNetwork(string name, int frequency, int signalStrength) {<br />
this.Name = name;<br />
this.Frequency = frequency;<br />
this.SignalStrength = signalStrength;<br />
}<br />
<br />
public int Channel {<br />
get {<br />
switch (Frequency) {<br />
case 2412000:<br />
return 1;<br />
case 2417000:<br />
return 2;<br />
case 2422000:<br />
return 3;<br />
case 2427000:<br />
return 4;<br />
case 2432000:<br />
return 5;<br />
case 2437000:<br />
return 6;<br />
case 2442000:<br />
return 7;<br />
case 2447000:<br />
return 8;<br />
case 2452000:<br />
return 9;<br />
case 2457000:<br />
return 10;<br />
case 2462000:<br />
return 11;<br />
default:<br />
return 1;<br />
}<br />
}<br />
}<br />
}<br />
</source><br />
<br />
'''Edukat wifi seadistamist!!!'''</div>Ajastremhttps://wiki.itcollege.ee/index.php?title=Windows_operatsioon_s%C3%BCsteemi_WiFi_API&diff=8790Windows operatsioon süsteemi WiFi API2010-05-06T08:08:49Z<p>Ajastrem: </p>
<hr />
<div>[[Category:Traadita side alused]]<br />
<br />
Kui teie oskate programmerida ja teil on Windows Vista või kõrgem operatsiooni süsteem, siis saate ligipääs “varjatud” infole. Selleks teil tuleb vahele toppida (Interop) üks windows library “wlanapi.dll”. Kogu vajalik info saab pärida siit:<br />
<br />
<source lang=csharp><br />
[DllImport("wlanapi.dll")]<br />
public static extern int WlanGetNetworkBssList(<br />
[In] IntPtr clientHandle,<br />
[In, MarshalAs(UnmanagedType.LPStruct)] Guid interfaceGuid,<br />
[In] IntPtr dot11SsidInt,<br />
[In] Dot11BssType dot11BssType,<br />
[In] bool securityEnabled,<br />
IntPtr reservedPtr,<br />
[Out] out IntPtr wlanBssList<br />
);<br />
</source><br />
<br />
<br />
ja näide algorütm millega saab arvestada välja millist wifi kanalit võiks antud võrgus kasutada Access Pointi seadistamiseks.<br />
Algorütm iga kanali jaoks võttab signali tugevust ja liidab juurde kahtee ees pool olevad kanali tugevused ja kahte taga pool olevad kanali tugevused. Siis võrdleb neid ja tagastab neid kanalid millel on kõige vähem "müra".<br />
Algorütm on kirjutatud .NET c# keeles.<br />
<br />
<source lang=csharp><br />
List<WiFiNetwork> NETWORKS = new List<WiFiNetwork>();<br />
<br />
public List<int> AnalyzeResult() {<br />
string routerSSID = tbRouterSSID.Text.Trim();<br />
if (routerSSID == string.Empty) routerSSID = null;<br />
int[] strengthes = new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };<br />
int[] counts = new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };<br />
<br />
foreach (WiFiNetwork wifiNetwork in NETWORKS) {<br />
if (wifiNetwork.Name != routerSSID) {<br />
strengthes[wifiNetwork.Channel - 1] += wifiNetwork.SignalStrength;<br />
counts[wifiNetwork.Channel - 1] += 1;<br />
}<br />
}<br />
<br />
int[] results = new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };<br />
int[] count_results = new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };<br />
<br />
for (int i = 0; i < 11; i++) {<br />
for (int j = -2; j <= 2; j++) {<br />
int o = i + j;<br />
if (o > -1 && o < 11) {<br />
int l = strengthes[o];<br />
int c = counts[o];<br />
if (l > 0) {<br />
results[i] += l;<br />
count_results[i] += c;<br />
}<br />
}<br />
}<br />
}<br />
<br />
for (int i = 0; i < 11; i++) {<br />
results[i] = results[i] * count_results[i];<br />
}<br />
<br />
List<int> result = new List<int>();<br />
int min = results.Min();<br />
for (int i = 0; i < 11; i++) {<br />
if (results[i] == min) result.Add(i + 1);<br />
}<br />
<br />
return result;<br />
}<br />
<br />
public class WiFiNetwork {<br />
public string Name { get; set; }<br />
public int Frequency { get; set; }<br />
public int SignalStrength { get; set; }<br />
<br />
public WiFiNetwork(string name, int frequency, int signalStrength) {<br />
this.Name = name;<br />
this.Frequency = frequency;<br />
this.SignalStrength = signalStrength;<br />
}<br />
<br />
public int Channel {<br />
get {<br />
switch (Frequency) {<br />
case 2412000:<br />
return 1;<br />
case 2417000:<br />
return 2;<br />
case 2422000:<br />
return 3;<br />
case 2427000:<br />
return 4;<br />
case 2432000:<br />
return 5;<br />
case 2437000:<br />
return 6;<br />
case 2442000:<br />
return 7;<br />
case 2447000:<br />
return 8;<br />
case 2452000:<br />
return 9;<br />
case 2457000:<br />
return 10;<br />
case 2462000:<br />
return 11;<br />
default:<br />
return 1;<br />
}<br />
}<br />
}<br />
}<br />
</source><br />
<br />
'''Edukat wifi seadistamist!!!'''</div>Ajastremhttps://wiki.itcollege.ee/index.php?title=Windows_operatsioon_s%C3%BCsteemi_WiFi_API&diff=8789Windows operatsioon süsteemi WiFi API2010-05-06T08:08:40Z<p>Ajastrem: </p>
<hr />
<div>[[Category:Traadita side alused]]<br />
<br />
Kui teie oskate programmerida ja teil on Windows Vista või kõrgem operatsiooni süsteem, siis saate ligipääs “varjatud” infole. Selleks teil tuleb vahele toppida (Interop) üks windows library “wlanapi.dll”. Kogu vajalik info saab pärida siit:<br />
<br />
<source lang=csharp><br />
[DllImport("wlanapi.dll")]<br />
public static extern int WlanGetNetworkBssList(<br />
[In] IntPtr clientHandle,<br />
[In, MarshalAs(UnmanagedType.LPStruct)] Guid interfaceGuid,<br />
[In] IntPtr dot11SsidInt,<br />
[In] Dot11BssType dot11BssType,<br />
[In] bool securityEnabled,<br />
IntPtr reservedPtr,<br />
[Out] out IntPtr wlanBssList<br />
);<br />
</source><br />
<br />
ja näide algorütm millega saab arvestada välja millist wifi kanalit võiks antud võrgus kasutada Access Pointi seadistamiseks.<br />
Algorütm iga kanali jaoks võttab signali tugevust ja liidab juurde kahtee ees pool olevad kanali tugevused ja kahte taga pool olevad kanali tugevused. Siis võrdleb neid ja tagastab neid kanalid millel on kõige vähem "müra".<br />
Algorütm on kirjutatud .NET c# keeles.<br />
<br />
<source lang=csharp><br />
List<WiFiNetwork> NETWORKS = new List<WiFiNetwork>();<br />
<br />
public List<int> AnalyzeResult() {<br />
string routerSSID = tbRouterSSID.Text.Trim();<br />
if (routerSSID == string.Empty) routerSSID = null;<br />
int[] strengthes = new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };<br />
int[] counts = new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };<br />
<br />
foreach (WiFiNetwork wifiNetwork in NETWORKS) {<br />
if (wifiNetwork.Name != routerSSID) {<br />
strengthes[wifiNetwork.Channel - 1] += wifiNetwork.SignalStrength;<br />
counts[wifiNetwork.Channel - 1] += 1;<br />
}<br />
}<br />
<br />
int[] results = new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };<br />
int[] count_results = new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };<br />
<br />
for (int i = 0; i < 11; i++) {<br />
for (int j = -2; j <= 2; j++) {<br />
int o = i + j;<br />
if (o > -1 && o < 11) {<br />
int l = strengthes[o];<br />
int c = counts[o];<br />
if (l > 0) {<br />
results[i] += l;<br />
count_results[i] += c;<br />
}<br />
}<br />
}<br />
}<br />
<br />
for (int i = 0; i < 11; i++) {<br />
results[i] = results[i] * count_results[i];<br />
}<br />
<br />
List<int> result = new List<int>();<br />
int min = results.Min();<br />
for (int i = 0; i < 11; i++) {<br />
if (results[i] == min) result.Add(i + 1);<br />
}<br />
<br />
return result;<br />
}<br />
<br />
public class WiFiNetwork {<br />
public string Name { get; set; }<br />
public int Frequency { get; set; }<br />
public int SignalStrength { get; set; }<br />
<br />
public WiFiNetwork(string name, int frequency, int signalStrength) {<br />
this.Name = name;<br />
this.Frequency = frequency;<br />
this.SignalStrength = signalStrength;<br />
}<br />
<br />
public int Channel {<br />
get {<br />
switch (Frequency) {<br />
case 2412000:<br />
return 1;<br />
case 2417000:<br />
return 2;<br />
case 2422000:<br />
return 3;<br />
case 2427000:<br />
return 4;<br />
case 2432000:<br />
return 5;<br />
case 2437000:<br />
return 6;<br />
case 2442000:<br />
return 7;<br />
case 2447000:<br />
return 8;<br />
case 2452000:<br />
return 9;<br />
case 2457000:<br />
return 10;<br />
case 2462000:<br />
return 11;<br />
default:<br />
return 1;<br />
}<br />
}<br />
}<br />
}<br />
</source><br />
<br />
'''Edukat wifi seadistamist!!!'''</div>Ajastremhttps://wiki.itcollege.ee/index.php?title=Windows_operatsioon_s%C3%BCsteemi_WiFi_API&diff=8788Windows operatsioon süsteemi WiFi API2010-05-06T08:07:20Z<p>Ajastrem: </p>
<hr />
<div>[[Category:Traadita side alused]]<br />
<br />
Kui teie oskate programmerida ja teil on Windows Vista või kõrgem operatsiooni süsteem, siis saate ligipääs “varjatud” infole. Selleks teil tuleb vahele toppida (Interop) üks windows library “wlanapi.dll”. Kogu vajalik info saab pärida siit:<br />
<br />
<source lang=csharp><br />
[DllImport("wlanapi.dll")]<br />
public static extern int WlanGetNetworkBssList(<br />
[In] IntPtr clientHandle,<br />
[In, MarshalAs(UnmanagedType.LPStruct)] Guid interfaceGuid,<br />
[In] IntPtr dot11SsidInt,<br />
[In] Dot11BssType dot11BssType,<br />
[In] bool securityEnabled,<br />
IntPtr reservedPtr,<br />
[Out] out IntPtr wlanBssList<br />
);<br />
</source><br />
<br />
ja näide algorütm millega saab arvestada välja millist wifi kanalit võiks antud võrgus kasutada Access Pointi seadistamiseks:<br />
<br />
<source lang=csharp><br />
List<WiFiNetwork> NETWORKS = new List<WiFiNetwork>();<br />
<br />
public List<int> AnalyzeResult() {<br />
string routerSSID = tbRouterSSID.Text.Trim();<br />
if (routerSSID == string.Empty) routerSSID = null;<br />
int[] strengthes = new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };<br />
int[] counts = new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };<br />
<br />
foreach (WiFiNetwork wifiNetwork in NETWORKS) {<br />
if (wifiNetwork.Name != routerSSID) {<br />
strengthes[wifiNetwork.Channel - 1] += wifiNetwork.SignalStrength;<br />
counts[wifiNetwork.Channel - 1] += 1;<br />
}<br />
}<br />
<br />
int[] results = new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };<br />
int[] count_results = new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };<br />
<br />
for (int i = 0; i < 11; i++) {<br />
for (int j = -2; j <= 2; j++) {<br />
int o = i + j;<br />
if (o > -1 && o < 11) {<br />
int l = strengthes[o];<br />
int c = counts[o];<br />
if (l > 0) {<br />
results[i] += l;<br />
count_results[i] += c;<br />
}<br />
}<br />
}<br />
}<br />
<br />
for (int i = 0; i < 11; i++) {<br />
results[i] = results[i] * count_results[i];<br />
}<br />
<br />
List<int> result = new List<int>();<br />
int min = results.Min();<br />
for (int i = 0; i < 11; i++) {<br />
if (results[i] == min) result.Add(i + 1);<br />
}<br />
<br />
return result;<br />
}<br />
<br />
public class WiFiNetwork {<br />
public string Name { get; set; }<br />
public int Frequency { get; set; }<br />
public int SignalStrength { get; set; }<br />
<br />
public WiFiNetwork(string name, int frequency, int signalStrength) {<br />
this.Name = name;<br />
this.Frequency = frequency;<br />
this.SignalStrength = signalStrength;<br />
}<br />
<br />
public int Channel {<br />
get {<br />
switch (Frequency) {<br />
case 2412000:<br />
return 1;<br />
case 2417000:<br />
return 2;<br />
case 2422000:<br />
return 3;<br />
case 2427000:<br />
return 4;<br />
case 2432000:<br />
return 5;<br />
case 2437000:<br />
return 6;<br />
case 2442000:<br />
return 7;<br />
case 2447000:<br />
return 8;<br />
case 2452000:<br />
return 9;<br />
case 2457000:<br />
return 10;<br />
case 2462000:<br />
return 11;<br />
default:<br />
return 1;<br />
}<br />
}<br />
}<br />
}<br />
</source><br />
<br />
Algorütm iga kanali jaoks võttab signali tugevust ja liidab juurde kahtee ees pool olevad kanali tugevused ja kahte taga pool olevad kanali tugevused. Siis võrdleb neid ja tagastab neid kanalid millel on kõige vähem "müra".<br />
Algorütm on kirjutatud .NET c# keeles <br />
<br />
'''Edukat wifi seadistamist!!!'''</div>Ajastremhttps://wiki.itcollege.ee/index.php?title=Windows_operatsioon_s%C3%BCsteemi_WiFi_API&diff=8787Windows operatsioon süsteemi WiFi API2010-05-06T08:06:37Z<p>Ajastrem: </p>
<hr />
<div>[[Category:Traadita side alused]]<br />
<br />
Kui teie oskate programmerida ja teil on Windows Vista või kõrgem operatsiooni süsteem, siis saate ligipääs “varjatud” infole. Selleks teil tuleb vahele toppida (Interop) üks windows library “wlanapi.dll”. Kogu vajalik info saab pärida siit:<br />
<br />
<source lang=csharp><br />
[DllImport("wlanapi.dll")]<br />
public static extern int WlanGetNetworkBssList(<br />
[In] IntPtr clientHandle,<br />
[In, MarshalAs(UnmanagedType.LPStruct)] Guid interfaceGuid,<br />
[In] IntPtr dot11SsidInt,<br />
[In] Dot11BssType dot11BssType,<br />
[In] bool securityEnabled,<br />
IntPtr reservedPtr,<br />
[Out] out IntPtr wlanBssList<br />
);<br />
</source><br />
<br />
ja näite algorütm millega saab arvestada välja millist wifi kanalit võiks antud võrgus kasutada Access Pointi seadistamiseks:<br />
<br />
<source lang=csharp><br />
List<WiFiNetwork> NETWORKS = new List<WiFiNetwork>();<br />
<br />
public List<int> AnalyzeResult() {<br />
string routerSSID = tbRouterSSID.Text.Trim();<br />
if (routerSSID == string.Empty) routerSSID = null;<br />
int[] strengthes = new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };<br />
int[] counts = new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };<br />
<br />
foreach (WiFiNetwork wifiNetwork in NETWORKS) {<br />
if (wifiNetwork.Name != routerSSID) {<br />
strengthes[wifiNetwork.Channel - 1] += wifiNetwork.SignalStrength;<br />
counts[wifiNetwork.Channel - 1] += 1;<br />
}<br />
}<br />
<br />
int[] results = new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };<br />
int[] count_results = new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };<br />
<br />
for (int i = 0; i < 11; i++) {<br />
for (int j = -2; j <= 2; j++) {<br />
int o = i + j;<br />
if (o > -1 && o < 11) {<br />
int l = strengthes[o];<br />
int c = counts[o];<br />
if (l > 0) {<br />
results[i] += l;<br />
count_results[i] += c;<br />
}<br />
}<br />
}<br />
}<br />
<br />
for (int i = 0; i < 11; i++) {<br />
results[i] = results[i] * count_results[i];<br />
}<br />
<br />
List<int> result = new List<int>();<br />
int min = results.Min();<br />
for (int i = 0; i < 11; i++) {<br />
if (results[i] == min) result.Add(i + 1);<br />
}<br />
<br />
return result;<br />
}<br />
<br />
public class WiFiNetwork {<br />
public string Name { get; set; }<br />
public int Frequency { get; set; }<br />
public int SignalStrength { get; set; }<br />
<br />
public WiFiNetwork(string name, int frequency, int signalStrength) {<br />
this.Name = name;<br />
this.Frequency = frequency;<br />
this.SignalStrength = signalStrength;<br />
}<br />
<br />
public int Channel {<br />
get {<br />
switch (Frequency) {<br />
case 2412000:<br />
return 1;<br />
case 2417000:<br />
return 2;<br />
case 2422000:<br />
return 3;<br />
case 2427000:<br />
return 4;<br />
case 2432000:<br />
return 5;<br />
case 2437000:<br />
return 6;<br />
case 2442000:<br />
return 7;<br />
case 2447000:<br />
return 8;<br />
case 2452000:<br />
return 9;<br />
case 2457000:<br />
return 10;<br />
case 2462000:<br />
return 11;<br />
default:<br />
return 1;<br />
}<br />
}<br />
}<br />
}<br />
</source><br />
<br />
Algorütm iga kanali jaoks võttab signali tugevust ja liidab juurde kahtee ees pool olevad kanali tugevused ja kahte taga pool olevad kanali tugevused. Siis võrdleb neid ja tagastab neid kanalid millel on kõige vähem "müra".<br />
Algorütm on kirjutatud .NET c# keeles <br />
<br />
'''Edukat wifi seadistamist!!!'''</div>Ajastremhttps://wiki.itcollege.ee/index.php?title=Wifi_kanali_valimine&diff=8786Wifi kanali valimine2010-05-06T07:55:06Z<p>Ajastrem: </p>
<hr />
<div>[[Category:Traadita side alused]]<br />
<br />
WiFi signaali sagedus<br />
<br />
Wifi access point’id võivad kasutada üks sagedus üheteiskümnest lubatud sagedustest(eestis on kolmteist, jaapanis on neliteist). Mõned access point’id oskavad kasutada veel kolm sagedus.<br />
<br />
2.4 GHz (802.11b/g/n)<br />
<br />
[[Image:WiFi_channels.jpg]]<br />
<br />
Pildi peal on ilusasti näha, et üks kanal segab kaks sagedust ette ja kaks sagedust taga poole. Nii et kanalid mis ei sega üks teisele on 1, 6 ja 11. Need on gi kanalid mis tavaliselt kasutakse signaali edastamiseks. Loogiline, kui teie kasutate kanalit näiteks nr. 3 siis teie segade neid kes istuvad kanalil nr. 1 ja kanalil nr. 6 (2, 4, 5 kaasarvatud). <br />
Peaks tunnistama, et wifi kasutamine on levinud päris palju ja sellel hetkel kui teie hakkate oma access point’I seadistama on teie maja umber (sees) on teil eetris mitme naabri wifi signaal juba olemas. Mis siis teha? Millist kanalit valida? Selleks teil on vaja teada naabri võrkude kanalid ja signaali tugevust. Kahjuks kui teie veel suudate vaadata tavaliste vahenditega naabri wifi signaali tugevust, teie ei saa teada kasutatud kanal.<br />
<br />
<br />
Soovitan teiele kasutada mõnda tarkvara mis võimaldab vadata sellised ajad nagu levivate wifi signaalide tugevust ja kanalit.<br />
Näiteks NetStumbler on hetkel üks tarkvara mis võimaldab selline info kätte saada.<br />
<br />
[[Image:NetStumbler.jpg|400px]]<br />
<br />
Kasutage sellist tüüpi tarkvara, et avastada kanal mis omab vähem müra.<br />
<br />
<br />
'''[[Windows operatsioon süsteemi WiFi API]]'''<br />
<br />
Kui teie aga oskate programmerida ja teil on Windows Vista või kõrgem operatsioon süsteem, siis teie saate ligipääs “varjatud” infole. Tasub lugeda seda artiklit [[Windows operatsioon süsteemi WiFi API]]</div>Ajastremhttps://wiki.itcollege.ee/index.php?title=Wifi_kanali_valimine&diff=8780Wifi kanali valimine2010-05-06T07:35:21Z<p>Ajastrem: </p>
<hr />
<div>[[Category:Traadita side alused]]<br />
<br />
WiFi signaali sagedus<br />
<br />
Wifi access point’id võivad kasutada üks sagedus üheteiskümnest lubatud sagedustest(eestis on kolmteist, jaapanis on neliteist). Mõned access point’id oskavad kasutada veel kolm sagedus.<br />
<br />
2.4 GHz (802.11b/g/n)<br />
<br />
[[Image:WiFi_channels.jpg]]<br />
<br />
Pildi peal on ilusasti näha, et üks kanal segab kaks sagedust ette ja kaks sagedust taga poole. Nii et kanalid mis ei sega üks teisele on 1, 6 ja 11. Need on gi kanalid mis tavaliselt kasutakse signaali edastamiseks. Loogiline, kui teie kasutate kanalit näiteks nr. 3 siis teie segade neid kes istuvad kanalil nr. 1 ja kanalil nr. 6 (2, 4, 5 kaasarvatud). <br />
Peaks tunnistama, et wifi kasutamine on levinud päris palju ja sellel hetkel kui teie hakkate oma access point’I seadistama on teie maja umber (sees) on teil eetris mitme naabri wifi signaal juba olemas. Mis siis teha? Millist kanalit valida? Selleks teil on vaja teada naabri võrkude kanalid ja signaali tugevust. Kahjuks kui teie veel suudate vaadata tavaliste vahenditega naabri wifi signaali tugevust, teie ei saa teada kasutatud kanal.<br />
<br />
<br />
Soovitan teiele kasutada mõnda tarkvara mis võimaldab vadata sellised ajad nagu levivate wifi signaalide tugevust ja kanalit.<br />
Näiteks NetStumbler on hetkel üks tarkvara mis võimaldab selline info kätte saada.<br />
<br />
[[Image:NetStumbler.jpg|400px]]<br />
<br />
Kasutage sellist tüüpi tarkvara, et avastada kanal mis omab vähem müra.<br />
<br />
'''[[Windows operatsioon süsteemi WiFi API]]'''<br />
<br />
<br />
Kui teie aga oskate programmerida ja teil on Windows Vista või kõrgem operatsioon süsteem, siis teie saate ligipääs “varjatud” infole. Tasub lugeda seda artiklit [[Windows operatsioon süsteemi WiFi API]]</div>Ajastremhttps://wiki.itcollege.ee/index.php?title=RSS_voogude_v%C3%A4rskete_uudiste_korjamise_rakendus&diff=8777RSS voogude värskete uudiste korjamise rakendus2010-05-06T07:27:08Z<p>Ajastrem: </p>
<hr />
<div>[[Category:Võrgurakendused II: hajussüsteemide ehitamine]]<br />
<p><br />
Idee oli koostada webi teenus mis oskaks kasutajate RSS voogude nimekirjast koostada viimaste uudiste nimekiri.<br />
<br /><br />
<br />Probleemide nimekiri oli teada: <br />
<br />1) RSS voogud on disaini poolest erinevad <br />
<br />2) RSS aja formaati standart on uurimata <br />
<br />3) Uudiste sünkrooniline uuendamine on aeglane <br />
<br /><br />
<br />Pakkutav lahendus oli: <br />
<br />1) Rakenduses kasutakse ainult ühine osa RSS voogudest <br />
<br />2) Aja formaat uurida ja leida lahendust <br />
<br />3) Uudised uuendada asünkroonselt <br />
<br /><br />
<br />Rakendus on paigaldatud [https://networksolutions2.googlecode.com/svn/trunk siin] ([https://www.googlecode.com google code])<br />
<br />Koodi saab kätte SVN kliendi abil, näiteks [http://tortoisesvn.net/downloads tortoise SVN]<br />
<br /><br />
<br />Selleks, et veenduda et RSS web teenus töötab tegin juurde kah väikse web saiti, <br />
<br />ehk kogu komponentide pilt oleks selline:<br />
<br />[[Image:RSS_voogude_rakendus.jpg]]<br />
<br /><br />
<br />Kõige pealt pidi uurima millist aja formaati kasutab RSS standart, <br />
<br />uurides standarti selgus et kasutakse RFC822 aja standart<br />
<br />[[Rfc822DateTimeFormat csharp]] RSS aja standarti c# implementatsioon <br />
<source lang=csharp>public static string[] Rfc822DateTimePatterns {<br />
get {<br />
formats = new string[35];<br />
<br />
// two-digit day, four-digit year patterns<br />
formats[0] = "ddd',' dd MMM yyyy HH':'mm':'ss'.'fffffff zzzz";<br />
</source><br />
<br />Edasi oli vaja implementeerida RSS voogu kätte saamine<br />
<br />[[RssFeed Retrieve]]<br />
<source lang=csharp>/// <summary><br />
/// Retrieves an RSS feed using the given Url, parses it and<br />
/// creates and new <see cref="RssFeed">RssFeed</see> object with the information.<br />
/// If an error occurs in the XML loading of the document, or parsing of<br />
/// the RSS feed, the error is trapped and stored inside the RssFeed's<br />
/// ErrorMessage property.<br />
/// </summary><br />
/// <param name="Url">The url to retrieve the RSS feed from, this can<br />
/// be in the format of http:// and also file://.. (ftp?)</param><br />
/// <returns>An <see cref="RssFeed">RssFeed</see> object with information<br />
/// retrieved from the feed.</returns><br />
public RssFeed Retrieve(string Url) {<br />
</source><br />
<br />Siis tegin kah andmebaasi selleks. et saaks kasutajate RSS voogud salvestada<br />
<br />[[Image:RSS_db.jpg]]<br />
<br /><br />
<br />Viimane samm oli teha testimiseks vebi leht,<br />
<br />Veb koosneb vaba registreerimisest, isiku voogude lisamise ja vatamise komponendist ja RSS web teenuse ühendusest.<br />
<br />[[Image:RSS_Web.jpg]]<br />
<br /><br />
<br />Ehk see oligi kõik, ülesanne oli suht lihtne :)<br />
<br /><br />
</p></div>Ajastremhttps://wiki.itcollege.ee/index.php?title=RSS_voogude_v%C3%A4rskete_uudiste_korjamise_rakendus&diff=8776RSS voogude värskete uudiste korjamise rakendus2010-05-06T07:26:24Z<p>Ajastrem: </p>
<hr />
<div>[[Category:Võrgurakendused]]<br />
<p><br />
Idee oli koostada webi teenus mis oskaks kasutajate RSS voogude nimekirjast koostada viimaste uudiste nimekiri.<br />
<br /><br />
<br />Probleemide nimekiri oli teada: <br />
<br />1) RSS voogud on disaini poolest erinevad <br />
<br />2) RSS aja formaati standart on uurimata <br />
<br />3) Uudiste sünkrooniline uuendamine on aeglane <br />
<br /><br />
<br />Pakkutav lahendus oli: <br />
<br />1) Rakenduses kasutakse ainult ühine osa RSS voogudest <br />
<br />2) Aja formaat uurida ja leida lahendust <br />
<br />3) Uudised uuendada asünkroonselt <br />
<br /><br />
<br />Rakendus on paigaldatud [https://networksolutions2.googlecode.com/svn/trunk siin] ([https://www.googlecode.com google code])<br />
<br />Koodi saab kätte SVN kliendi abil, näiteks [http://tortoisesvn.net/downloads tortoise SVN]<br />
<br /><br />
<br />Selleks, et veenduda et RSS web teenus töötab tegin juurde kah väikse web saiti, <br />
<br />ehk kogu komponentide pilt oleks selline:<br />
<br />[[Image:RSS_voogude_rakendus.jpg]]<br />
<br /><br />
<br />Kõige pealt pidi uurima millist aja formaati kasutab RSS standart, <br />
<br />uurides standarti selgus et kasutakse RFC822 aja standart<br />
<br />[[Rfc822DateTimeFormat csharp]] RSS aja standarti c# implementatsioon <br />
<source lang=csharp>public static string[] Rfc822DateTimePatterns {<br />
get {<br />
formats = new string[35];<br />
<br />
// two-digit day, four-digit year patterns<br />
formats[0] = "ddd',' dd MMM yyyy HH':'mm':'ss'.'fffffff zzzz";<br />
</source><br />
<br />Edasi oli vaja implementeerida RSS voogu kätte saamine<br />
<br />[[RssFeed Retrieve]]<br />
<source lang=csharp>/// <summary><br />
/// Retrieves an RSS feed using the given Url, parses it and<br />
/// creates and new <see cref="RssFeed">RssFeed</see> object with the information.<br />
/// If an error occurs in the XML loading of the document, or parsing of<br />
/// the RSS feed, the error is trapped and stored inside the RssFeed's<br />
/// ErrorMessage property.<br />
/// </summary><br />
/// <param name="Url">The url to retrieve the RSS feed from, this can<br />
/// be in the format of http:// and also file://.. (ftp?)</param><br />
/// <returns>An <see cref="RssFeed">RssFeed</see> object with information<br />
/// retrieved from the feed.</returns><br />
public RssFeed Retrieve(string Url) {<br />
</source><br />
<br />Siis tegin kah andmebaasi selleks. et saaks kasutajate RSS voogud salvestada<br />
<br />[[Image:RSS_db.jpg]]<br />
<br /><br />
<br />Viimane samm oli teha testimiseks vebi leht,<br />
<br />Veb koosneb vaba registreerimisest, isiku voogude lisamise ja vatamise komponendist ja RSS web teenuse ühendusest.<br />
<br />[[Image:RSS_Web.jpg]]<br />
<br /><br />
<br />Ehk see oligi kõik, ülesanne oli suht lihtne :)<br />
<br /><br />
</p></div>Ajastremhttps://wiki.itcollege.ee/index.php?title=Windows_operatsioon_s%C3%BCsteemi_WiFi_API&diff=8775Windows operatsioon süsteemi WiFi API2010-05-06T07:25:12Z<p>Ajastrem: </p>
<hr />
<div>[[Category:Traadita side alused]]<br />
<br />
Kui teie oskate programmerida ja teil on Windows Vista või kõrgem operatsiooni süsteem, siis saate ligipääs “varjatud” infole. Selleks teil tuleb vahele toppida (Interop) üks windows library “wlanapi.dll”. Kogu vajalik info saab pärida siit:<br />
<br />
<source lang=csharp><br />
[DllImport("wlanapi.dll")]<br />
public static extern int WlanGetNetworkBssList(<br />
[In] IntPtr clientHandle,<br />
[In, MarshalAs(UnmanagedType.LPStruct)] Guid interfaceGuid,<br />
[In] IntPtr dot11SsidInt,<br />
[In] Dot11BssType dot11BssType,<br />
[In] bool securityEnabled,<br />
IntPtr reservedPtr,<br />
[Out] out IntPtr wlanBssList<br />
);<br />
</source><br />
<br />
ja näite algorütm millega saab arvestada välja millist wifi kanalit võiks antud võrgus kasutada Access Pointi seadistamiseks:<br />
<br />
<source lang=csharp><br />
public List<int> AnalyzeResult() {<br />
string routerSSID = tbRouterSSID.Text.Trim();<br />
if (routerSSID == string.Empty) routerSSID = null;<br />
int[] strengthes = new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };<br />
int[] counts = new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };<br />
<br />
foreach (WiFiNetwork wifiNetwork in NETWORKS) {<br />
if (wifiNetwork.Name != routerSSID) {<br />
strengthes[wifiNetwork.Channel - 1] += wifiNetwork.SignalStrength;<br />
counts[wifiNetwork.Channel - 1] += 1;<br />
}<br />
}<br />
<br />
int[] results = new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };<br />
int[] count_results = new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };<br />
<br />
for (int i = 0; i < 11; i++) {<br />
for (int j = -2; j <= 2; j++) {<br />
int o = i + j;<br />
if (o > -1 && o < 11) {<br />
int l = strengthes[o];<br />
int c = counts[o];<br />
if (l > 0) {<br />
results[i] += l;<br />
count_results[i] += c;<br />
}<br />
}<br />
}<br />
}<br />
<br />
for (int i = 0; i < 11; i++) {<br />
results[i] = results[i] * count_results[i];<br />
}<br />
<br />
List<int> result = new List<int>();<br />
int min = results.Min();<br />
for (int i = 0; i < 11; i++) {<br />
if (results[i] == min) result.Add(i + 1);<br />
}<br />
<br />
return result;<br />
}<br />
</source><br />
<br />
'''Edukat wifi seadistamist!!!'''</div>Ajastremhttps://wiki.itcollege.ee/index.php?title=Windows_operatsioon_s%C3%BCsteemi_WiFi_API&diff=8774Windows operatsioon süsteemi WiFi API2010-05-06T07:23:05Z<p>Ajastrem: </p>
<hr />
<div>[[Category:Traadita side alused]]<br />
<br />
Kui teie oskate programmerida ja teil on Windows Vista või kõrgem operatsiooni süsteem, siis saate ligipääs “varjatud” infole. Selleks teil tuleb vahele toppida (Interop) üks windows library “wlanapi.dll”. Kogu vajalik info saab pärida siit:<br />
<br />
[DllImport("wlanapi.dll")]<br />
public static extern int WlanGetNetworkBssList(<br />
[In] IntPtr clientHandle,<br />
[In, MarshalAs(UnmanagedType.LPStruct)] Guid interfaceGuid,<br />
[In] IntPtr dot11SsidInt,<br />
[In] Dot11BssType dot11BssType,<br />
[In] bool securityEnabled,<br />
IntPtr reservedPtr,<br />
[Out] out IntPtr wlanBssList<br />
);<br />
<br />
ja näite algorütm millega saab arvestada välja millist wifi kanalit võiks antud võrgus kasutada Access Pointi seadistamiseks:<br />
<br />
public List<int> AnalyzeResult() {<br />
string routerSSID = tbRouterSSID.Text.Trim();<br />
if (routerSSID == string.Empty) routerSSID = null;<br />
int[] strengthes = new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };<br />
int[] counts = new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };<br />
<br />
foreach (WiFiNetwork wifiNetwork in NETWORKS) {<br />
if (wifiNetwork.Name != routerSSID) {<br />
strengthes[wifiNetwork.Channel - 1] += wifiNetwork.SignalStrength;<br />
counts[wifiNetwork.Channel - 1] += 1;<br />
}<br />
}<br />
<br />
int[] results = new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };<br />
int[] count_results = new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };<br />
<br />
for (int i = 0; i < 11; i++) {<br />
for (int j = -2; j <= 2; j++) {<br />
int o = i + j;<br />
if (o > -1 && o < 11) {<br />
int l = strengthes[o];<br />
int c = counts[o];<br />
if (l > 0) {<br />
results[i] += l;<br />
count_results[i] += c;<br />
}<br />
}<br />
}<br />
}<br />
<br />
for (int i = 0; i < 11; i++) {<br />
results[i] = results[i] * count_results[i];<br />
}<br />
<br />
List<int> result = new List<int>();<br />
int min = results.Min();<br />
for (int i = 0; i < 11; i++) {<br />
if (results[i] == min) result.Add(i + 1);<br />
}<br />
<br />
return result;<br />
}<br />
<br />
'''Edukat wifi seadistamist!!!'''</div>Ajastremhttps://wiki.itcollege.ee/index.php?title=Windows_operatsioon_s%C3%BCsteemi_WiFi_API&diff=8773Windows operatsioon süsteemi WiFi API2010-05-06T07:17:20Z<p>Ajastrem: New page: Category:Traadita side alused</p>
<hr />
<div>[[Category:Traadita side alused]]</div>Ajastremhttps://wiki.itcollege.ee/index.php?title=Wifi_kanali_valimine&diff=8772Wifi kanali valimine2010-05-06T07:16:43Z<p>Ajastrem: </p>
<hr />
<div>[[Category:Traadita side alused]]<br />
<br />
WiFi signaali sagedus<br />
<br />
Wifi access point’id võivad kasutada üks sagedus üheteiskümnest lubatud sagedustest(eestis on kolmteist, jaapanis on neliteist). Mõned access point’id oskavad kasutada veel kolm sagedus.<br />
<br />
2.4 GHz (802.11b/g/n)<br />
<br />
[[Image:WiFi_channels.jpg]]<br />
<br />
Pildi peal on ilusasti näha, et üks kanal segab kaks sagedust ette ja kaks sagedust taga poole. Nii et kanalid mis ei sega üks teisele on 1, 6 ja 11. Need on gi kanalid mis tavaliselt kasutakse signaali edastamiseks. Loogiline, kui teie kasutate kanalit näiteks nr. 3 siis teie segade neid kes istuvad kanalil nr. 1 ja kanalil nr. 6 (2, 4, 5 kaasarvatud). <br />
Peaks tunnistama, et wifi kasutamine on levinud päris palju ja sellel hetkel kui teie hakkate oma access point’I seadistama on teie maja umber (sees) on teil eetris mitme naabri wifi signaal juba olemas. Mis siis teha? Millist kanalit valida? Selleks teil on vaja teada naabri võrkude kanalid ja signaali tugevust. Kahjuks kui teie veel suudate vaadata tavaliste vahenditega naabri wifi signaali tugevust, teie ei saa teada kasutatud kanal.<br />
<br />
<br />
Soovitan teiele kasutada mõnda tarkvara mis võimaldab vadata sellised ajad nagu levivate wifi signaalide tugevust ja kanalit.<br />
Näiteks NetStumbler on hetkel üks tarkvara mis võimaldab selline info kätte saada.<br />
<br />
[[Image:NetStumbler.jpg|400px]]<br />
<br />
Kasutage sellist tüüpi tarkvara, et avastada kanal mis omab vähem müra.<br />
<br />
'''[[Windows operatsioon süsteemi WiFi API]]'''<br />
<br />
<br />
Kui teie aga oskate programmerida ja teil on Windows Vista või kõrgem operatsioon süsteem, siis teie saate ligipääs “varjatud” infole. Tasub lugeda seda artiklit [link]</div>Ajastremhttps://wiki.itcollege.ee/index.php?title=Wifi_kanali_valimine&diff=8771Wifi kanali valimine2010-05-06T07:13:55Z<p>Ajastrem: </p>
<hr />
<div>[[Category:Traadita side alused]]<br />
<br />
WiFi signaali sagedus<br />
<br />
Wifi access point’id võivad kasutada üks sagedus üheteiskümnest lubatud sagedustest(eestis on kolmteist, jaapanis on neliteist). Mõned access point’id oskavad kasutada veel kolm sagedus.<br />
<br />
2.4 GHz (802.11b/g/n)<br />
<br />
[[Image:WiFi_channels.jpg]]<br />
<br />
Pildi peal on ilusasti näha, et üks kanal segab kaks sagedust ette ja kaks sagedust taga poole. Nii et kanalid mis ei sega üks teisele on 1, 6 ja 11. Need on gi kanalid mis tavaliselt kasutakse signaali edastamiseks. Loogiline, kui teie kasutate kanalit näiteks nr. 3 siis teie segade neid kes istuvad kanalil nr. 1 ja kanalil nr. 6 (2, 4, 5 kaasarvatud). <br />
Peaks tunnistama, et wifi kasutamine on levinud päris palju ja sellel hetkel kui teie hakkate oma access point’I seadistama on teie maja umber (sees) on teil eetris mitme naabri wifi signaal juba olemas. Mis siis teha? Millist kanalit valida? Selleks teil on vaja teada naabri võrkude kanalid ja signaali tugevust. Kahjuks kui teie veel suudate vaadata tavaliste vahenditega naabri wifi signaali tugevust, teie ei saa teada kasutatud kanal.<br />
<br />
<br />
Soovitan teiele kasutada mõnda tarkvara mis võimaldab vadata sellised ajad nagu levivate wifi signaalide tugevust ja kanalit.<br />
Näiteks NetStumbler on hetkel üks tarkvara mis võimaldab selline info kätte saada.<br />
<br />
[[Image:NetStumbler.jpg|400px]]<br />
<br />
Kasutage sellist tüüpi tarkvara, et avastada kanal mis omab vähem müra.<br />
<br />
Windows operatsioon süsteemi WiFi API<br />
Kui teie aga oskate programmerida ja teil on Windows Vista või kõrgem operatsioon süsteem, siis teie saate ligipääs “varjatud” infole. Tasub lugeda seda artiklit [link]</div>Ajastremhttps://wiki.itcollege.ee/index.php?title=Wifi_kanali_valimine&diff=8770Wifi kanali valimine2010-05-06T07:13:48Z<p>Ajastrem: </p>
<hr />
<div>[[Category:Traadita side alused]]<br />
<br />
WiFi signaali sagedus<br />
<br />
Wifi access point’id võivad kasutada üks sagedus üheteiskümnest lubatud sagedustest(eestis on kolmteist, jaapanis on neliteist). Mõned access point’id oskavad kasutada veel kolm sagedus.<br />
<br />
2.4 GHz (802.11b/g/n)<br />
<br />
[[Image:WiFi_channels.jpg]]<br />
<br />
Pildi peal on ilusasti näha, et üks kanal segab kaks sagedust ette ja kaks sagedust taga poole. Nii et kanalid mis ei sega üks teisele on 1, 6 ja 11. Need on gi kanalid mis tavaliselt kasutakse signaali edastamiseks. Loogiline, kui teie kasutate kanalit näiteks nr. 3 siis teie segade neid kes istuvad kanalil nr. 1 ja kanalil nr. 6 (2, 4, 5 kaasarvatud). <br />
Peaks tunnistama, et wifi kasutamine on levinud päris palju ja sellel hetkel kui teie hakkate oma access point’I seadistama on teie maja umber (sees) on teil eetris mitme naabri wifi signaal juba olemas. Mis siis teha? Millist kanalit valida? Selleks teil on vaja teada naabri võrkude kanalid ja signaali tugevust. Kahjuks kui teie veel suudate vaadata tavaliste vahenditega naabri wifi signaali tugevust, teie ei saa teada kasutatud kanal.<br />
<br />
<br />
Soovitan teiele kasutada mõnda tarkvara mis võimaldab vadata sellised ajad nagu levivate wifi signaalide tugevust ja kanalit.<br />
Näiteks NetStumbler on hetkel üks tarkvara mis võimaldab selline info kätte saada.<br />
<br />
[[Image:NetStumbler.jpg|100px]]<br />
<br />
Kasutage sellist tüüpi tarkvara, et avastada kanal mis omab vähem müra.<br />
<br />
Windows operatsioon süsteemi WiFi API<br />
Kui teie aga oskate programmerida ja teil on Windows Vista või kõrgem operatsioon süsteem, siis teie saate ligipääs “varjatud” infole. Tasub lugeda seda artiklit [link]</div>Ajastremhttps://wiki.itcollege.ee/index.php?title=Wifi_kanali_valimine&diff=8769Wifi kanali valimine2010-05-06T07:13:22Z<p>Ajastrem: </p>
<hr />
<div>[[Category:Traadita side alused]]<br />
<br />
WiFi signaali sagedus<br />
<br />
Wifi access point’id võivad kasutada üks sagedus üheteiskümnest lubatud sagedustest(eestis on kolmteist, jaapanis on neliteist). Mõned access point’id oskavad kasutada veel kolm sagedus.<br />
<br />
2.4 GHz (802.11b/g/n)<br />
<br />
[[Image:WiFi_channels.jpg]]<br />
<br />
Pildi peal on ilusasti näha, et üks kanal segab kaks sagedust ette ja kaks sagedust taga poole. Nii et kanalid mis ei sega üks teisele on 1, 6 ja 11. Need on gi kanalid mis tavaliselt kasutakse signaali edastamiseks. Loogiline, kui teie kasutate kanalit näiteks nr. 3 siis teie segade neid kes istuvad kanalil nr. 1 ja kanalil nr. 6 (2, 4, 5 kaasarvatud). <br />
Peaks tunnistama, et wifi kasutamine on levinud päris palju ja sellel hetkel kui teie hakkate oma access point’I seadistama on teie maja umber (sees) on teil eetris mitme naabri wifi signaal juba olemas. Mis siis teha? Millist kanalit valida? Selleks teil on vaja teada naabri võrkude kanalid ja signaali tugevust. Kahjuks kui teie veel suudate vaadata tavaliste vahenditega naabri wifi signaali tugevust, teie ei saa teada kasutatud kanal.<br />
<br />
<br />
Soovitan teiele kasutada mõnda tarkvara mis võimaldab vadata sellised ajad nagu levivate wifi signaalide tugevust ja kanalit.<br />
Näiteks NetStumbler on hetkel üks tarkvara mis võimaldab selline info kätte saada.<br />
<br />
[[Image:NetStumbler.jpg|width 100]]<br />
<br />
Kasutage sellist tüüpi tarkvara, et avastada kanal mis omab vähem müra.<br />
<br />
Windows operatsioon süsteemi WiFi API<br />
Kui teie aga oskate programmerida ja teil on Windows Vista või kõrgem operatsioon süsteem, siis teie saate ligipääs “varjatud” infole. Tasub lugeda seda artiklit [link]</div>Ajastremhttps://wiki.itcollege.ee/index.php?title=Wifi_kanali_valimine&diff=8768Wifi kanali valimine2010-05-06T07:13:13Z<p>Ajastrem: </p>
<hr />
<div>[[Category:Traadita side alused]]<br />
<br />
WiFi signaali sagedus<br />
<br />
Wifi access point’id võivad kasutada üks sagedus üheteiskümnest lubatud sagedustest(eestis on kolmteist, jaapanis on neliteist). Mõned access point’id oskavad kasutada veel kolm sagedus.<br />
<br />
2.4 GHz (802.11b/g/n)<br />
<br />
[[Image:WiFi_channels.jpg]]<br />
<br />
Pildi peal on ilusasti näha, et üks kanal segab kaks sagedust ette ja kaks sagedust taga poole. Nii et kanalid mis ei sega üks teisele on 1, 6 ja 11. Need on gi kanalid mis tavaliselt kasutakse signaali edastamiseks. Loogiline, kui teie kasutate kanalit näiteks nr. 3 siis teie segade neid kes istuvad kanalil nr. 1 ja kanalil nr. 6 (2, 4, 5 kaasarvatud). <br />
Peaks tunnistama, et wifi kasutamine on levinud päris palju ja sellel hetkel kui teie hakkate oma access point’I seadistama on teie maja umber (sees) on teil eetris mitme naabri wifi signaal juba olemas. Mis siis teha? Millist kanalit valida? Selleks teil on vaja teada naabri võrkude kanalid ja signaali tugevust. Kahjuks kui teie veel suudate vaadata tavaliste vahenditega naabri wifi signaali tugevust, teie ei saa teada kasutatud kanal.<br />
<br />
<br />
Soovitan teiele kasutada mõnda tarkvara mis võimaldab vadata sellised ajad nagu levivate wifi signaalide tugevust ja kanalit.<br />
Näiteks NetStumbler on hetkel üks tarkvara mis võimaldab selline info kätte saada.<br />
<br />
[[Image:NetStumbler.jpg|width 600]]<br />
<br />
Kasutage sellist tüüpi tarkvara, et avastada kanal mis omab vähem müra.<br />
<br />
Windows operatsioon süsteemi WiFi API<br />
Kui teie aga oskate programmerida ja teil on Windows Vista või kõrgem operatsioon süsteem, siis teie saate ligipääs “varjatud” infole. Tasub lugeda seda artiklit [link]</div>Ajastremhttps://wiki.itcollege.ee/index.php?title=Wifi_kanali_valimine&diff=8767Wifi kanali valimine2010-05-06T07:13:05Z<p>Ajastrem: </p>
<hr />
<div>[[Category:Traadita side alused]]<br />
<br />
WiFi signaali sagedus<br />
<br />
Wifi access point’id võivad kasutada üks sagedus üheteiskümnest lubatud sagedustest(eestis on kolmteist, jaapanis on neliteist). Mõned access point’id oskavad kasutada veel kolm sagedus.<br />
<br />
2.4 GHz (802.11b/g/n)<br />
<br />
[[Image:WiFi_channels.jpg]]<br />
<br />
Pildi peal on ilusasti näha, et üks kanal segab kaks sagedust ette ja kaks sagedust taga poole. Nii et kanalid mis ei sega üks teisele on 1, 6 ja 11. Need on gi kanalid mis tavaliselt kasutakse signaali edastamiseks. Loogiline, kui teie kasutate kanalit näiteks nr. 3 siis teie segade neid kes istuvad kanalil nr. 1 ja kanalil nr. 6 (2, 4, 5 kaasarvatud). <br />
Peaks tunnistama, et wifi kasutamine on levinud päris palju ja sellel hetkel kui teie hakkate oma access point’I seadistama on teie maja umber (sees) on teil eetris mitme naabri wifi signaal juba olemas. Mis siis teha? Millist kanalit valida? Selleks teil on vaja teada naabri võrkude kanalid ja signaali tugevust. Kahjuks kui teie veel suudate vaadata tavaliste vahenditega naabri wifi signaali tugevust, teie ei saa teada kasutatud kanal.<br />
<br />
<br />
Soovitan teiele kasutada mõnda tarkvara mis võimaldab vadata sellised ajad nagu levivate wifi signaalide tugevust ja kanalit.<br />
Näiteks NetStumbler on hetkel üks tarkvara mis võimaldab selline info kätte saada.<br />
<br />
[[Image:NetStumbler.jpg|width 600px]]<br />
<br />
Kasutage sellist tüüpi tarkvara, et avastada kanal mis omab vähem müra.<br />
<br />
Windows operatsioon süsteemi WiFi API<br />
Kui teie aga oskate programmerida ja teil on Windows Vista või kõrgem operatsioon süsteem, siis teie saate ligipääs “varjatud” infole. Tasub lugeda seda artiklit [link]</div>Ajastremhttps://wiki.itcollege.ee/index.php?title=File:NetStumbler.jpg&diff=8766File:NetStumbler.jpg2010-05-06T07:10:03Z<p>Ajastrem: </p>
<hr />
<div></div>Ajastremhttps://wiki.itcollege.ee/index.php?title=File:WiFi_channels.jpg&diff=8765File:WiFi channels.jpg2010-05-06T07:09:30Z<p>Ajastrem: </p>
<hr />
<div></div>Ajastremhttps://wiki.itcollege.ee/index.php?title=Wifi_kanali_valimine&diff=8764Wifi kanali valimine2010-05-06T07:08:02Z<p>Ajastrem: </p>
<hr />
<div>[[Category:Traadita side alused]]<br />
<br />
WiFi signaali sagedus<br />
<br />
Wifi access point’id võivad kasutada üks sagedus üheteiskümnest lubatud sagedustest(eestis on kolmteist, jaapanis on neliteist). Mõned access point’id oskavad kasutada veel kolm sagedus.<br />
<br />
2.4 GHz (802.11b/g/n)<br />
<br />
[[Image:WiFi_channels.jpg]]<br />
<br />
Pildi peal on ilusasti näha, et üks kanal segab kaks sagedust ette ja kaks sagedust taga poole. Nii et kanalid mis ei sega üks teisele on 1, 6 ja 11. Need on gi kanalid mis tavaliselt kasutakse signaali edastamiseks. Loogiline, kui teie kasutate kanalit näiteks nr. 3 siis teie segade neid kes istuvad kanalil nr. 1 ja kanalil nr. 6 (2, 4, 5 kaasarvatud). <br />
Peaks tunnistama, et wifi kasutamine on levinud päris palju ja sellel hetkel kui teie hakkate oma access point’I seadistama on teie maja umber (sees) on teil eetris mitme naabri wifi signaal juba olemas. Mis siis teha? Millist kanalit valida? Selleks teil on vaja teada naabri võrkude kanalid ja signaali tugevust. Kahjuks kui teie veel suudate vaadata tavaliste vahenditega naabri wifi signaali tugevust, teie ei saa teada kasutatud kanal.<br />
<br />
<br />
Soovitan teiele kasutada mõnda tarkvara mis võimaldab vadata sellised ajad nagu levivate wifi signaalide tugevust ja kanalit.<br />
Näiteks NetStumbler on hetkel üks tarkvara mis võimaldab selline info kätte saada.<br />
<br />
[[Image:NetStumbler.jpg]]<br />
<br />
Kasutage sellist tüüpi tarkvara, et avastada kanal mis omab vähem müra.<br />
<br />
Windows operatsioon süsteemi WiFi API<br />
Kui teie aga oskate programmerida ja teil on Windows Vista või kõrgem operatsioon süsteem, siis teie saate ligipääs “varjatud” infole. Tasub lugeda seda artiklit [link]</div>Ajastremhttps://wiki.itcollege.ee/index.php?title=Wifi_kanali_valimine&diff=8763Wifi kanali valimine2010-05-06T07:07:51Z<p>Ajastrem: </p>
<hr />
<div>[[Category:Traadita side alused]]<br />
<br />
WiFi signaali sagedus<br />
<br />
Wifi access point’id võivad kasutada üks sagedus üheteiskümnest lubatud sagedustest(eestis on kolmteist, jaapanis on neliteist). Mõned access point’id oskavad kasutada veel kolm sagedus.<br />
<br />
2.4 GHz (802.11b/g/n)<br />
[[Image:WiFi_channels.jpg]]<br />
<br />
Pildi peal on ilusasti näha, et üks kanal segab kaks sagedust ette ja kaks sagedust taga poole. Nii et kanalid mis ei sega üks teisele on 1, 6 ja 11. Need on gi kanalid mis tavaliselt kasutakse signaali edastamiseks. Loogiline, kui teie kasutate kanalit näiteks nr. 3 siis teie segade neid kes istuvad kanalil nr. 1 ja kanalil nr. 6 (2, 4, 5 kaasarvatud). <br />
Peaks tunnistama, et wifi kasutamine on levinud päris palju ja sellel hetkel kui teie hakkate oma access point’I seadistama on teie maja umber (sees) on teil eetris mitme naabri wifi signaal juba olemas. Mis siis teha? Millist kanalit valida? Selleks teil on vaja teada naabri võrkude kanalid ja signaali tugevust. Kahjuks kui teie veel suudate vaadata tavaliste vahenditega naabri wifi signaali tugevust, teie ei saa teada kasutatud kanal.<br />
<br />
<br />
Soovitan teiele kasutada mõnda tarkvara mis võimaldab vadata sellised ajad nagu levivate wifi signaalide tugevust ja kanalit.<br />
Näiteks NetStumbler on hetkel üks tarkvara mis võimaldab selline info kätte saada.<br />
<br />
[[Image:NetStumbler.jpg]]<br />
<br />
Kasutage sellist tüüpi tarkvara, et avastada kanal mis omab vähem müra.<br />
<br />
Windows operatsioon süsteemi WiFi API<br />
Kui teie aga oskate programmerida ja teil on Windows Vista või kõrgem operatsioon süsteem, siis teie saate ligipääs “varjatud” infole. Tasub lugeda seda artiklit [link]</div>Ajastremhttps://wiki.itcollege.ee/index.php?title=Wifi_kanali_valimine&diff=8762Wifi kanali valimine2010-05-06T07:00:11Z<p>Ajastrem: </p>
<hr />
<div>[[Category:Traadita side alused]]<br />
<br />
WiFi signaali sagedus<br />
<br />
Wifi access point’id võivad kasutada üks sagedus üheteiskümnest lubatud sagedustest(eestis on kolmteist, jaapanis on neliteist). Mõned access point’id oskavad kasutada veel kolm sagedus.<br />
<br />
Pilt1 <br />
<br />
Pildi peal on ilusasti näha, et üks kanal segab kaks sagedust ette ja kaks sagedust taga poole. Nii et kanalid mis ei sega üks teisele on 1, 6 ja 11. Need on gi kanalid mis tavaliselt kasutakse signaali edastamiseks. Loogiline, kui teie kasutate kanalit näiteks nr. 3 siis teie segade neid kes istuvad kanalil nr. 1 ja kanalil nr. 6 (2, 4, 5 kaasarvatud). <br />
Peaks tunnistama, et wifi kasutamine on levinud päris palju ja sellel hetkel kui teie hakkate oma access point’I seadistama on teie maja umber (sees) on teil eetris mitme naabri wifi signaal juba olemas. Mis siis teha? Millist kanalit valida? Selleks teil on vaja teada naabri võrkude kanalid ja signaali tugevust. Kahjuks kui teie veel suudate vaadata tavaliste vahenditega naabri wifi signaali tugevust, teie ei saa teada kasutatud kanal.<br />
<br />
<br />
Soovitan teiele kasutada mõnda tarkvara mis võimaldab vadata sellised ajad nagu levivate wifi signaalide tugevust ja kanalit.<br />
Näiteks NetStumbler on hetkel üks tarkvara mis võimaldab selline info kätte saada.<br />
<br />
Pilt 2<br />
<br />
Kasutage sellist tüüpi tarkvara, et avastada kanal mis omab vähem müra.<br />
<br />
Windows operatsioon süsteemi WiFi API<br />
Kui teie aga oskate programmerida ja teil on Windows Vista või kõrgem operatsioon süsteem, siis teie saate ligipääs “varjatud” infole. Tasub lugeda seda artiklit [link]</div>Ajastremhttps://wiki.itcollege.ee/index.php?title=Wifi_kanali_valimine&diff=8733Wifi kanali valimine2010-05-05T16:08:33Z<p>Ajastrem: New page: Category:Traadita side alused</p>
<hr />
<div>[[Category:Traadita side alused]]</div>Ajastremhttps://wiki.itcollege.ee/index.php?title=File:RSS_Web.jpg&diff=7440File:RSS Web.jpg2010-04-23T07:43:17Z<p>Ajastrem: </p>
<hr />
<div></div>Ajastremhttps://wiki.itcollege.ee/index.php?title=RSS_voogude_v%C3%A4rskete_uudiste_korjamise_rakendus&diff=7439RSS voogude värskete uudiste korjamise rakendus2010-04-23T07:43:10Z<p>Ajastrem: </p>
<hr />
<div><p><br />
Idee oli koostada webi teenus mis oskaks kasutajate RSS voogude nimekirjast koostada viimaste uudiste nimekiri.<br />
<br /><br />
<br />Probleemide nimekiri oli teada: <br />
<br />1) RSS voogud on disaini poolest erinevad <br />
<br />2) RSS aja formaati standart on uurimata <br />
<br />3) Uudiste sünkrooniline uuendamine on aeglane <br />
<br /><br />
<br />Pakkutav lahendus oli: <br />
<br />1) Rakenduses kasutakse ainult ühine osa RSS voogudest <br />
<br />2) Aja formaat uurida ja leida lahendust <br />
<br />3) Uudised uuendada asünkroonselt <br />
<br /><br />
<br />Rakendus on paigaldatud [https://networksolutions2.googlecode.com/svn/trunk siin] ([https://www.googlecode.com google code])<br />
<br />Koodi saab kätte SVN kliendi abil, näiteks [http://tortoisesvn.net/downloads tortoise SVN]<br />
<br /><br />
<br />Selleks, et veenduda et RSS web teenus töötab tegin juurde kah väikse web saiti, <br />
<br />ehk kogu komponentide pilt oleks selline:<br />
<br />[[Image:RSS_voogude_rakendus.jpg]]<br />
<br /><br />
<br />Kõige pealt pidi uurima millist aja formaati kasutab RSS standart, <br />
<br />uurides standarti selgus et kasutakse RFC822 aja standart<br />
<br />[[Rfc822DateTimeFormat csharp]] RSS aja standarti c# implementatsioon <br />
<source lang=csharp>public static string[] Rfc822DateTimePatterns {<br />
get {<br />
formats = new string[35];<br />
<br />
// two-digit day, four-digit year patterns<br />
formats[0] = "ddd',' dd MMM yyyy HH':'mm':'ss'.'fffffff zzzz";<br />
</source><br />
<br />Edasi oli vaja implementeerida RSS voogu kätte saamine<br />
<br />[[RssFeed Retrieve]]<br />
<source lang=csharp>/// <summary><br />
/// Retrieves an RSS feed using the given Url, parses it and<br />
/// creates and new <see cref="RssFeed">RssFeed</see> object with the information.<br />
/// If an error occurs in the XML loading of the document, or parsing of<br />
/// the RSS feed, the error is trapped and stored inside the RssFeed's<br />
/// ErrorMessage property.<br />
/// </summary><br />
/// <param name="Url">The url to retrieve the RSS feed from, this can<br />
/// be in the format of http:// and also file://.. (ftp?)</param><br />
/// <returns>An <see cref="RssFeed">RssFeed</see> object with information<br />
/// retrieved from the feed.</returns><br />
public RssFeed Retrieve(string Url) {<br />
</source><br />
<br />Siis tegin kah andmebaasi selleks. et saaks kasutajate RSS voogud salvestada<br />
<br />[[Image:RSS_db.jpg]]<br />
<br /><br />
<br />Viimane samm oli teha testimiseks vebi leht,<br />
<br />Veb koosneb vaba registreerimisest, isiku voogude lisamise ja vatamise komponendist ja RSS web teenuse ühendusest.<br />
<br />[[Image:RSS_Web.jpg]]<br />
<br /><br />
<br />Ehk see oligi kõik, ülesanne oli suht lihtne :)<br />
<br /><br />
</p></div>Ajastremhttps://wiki.itcollege.ee/index.php?title=File:RSS_db.jpg&diff=7438File:RSS db.jpg2010-04-23T07:37:13Z<p>Ajastrem: </p>
<hr />
<div></div>Ajastremhttps://wiki.itcollege.ee/index.php?title=RSS_voogude_v%C3%A4rskete_uudiste_korjamise_rakendus&diff=7437RSS voogude värskete uudiste korjamise rakendus2010-04-23T07:37:04Z<p>Ajastrem: </p>
<hr />
<div><p><br />
Idee oli koostada webi teenus mis oskaks kasutajate RSS voogude nimekirjast koostada viimaste uudiste nimekiri.<br />
<br /><br />
<br />Probleemide nimekiri oli teada: <br />
<br />1) RSS voogud on disaini poolest erinevad <br />
<br />2) RSS aja formaati standart on uurimata <br />
<br />3) Uudiste sünkrooniline uuendamine on aeglane <br />
<br /><br />
<br />Pakkutav lahendus oli: <br />
<br />1) Rakenduses kasutakse ainult ühine osa RSS voogudest <br />
<br />2) Aja formaat uurida ja leida lahendust <br />
<br />3) Uudised uuendada asünkroonselt <br />
<br /><br />
<br />Rakendus on paigaldatud [https://networksolutions2.googlecode.com/svn/trunk siin] ([https://www.googlecode.com google code])<br />
<br />Koodi saab kätte SVN kliendi abil, näiteks [http://tortoisesvn.net/downloads tortoise SVN]<br />
<br /><br />
<br />Selleks, et veenduda et RSS web teenus töötab tegin juurde kah väikse web saiti, <br />
<br />ehk kogu komponentide pilt oleks selline:<br />
<br />[[Image:RSS_voogude_rakendus.jpg]]<br />
<br /><br />
<br />Kõige pealt pidi uurima millist aja formaati kasutab RSS standart, <br />
<br />uurides standarti selgus et kasutakse RFC822 aja standart<br />
<br />[[Rfc822DateTimeFormat csharp]] RSS aja standarti c# implementatsioon <br />
<source lang=csharp>public static string[] Rfc822DateTimePatterns {<br />
get {<br />
formats = new string[35];<br />
<br />
// two-digit day, four-digit year patterns<br />
formats[0] = "ddd',' dd MMM yyyy HH':'mm':'ss'.'fffffff zzzz";<br />
</source><br />
<br />Edasi oli vaja implementeerida RSS voogu kätte saamine<br />
<br />[[RssFeed Retrieve]]<br />
<source lang=csharp>/// <summary><br />
/// Retrieves an RSS feed using the given Url, parses it and<br />
/// creates and new <see cref="RssFeed">RssFeed</see> object with the information.<br />
/// If an error occurs in the XML loading of the document, or parsing of<br />
/// the RSS feed, the error is trapped and stored inside the RssFeed's<br />
/// ErrorMessage property.<br />
/// </summary><br />
/// <param name="Url">The url to retrieve the RSS feed from, this can<br />
/// be in the format of http:// and also file://.. (ftp?)</param><br />
/// <returns>An <see cref="RssFeed">RssFeed</see> object with information<br />
/// retrieved from the feed.</returns><br />
public RssFeed Retrieve(string Url) {<br />
</source><br />
<br />Siis tegin kah andmebaasi selleks. et saaks kasutajate RSS voogud salvestada<br />
<br />[[Image:RSS_db.jpg]]<br />
<br /><br />
<br /><br />
<br /><br />
</p></div>Ajastremhttps://wiki.itcollege.ee/index.php?title=RSS_voogude_v%C3%A4rskete_uudiste_korjamise_rakendus&diff=7436RSS voogude värskete uudiste korjamise rakendus2010-04-23T07:33:41Z<p>Ajastrem: </p>
<hr />
<div><p><br />
Idee oli koostada webi teenus mis oskaks kasutajate RSS voogude nimekirjast koostada viimaste uudiste nimekiri.<br />
<br /><br />
<br />Probleemide nimekiri oli teada: <br />
<br />1) RSS voogud on disaini poolest erinevad <br />
<br />2) RSS aja formaati standart on uurimata <br />
<br />3) Uudiste sünkrooniline uuendamine on aeglane <br />
<br /><br />
<br />Pakkutav lahendus oli: <br />
<br />1) Rakenduses kasutakse ainult ühine osa RSS voogudest <br />
<br />2) Aja formaat uurida ja leida lahendust <br />
<br />3) Uudised uuendada asünkroonselt <br />
<br /><br />
<br />Rakendus on paigaldatud [https://networksolutions2.googlecode.com/svn/trunk siin] ([https://www.googlecode.com google code])<br />
<br />Koodi saab kätte SVN kliendi abil, näiteks [http://tortoisesvn.net/downloads tortoise SVN]<br />
<br /><br />
<br />Selleks, et veenduda et RSS web teenus töötab tegin juurde kah väikse web saiti, <br />
<br />ehk kogu komponentide pilt oleks selline:<br />
<br />[[Image:RSS_voogude_rakendus.jpg]]<br />
<br /><br />
<br />Kõige pealt pidi uurima millist aja formaati kasutab RSS standart, <br />
<br />uurides standarti selgus et kasutakse RFC822 aja standart<br />
<br />[[Rfc822DateTimeFormat csharp]] RSS aja standarti c# implementatsioon <br />
<source lang=csharp>public static string[] Rfc822DateTimePatterns {<br />
get {<br />
formats = new string[35];<br />
<br />
// two-digit day, four-digit year patterns<br />
formats[0] = "ddd',' dd MMM yyyy HH':'mm':'ss'.'fffffff zzzz";<br />
</source><br />
<br />Edasi oli vaja implementeerida RSS voogu kätte saamine<br />
<br />[[RssFeed Retrieve]]<br />
<source lang=csharp>/// <summary><br />
/// Retrieves an RSS feed using the given Url, parses it and<br />
/// creates and new <see cref="RssFeed">RssFeed</see> object with the information.<br />
/// If an error occurs in the XML loading of the document, or parsing of<br />
/// the RSS feed, the error is trapped and stored inside the RssFeed's<br />
/// ErrorMessage property.<br />
/// </summary><br />
/// <param name="Url">The url to retrieve the RSS feed from, this can<br />
/// be in the format of http:// and also file://.. (ftp?)</param><br />
/// <returns>An <see cref="RssFeed">RssFeed</see> object with information<br />
/// retrieved from the feed.</returns><br />
public RssFeed Retrieve(string Url) {<br />
</source><br />
</p></div>Ajastremhttps://wiki.itcollege.ee/index.php?title=RSS_voogude_v%C3%A4rskete_uudiste_korjamise_rakendus&diff=7435RSS voogude värskete uudiste korjamise rakendus2010-04-23T07:33:02Z<p>Ajastrem: </p>
<hr />
<div><p><br />
Idee oli koostada webi teenus mis oskaks kasutajate RSS voogude nimekirjast koostada viimaste uudiste nimekiri.<br />
<br /><br />
<br />Probleemide nimekiri oli teada: <br />
<br />1) RSS voogud on disaini poolest erinevad <br />
<br />2) RSS aja formaati standart on uurimata <br />
<br />3) Uudiste sünkrooniline uuendamine on aeglane <br />
<br /><br />
<br />Pakkutav lahendus oli: <br />
<br />1) Rakenduses kasutakse ainult ühine osa RSS voogudest <br />
<br />2) Aja formaat uurida ja leida lahendust <br />
<br />3) Uudised uuendada asünkroonselt <br />
<br /><br />
<br />Rakendus on paigaldatud [https://networksolutions2.googlecode.com/svn/trunk siin] ([https://www.googlecode.com google code])<br />
<br />Koodi saab kätte SVN kliendi abil, näiteks [http://tortoisesvn.net/downloads tortoise SVN]<br />
<br /><br />
<br />Selleks, et veenduda et RSS web teenus töötab tegin juurde kah väikse web saiti, <br />
<br />ehk kogu komponentide pilt oleks selline:<br />
<br />[[Image:RSS_voogude_rakendus.jpg]]<br />
<br /><br />
<br />Kõige pealt pidi uurima millist aja formaati kasutab RSS standart, <br />
<br />uurides standarti selgus et kasutakse RFC822 aja standart<br />
<br />[[Rfc822DateTimeFormat csharp]] RSS aja standarti c# implementatsioon <br />
<source lang=csharp>public static string[] Rfc822DateTimePatterns {<br />
get {<br />
formats = new string[35];<br />
<br />
// two-digit day, four-digit year patterns<br />
formats[0] = "ddd',' dd MMM yyyy HH':'mm':'ss'.'fffffff zzzz";<br />
</source><br />
<br />Edasi oli vaja implementeerida RSS voogude kätte saamine<br />
<br />[[RssFeed Retrieve]] RSS voogu uudiste nimekiri kätte saamine<br />
<source lang=csharp>/// <summary><br />
/// Retrieves an RSS feed using the given Url, parses it and<br />
/// creates and new <see cref="RssFeed">RssFeed</see> object with the information.<br />
/// If an error occurs in the XML loading of the document, or parsing of<br />
/// the RSS feed, the error is trapped and stored inside the RssFeed's<br />
/// ErrorMessage property.<br />
/// </summary><br />
/// <param name="Url">The url to retrieve the RSS feed from, this can<br />
/// be in the format of http:// and also file://.. (ftp?)</param><br />
/// <returns>An <see cref="RssFeed">RssFeed</see> object with information<br />
/// retrieved from the feed.</returns><br />
public RssFeed Retrieve(string Url) {<br />
</source><br />
</p></div>Ajastremhttps://wiki.itcollege.ee/index.php?title=RSS_voogude_v%C3%A4rskete_uudiste_korjamise_rakendus&diff=7434RSS voogude värskete uudiste korjamise rakendus2010-04-23T07:32:08Z<p>Ajastrem: </p>
<hr />
<div><p><br />
Idee oli koostada webi teenus mis oskaks kasutajate RSS voogude nimekirjast koostada viimaste uudiste nimekiri.<br />
<br /><br />
<br />Probleemide nimekiri oli teada: <br />
<br />1) RSS voogud on disaini poolest erinevad <br />
<br />2) RSS aja formaati standart on uurimata <br />
<br />3) Uudiste sünkrooniline uuendamine on aeglane <br />
<br /><br />
<br />Pakkutav lahendus oli: <br />
<br />1) Rakenduses kasutakse ainult ühine osa RSS voogudest <br />
<br />2) Aja formaat uurida ja leida lahendust <br />
<br />3) Uudised uuendada asünkroonselt <br />
<br /><br />
<br />Rakendus on paigaldatud [https://networksolutions2.googlecode.com/svn/trunk siin] ([https://www.googlecode.com google code])<br />
<br />Koodi saab kätte SVN kliendi abil, näiteks [http://tortoisesvn.net/downloads tortoise SVN]<br />
<br /><br />
<br />Selleks, et veenduda et RSS web teenus töötab tegin juurde kah väikse web saiti, <br />
<br />ehk kogu komponentide pilt oleks selline:<br />
<br />[[Image:RSS_voogude_rakendus.jpg]]<br />
<br /><br />
<br />Kõige pealt pidi uurima millist aja formaati kasutab RSS standart, <br />
<br />uurides standarti selgus et kasutakse RFC822 aja standart<br />
<br />[[Rfc822DateTimeFormat csharp]] RSS aja standarti c# implementatsioon <br />
<source lang=csharp>public static string[] Rfc822DateTimePatterns {<br />
get {<br />
formats = new string[35];<br />
<br />
// two-digit day, four-digit year patterns<br />
formats[0] = "ddd',' dd MMM yyyy HH':'mm':'ss'.'fffffff zzzz";<br />
</source><br />
<br />[[RssFeed Retrieve]] RSS voogu uudiste nimekiri kätte saamine<br />
<source lang=csharp>/// <summary><br />
/// Retrieves an RSS feed using the given Url, parses it and<br />
/// creates and new <see cref="RssFeed">RssFeed</see> object with the information.<br />
/// If an error occurs in the XML loading of the document, or parsing of<br />
/// the RSS feed, the error is trapped and stored inside the RssFeed's<br />
/// ErrorMessage property.<br />
/// </summary><br />
/// <param name="Url">The url to retrieve the RSS feed from, this can<br />
/// be in the format of http:// and also file://.. (ftp?)</param><br />
/// <returns>An <see cref="RssFeed">RssFeed</see> object with information<br />
/// retrieved from the feed.</returns><br />
public RssFeed Retrieve(string Url) {<br />
</source><br />
</p></div>Ajastremhttps://wiki.itcollege.ee/index.php?title=File:RSS_voogude_rakendus.jpg&diff=7433File:RSS voogude rakendus.jpg2010-04-23T07:22:18Z<p>Ajastrem: </p>
<hr />
<div></div>Ajastremhttps://wiki.itcollege.ee/index.php?title=RSS_voogude_v%C3%A4rskete_uudiste_korjamise_rakendus&diff=7432RSS voogude värskete uudiste korjamise rakendus2010-04-23T07:22:11Z<p>Ajastrem: </p>
<hr />
<div><p><br />
Idee oli koostada webi teenus mis oskaks kasutajate RSS voogude nimekirjast koostada viimaste uudiste nimekiri.<br />
<br /><br />
<br />Probleemide nimekiri oli teada: <br />
<br />1) RSS voogud on disaini poolest erinevad <br />
<br />2) RSS aja formaati standart on uurimata <br />
<br />3) Uudiste sünkrooniline uuendamine on aeglane <br />
<br /><br />
<br />Pakkutav lahendus oli: <br />
<br />1) Rakenduses kasutakse ainult ühine osa RSS voogudest <br />
<br />2) Aja formaat uurida ja leida lahendust <br />
<br />3) Uudised uuendada asünkroonselt <br />
<br /><br />
<br />Rakendus on paigaldatud [https://networksolutions2.googlecode.com/svn/trunk siin] ([https://www.googlecode.com google code])<br />
<br />Koodi saab kätte SVN kliendi abil, näiteks [http://tortoisesvn.net/downloads tortoise SVN]<br />
<br /><br />
<br />Selleks, et veenduda et RSS web teenus töötab tegin juurde kah väikse web saiti, <br />
<br />ehk kogu komponentide pilt oleks selline:<br />
<br />[[Image:RSS_voogude_rakendus.jpg]]<br />
<br /><br />
<br />Huuvitavad kohad koodist: <br />
<br />[[Rfc822DateTimeFormat csharp]] RSS aja standarti c# implementatsioon <br />
<source lang=csharp>public static string[] Rfc822DateTimePatterns {<br />
get {<br />
formats = new string[35];<br />
<br />
// two-digit day, four-digit year patterns<br />
formats[0] = "ddd',' dd MMM yyyy HH':'mm':'ss'.'fffffff zzzz";<br />
</source><br />
<br />[[RssFeed Retrieve]] RSS voogu uudiste nimekiri kätte saamine<br />
<source lang=csharp>/// <summary><br />
/// Retrieves an RSS feed using the given Url, parses it and<br />
/// creates and new <see cref="RssFeed">RssFeed</see> object with the information.<br />
/// If an error occurs in the XML loading of the document, or parsing of<br />
/// the RSS feed, the error is trapped and stored inside the RssFeed's<br />
/// ErrorMessage property.<br />
/// </summary><br />
/// <param name="Url">The url to retrieve the RSS feed from, this can<br />
/// be in the format of http:// and also file://.. (ftp?)</param><br />
/// <returns>An <see cref="RssFeed">RssFeed</see> object with information<br />
/// retrieved from the feed.</returns><br />
public RssFeed Retrieve(string Url) {<br />
</source><br />
</p></div>Ajastremhttps://wiki.itcollege.ee/index.php?title=File:RSS_Component_diagramm.jpg&diff=7431File:RSS Component diagramm.jpg2010-04-23T07:20:58Z<p>Ajastrem: RSS voogude rakenduse Component diagramm</p>
<hr />
<div>RSS voogude rakenduse Component diagramm</div>Ajastremhttps://wiki.itcollege.ee/index.php?title=RSS_voogude_v%C3%A4rskete_uudiste_korjamise_rakendus&diff=7430RSS voogude värskete uudiste korjamise rakendus2010-04-23T07:19:26Z<p>Ajastrem: </p>
<hr />
<div><p><br />
Idee oli koostada webi teenus mis oskaks kasutajate RSS voogude nimekirjast koostada viimaste uudiste nimekiri.<br />
<br /><br />
<br />Probleemide nimekiri oli teada: <br />
<br />1) RSS voogud on disaini poolest erinevad <br />
<br />2) RSS aja formaati standart on uurimata <br />
<br />3) Uudiste sünkrooniline uuendamine on aeglane <br />
<br /><br />
<br />Pakkutav lahendus oli: <br />
<br />1) Rakenduses kasutakse ainult ühine osa RSS voogudest <br />
<br />2) Aja formaat uurida ja leida lahendust <br />
<br />3) Uudised uuendada asünkroonselt <br />
<br /><br />
<br />Rakendus on paigaldatud [https://networksolutions2.googlecode.com/svn/trunk siin] ([https://www.googlecode.com google code])<br />
<br />Koodi saab kätte SVN kliendi abil, näiteks [http://tortoisesvn.net/downloads tortoise SVN]<br />
<br /><br />
<br />Selleks, et veenduda et RSS web teenus töötab tegin juurde kah väikse web saiti, <br />
<br />ehk kogu komponentide pilt oleks selline:<br />
<br />[[Image:RSS voogude rakenduse Component diagramm]]<br />
<br /><br />
<br />Huuvitavad kohad koodist: <br />
<br />[[Rfc822DateTimeFormat csharp]] RSS aja standarti c# implementatsioon <br />
<source lang=csharp>public static string[] Rfc822DateTimePatterns {<br />
get {<br />
formats = new string[35];<br />
<br />
// two-digit day, four-digit year patterns<br />
formats[0] = "ddd',' dd MMM yyyy HH':'mm':'ss'.'fffffff zzzz";<br />
</source><br />
<br />[[RssFeed Retrieve]] RSS voogu uudiste nimekiri kätte saamine<br />
<source lang=csharp>/// <summary><br />
/// Retrieves an RSS feed using the given Url, parses it and<br />
/// creates and new <see cref="RssFeed">RssFeed</see> object with the information.<br />
/// If an error occurs in the XML loading of the document, or parsing of<br />
/// the RSS feed, the error is trapped and stored inside the RssFeed's<br />
/// ErrorMessage property.<br />
/// </summary><br />
/// <param name="Url">The url to retrieve the RSS feed from, this can<br />
/// be in the format of http:// and also file://.. (ftp?)</param><br />
/// <returns>An <see cref="RssFeed">RssFeed</see> object with information<br />
/// retrieved from the feed.</returns><br />
public RssFeed Retrieve(string Url) {<br />
</source><br />
</p></div>Ajastremhttps://wiki.itcollege.ee/index.php?title=RSS_voogude_v%C3%A4rskete_uudiste_korjamise_rakendus&diff=7429RSS voogude värskete uudiste korjamise rakendus2010-04-23T07:17:48Z<p>Ajastrem: </p>
<hr />
<div><p><br />
Idee oli koostada webi teenus mis oskaks kasutajate RSS voogude nimekirjast koostada viimaste uudiste nimekiri.<br />
<br /><br />
<br />Probleemide nimekiri oli teada: <br />
<br />1) RSS voogud on disaini poolest erinevad <br />
<br />2) RSS aja formaati standart on uurimata <br />
<br />3) Uudiste sünkrooniline uuendamine on aeglane <br />
<br /><br />
<br />Pakkutav lahendus oli: <br />
<br />1) Rakenduses kasutakse ainult ühine osa RSS voogudest <br />
<br />2) Aja formaat uurida ja leida lahendust <br />
<br />3) Uudised uuendada asünkroonselt <br />
<br /><br />
<br />Rakendus on paigaldatud [https://networksolutions2.googlecode.com/svn/trunk siin] ([https://www.googlecode.com google code])<br />
<br />Koodi saab kätte SVN kliendi abil, näiteks [http://tortoisesvn.net/downloads tortoise SVN]<br />
<br /><br />
<br />Selleks, et veenduda et RSS web teenus töötab tegin juurde kah väikse web saiti, <br />
<br />ehk kogu komponentide pilt oleks [[Image:selline]]<br />
<br /><br />
<br /><br />
<br />Huuvitavad kohad koodist: <br />
<br />[[Rfc822DateTimeFormat csharp]] RSS aja standarti c# implementatsioon <br />
<source lang=csharp>public static string[] Rfc822DateTimePatterns {<br />
get {<br />
formats = new string[35];<br />
<br />
// two-digit day, four-digit year patterns<br />
formats[0] = "ddd',' dd MMM yyyy HH':'mm':'ss'.'fffffff zzzz";<br />
</source><br />
<br />[[RssFeed Retrieve]] RSS voogu uudiste nimekiri kätte saamine<br />
<source lang=csharp>/// <summary><br />
/// Retrieves an RSS feed using the given Url, parses it and<br />
/// creates and new <see cref="RssFeed">RssFeed</see> object with the information.<br />
/// If an error occurs in the XML loading of the document, or parsing of<br />
/// the RSS feed, the error is trapped and stored inside the RssFeed's<br />
/// ErrorMessage property.<br />
/// </summary><br />
/// <param name="Url">The url to retrieve the RSS feed from, this can<br />
/// be in the format of http:// and also file://.. (ftp?)</param><br />
/// <returns>An <see cref="RssFeed">RssFeed</see> object with information<br />
/// retrieved from the feed.</returns><br />
public RssFeed Retrieve(string Url) {<br />
</source><br />
</p></div>Ajastremhttps://wiki.itcollege.ee/index.php?title=RSS_voogude_v%C3%A4rskete_uudiste_korjamise_rakendus&diff=7427RSS voogude värskete uudiste korjamise rakendus2010-04-23T06:41:57Z<p>Ajastrem: </p>
<hr />
<div><p><br />
Idee oli koostada webi teenus mis oskaks kasutajate RSS voogude nimekirjast koostada viimaste uudiste nimekiri.<br />
<br /><br />
<br />Probleemide nimekiri oli teada: <br />
<br />1) RSS voogud on disaini poolest erinevad <br />
<br />2) RSS aja formaati standart on uurimata <br />
<br />3) Uudiste sünkrooniline uuendamine on aeglane <br />
<br /><br />
<br />Pakkutav lahendus oli: <br />
<br />1) Rakenduses kasutakse ainult ühine osa RSS voogudest <br />
<br />2) Aja formaat uurida ja leida lahendust <br />
<br />3) Uudised uuendada asünkroonselt <br />
<br /><br />
<br />Rakendus on paigaldatud [https://networksolutions2.googlecode.com/svn/trunk siin] ([https://www.googlecode.com google code])<br />
<br />Koodi saab kätte SVN kliendi abil, näiteks [http://tortoisesvn.net/downloads tortoise SVN]<br />
<br /><br />
<br />Huuvitavad kohad koodist: <br />
<br />[[Rfc822DateTimeFormat csharp]] RSS aja standarti c# implementatsioon <br />
<source lang=csharp>public static string[] Rfc822DateTimePatterns {<br />
get {<br />
formats = new string[35];<br />
<br />
// two-digit day, four-digit year patterns<br />
formats[0] = "ddd',' dd MMM yyyy HH':'mm':'ss'.'fffffff zzzz";<br />
</source><br />
<br />[[RssFeed Retrieve]] RSS voogu uudiste nimekiri kätte saamine<br />
<source lang=csharp>/// <summary><br />
/// Retrieves an RSS feed using the given Url, parses it and<br />
/// creates and new <see cref="RssFeed">RssFeed</see> object with the information.<br />
/// If an error occurs in the XML loading of the document, or parsing of<br />
/// the RSS feed, the error is trapped and stored inside the RssFeed's<br />
/// ErrorMessage property.<br />
/// </summary><br />
/// <param name="Url">The url to retrieve the RSS feed from, this can<br />
/// be in the format of http:// and also file://.. (ftp?)</param><br />
/// <returns>An <see cref="RssFeed">RssFeed</see> object with information<br />
/// retrieved from the feed.</returns><br />
public RssFeed Retrieve(string Url) {<br />
</source><br />
</p></div>Ajastremhttps://wiki.itcollege.ee/index.php?title=RssFeed_Retrieve&diff=6772RssFeed Retrieve2010-04-16T12:10:48Z<p>Ajastrem: </p>
<hr />
<div>RSS voogu uudiste nimekiri kätte saamine (abi klass)<br />
<source lang=csharp><br />
using System;<br />
using System.Collections.Generic;<br />
using System.Linq;<br />
using System.Text;<br />
using System.Net;<br />
using System.IO;<br />
<br />
using System.Collections;<br />
using System.Xml;<br />
<br />
namespace Scream.RSS {<br />
public class RssManager {<br />
public void GetRssItemList(string url) {<br />
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);<br />
HttpWebResponse response = (HttpWebResponse)request.GetResponse();<br />
Stream responseStream = response.GetResponseStream();<br />
<br />
Encoding BrowserEncoding = Encoding.ASCII;<br />
<br />
if (request.HaveResponse) {<br />
// Next is redirection<br />
if ((response.StatusCode == HttpStatusCode.Found) ||<br />
(response.StatusCode == HttpStatusCode.Redirect) ||<br />
(response.StatusCode == HttpStatusCode.Moved) ||<br />
(response.StatusCode == HttpStatusCode.MovedPermanently)) {<br />
// Get new location and call recursively<br />
WebHeaderCollection responseHeaders = response.Headers;<br />
request = (HttpWebRequest)WebRequest.Create(responseHeaders["Location"]);<br />
<br />
HttpWebResponse redirectedResponse = (HttpWebResponse)request.GetResponse();<br />
<br />
responseStream = redirectedResponse.GetResponseStream();<br />
}<br />
}<br />
<br />
StringBuilder stringBuilder = new StringBuilder();<br />
byte[] buffer = new byte[8192];<br />
string tempString = null;<br />
int count = 0;<br />
do {<br />
// fill the buffer with data<br />
count = responseStream.Read(buffer, 0, buffer.Length);<br />
// make sure we read some data<br />
if (count != 0) {<br />
tempString = Encoding.UTF8.GetString(Encoding.Convert(BrowserEncoding, Encoding.UTF8, buffer, 0, count));<br />
stringBuilder.Append(tempString);<br />
}<br />
}<br />
while (count > 0); // any more data to read?<br />
<br />
string html = stringBuilder.ToString();<br />
<br />
<br />
}<br />
}<br />
<br />
#region Event datatype/delegate<br />
/// <summary><br />
/// Holds details about any errors that occured<br />
/// during the loading or parsing of the RSS feed.<br />
/// </summary><br />
public class RssReaderErrorEventArgs : EventArgs {<br />
/// <summary><br />
/// The details of the error.<br />
/// </summary><br />
public string Message {<br />
get {<br />
return this.message;<br />
}<br />
set {<br />
this.message = value;<br />
}<br />
}<br />
<br />
private string message;<br />
}<br />
<br />
/// <summary><br />
/// Represents the method that will handle the RssReader error event.<br />
/// </summary><br />
public delegate void RssReaderErrorEventHandler(object sender, RssReaderErrorEventArgs e);<br />
#endregion<br />
<br />
#region RssReader class<br />
/// <summary><br />
/// The RssReader class provides a number of static methods for easy<br />
/// 1 or 2 step retrieval of RSS feeds. RSS feeds can be downloaded from any<br />
/// URL, and are then parsed into an <see cref="RssFeed">RssFeed</see> data type,<br />
/// which contains properties representing most aspects of an RSS Feed. A number<br />
/// of events are available for the calling application to register at the various<br />
/// stages of the feed request and parsing.<br />
/// <example><br />
/// The following example retrieves the RSS news feed for the BBC news website,<br />
/// and creates a HTML document from the feed's details. It saves the HTML document<br />
/// to disk, and launches the default browser with the document. The number of items<br />
/// displayed is limited to 5. If there is any error, a messagebox is displayed with<br />
/// the details of the error.<br />
/// <code><br />
/// RssFeed feed = RssReader.GetFeed("http://www.bbc.co.uk/syndication/feeds/news/ukfs_news/front_page/rss091.xml");<br />
/// <br />
/// if ( feed.ErrorMessage == null || feed.ErrorMessage == "" )<br />
/// {<br />
/// string template = "&lt;a href=\"%Link%&gt;%Title%&lt;/a&gt;&lt;br/&gt;%Description%&lt;br/&gt;&lt;br/&gt;&lt;ul&gt;%Items%&lt;/ul&gt;";<br />
/// string itemTemplate = "&lt;li&gt;&lt;a href=\"%Link%&gt;%Title%&lt;/a&gt;&lt;br/&gt;%Description%&lt;/li&gt;";<br />
/// string html = RssReader.CreateHtml(feed,template,itemTemplate,"",5);<br />
/// <br />
/// StreamWriter streamWriter = File.CreateText("c:\\rss.html");<br />
/// streamWriter.Write(html);<br />
/// streamWriter.Close();<br />
/// <br />
/// System.Diagnostics.Process.Start("c:\\rss.html");<br />
/// }<br />
/// else<br />
/// {<br />
/// MessageBox.Show("Error getting feed:\r\n" +feed.ErrorMessage,"Rss Demo App",MessageBoxButtons.OK,MessageBoxIcon.Exclamation);<br />
/// }<br />
/// </code><br />
/// </example><br />
/// </summary><br />
public class RssReader {<br />
// Events: XML document loaded, rss element found,<br />
// channel node found, item parsed, error<br />
<br />
/// <summary><br />
/// This event is fired when the feed has finished loading from the URL<br />
/// provided, into the XML parser.<br />
/// </summary><br />
public event EventHandler FeedLoaded;<br />
<br />
/// <summary><br />
/// This event is fired when the root node (typically 'rss') has<br />
/// been found in the feed.<br />
/// </summary><br />
public event EventHandler RssNodeFound;<br />
<br />
/// <summary><br />
/// This event is fired when the channel/child node of the rss node<br />
/// (typically 'channel') has been found in the feed.<br />
/// </summary><br />
public event EventHandler ChannelNodeFound;<br />
<br />
/// <summary><br />
/// This event is fired when an item is added to the <see cref="RssFeed">RssFeed</see>'s<br />
/// collection of items.<br />
/// </summary><br />
public event EventHandler ItemAdded;<br />
<br />
/// <summary><br />
/// This event is fired when an error occurs in the loading or parsing<br />
/// of the feed. The same error message is also available in the ErrorMessage<br />
/// property of the <see cref="RssFeed">RssFeed</see> object that is returned<br />
/// by the <see cref="Retrieve">Retrieve</see> method.<br />
/// </summary><br />
public event RssReaderErrorEventHandler Error;<br />
<br />
<br />
/// <summary><br />
/// The node name for the channel element<br />
/// in the RSS feed. This will rarely ever to be<br />
/// changed. Default is 'channel'.<br />
/// </summary><br />
public string RootNodeName {<br />
get {<br />
return this.rootNodeName;<br />
}<br />
set {<br />
this.rootNodeName = value;<br />
}<br />
}<br />
<br />
/// <summary><br />
/// The node name for the root rss element<br />
/// in the RSS feed. This is altered automatically to 'rdf:RDF'<br />
/// when RdfMode is set to true. Default is 'rss'.<br />
/// </summary><br />
public string ChannelNodeName {<br />
get {<br />
return this.channelNodeName;<br />
}<br />
set {<br />
this.channelNodeName = value;<br />
}<br />
}<br />
<br />
<br />
/// <summary><br />
/// If this is set to true, then the XML document<br />
/// is parsed slightly different, to cater sites with RDF feeds (such as<br />
/// slashdot.org and register.com). The whole RDF format is not supported,<br />
/// but those items in RSS which have a corresponding RDF property, such<br />
/// as description,title for the channel, and title,description for each<br />
/// item, are matched.<br />
/// </summary><br />
public bool RdfMode {<br />
get {<br />
return this.rdfMode;<br />
}<br />
set {<br />
if (value) {<br />
this.rootNodeName = "rdf:RDF";<br />
}<br />
else {<br />
this.rootNodeName = "rss";<br />
}<br />
this.rdfMode = value;<br />
}<br />
}<br />
<br />
/// <summary><br />
/// Member for the public property.<br />
/// </summary><br />
private string rootNodeName = "rss";<br />
<br />
/// <summary><br />
/// Member for the public property.<br />
/// </summary><br />
private string channelNodeName = "channel";<br />
<br />
/// <summary><br />
/// Member for the public property.<br />
/// </summary><br />
private bool rdfMode = false;<br />
<br />
/// <summary><br />
/// Retrieves a <see cref="RssFeed">RssFeed</see> object using<br />
/// the url provided as the source of the Feed.<br />
/// </summary><br />
/// <param name="Url">The url to retrieve the RSS feed from, this can<br />
/// be in the format of http:// and also file://.. (ftp?)</param><br />
/// <param name="RdfFormat">If this is set to true, then the XML document<br />
/// is parsed slightly different, to cater sites with RDF feeds (such as<br />
/// slashdot.org and register.com). The whole RDF format is not supported,<br />
/// but those items in RSS which have a corresponding RDF property, such<br />
/// as description,title for the channel, and title,description for each<br />
/// item, are matched.</param><br />
/// <returns>A <see cref="RssFeed">RssFeed</see> object from the<br />
/// RSS feed's details.</returns><br />
public static RssFeed GetFeed(string Url, bool RdfFormat) {<br />
RssReader rssReader = new RssReader();<br />
rssReader.RdfMode = RdfFormat;<br />
return rssReader.Retrieve(Url);<br />
}<br />
<br />
/// <summary><br />
/// Retrieves a <see cref="RssFeed">RssFeed</see> object using<br />
/// the url provided as the source of the Feed.<br />
/// </summary><br />
/// <param name="Url">The url to retrieve the RSS feed from, this can<br />
/// be in the format of http:// and also file://.. (ftp?)</param><br />
/// <returns>A <see cref="RssFeed">RssFeed</see> object from the<br />
/// RSS feed's details.</returns><br />
public static RssFeed GetFeed(string Url) {<br />
RssReader rssReader = new RssReader();<br />
return rssReader.Retrieve(Url);<br />
}<br />
<br />
/// <summary><br />
/// A simplified method of creating a HTML (or any document) from an<br />
/// RSS Feed. See <see cref="RssHtmlMaker">RssHtmlMaker</see><br />
/// </summary><br />
/// <param name="Feed">The <see cref="RssFeed">RssFeed</see> object to<br />
/// get the tokens' data from.</param><br />
/// <param name="Template">The overall HTML template (or any other format)<br />
/// to replace the tokens in.</param><br />
/// <param name="ItemPrefix">A string template that is prepended to the beginning<br />
/// of each RSS item.</param><br />
/// <param name="ItemSuffix">A string template that is apppended to the end<br />
/// of each RSS item.</param><br />
/// <returns>A string with the templates provided parsed of their tokens, with<br />
/// the data values in their place.</returns><br />
public static string CreateHtml(RssFeed Feed, string Template, string ItemPrefix, string ItemSuffix) {<br />
return new RssHtmlMaker().GetHtmlContents(Feed, Template, ItemPrefix, ItemSuffix);<br />
}<br />
<br />
/// <summary><br />
/// A simplified method of creating a HTML (or any document) from an<br />
/// RSS Feed. See <see cref="RssHtmlMaker">RssHtmlMaker</see><br />
/// </summary><br />
/// <param name="Feed">The <see cref="RssFeed">RssFeed</see> object to<br />
/// get the tokens' data from.</param><br />
/// <param name="Template">The overall HTML template (or any other format)<br />
/// to replace the tokens in.</param><br />
/// <param name="ItemPrefix">A string template that is prepended to the beginning<br />
/// of each RSS item.</param><br />
/// <param name="ItemSuffix">A string template that is apppended to the end<br />
/// of each RSS item.</param><br />
/// <param name="MaxItems">The maximum number of RSS items to display.</param><br />
/// <returns>A string with the templates provided parsed of their tokens, with<br />
/// the data values in their place.</returns><br />
public static string CreateHtml(RssFeed Feed, string Template, string ItemPrefix, string ItemSuffix, int MaxItems) {<br />
RssHtmlMaker rssHtmlMaker = new RssHtmlMaker();<br />
rssHtmlMaker.MaxItems = MaxItems;<br />
return rssHtmlMaker.GetHtmlContents(Feed, Template, ItemPrefix, ItemSuffix);<br />
}<br />
<br />
/// <summary><br />
/// Retrieves an RSS feed using the given Url, parses it and<br />
/// creates and new <see cref="RssFeed">RssFeed</see> object with the information.<br />
/// If an error occurs in the XML loading of the document, or parsing of<br />
/// the RSS feed, the error is trapped and stored inside the RssFeed's<br />
/// ErrorMessage property.<br />
/// </summary><br />
/// <param name="Url">The url to retrieve the RSS feed from, this can<br />
/// be in the format of http:// and also file://.. (ftp?)</param><br />
/// <returns>An <see cref="RssFeed">RssFeed</see> object with information<br />
/// retrieved from the feed.</returns><br />
public RssFeed Retrieve(string Url) {<br />
<br />
RssFeed rssFeed = new RssFeed();<br />
rssFeed.Items = new RssItems();<br />
<br />
XmlTextReader xmlTextReader = new XmlTextReader(Url);<br />
XmlValidatingReader xmlValidatingReader = new XmlValidatingReader(xmlTextReader);<br />
xmlValidatingReader.ValidationType = ValidationType.None;<br />
<br />
XmlDocument xmlDoc = new XmlDocument();<br />
<br />
try {<br />
xmlDoc.Load(xmlTextReader);<br />
<br />
// Fire the load event<br />
if (this.FeedLoaded != null) {<br />
this.FeedLoaded(this, new EventArgs());<br />
}<br />
<br />
XmlNode rssXmlNode = null;<br />
<br />
// Loop child nodes till we find the rss one<br />
for (int i = 0; i < xmlDoc.ChildNodes.Count; i++) {<br />
System.Diagnostics.Debug.Write("Child: " + xmlDoc.ChildNodes[i].Name);<br />
System.Diagnostics.Debug.WriteLine(" has " + xmlDoc.ChildNodes[i].ChildNodes.Count + " children");<br />
<br />
if (xmlDoc.ChildNodes[i].Name == this.rootNodeName && xmlDoc.ChildNodes[i].ChildNodes.Count > 0) {<br />
rssXmlNode = xmlDoc.ChildNodes[i];<br />
<br />
// Fire the found event<br />
if (this.RssNodeFound != null) {<br />
this.RssNodeFound(this, new EventArgs());<br />
}<br />
<br />
break;<br />
}<br />
}<br />
<br />
if (rssXmlNode != null) {<br />
XmlNode channelXmlNode = null;<br />
<br />
// Loop through the rss node till we find the channel<br />
for (int i = 0; i < rssXmlNode.ChildNodes.Count; i++) {<br />
System.Diagnostics.Debug.WriteLine("Rss child: " + rssXmlNode.ChildNodes[i].Name);<br />
if (rssXmlNode.ChildNodes[i].Name == this.channelNodeName && rssXmlNode.ChildNodes[i].ChildNodes.Count > 0) {<br />
channelXmlNode = rssXmlNode.ChildNodes[i];<br />
<br />
// Fire the found event<br />
if (this.ChannelNodeFound != null) {<br />
this.ChannelNodeFound(this, new EventArgs());<br />
}<br />
<br />
break;<br />
}<br />
}<br />
<br />
// Found the channel node<br />
if (channelXmlNode != null) {<br />
// Loop through its children, copying details to the<br />
// RssFeed struct, and parsing the items<br />
for (int i = 0; i < channelXmlNode.ChildNodes.Count; i++) {<br />
System.Diagnostics.Debug.WriteLine(channelXmlNode.ChildNodes[i].Name);<br />
switch (channelXmlNode.ChildNodes[i].Name) {<br />
case "title": {<br />
rssFeed.Title = channelXmlNode.ChildNodes[i].InnerText;<br />
break;<br />
}<br />
case "description": {<br />
rssFeed.Description = channelXmlNode.ChildNodes[i].InnerText;<br />
break;<br />
}<br />
case "language": {<br />
rssFeed.Language = channelXmlNode.ChildNodes[i].InnerText;<br />
break;<br />
}<br />
case "copyright": {<br />
rssFeed.Copyright = channelXmlNode.ChildNodes[i].InnerText;<br />
break;<br />
}<br />
case "webmaster": {<br />
rssFeed.Webmaster = channelXmlNode.ChildNodes[i].InnerText;<br />
break;<br />
}<br />
case "pubDate": {<br />
rssFeed.PubDate = channelXmlNode.ChildNodes[i].InnerText;<br />
break;<br />
}<br />
case "lastBuildDate": {<br />
rssFeed.LastBuildDate = channelXmlNode.ChildNodes[i].InnerText;<br />
break;<br />
}<br />
case "category": {<br />
rssFeed.Category = channelXmlNode.ChildNodes[i].InnerText;<br />
break;<br />
}<br />
case "generator": {<br />
rssFeed.Generator = channelXmlNode.ChildNodes[i].InnerText;<br />
break;<br />
}<br />
case "ttl": {<br />
rssFeed.Ttl = channelXmlNode.ChildNodes[i].InnerText;<br />
break;<br />
}<br />
case "rating": {<br />
rssFeed.Rating = channelXmlNode.ChildNodes[i].InnerText;<br />
break;<br />
}<br />
case "skipHours": {<br />
rssFeed.Skiphours = channelXmlNode.ChildNodes[i].InnerText;<br />
break;<br />
}<br />
case "skipDays": {<br />
rssFeed.Skipdays = channelXmlNode.ChildNodes[i].InnerText;<br />
break;<br />
}<br />
case "managingEditor": {<br />
rssFeed.ManagingEditor = channelXmlNode.ChildNodes[i].InnerText;<br />
break;<br />
}<br />
case "item": {<br />
rssFeed.Items.Add(this.getRssItem(channelXmlNode.ChildNodes[i]));<br />
<br />
// Fire the found event<br />
if (this.ItemAdded != null) {<br />
this.ItemAdded(this, new EventArgs());<br />
}<br />
<br />
break;<br />
}<br />
}<br />
<br />
}<br />
<br />
// If rdf mode is set, then the channel node only contains<br />
// information about the channel, it doesn't hold the item<br />
// nodes. The item nodes are children of the root node in<br />
// an RDF document, so we use this instead.<br />
if (this.RdfMode) {<br />
for (int i = 0; i < rssXmlNode.ChildNodes.Count; i++) {<br />
switch (rssXmlNode.ChildNodes[i].Name) {<br />
case "item": {<br />
rssFeed.Items.Add(this.getRssItem(rssXmlNode.ChildNodes[i]));<br />
<br />
// Fire the found event<br />
if (this.ItemAdded != null) {<br />
this.ItemAdded(this, new EventArgs());<br />
}<br />
<br />
break;<br />
}<br />
}<br />
}<br />
}<br />
}<br />
else {<br />
rssFeed.ErrorMessage = "Unable to find rss <seehannel> node";<br />
<br />
// Fire the error event<br />
if (this.Error != null) {<br />
RssReaderErrorEventArgs args = new RssReaderErrorEventArgs();<br />
args.Message = rssFeed.ErrorMessage;<br />
this.Error(this, args);<br />
}<br />
}<br />
<br />
}<br />
else {<br />
rssFeed.ErrorMessage = "Unable to find root <rss> node";<br />
<br />
// Fire the error event<br />
if (this.Error != null) {<br />
RssReaderErrorEventArgs args = new RssReaderErrorEventArgs();<br />
args.Message = rssFeed.ErrorMessage;<br />
this.Error(this, args);<br />
}<br />
}<br />
<br />
}<br />
catch (XmlException err) {<br />
//<br />
rssFeed.ErrorMessage = "Xml error: " + err.Message;<br />
<br />
// Fire the error event<br />
if (this.Error != null) {<br />
RssReaderErrorEventArgs args = new RssReaderErrorEventArgs();<br />
args.Message = rssFeed.ErrorMessage;<br />
this.Error(this, args);<br />
}<br />
return rssFeed;<br />
}<br />
<br />
return rssFeed;<br />
}<br />
<br />
/// <summary><br />
/// Creates an RSS item from an XML node with the <br />
/// corresponding child nodes (title,description etc.)<br />
/// </summary><br />
/// <param name="xmlNode">The node to extract the details from</param><br />
/// <returns>An RssItem object with details taken from the item node.</returns><br />
private RssItem getRssItem(XmlNode xmlNode) {<br />
RssItem rssItem = new RssItem();<br />
<br />
for (int i = 0; i < xmlNode.ChildNodes.Count; i++) {<br />
switch (xmlNode.ChildNodes[i].Name.ToLower()) {<br />
case "title": {<br />
rssItem.Title = xmlNode.ChildNodes[i].InnerText;<br />
break;<br />
}<br />
case "description": {<br />
rssItem.Description = xmlNode.ChildNodes[i].InnerText;<br />
break;<br />
}<br />
case "link": {<br />
rssItem.Link = xmlNode.ChildNodes[i].InnerText;<br />
break;<br />
}<br />
case "author": {<br />
rssItem.Author = xmlNode.ChildNodes[i].InnerText;<br />
break;<br />
}<br />
case "comments": {<br />
rssItem.Comments = xmlNode.ChildNodes[i].InnerText;<br />
break;<br />
}<br />
case "pubdate": {<br />
rssItem.Pubdate = xmlNode.ChildNodes[i].InnerText;<br />
break;<br />
}<br />
case "guid": {<br />
rssItem.Guid = xmlNode.ChildNodes[i].InnerText;<br />
break;<br />
}<br />
}<br />
}<br />
<br />
return rssItem;<br />
}<br />
}<br />
#endregion<br />
<br />
#region Html creator class<br />
/// <summary><br />
/// This class provides an easy method of converting a <see cref="RssFeed">RssFeed</see><br />
/// object into a simple HTML document. This document can then be written to<br />
/// file, where it can be stored in a cached state (saving a feed request each<br />
/// time the feed is required). <br />
/// </summary><br />
public class RssHtmlMaker {<br />
<br />
/// <summary><br />
/// Restricts the number of items that are displayed and replaced<br />
/// using the %Items% token in the HTML template.<br />
/// </summary><br />
public int MaxItems {<br />
get {<br />
return this.maxItems;<br />
}<br />
set {<br />
this.maxItems = value;<br />
}<br />
}<br />
<br />
/// <summary><br />
/// Member for the public property.<br />
/// </summary><br />
private int maxItems = 0;<br />
<br />
/// <summary><br />
/// Creates a HTML document, or any format - this is only limited by<br />
/// the template you provide - from the provided<br />
/// <see cref="RssFeed">RssFeed</see> object. The tokens described in the<br />
/// remarks section are replaced with their values inside the template.<br />
/// The items in the RSS feed are replaced using the ItemPrefix and ItemSuffix<br />
/// templates, where the suffix is placed face, and the suffix is appended on the end.<br />
/// </summary><br />
/// <remarks><br />
/// The following are a list of tokens which are replaced inside the main Template,<br />
/// with their corresponding values from the provided <see cref="RssFeed">RssFeed</see> <br />
/// object. For details on each token, see its corresponding property in the <br />
/// <see cref="RssFeed">RssFeed</see> object.<br />
/// <list type="bullet"><br />
/// <item>%Title%</item><br />
/// <item>%Description%</item><br />
/// <item>%Link%</item><br />
/// <item>%Language%</item><br />
/// <item>%Copyright%</item><br />
/// <item>%Webmaster%</item><br />
/// <item>%PubDate%</item><br />
/// <item>%LastBuildDate%</item><br />
/// <item>%Category%</item><br />
/// <item>%Generator%</item><br />
/// <item>%Ttl%</item><br />
/// <item>%Rating%</item><br />
/// <item>%Skiphours%</item><br />
/// <item>%Skipdays%</item><br />
/// <item>%Skipdays%</item><br />
/// <item>%Items% - This is replaced by the parsed template of the items</item><br />
/// </list><br />
/// The following are a list of tokens which are replaced inside the ItemPrefix<br />
/// and ItemSuffix templates, with their corresponding values from the <br />
/// provided <see cref="RssItem">RssItem</see> object. For details<br />
/// on each token, see its corresponding property in <br />
/// the <see cref="RssItem">RssItem</see> object.<br />
/// <list type="bullet"><br />
/// <item>%Title%</item><br />
/// <item>%Description%</item><br />
/// <item>%Link%</item><br />
/// <item>%Author%</item><br />
/// <item>%Comments%</item><br />
/// <item>%Pubdate%</item><br />
/// <item>%Guid%</item><br />
/// </list><br />
/// </remarks><br />
/// <param name="Feed">The <see cref="RssFeed">RssFeed</see> object to<br />
/// get the tokens' data from.</param><br />
/// <param name="Template">The overall HTML template (or any other format)<br />
/// to replace the tokens in.</param><br />
/// <param name="ItemPrefix">A string template that is prepended to the beginning<br />
/// of each RSS item.</param><br />
/// <param name="ItemSuffix">A string template that is apppended to the end<br />
/// of each RSS item.</param><br />
/// <returns>A string with the templates provided parsed of their tokens, with<br />
/// the data values in their place.</returns><br />
public string GetHtmlContents(RssFeed Feed, string Template, string ItemPrefix, string ItemSuffix) {<br />
string result = Template;<br />
<br />
// Replace all template tokens<br />
result = result.Replace("%Title%", Feed.Title);<br />
result = result.Replace("%Description%", Feed.Description);<br />
result = result.Replace("%Link%", Feed.Link);<br />
result = result.Replace("%Language%", Feed.Language);<br />
result = result.Replace("%Copyright%", Feed.Copyright);<br />
result = result.Replace("%Webmaster%", Feed.Webmaster);<br />
result = result.Replace("%PubDate%", Feed.PubDate);<br />
result = result.Replace("%LastBuildDate%", Feed.LastBuildDate);<br />
result = result.Replace("%Category%", Feed.Category);<br />
result = result.Replace("%Generator%", Feed.Generator);<br />
result = result.Replace("%Ttl%", Feed.Ttl);<br />
result = result.Replace("%Rating%", Feed.Rating);<br />
result = result.Replace("%Skiphours%", Feed.Skiphours);<br />
result = result.Replace("%Skipdays%", Feed.Skipdays);<br />
result = result.Replace("%Skipdays%", Feed.ManagingEditor);<br />
<br />
// Parse item template<br />
string itemsContent = "";<br />
string tempContent = "";<br />
<br />
if (maxItems == 0 || maxItems > Feed.Items.Count) {<br />
maxItems = Feed.Items.Count;<br />
}<br />
<br />
for (int i = 0; i < maxItems; i++) {<br />
// Parse prefix template<br />
tempContent = ItemPrefix;<br />
tempContent = tempContent.Replace("%Title%", Feed.Items[i].Title);<br />
tempContent = tempContent.Replace("%Description%", Feed.Items[i].Description);<br />
tempContent = tempContent.Replace("%Link%", Feed.Items[i].Link);<br />
tempContent = tempContent.Replace("%Author%", Feed.Items[i].Author);<br />
tempContent = tempContent.Replace("%Comments%", Feed.Items[i].Comments);<br />
tempContent = tempContent.Replace("%Pubdate%", Feed.Items[i].Pubdate);<br />
tempContent = tempContent.Replace("%Guid%", Feed.Items[i].Guid);<br />
<br />
itemsContent += tempContent;<br />
<br />
// Parse suffix template<br />
tempContent = ItemSuffix;<br />
tempContent = tempContent.Replace("%Title%", Feed.Items[i].Title);<br />
tempContent = tempContent.Replace("%Description%", Feed.Items[i].Description);<br />
tempContent = tempContent.Replace("%Link%", Feed.Items[i].Link);<br />
tempContent = tempContent.Replace("%Author%", Feed.Items[i].Author);<br />
tempContent = tempContent.Replace("%Comments%", Feed.Items[i].Comments);<br />
tempContent = tempContent.Replace("%Pubdate%", Feed.Items[i].Pubdate);<br />
tempContent = tempContent.Replace("%Guid%", Feed.Items[i].Guid);<br />
<br />
itemsContent += tempContent;<br />
}<br />
<br />
// Replace %items% with items<br />
result = result.Replace("%Items%", itemsContent);<br />
<br />
return result;<br />
}<br />
}<br />
#endregion<br />
<br />
#region Data structures<br />
/// <summary><br />
/// A data type to represent all properties of single RSS feed.<br />
/// (one XML document). The descriptions for<br />
/// the properties of RssItem are para-phrased from the <br />
/// <see href="http://blogs.law.harvard.edu/tech/rss">RSS 2 specification</see>.<br />
/// See <see cref="RssReader">RssReader</see> for properties which <br />
/// have not yet been implemented in this version of the<br />
/// the RssReader class.<br />
/// </summary><br />
/// <remarks><br />
/// The following elements of the RSS &lt;channel&gt; node aren't<br />
/// supported by this version of RssReader:<br />
/// <list type="bullet"><br />
/// <item>image (has subelements: image,url,title,link)</item><br />
/// <item>cloud (has attributes: domain,port,path,registerProcedure,protocol)</item><br />
/// <item>textInput (has subelements: title,description,name,link)</item><br />
/// </list><br />
/// </remarks><br />
[Serializable()]<br />
public struct RssFeed {<br />
/// <summary><br />
/// The name of the channel.<br />
/// </summary><br />
public string Title;<br />
/// <summary><br />
/// Phrase or sentence describing the channel.<br />
/// </summary><br />
public string Description;<br />
/// <summary><br />
/// The URL to the HTML website corresponding to the channel.<br />
/// </summary><br />
public string Link;<br />
<br />
// Optional items<br />
<br />
/// <summary><br />
/// The language the channel is written in. This allows <br />
/// aggregators to group all Italian language sites, for example, on a single page. <br />
/// </summary><br />
public string Language;<br />
/// <summary><br />
/// Copyright notice for content in the channel.<br />
/// </summary><br />
public string Copyright;<br />
/// <summary><br />
/// Email address for person responsible for technical issues relating to channel.<br />
/// </summary><br />
public string Webmaster;<br />
/// <summary><br />
/// The publication date for the content in the channel. <br />
/// </summary><br />
public string PubDate;<br />
/// <summary><br />
/// The last time the content of the channel changed.<br />
/// </summary><br />
public string LastBuildDate;<br />
/// <summary><br />
/// Specify one or more categories that the channel belongs to.<br />
/// </summary><br />
public string Category;<br />
/// <summary><br />
/// A string indicating the program used to generate the channel.<br />
/// </summary><br />
public string Generator;<br />
/// <summary><br />
/// ttl stands for time to live. It's a number of minutes <br />
/// that indicates how long a channel can be cached before <br />
/// refreshing from the source<br />
/// </summary><br />
public string Ttl;<br />
/// <summary><br />
/// The <see href="http://www.w3.org/PICS/">PICS</see> rating for the channel.<br />
/// </summary><br />
public string Rating;<br />
/// <summary><br />
/// A hint for aggregators telling them which hours they can skip. <br />
/// </summary><br />
public string Skiphours;<br />
/// <summary><br />
/// A hint for aggregators telling them which days they can skip. <br />
/// </summary><br />
public string Skipdays;<br />
/// <summary><br />
/// Email address for person responsible for editorial content.<br />
/// </summary><br />
public string ManagingEditor;<br />
/// <summary><br />
/// A collection of RssItem datatypes, representing each<br />
/// item for the RSS feed.<br />
/// </summary><br />
public RssItems Items;<br />
/// <summary><br />
/// Contains any errors that occured during the loading or<br />
/// parsing of the XML document. Compare this to a blank string<br />
/// to see if any errors occured.<br />
/// </summary><br />
public string ErrorMessage;<br />
}<br />
<br />
/// <summary><br />
/// A data type to represent a single<br />
/// RSS item in a RSS feed. See <see cref="RssReader">RssReader</see> for<br />
/// properties of a RSS item which have not yet been implemented <br />
/// in this version of the the RssReader class. The descriptions for<br />
/// the properties of RssItem are para-phrased from the <br />
/// <see href="http://blogs.law.harvard.edu/tech/rss">RSS 2 specification.</see><br />
/// </summary><br />
/// <remarks><br />
/// The following elements of a RSS item aren't<br />
/// supported by this version of RssReader:<br />
/// <list type="bullet"><br />
/// <item>category (can have domain attribute)</item><br />
/// <item>enclosure ( has attributes: url,length,type )</item><br />
/// <item>source (has attributes: url)</item><br />
/// </list><br />
/// </remarks><br />
[Serializable()]<br />
public struct RssItem {<br />
/// <summary><br />
/// The title of the item.<br />
/// </summary><br />
public string Title;<br />
/// <summary><br />
/// The item synopsis.<br />
/// </summary><br />
public string Description;<br />
/// <summary><br />
/// The URL of the item.<br />
/// </summary><br />
public string Link;<br />
/// <summary><br />
/// Email address of the author of the item. <br />
/// </summary><br />
public string Author;<br />
/// <summary><br />
/// URL of a page for comments relating to the item<br />
/// </summary><br />
public string Comments;<br />
/// <summary><br />
/// Indicates when the item was published. <br />
/// </summary><br />
public string Pubdate;<br />
/// <summary><br />
/// A string that uniquely identifies the item.<br />
/// </summary><br />
public string Guid;<br />
}<br />
<br />
/// <summary><br />
/// Represents a collection of RSS items for<br />
/// the RSS feed.<br />
/// </summary><br />
[Serializable()]<br />
public class RssItems : CollectionBase {<br />
public RssItem this[int item] {<br />
get {<br />
return this.getItem(item);<br />
}<br />
}<br />
<br />
public void Add(RssItem rssItem) {<br />
List.Add(rssItem);<br />
}<br />
<br />
public bool Remove(int index) {<br />
if (index > Count - 1 || index < 0) {<br />
return false;<br />
}<br />
else {<br />
List.RemoveAt(index);<br />
return true;<br />
}<br />
}<br />
<br />
private RssItem getItem(int Index) {<br />
return (RssItem)List[Index];<br />
}<br />
<br />
}<br />
#endregion<br />
}<br />
</source></div>Ajastremhttps://wiki.itcollege.ee/index.php?title=Rfc822DateTimeFormat_csharp&diff=6771Rfc822DateTimeFormat csharp2010-04-16T12:10:12Z<p>Ajastrem: </p>
<hr />
<div>RSS aja standarti c# implementatsioon<br />
<br />
<source lang=csharp><br />
using System;<br />
using System.Collections.Generic;<br />
using System.Linq;<br />
using System.Text;<br />
using System.Globalization;<br />
<br />
namespace Scream.RSS {<br />
<br />
<br />
/// <summary><br />
/// Provides methods for converting <see cref="DateTime"/> structures <br />
/// to and from the equivalent <a href="http://www.w3.org/Protocols/rfc822/#z28">RFC 822</a> <br />
/// string representation.<br />
/// </summary><br />
public class Rfc822DateTime {<br />
//============================================================<br />
// Private members<br />
//============================================================<br />
#region Private Members<br />
/// <summary><br />
/// Private member to hold array of formats that RFC 822 date-time representations conform to.<br />
/// </summary><br />
private static string[] formats = new string[0];<br />
/// <summary><br />
/// Private member to hold the DateTime format string for representing a DateTime in the RFC 822 format.<br />
/// </summary><br />
private const string format = "ddd, dd MMM yyyy HH:mm:ss K";<br />
#endregion<br />
<br />
//============================================================<br />
// Public Properties<br />
//============================================================<br />
#region Rfc822DateTimeFormat<br />
/// <summary><br />
/// Gets the custom format specifier that may be used to represent a <see cref="DateTime"/> in the RFC 822 format.<br />
/// </summary><br />
/// <value>A <i>DateTime format string</i> that may be used to represent a <see cref="DateTime"/> in the RFC 822 format.</value><br />
/// <remarks><br />
/// <para><br />
/// This method returns a string representation of a <see cref="DateTime"/> that utilizes the time zone <br />
/// offset (local differential) to represent the offset from Greenwich mean time in hours and minutes. <br />
/// The <see cref="Rfc822DateTimeFormat"/> is a valid date-time format string for use <br />
/// in the <see cref="DateTime.ToString(String, IFormatProvider)"/> method.<br />
/// </para><br />
/// <para><br />
/// The <a href="http://www.w3.org/Protocols/rfc822/#z28">RFC 822</a> Date and Time specification <br />
/// specifies that the year will be represented as a two-digit value, but the <br />
/// <a href="http://www.rssboard.org/rss-profile#data-types-datetime">RSS Profile</a> recommends that <br />
/// all date-time values should use a four-digit year. The <see cref="Rfc822DateTime"/> class <br />
/// follows the RSS Profile recommendation when converting a <see cref="DateTime"/> to the equivalent <br />
/// RFC 822 string representation.<br />
/// </para><br />
/// </remarks><br />
public static string Rfc822DateTimeFormat {<br />
get {<br />
return format;<br />
}<br />
}<br />
#endregion<br />
<br />
#region Rfc822DateTimePatterns<br />
/// <summary><br />
/// Gets an array of the expected formats for RFC 822 date-time string representations.<br />
/// </summary><br />
/// <value><br />
/// An array of the expected formats for RFC 822 date-time string representations <br />
/// that may used in the <see cref="DateTime.TryParseExact(String, string[], IFormatProvider, DateTimeStyles, out DateTime)"/> method.<br />
/// </value><br />
/// <remarks><br />
/// The array of the expected formats that is returned assumes that the RFC 822 time zone <br />
/// is represented as or converted to a local differential representation.<br />
/// </remarks><br />
/// <seealso cref="ConvertZoneToLocalDifferential(String)"/><br />
public static string[] Rfc822DateTimePatterns {<br />
get {<br />
if (formats.Length > 0) {<br />
return formats;<br />
}<br />
else {<br />
formats = new string[35];<br />
<br />
// two-digit day, four-digit year patterns<br />
formats[0] = "ddd',' dd MMM yyyy HH':'mm':'ss'.'fffffff zzzz";<br />
formats[1] = "ddd',' dd MMM yyyy HH':'mm':'ss'.'ffffff zzzz";<br />
formats[2] = "ddd',' dd MMM yyyy HH':'mm':'ss'.'fffff zzzz";<br />
formats[3] = "ddd',' dd MMM yyyy HH':'mm':'ss'.'ffff zzzz";<br />
formats[4] = "ddd',' dd MMM yyyy HH':'mm':'ss'.'fff zzzz";<br />
formats[5] = "ddd',' dd MMM yyyy HH':'mm':'ss'.'ff zzzz";<br />
formats[6] = "ddd',' dd MMM yyyy HH':'mm':'ss'.'f zzzz";<br />
formats[7] = "ddd',' dd MMM yyyy HH':'mm':'ss zzzz";<br />
<br />
// two-digit day, two-digit year patterns<br />
formats[8] = "ddd',' dd MMM yy HH':'mm':'ss'.'fffffff zzzz";<br />
formats[9] = "ddd',' dd MMM yy HH':'mm':'ss'.'ffffff zzzz";<br />
formats[10] = "ddd',' dd MMM yy HH':'mm':'ss'.'fffff zzzz";<br />
formats[11] = "ddd',' dd MMM yy HH':'mm':'ss'.'ffff zzzz";<br />
formats[12] = "ddd',' dd MMM yy HH':'mm':'ss'.'fff zzzz";<br />
formats[13] = "ddd',' dd MMM yy HH':'mm':'ss'.'ff zzzz";<br />
formats[14] = "ddd',' dd MMM yy HH':'mm':'ss'.'f zzzz";<br />
formats[15] = "ddd',' dd MMM yy HH':'mm':'ss zzzz";<br />
<br />
// one-digit day, four-digit year patterns<br />
formats[16] = "ddd',' d MMM yyyy HH':'mm':'ss'.'fffffff zzzz";<br />
formats[17] = "ddd',' d MMM yyyy HH':'mm':'ss'.'ffffff zzzz";<br />
formats[18] = "ddd',' d MMM yyyy HH':'mm':'ss'.'fffff zzzz";<br />
formats[19] = "ddd',' d MMM yyyy HH':'mm':'ss'.'ffff zzzz";<br />
formats[20] = "ddd',' d MMM yyyy HH':'mm':'ss'.'fff zzzz";<br />
formats[21] = "ddd',' d MMM yyyy HH':'mm':'ss'.'ff zzzz";<br />
formats[22] = "ddd',' d MMM yyyy HH':'mm':'ss'.'f zzzz";<br />
formats[23] = "ddd',' d MMM yyyy HH':'mm':'ss zzzz";<br />
<br />
// two-digit day, two-digit year patterns<br />
formats[24] = "ddd',' d MMM yy HH':'mm':'ss'.'fffffff zzzz";<br />
formats[25] = "ddd',' d MMM yy HH':'mm':'ss'.'ffffff zzzz";<br />
formats[26] = "ddd',' d MMM yy HH':'mm':'ss'.'fffff zzzz";<br />
formats[27] = "ddd',' d MMM yy HH':'mm':'ss'.'ffff zzzz";<br />
formats[28] = "ddd',' d MMM yy HH':'mm':'ss'.'fff zzzz";<br />
formats[29] = "ddd',' d MMM yy HH':'mm':'ss'.'ff zzzz";<br />
formats[30] = "ddd',' d MMM yy HH':'mm':'ss'.'f zzzz";<br />
formats[31] = "ddd',' d MMM yy HH':'mm':'ss zzzz";<br />
<br />
// Fall back patterns<br />
formats[32] = "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK"; // RoundtripDateTimePattern<br />
formats[33] = DateTimeFormatInfo.InvariantInfo.UniversalSortableDateTimePattern;<br />
formats[34] = DateTimeFormatInfo.InvariantInfo.SortableDateTimePattern;<br />
<br />
return formats;<br />
}<br />
}<br />
}<br />
#endregion<br />
<br />
public static void ArgumentNotNullOrEmptyString(string arg, string s) {<br />
if (arg == null || arg.Trim().Length == 0) throw new Exception("Argument is null or is Empty string");<br />
}<br />
<br />
//============================================================<br />
// Public Methods<br />
//============================================================<br />
#region Parse(string s)<br />
/// <summary><br />
/// Converts the specified string representation of a date and time to its <see cref="DateTime"/> equivalent.<br />
/// </summary><br />
/// <param name="s">A string containing a date and time to convert.</param><br />
/// <returns><br />
/// A <see cref="DateTime"/> equivalent to the date and time contained in <paramref name="s"/>, <br />
/// expressed as <i>Coordinated Universal Time (UTC)</i>.<br />
/// </returns><br />
/// <remarks><br />
/// The string <paramref name="s"/> is parsed using formatting information in the <see cref="DateTimeFormatInfo.InvariantInfo"/> object.<br />
/// </remarks><br />
/// <exception cref="ArgumentNullException"><paramref name="s"/> is a <b>null</b> reference (Nothing in Visual Basic).</exception><br />
/// <exception cref="ArgumentNullException"><paramref name="s"/> is an empty string.</exception><br />
/// <exception cref="FormatException"><paramref name="s"/> does not contain a valid RFC 822 string representation of a date and time.</exception><br />
public static DateTime Parse(string s) {<br />
//------------------------------------------------------------<br />
// Validate parameter<br />
//------------------------------------------------------------<br />
// Guard.<br />
ArgumentNotNullOrEmptyString(s, "s");<br />
<br />
DateTime result;<br />
if (Rfc822DateTime.TryParse(s, out result)) {<br />
return result;<br />
}<br />
else {<br />
throw new FormatException(String.Format(null, "{0} is not a valid RFC 822 string representation of a date and time.", s));<br />
}<br />
}<br />
#endregion<br />
<br />
#region ConvertZoneToLocalDifferential(string s)<br />
/// <summary><br />
/// Converts the time zone component of an RFC 822 date and time string representation to its local differential (time zone offset).<br />
/// </summary><br />
/// <param name="s">A string containing an RFC 822 date and time to convert.</param><br />
/// <returns>A date and time string that uses local differential to describe the time zone equivalent to the date and time contained in <paramref name="s"/>.</returns><br />
/// <exception cref="ArgumentNullException"><paramref name="s"/> is a <b>null</b> reference (Nothing in Visual Basic).</exception><br />
/// <exception cref="ArgumentNullException"><paramref name="s"/> is an empty string.</exception><br />
public static string ConvertZoneToLocalDifferential(string s) {<br />
string zoneRepresentedAsLocalDifferential = String.Empty;<br />
<br />
//------------------------------------------------------------<br />
// Validate parameter<br />
//------------------------------------------------------------<br />
//Guard.<br />
ArgumentNotNullOrEmptyString(s, "s");<br />
<br />
if (s.EndsWith(" UT", StringComparison.OrdinalIgnoreCase)) {<br />
zoneRepresentedAsLocalDifferential = String.Concat(s.Substring(0, (s.LastIndexOf(" UT") + 1)), "+00:00");<br />
}<br />
else if (s.EndsWith(" GMT", StringComparison.OrdinalIgnoreCase)) {<br />
zoneRepresentedAsLocalDifferential = String.Concat(s.Substring(0, (s.LastIndexOf(" GMT") + 1)), "+00:00");<br />
}<br />
else if (s.EndsWith(" EST", StringComparison.OrdinalIgnoreCase)) {<br />
zoneRepresentedAsLocalDifferential = String.Concat(s.Substring(0, (s.LastIndexOf(" EST") + 1)), "-05:00");<br />
}<br />
else if (s.EndsWith(" EDT", StringComparison.OrdinalIgnoreCase)) {<br />
zoneRepresentedAsLocalDifferential = String.Concat(s.Substring(0, (s.LastIndexOf(" EDT") + 1)), "-04:00");<br />
}<br />
else if (s.EndsWith(" CST", StringComparison.OrdinalIgnoreCase)) {<br />
zoneRepresentedAsLocalDifferential = String.Concat(s.Substring(0, (s.LastIndexOf(" CST") + 1)), "-06:00");<br />
}<br />
else if (s.EndsWith(" CDT", StringComparison.OrdinalIgnoreCase)) {<br />
zoneRepresentedAsLocalDifferential = String.Concat(s.Substring(0, (s.LastIndexOf(" CDT") + 1)), "-05:00");<br />
}<br />
else if (s.EndsWith(" MST", StringComparison.OrdinalIgnoreCase)) {<br />
zoneRepresentedAsLocalDifferential = String.Concat(s.Substring(0, (s.LastIndexOf(" MST") + 1)), "-07:00");<br />
}<br />
else if (s.EndsWith(" MDT", StringComparison.OrdinalIgnoreCase)) {<br />
zoneRepresentedAsLocalDifferential = String.Concat(s.Substring(0, (s.LastIndexOf(" MDT") + 1)), "-06:00");<br />
}<br />
else if (s.EndsWith(" PST", StringComparison.OrdinalIgnoreCase)) {<br />
zoneRepresentedAsLocalDifferential = String.Concat(s.Substring(0, (s.LastIndexOf(" PST") + 1)), "-08:00");<br />
}<br />
else if (s.EndsWith(" PDT", StringComparison.OrdinalIgnoreCase)) {<br />
zoneRepresentedAsLocalDifferential = String.Concat(s.Substring(0, (s.LastIndexOf(" PDT") + 1)), "-07:00");<br />
}<br />
else if (s.EndsWith(" Z", StringComparison.OrdinalIgnoreCase)) {<br />
zoneRepresentedAsLocalDifferential = String.Concat(s.Substring(0, (s.LastIndexOf(" Z") + 1)), "+00:00");<br />
}<br />
else if (s.EndsWith(" A", StringComparison.OrdinalIgnoreCase)) {<br />
zoneRepresentedAsLocalDifferential = String.Concat(s.Substring(0, (s.LastIndexOf(" A") + 1)), "-01:00");<br />
}<br />
else if (s.EndsWith(" M", StringComparison.OrdinalIgnoreCase)) {<br />
zoneRepresentedAsLocalDifferential = String.Concat(s.Substring(0, (s.LastIndexOf(" M") + 1)), "-12:00");<br />
}<br />
else if (s.EndsWith(" N", StringComparison.OrdinalIgnoreCase)) {<br />
zoneRepresentedAsLocalDifferential = String.Concat(s.Substring(0, (s.LastIndexOf(" N") + 1)), "+01:00");<br />
}<br />
else if (s.EndsWith(" Y", StringComparison.OrdinalIgnoreCase)) {<br />
zoneRepresentedAsLocalDifferential = String.Concat(s.Substring(0, (s.LastIndexOf(" Y") + 1)), "+12:00");<br />
}<br />
else {<br />
zoneRepresentedAsLocalDifferential = s;<br />
}<br />
<br />
return zoneRepresentedAsLocalDifferential;<br />
}<br />
#endregion<br />
<br />
#region ToString(DateTime utcDateTime)<br />
/// <summary><br />
/// Converts the value of the specified <see cref="DateTime"/> object to its equivalent string representation.<br />
/// </summary><br />
/// <param name="utcDateTime">The Coordinated Universal Time (UTC) <see cref="DateTime"/> to convert.</param><br />
/// <returns>A RFC 822 string representation of the value of the <paramref name="utcDateTime"/>.</returns><br />
/// <exception cref="ArgumentException">The specified <paramref name="utcDateTime"/> object does not represent a <see cref="DateTimeKind.Utc">Coordinated Universal Time (UTC)</see> value.</exception><br />
public static string ToString(DateTime utcDateTime) {<br />
if (utcDateTime.Kind != DateTimeKind.Utc) {<br />
throw new ArgumentException("utcDateTime");<br />
}<br />
<br />
return utcDateTime.ToString(Rfc822DateTime.Rfc822DateTimeFormat, DateTimeFormatInfo.InvariantInfo);<br />
}<br />
#endregion<br />
<br />
#region TryParse(string s, out DateTime result)<br />
/// <summary><br />
/// Converts the specified string representation of a date and time to its <see cref="DateTime"/> equivalent.<br />
/// </summary><br />
/// <param name="s">A string containing a date and time to convert.</param><br />
/// <param name="result"><br />
/// When this method returns, contains the <see cref="DateTime"/> value equivalent to the date and time <br />
/// contained in <paramref name="s"/>, expressed as <i>Coordinated Universal Time (UTC)</i>, <br />
/// if the conversion succeeded, or <see cref="DateTime.MinValue">MinValue</see> if the conversion failed. <br />
/// The conversion fails if the s parameter is a <b>null</b> reference (Nothing in Visual Basic), <br />
/// or does not contain a valid string representation of a date and time. <br />
/// This parameter is passed uninitialized.<br />
/// </param><br />
/// <returns><b>true</b> if the <paramref name="s"/> parameter was converted successfully; otherwise, <b>false</b>.</returns><br />
/// <remarks><br />
/// The string <paramref name="s"/> is parsed using formatting information in the <see cref="DateTimeFormatInfo.InvariantInfo"/> object. <br />
/// </remarks><br />
public static bool TryParse(string s, out DateTime result) {<br />
//------------------------------------------------------------<br />
// Attempt to convert string representation<br />
//------------------------------------------------------------<br />
bool wasConverted = false;<br />
result = DateTime.MinValue;<br />
<br />
if (!String.IsNullOrEmpty(s)) {<br />
DateTime parseResult;<br />
if (DateTime.TryParseExact(Rfc822DateTime.ConvertZoneToLocalDifferential(s), Rfc822DateTime.Rfc822DateTimePatterns, DateTimeFormatInfo.InvariantInfo, DateTimeStyles.AdjustToUniversal, out parseResult)) {<br />
result = DateTime.SpecifyKind(parseResult, DateTimeKind.Utc);<br />
wasConverted = true;<br />
}<br />
}<br />
<br />
return wasConverted;<br />
}<br />
#endregion<br />
}<br />
<br />
}<br />
</source></div>Ajastremhttps://wiki.itcollege.ee/index.php?title=RssFeed_Retrieve&diff=6770RssFeed Retrieve2010-04-16T12:02:01Z<p>Ajastrem: </p>
<hr />
<div><source lang=csharp><br />
using System;<br />
using System.Collections.Generic;<br />
using System.Linq;<br />
using System.Text;<br />
using System.Net;<br />
using System.IO;<br />
<br />
using System.Collections;<br />
using System.Xml;<br />
<br />
namespace Scream.RSS {<br />
public class RssManager {<br />
public void GetRssItemList(string url) {<br />
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);<br />
HttpWebResponse response = (HttpWebResponse)request.GetResponse();<br />
Stream responseStream = response.GetResponseStream();<br />
<br />
Encoding BrowserEncoding = Encoding.ASCII;<br />
<br />
if (request.HaveResponse) {<br />
// Next is redirection<br />
if ((response.StatusCode == HttpStatusCode.Found) ||<br />
(response.StatusCode == HttpStatusCode.Redirect) ||<br />
(response.StatusCode == HttpStatusCode.Moved) ||<br />
(response.StatusCode == HttpStatusCode.MovedPermanently)) {<br />
// Get new location and call recursively<br />
WebHeaderCollection responseHeaders = response.Headers;<br />
request = (HttpWebRequest)WebRequest.Create(responseHeaders["Location"]);<br />
<br />
HttpWebResponse redirectedResponse = (HttpWebResponse)request.GetResponse();<br />
<br />
responseStream = redirectedResponse.GetResponseStream();<br />
}<br />
}<br />
<br />
StringBuilder stringBuilder = new StringBuilder();<br />
byte[] buffer = new byte[8192];<br />
string tempString = null;<br />
int count = 0;<br />
do {<br />
// fill the buffer with data<br />
count = responseStream.Read(buffer, 0, buffer.Length);<br />
// make sure we read some data<br />
if (count != 0) {<br />
tempString = Encoding.UTF8.GetString(Encoding.Convert(BrowserEncoding, Encoding.UTF8, buffer, 0, count));<br />
stringBuilder.Append(tempString);<br />
}<br />
}<br />
while (count > 0); // any more data to read?<br />
<br />
string html = stringBuilder.ToString();<br />
<br />
<br />
}<br />
}<br />
<br />
#region Event datatype/delegate<br />
/// <summary><br />
/// Holds details about any errors that occured<br />
/// during the loading or parsing of the RSS feed.<br />
/// </summary><br />
public class RssReaderErrorEventArgs : EventArgs {<br />
/// <summary><br />
/// The details of the error.<br />
/// </summary><br />
public string Message {<br />
get {<br />
return this.message;<br />
}<br />
set {<br />
this.message = value;<br />
}<br />
}<br />
<br />
private string message;<br />
}<br />
<br />
/// <summary><br />
/// Represents the method that will handle the RssReader error event.<br />
/// </summary><br />
public delegate void RssReaderErrorEventHandler(object sender, RssReaderErrorEventArgs e);<br />
#endregion<br />
<br />
#region RssReader class<br />
/// <summary><br />
/// The RssReader class provides a number of static methods for easy<br />
/// 1 or 2 step retrieval of RSS feeds. RSS feeds can be downloaded from any<br />
/// URL, and are then parsed into an <see cref="RssFeed">RssFeed</see> data type,<br />
/// which contains properties representing most aspects of an RSS Feed. A number<br />
/// of events are available for the calling application to register at the various<br />
/// stages of the feed request and parsing.<br />
/// <example><br />
/// The following example retrieves the RSS news feed for the BBC news website,<br />
/// and creates a HTML document from the feed's details. It saves the HTML document<br />
/// to disk, and launches the default browser with the document. The number of items<br />
/// displayed is limited to 5. If there is any error, a messagebox is displayed with<br />
/// the details of the error.<br />
/// <code><br />
/// RssFeed feed = RssReader.GetFeed("http://www.bbc.co.uk/syndication/feeds/news/ukfs_news/front_page/rss091.xml");<br />
/// <br />
/// if ( feed.ErrorMessage == null || feed.ErrorMessage == "" )<br />
/// {<br />
/// string template = "&lt;a href=\"%Link%&gt;%Title%&lt;/a&gt;&lt;br/&gt;%Description%&lt;br/&gt;&lt;br/&gt;&lt;ul&gt;%Items%&lt;/ul&gt;";<br />
/// string itemTemplate = "&lt;li&gt;&lt;a href=\"%Link%&gt;%Title%&lt;/a&gt;&lt;br/&gt;%Description%&lt;/li&gt;";<br />
/// string html = RssReader.CreateHtml(feed,template,itemTemplate,"",5);<br />
/// <br />
/// StreamWriter streamWriter = File.CreateText("c:\\rss.html");<br />
/// streamWriter.Write(html);<br />
/// streamWriter.Close();<br />
/// <br />
/// System.Diagnostics.Process.Start("c:\\rss.html");<br />
/// }<br />
/// else<br />
/// {<br />
/// MessageBox.Show("Error getting feed:\r\n" +feed.ErrorMessage,"Rss Demo App",MessageBoxButtons.OK,MessageBoxIcon.Exclamation);<br />
/// }<br />
/// </code><br />
/// </example><br />
/// </summary><br />
public class RssReader {<br />
// Events: XML document loaded, rss element found,<br />
// channel node found, item parsed, error<br />
<br />
/// <summary><br />
/// This event is fired when the feed has finished loading from the URL<br />
/// provided, into the XML parser.<br />
/// </summary><br />
public event EventHandler FeedLoaded;<br />
<br />
/// <summary><br />
/// This event is fired when the root node (typically 'rss') has<br />
/// been found in the feed.<br />
/// </summary><br />
public event EventHandler RssNodeFound;<br />
<br />
/// <summary><br />
/// This event is fired when the channel/child node of the rss node<br />
/// (typically 'channel') has been found in the feed.<br />
/// </summary><br />
public event EventHandler ChannelNodeFound;<br />
<br />
/// <summary><br />
/// This event is fired when an item is added to the <see cref="RssFeed">RssFeed</see>'s<br />
/// collection of items.<br />
/// </summary><br />
public event EventHandler ItemAdded;<br />
<br />
/// <summary><br />
/// This event is fired when an error occurs in the loading or parsing<br />
/// of the feed. The same error message is also available in the ErrorMessage<br />
/// property of the <see cref="RssFeed">RssFeed</see> object that is returned<br />
/// by the <see cref="Retrieve">Retrieve</see> method.<br />
/// </summary><br />
public event RssReaderErrorEventHandler Error;<br />
<br />
<br />
/// <summary><br />
/// The node name for the channel element<br />
/// in the RSS feed. This will rarely ever to be<br />
/// changed. Default is 'channel'.<br />
/// </summary><br />
public string RootNodeName {<br />
get {<br />
return this.rootNodeName;<br />
}<br />
set {<br />
this.rootNodeName = value;<br />
}<br />
}<br />
<br />
/// <summary><br />
/// The node name for the root rss element<br />
/// in the RSS feed. This is altered automatically to 'rdf:RDF'<br />
/// when RdfMode is set to true. Default is 'rss'.<br />
/// </summary><br />
public string ChannelNodeName {<br />
get {<br />
return this.channelNodeName;<br />
}<br />
set {<br />
this.channelNodeName = value;<br />
}<br />
}<br />
<br />
<br />
/// <summary><br />
/// If this is set to true, then the XML document<br />
/// is parsed slightly different, to cater sites with RDF feeds (such as<br />
/// slashdot.org and register.com). The whole RDF format is not supported,<br />
/// but those items in RSS which have a corresponding RDF property, such<br />
/// as description,title for the channel, and title,description for each<br />
/// item, are matched.<br />
/// </summary><br />
public bool RdfMode {<br />
get {<br />
return this.rdfMode;<br />
}<br />
set {<br />
if (value) {<br />
this.rootNodeName = "rdf:RDF";<br />
}<br />
else {<br />
this.rootNodeName = "rss";<br />
}<br />
this.rdfMode = value;<br />
}<br />
}<br />
<br />
/// <summary><br />
/// Member for the public property.<br />
/// </summary><br />
private string rootNodeName = "rss";<br />
<br />
/// <summary><br />
/// Member for the public property.<br />
/// </summary><br />
private string channelNodeName = "channel";<br />
<br />
/// <summary><br />
/// Member for the public property.<br />
/// </summary><br />
private bool rdfMode = false;<br />
<br />
/// <summary><br />
/// Retrieves a <see cref="RssFeed">RssFeed</see> object using<br />
/// the url provided as the source of the Feed.<br />
/// </summary><br />
/// <param name="Url">The url to retrieve the RSS feed from, this can<br />
/// be in the format of http:// and also file://.. (ftp?)</param><br />
/// <param name="RdfFormat">If this is set to true, then the XML document<br />
/// is parsed slightly different, to cater sites with RDF feeds (such as<br />
/// slashdot.org and register.com). The whole RDF format is not supported,<br />
/// but those items in RSS which have a corresponding RDF property, such<br />
/// as description,title for the channel, and title,description for each<br />
/// item, are matched.</param><br />
/// <returns>A <see cref="RssFeed">RssFeed</see> object from the<br />
/// RSS feed's details.</returns><br />
public static RssFeed GetFeed(string Url, bool RdfFormat) {<br />
RssReader rssReader = new RssReader();<br />
rssReader.RdfMode = RdfFormat;<br />
return rssReader.Retrieve(Url);<br />
}<br />
<br />
/// <summary><br />
/// Retrieves a <see cref="RssFeed">RssFeed</see> object using<br />
/// the url provided as the source of the Feed.<br />
/// </summary><br />
/// <param name="Url">The url to retrieve the RSS feed from, this can<br />
/// be in the format of http:// and also file://.. (ftp?)</param><br />
/// <returns>A <see cref="RssFeed">RssFeed</see> object from the<br />
/// RSS feed's details.</returns><br />
public static RssFeed GetFeed(string Url) {<br />
RssReader rssReader = new RssReader();<br />
return rssReader.Retrieve(Url);<br />
}<br />
<br />
/// <summary><br />
/// A simplified method of creating a HTML (or any document) from an<br />
/// RSS Feed. See <see cref="RssHtmlMaker">RssHtmlMaker</see><br />
/// </summary><br />
/// <param name="Feed">The <see cref="RssFeed">RssFeed</see> object to<br />
/// get the tokens' data from.</param><br />
/// <param name="Template">The overall HTML template (or any other format)<br />
/// to replace the tokens in.</param><br />
/// <param name="ItemPrefix">A string template that is prepended to the beginning<br />
/// of each RSS item.</param><br />
/// <param name="ItemSuffix">A string template that is apppended to the end<br />
/// of each RSS item.</param><br />
/// <returns>A string with the templates provided parsed of their tokens, with<br />
/// the data values in their place.</returns><br />
public static string CreateHtml(RssFeed Feed, string Template, string ItemPrefix, string ItemSuffix) {<br />
return new RssHtmlMaker().GetHtmlContents(Feed, Template, ItemPrefix, ItemSuffix);<br />
}<br />
<br />
/// <summary><br />
/// A simplified method of creating a HTML (or any document) from an<br />
/// RSS Feed. See <see cref="RssHtmlMaker">RssHtmlMaker</see><br />
/// </summary><br />
/// <param name="Feed">The <see cref="RssFeed">RssFeed</see> object to<br />
/// get the tokens' data from.</param><br />
/// <param name="Template">The overall HTML template (or any other format)<br />
/// to replace the tokens in.</param><br />
/// <param name="ItemPrefix">A string template that is prepended to the beginning<br />
/// of each RSS item.</param><br />
/// <param name="ItemSuffix">A string template that is apppended to the end<br />
/// of each RSS item.</param><br />
/// <param name="MaxItems">The maximum number of RSS items to display.</param><br />
/// <returns>A string with the templates provided parsed of their tokens, with<br />
/// the data values in their place.</returns><br />
public static string CreateHtml(RssFeed Feed, string Template, string ItemPrefix, string ItemSuffix, int MaxItems) {<br />
RssHtmlMaker rssHtmlMaker = new RssHtmlMaker();<br />
rssHtmlMaker.MaxItems = MaxItems;<br />
return rssHtmlMaker.GetHtmlContents(Feed, Template, ItemPrefix, ItemSuffix);<br />
}<br />
<br />
/// <summary><br />
/// Retrieves an RSS feed using the given Url, parses it and<br />
/// creates and new <see cref="RssFeed">RssFeed</see> object with the information.<br />
/// If an error occurs in the XML loading of the document, or parsing of<br />
/// the RSS feed, the error is trapped and stored inside the RssFeed's<br />
/// ErrorMessage property.<br />
/// </summary><br />
/// <param name="Url">The url to retrieve the RSS feed from, this can<br />
/// be in the format of http:// and also file://.. (ftp?)</param><br />
/// <returns>An <see cref="RssFeed">RssFeed</see> object with information<br />
/// retrieved from the feed.</returns><br />
public RssFeed Retrieve(string Url) {<br />
<br />
RssFeed rssFeed = new RssFeed();<br />
rssFeed.Items = new RssItems();<br />
<br />
XmlTextReader xmlTextReader = new XmlTextReader(Url);<br />
XmlValidatingReader xmlValidatingReader = new XmlValidatingReader(xmlTextReader);<br />
xmlValidatingReader.ValidationType = ValidationType.None;<br />
<br />
XmlDocument xmlDoc = new XmlDocument();<br />
<br />
try {<br />
xmlDoc.Load(xmlTextReader);<br />
<br />
// Fire the load event<br />
if (this.FeedLoaded != null) {<br />
this.FeedLoaded(this, new EventArgs());<br />
}<br />
<br />
XmlNode rssXmlNode = null;<br />
<br />
// Loop child nodes till we find the rss one<br />
for (int i = 0; i < xmlDoc.ChildNodes.Count; i++) {<br />
System.Diagnostics.Debug.Write("Child: " + xmlDoc.ChildNodes[i].Name);<br />
System.Diagnostics.Debug.WriteLine(" has " + xmlDoc.ChildNodes[i].ChildNodes.Count + " children");<br />
<br />
if (xmlDoc.ChildNodes[i].Name == this.rootNodeName && xmlDoc.ChildNodes[i].ChildNodes.Count > 0) {<br />
rssXmlNode = xmlDoc.ChildNodes[i];<br />
<br />
// Fire the found event<br />
if (this.RssNodeFound != null) {<br />
this.RssNodeFound(this, new EventArgs());<br />
}<br />
<br />
break;<br />
}<br />
}<br />
<br />
if (rssXmlNode != null) {<br />
XmlNode channelXmlNode = null;<br />
<br />
// Loop through the rss node till we find the channel<br />
for (int i = 0; i < rssXmlNode.ChildNodes.Count; i++) {<br />
System.Diagnostics.Debug.WriteLine("Rss child: " + rssXmlNode.ChildNodes[i].Name);<br />
if (rssXmlNode.ChildNodes[i].Name == this.channelNodeName && rssXmlNode.ChildNodes[i].ChildNodes.Count > 0) {<br />
channelXmlNode = rssXmlNode.ChildNodes[i];<br />
<br />
// Fire the found event<br />
if (this.ChannelNodeFound != null) {<br />
this.ChannelNodeFound(this, new EventArgs());<br />
}<br />
<br />
break;<br />
}<br />
}<br />
<br />
// Found the channel node<br />
if (channelXmlNode != null) {<br />
// Loop through its children, copying details to the<br />
// RssFeed struct, and parsing the items<br />
for (int i = 0; i < channelXmlNode.ChildNodes.Count; i++) {<br />
System.Diagnostics.Debug.WriteLine(channelXmlNode.ChildNodes[i].Name);<br />
switch (channelXmlNode.ChildNodes[i].Name) {<br />
case "title": {<br />
rssFeed.Title = channelXmlNode.ChildNodes[i].InnerText;<br />
break;<br />
}<br />
case "description": {<br />
rssFeed.Description = channelXmlNode.ChildNodes[i].InnerText;<br />
break;<br />
}<br />
case "language": {<br />
rssFeed.Language = channelXmlNode.ChildNodes[i].InnerText;<br />
break;<br />
}<br />
case "copyright": {<br />
rssFeed.Copyright = channelXmlNode.ChildNodes[i].InnerText;<br />
break;<br />
}<br />
case "webmaster": {<br />
rssFeed.Webmaster = channelXmlNode.ChildNodes[i].InnerText;<br />
break;<br />
}<br />
case "pubDate": {<br />
rssFeed.PubDate = channelXmlNode.ChildNodes[i].InnerText;<br />
break;<br />
}<br />
case "lastBuildDate": {<br />
rssFeed.LastBuildDate = channelXmlNode.ChildNodes[i].InnerText;<br />
break;<br />
}<br />
case "category": {<br />
rssFeed.Category = channelXmlNode.ChildNodes[i].InnerText;<br />
break;<br />
}<br />
case "generator": {<br />
rssFeed.Generator = channelXmlNode.ChildNodes[i].InnerText;<br />
break;<br />
}<br />
case "ttl": {<br />
rssFeed.Ttl = channelXmlNode.ChildNodes[i].InnerText;<br />
break;<br />
}<br />
case "rating": {<br />
rssFeed.Rating = channelXmlNode.ChildNodes[i].InnerText;<br />
break;<br />
}<br />
case "skipHours": {<br />
rssFeed.Skiphours = channelXmlNode.ChildNodes[i].InnerText;<br />
break;<br />
}<br />
case "skipDays": {<br />
rssFeed.Skipdays = channelXmlNode.ChildNodes[i].InnerText;<br />
break;<br />
}<br />
case "managingEditor": {<br />
rssFeed.ManagingEditor = channelXmlNode.ChildNodes[i].InnerText;<br />
break;<br />
}<br />
case "item": {<br />
rssFeed.Items.Add(this.getRssItem(channelXmlNode.ChildNodes[i]));<br />
<br />
// Fire the found event<br />
if (this.ItemAdded != null) {<br />
this.ItemAdded(this, new EventArgs());<br />
}<br />
<br />
break;<br />
}<br />
}<br />
<br />
}<br />
<br />
// If rdf mode is set, then the channel node only contains<br />
// information about the channel, it doesn't hold the item<br />
// nodes. The item nodes are children of the root node in<br />
// an RDF document, so we use this instead.<br />
if (this.RdfMode) {<br />
for (int i = 0; i < rssXmlNode.ChildNodes.Count; i++) {<br />
switch (rssXmlNode.ChildNodes[i].Name) {<br />
case "item": {<br />
rssFeed.Items.Add(this.getRssItem(rssXmlNode.ChildNodes[i]));<br />
<br />
// Fire the found event<br />
if (this.ItemAdded != null) {<br />
this.ItemAdded(this, new EventArgs());<br />
}<br />
<br />
break;<br />
}<br />
}<br />
}<br />
}<br />
}<br />
else {<br />
rssFeed.ErrorMessage = "Unable to find rss <seehannel> node";<br />
<br />
// Fire the error event<br />
if (this.Error != null) {<br />
RssReaderErrorEventArgs args = new RssReaderErrorEventArgs();<br />
args.Message = rssFeed.ErrorMessage;<br />
this.Error(this, args);<br />
}<br />
}<br />
<br />
}<br />
else {<br />
rssFeed.ErrorMessage = "Unable to find root <rss> node";<br />
<br />
// Fire the error event<br />
if (this.Error != null) {<br />
RssReaderErrorEventArgs args = new RssReaderErrorEventArgs();<br />
args.Message = rssFeed.ErrorMessage;<br />
this.Error(this, args);<br />
}<br />
}<br />
<br />
}<br />
catch (XmlException err) {<br />
//<br />
rssFeed.ErrorMessage = "Xml error: " + err.Message;<br />
<br />
// Fire the error event<br />
if (this.Error != null) {<br />
RssReaderErrorEventArgs args = new RssReaderErrorEventArgs();<br />
args.Message = rssFeed.ErrorMessage;<br />
this.Error(this, args);<br />
}<br />
return rssFeed;<br />
}<br />
<br />
return rssFeed;<br />
}<br />
<br />
/// <summary><br />
/// Creates an RSS item from an XML node with the <br />
/// corresponding child nodes (title,description etc.)<br />
/// </summary><br />
/// <param name="xmlNode">The node to extract the details from</param><br />
/// <returns>An RssItem object with details taken from the item node.</returns><br />
private RssItem getRssItem(XmlNode xmlNode) {<br />
RssItem rssItem = new RssItem();<br />
<br />
for (int i = 0; i < xmlNode.ChildNodes.Count; i++) {<br />
switch (xmlNode.ChildNodes[i].Name.ToLower()) {<br />
case "title": {<br />
rssItem.Title = xmlNode.ChildNodes[i].InnerText;<br />
break;<br />
}<br />
case "description": {<br />
rssItem.Description = xmlNode.ChildNodes[i].InnerText;<br />
break;<br />
}<br />
case "link": {<br />
rssItem.Link = xmlNode.ChildNodes[i].InnerText;<br />
break;<br />
}<br />
case "author": {<br />
rssItem.Author = xmlNode.ChildNodes[i].InnerText;<br />
break;<br />
}<br />
case "comments": {<br />
rssItem.Comments = xmlNode.ChildNodes[i].InnerText;<br />
break;<br />
}<br />
case "pubdate": {<br />
rssItem.Pubdate = xmlNode.ChildNodes[i].InnerText;<br />
break;<br />
}<br />
case "guid": {<br />
rssItem.Guid = xmlNode.ChildNodes[i].InnerText;<br />
break;<br />
}<br />
}<br />
}<br />
<br />
return rssItem;<br />
}<br />
}<br />
#endregion<br />
<br />
#region Html creator class<br />
/// <summary><br />
/// This class provides an easy method of converting a <see cref="RssFeed">RssFeed</see><br />
/// object into a simple HTML document. This document can then be written to<br />
/// file, where it can be stored in a cached state (saving a feed request each<br />
/// time the feed is required). <br />
/// </summary><br />
public class RssHtmlMaker {<br />
<br />
/// <summary><br />
/// Restricts the number of items that are displayed and replaced<br />
/// using the %Items% token in the HTML template.<br />
/// </summary><br />
public int MaxItems {<br />
get {<br />
return this.maxItems;<br />
}<br />
set {<br />
this.maxItems = value;<br />
}<br />
}<br />
<br />
/// <summary><br />
/// Member for the public property.<br />
/// </summary><br />
private int maxItems = 0;<br />
<br />
/// <summary><br />
/// Creates a HTML document, or any format - this is only limited by<br />
/// the template you provide - from the provided<br />
/// <see cref="RssFeed">RssFeed</see> object. The tokens described in the<br />
/// remarks section are replaced with their values inside the template.<br />
/// The items in the RSS feed are replaced using the ItemPrefix and ItemSuffix<br />
/// templates, where the suffix is placed face, and the suffix is appended on the end.<br />
/// </summary><br />
/// <remarks><br />
/// The following are a list of tokens which are replaced inside the main Template,<br />
/// with their corresponding values from the provided <see cref="RssFeed">RssFeed</see> <br />
/// object. For details on each token, see its corresponding property in the <br />
/// <see cref="RssFeed">RssFeed</see> object.<br />
/// <list type="bullet"><br />
/// <item>%Title%</item><br />
/// <item>%Description%</item><br />
/// <item>%Link%</item><br />
/// <item>%Language%</item><br />
/// <item>%Copyright%</item><br />
/// <item>%Webmaster%</item><br />
/// <item>%PubDate%</item><br />
/// <item>%LastBuildDate%</item><br />
/// <item>%Category%</item><br />
/// <item>%Generator%</item><br />
/// <item>%Ttl%</item><br />
/// <item>%Rating%</item><br />
/// <item>%Skiphours%</item><br />
/// <item>%Skipdays%</item><br />
/// <item>%Skipdays%</item><br />
/// <item>%Items% - This is replaced by the parsed template of the items</item><br />
/// </list><br />
/// The following are a list of tokens which are replaced inside the ItemPrefix<br />
/// and ItemSuffix templates, with their corresponding values from the <br />
/// provided <see cref="RssItem">RssItem</see> object. For details<br />
/// on each token, see its corresponding property in <br />
/// the <see cref="RssItem">RssItem</see> object.<br />
/// <list type="bullet"><br />
/// <item>%Title%</item><br />
/// <item>%Description%</item><br />
/// <item>%Link%</item><br />
/// <item>%Author%</item><br />
/// <item>%Comments%</item><br />
/// <item>%Pubdate%</item><br />
/// <item>%Guid%</item><br />
/// </list><br />
/// </remarks><br />
/// <param name="Feed">The <see cref="RssFeed">RssFeed</see> object to<br />
/// get the tokens' data from.</param><br />
/// <param name="Template">The overall HTML template (or any other format)<br />
/// to replace the tokens in.</param><br />
/// <param name="ItemPrefix">A string template that is prepended to the beginning<br />
/// of each RSS item.</param><br />
/// <param name="ItemSuffix">A string template that is apppended to the end<br />
/// of each RSS item.</param><br />
/// <returns>A string with the templates provided parsed of their tokens, with<br />
/// the data values in their place.</returns><br />
public string GetHtmlContents(RssFeed Feed, string Template, string ItemPrefix, string ItemSuffix) {<br />
string result = Template;<br />
<br />
// Replace all template tokens<br />
result = result.Replace("%Title%", Feed.Title);<br />
result = result.Replace("%Description%", Feed.Description);<br />
result = result.Replace("%Link%", Feed.Link);<br />
result = result.Replace("%Language%", Feed.Language);<br />
result = result.Replace("%Copyright%", Feed.Copyright);<br />
result = result.Replace("%Webmaster%", Feed.Webmaster);<br />
result = result.Replace("%PubDate%", Feed.PubDate);<br />
result = result.Replace("%LastBuildDate%", Feed.LastBuildDate);<br />
result = result.Replace("%Category%", Feed.Category);<br />
result = result.Replace("%Generator%", Feed.Generator);<br />
result = result.Replace("%Ttl%", Feed.Ttl);<br />
result = result.Replace("%Rating%", Feed.Rating);<br />
result = result.Replace("%Skiphours%", Feed.Skiphours);<br />
result = result.Replace("%Skipdays%", Feed.Skipdays);<br />
result = result.Replace("%Skipdays%", Feed.ManagingEditor);<br />
<br />
// Parse item template<br />
string itemsContent = "";<br />
string tempContent = "";<br />
<br />
if (maxItems == 0 || maxItems > Feed.Items.Count) {<br />
maxItems = Feed.Items.Count;<br />
}<br />
<br />
for (int i = 0; i < maxItems; i++) {<br />
// Parse prefix template<br />
tempContent = ItemPrefix;<br />
tempContent = tempContent.Replace("%Title%", Feed.Items[i].Title);<br />
tempContent = tempContent.Replace("%Description%", Feed.Items[i].Description);<br />
tempContent = tempContent.Replace("%Link%", Feed.Items[i].Link);<br />
tempContent = tempContent.Replace("%Author%", Feed.Items[i].Author);<br />
tempContent = tempContent.Replace("%Comments%", Feed.Items[i].Comments);<br />
tempContent = tempContent.Replace("%Pubdate%", Feed.Items[i].Pubdate);<br />
tempContent = tempContent.Replace("%Guid%", Feed.Items[i].Guid);<br />
<br />
itemsContent += tempContent;<br />
<br />
// Parse suffix template<br />
tempContent = ItemSuffix;<br />
tempContent = tempContent.Replace("%Title%", Feed.Items[i].Title);<br />
tempContent = tempContent.Replace("%Description%", Feed.Items[i].Description);<br />
tempContent = tempContent.Replace("%Link%", Feed.Items[i].Link);<br />
tempContent = tempContent.Replace("%Author%", Feed.Items[i].Author);<br />
tempContent = tempContent.Replace("%Comments%", Feed.Items[i].Comments);<br />
tempContent = tempContent.Replace("%Pubdate%", Feed.Items[i].Pubdate);<br />
tempContent = tempContent.Replace("%Guid%", Feed.Items[i].Guid);<br />
<br />
itemsContent += tempContent;<br />
}<br />
<br />
// Replace %items% with items<br />
result = result.Replace("%Items%", itemsContent);<br />
<br />
return result;<br />
}<br />
}<br />
#endregion<br />
<br />
#region Data structures<br />
/// <summary><br />
/// A data type to represent all properties of single RSS feed.<br />
/// (one XML document). The descriptions for<br />
/// the properties of RssItem are para-phrased from the <br />
/// <see href="http://blogs.law.harvard.edu/tech/rss">RSS 2 specification</see>.<br />
/// See <see cref="RssReader">RssReader</see> for properties which <br />
/// have not yet been implemented in this version of the<br />
/// the RssReader class.<br />
/// </summary><br />
/// <remarks><br />
/// The following elements of the RSS &lt;channel&gt; node aren't<br />
/// supported by this version of RssReader:<br />
/// <list type="bullet"><br />
/// <item>image (has subelements: image,url,title,link)</item><br />
/// <item>cloud (has attributes: domain,port,path,registerProcedure,protocol)</item><br />
/// <item>textInput (has subelements: title,description,name,link)</item><br />
/// </list><br />
/// </remarks><br />
[Serializable()]<br />
public struct RssFeed {<br />
/// <summary><br />
/// The name of the channel.<br />
/// </summary><br />
public string Title;<br />
/// <summary><br />
/// Phrase or sentence describing the channel.<br />
/// </summary><br />
public string Description;<br />
/// <summary><br />
/// The URL to the HTML website corresponding to the channel.<br />
/// </summary><br />
public string Link;<br />
<br />
// Optional items<br />
<br />
/// <summary><br />
/// The language the channel is written in. This allows <br />
/// aggregators to group all Italian language sites, for example, on a single page. <br />
/// </summary><br />
public string Language;<br />
/// <summary><br />
/// Copyright notice for content in the channel.<br />
/// </summary><br />
public string Copyright;<br />
/// <summary><br />
/// Email address for person responsible for technical issues relating to channel.<br />
/// </summary><br />
public string Webmaster;<br />
/// <summary><br />
/// The publication date for the content in the channel. <br />
/// </summary><br />
public string PubDate;<br />
/// <summary><br />
/// The last time the content of the channel changed.<br />
/// </summary><br />
public string LastBuildDate;<br />
/// <summary><br />
/// Specify one or more categories that the channel belongs to.<br />
/// </summary><br />
public string Category;<br />
/// <summary><br />
/// A string indicating the program used to generate the channel.<br />
/// </summary><br />
public string Generator;<br />
/// <summary><br />
/// ttl stands for time to live. It's a number of minutes <br />
/// that indicates how long a channel can be cached before <br />
/// refreshing from the source<br />
/// </summary><br />
public string Ttl;<br />
/// <summary><br />
/// The <see href="http://www.w3.org/PICS/">PICS</see> rating for the channel.<br />
/// </summary><br />
public string Rating;<br />
/// <summary><br />
/// A hint for aggregators telling them which hours they can skip. <br />
/// </summary><br />
public string Skiphours;<br />
/// <summary><br />
/// A hint for aggregators telling them which days they can skip. <br />
/// </summary><br />
public string Skipdays;<br />
/// <summary><br />
/// Email address for person responsible for editorial content.<br />
/// </summary><br />
public string ManagingEditor;<br />
/// <summary><br />
/// A collection of RssItem datatypes, representing each<br />
/// item for the RSS feed.<br />
/// </summary><br />
public RssItems Items;<br />
/// <summary><br />
/// Contains any errors that occured during the loading or<br />
/// parsing of the XML document. Compare this to a blank string<br />
/// to see if any errors occured.<br />
/// </summary><br />
public string ErrorMessage;<br />
}<br />
<br />
/// <summary><br />
/// A data type to represent a single<br />
/// RSS item in a RSS feed. See <see cref="RssReader">RssReader</see> for<br />
/// properties of a RSS item which have not yet been implemented <br />
/// in this version of the the RssReader class. The descriptions for<br />
/// the properties of RssItem are para-phrased from the <br />
/// <see href="http://blogs.law.harvard.edu/tech/rss">RSS 2 specification.</see><br />
/// </summary><br />
/// <remarks><br />
/// The following elements of a RSS item aren't<br />
/// supported by this version of RssReader:<br />
/// <list type="bullet"><br />
/// <item>category (can have domain attribute)</item><br />
/// <item>enclosure ( has attributes: url,length,type )</item><br />
/// <item>source (has attributes: url)</item><br />
/// </list><br />
/// </remarks><br />
[Serializable()]<br />
public struct RssItem {<br />
/// <summary><br />
/// The title of the item.<br />
/// </summary><br />
public string Title;<br />
/// <summary><br />
/// The item synopsis.<br />
/// </summary><br />
public string Description;<br />
/// <summary><br />
/// The URL of the item.<br />
/// </summary><br />
public string Link;<br />
/// <summary><br />
/// Email address of the author of the item. <br />
/// </summary><br />
public string Author;<br />
/// <summary><br />
/// URL of a page for comments relating to the item<br />
/// </summary><br />
public string Comments;<br />
/// <summary><br />
/// Indicates when the item was published. <br />
/// </summary><br />
public string Pubdate;<br />
/// <summary><br />
/// A string that uniquely identifies the item.<br />
/// </summary><br />
public string Guid;<br />
}<br />
<br />
/// <summary><br />
/// Represents a collection of RSS items for<br />
/// the RSS feed.<br />
/// </summary><br />
[Serializable()]<br />
public class RssItems : CollectionBase {<br />
public RssItem this[int item] {<br />
get {<br />
return this.getItem(item);<br />
}<br />
}<br />
<br />
public void Add(RssItem rssItem) {<br />
List.Add(rssItem);<br />
}<br />
<br />
public bool Remove(int index) {<br />
if (index > Count - 1 || index < 0) {<br />
return false;<br />
}<br />
else {<br />
List.RemoveAt(index);<br />
return true;<br />
}<br />
}<br />
<br />
private RssItem getItem(int Index) {<br />
return (RssItem)List[Index];<br />
}<br />
<br />
}<br />
#endregion<br />
}<br />
</source></div>Ajastremhttps://wiki.itcollege.ee/index.php?title=RssFeed_Retrieve&diff=6769RssFeed Retrieve2010-04-16T12:01:29Z<p>Ajastrem: New page: <source lang=csharp> </source>using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net; using System.IO; using System.Collections; using Sys...</p>
<hr />
<div><source lang=csharp><br />
<br />
</source>using System;<br />
using System.Collections.Generic;<br />
using System.Linq;<br />
using System.Text;<br />
using System.Net;<br />
using System.IO;<br />
<br />
using System.Collections;<br />
using System.Xml;<br />
<br />
namespace Scream.RSS {<br />
public class RssManager {<br />
public void GetRssItemList(string url) {<br />
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);<br />
HttpWebResponse response = (HttpWebResponse)request.GetResponse();<br />
Stream responseStream = response.GetResponseStream();<br />
<br />
Encoding BrowserEncoding = Encoding.ASCII;<br />
<br />
if (request.HaveResponse) {<br />
// Next is redirection<br />
if ((response.StatusCode == HttpStatusCode.Found) ||<br />
(response.StatusCode == HttpStatusCode.Redirect) ||<br />
(response.StatusCode == HttpStatusCode.Moved) ||<br />
(response.StatusCode == HttpStatusCode.MovedPermanently)) {<br />
// Get new location and call recursively<br />
WebHeaderCollection responseHeaders = response.Headers;<br />
request = (HttpWebRequest)WebRequest.Create(responseHeaders["Location"]);<br />
<br />
HttpWebResponse redirectedResponse = (HttpWebResponse)request.GetResponse();<br />
<br />
responseStream = redirectedResponse.GetResponseStream();<br />
}<br />
}<br />
<br />
StringBuilder stringBuilder = new StringBuilder();<br />
byte[] buffer = new byte[8192];<br />
string tempString = null;<br />
int count = 0;<br />
do {<br />
// fill the buffer with data<br />
count = responseStream.Read(buffer, 0, buffer.Length);<br />
// make sure we read some data<br />
if (count != 0) {<br />
tempString = Encoding.UTF8.GetString(Encoding.Convert(BrowserEncoding, Encoding.UTF8, buffer, 0, count));<br />
stringBuilder.Append(tempString);<br />
}<br />
}<br />
while (count > 0); // any more data to read?<br />
<br />
string html = stringBuilder.ToString();<br />
<br />
<br />
}<br />
}<br />
<br />
#region Event datatype/delegate<br />
/// <summary><br />
/// Holds details about any errors that occured<br />
/// during the loading or parsing of the RSS feed.<br />
/// </summary><br />
public class RssReaderErrorEventArgs : EventArgs {<br />
/// <summary><br />
/// The details of the error.<br />
/// </summary><br />
public string Message {<br />
get {<br />
return this.message;<br />
}<br />
set {<br />
this.message = value;<br />
}<br />
}<br />
<br />
private string message;<br />
}<br />
<br />
/// <summary><br />
/// Represents the method that will handle the RssReader error event.<br />
/// </summary><br />
public delegate void RssReaderErrorEventHandler(object sender, RssReaderErrorEventArgs e);<br />
#endregion<br />
<br />
#region RssReader class<br />
/// <summary><br />
/// The RssReader class provides a number of static methods for easy<br />
/// 1 or 2 step retrieval of RSS feeds. RSS feeds can be downloaded from any<br />
/// URL, and are then parsed into an <see cref="RssFeed">RssFeed</see> data type,<br />
/// which contains properties representing most aspects of an RSS Feed. A number<br />
/// of events are available for the calling application to register at the various<br />
/// stages of the feed request and parsing.<br />
/// <example><br />
/// The following example retrieves the RSS news feed for the BBC news website,<br />
/// and creates a HTML document from the feed's details. It saves the HTML document<br />
/// to disk, and launches the default browser with the document. The number of items<br />
/// displayed is limited to 5. If there is any error, a messagebox is displayed with<br />
/// the details of the error.<br />
/// <code><br />
/// RssFeed feed = RssReader.GetFeed("http://www.bbc.co.uk/syndication/feeds/news/ukfs_news/front_page/rss091.xml");<br />
/// <br />
/// if ( feed.ErrorMessage == null || feed.ErrorMessage == "" )<br />
/// {<br />
/// string template = "&lt;a href=\"%Link%&gt;%Title%&lt;/a&gt;&lt;br/&gt;%Description%&lt;br/&gt;&lt;br/&gt;&lt;ul&gt;%Items%&lt;/ul&gt;";<br />
/// string itemTemplate = "&lt;li&gt;&lt;a href=\"%Link%&gt;%Title%&lt;/a&gt;&lt;br/&gt;%Description%&lt;/li&gt;";<br />
/// string html = RssReader.CreateHtml(feed,template,itemTemplate,"",5);<br />
/// <br />
/// StreamWriter streamWriter = File.CreateText("c:\\rss.html");<br />
/// streamWriter.Write(html);<br />
/// streamWriter.Close();<br />
/// <br />
/// System.Diagnostics.Process.Start("c:\\rss.html");<br />
/// }<br />
/// else<br />
/// {<br />
/// MessageBox.Show("Error getting feed:\r\n" +feed.ErrorMessage,"Rss Demo App",MessageBoxButtons.OK,MessageBoxIcon.Exclamation);<br />
/// }<br />
/// </code><br />
/// </example><br />
/// </summary><br />
public class RssReader {<br />
// Events: XML document loaded, rss element found,<br />
// channel node found, item parsed, error<br />
<br />
/// <summary><br />
/// This event is fired when the feed has finished loading from the URL<br />
/// provided, into the XML parser.<br />
/// </summary><br />
public event EventHandler FeedLoaded;<br />
<br />
/// <summary><br />
/// This event is fired when the root node (typically 'rss') has<br />
/// been found in the feed.<br />
/// </summary><br />
public event EventHandler RssNodeFound;<br />
<br />
/// <summary><br />
/// This event is fired when the channel/child node of the rss node<br />
/// (typically 'channel') has been found in the feed.<br />
/// </summary><br />
public event EventHandler ChannelNodeFound;<br />
<br />
/// <summary><br />
/// This event is fired when an item is added to the <see cref="RssFeed">RssFeed</see>'s<br />
/// collection of items.<br />
/// </summary><br />
public event EventHandler ItemAdded;<br />
<br />
/// <summary><br />
/// This event is fired when an error occurs in the loading or parsing<br />
/// of the feed. The same error message is also available in the ErrorMessage<br />
/// property of the <see cref="RssFeed">RssFeed</see> object that is returned<br />
/// by the <see cref="Retrieve">Retrieve</see> method.<br />
/// </summary><br />
public event RssReaderErrorEventHandler Error;<br />
<br />
<br />
/// <summary><br />
/// The node name for the channel element<br />
/// in the RSS feed. This will rarely ever to be<br />
/// changed. Default is 'channel'.<br />
/// </summary><br />
public string RootNodeName {<br />
get {<br />
return this.rootNodeName;<br />
}<br />
set {<br />
this.rootNodeName = value;<br />
}<br />
}<br />
<br />
/// <summary><br />
/// The node name for the root rss element<br />
/// in the RSS feed. This is altered automatically to 'rdf:RDF'<br />
/// when RdfMode is set to true. Default is 'rss'.<br />
/// </summary><br />
public string ChannelNodeName {<br />
get {<br />
return this.channelNodeName;<br />
}<br />
set {<br />
this.channelNodeName = value;<br />
}<br />
}<br />
<br />
<br />
/// <summary><br />
/// If this is set to true, then the XML document<br />
/// is parsed slightly different, to cater sites with RDF feeds (such as<br />
/// slashdot.org and register.com). The whole RDF format is not supported,<br />
/// but those items in RSS which have a corresponding RDF property, such<br />
/// as description,title for the channel, and title,description for each<br />
/// item, are matched.<br />
/// </summary><br />
public bool RdfMode {<br />
get {<br />
return this.rdfMode;<br />
}<br />
set {<br />
if (value) {<br />
this.rootNodeName = "rdf:RDF";<br />
}<br />
else {<br />
this.rootNodeName = "rss";<br />
}<br />
this.rdfMode = value;<br />
}<br />
}<br />
<br />
/// <summary><br />
/// Member for the public property.<br />
/// </summary><br />
private string rootNodeName = "rss";<br />
<br />
/// <summary><br />
/// Member for the public property.<br />
/// </summary><br />
private string channelNodeName = "channel";<br />
<br />
/// <summary><br />
/// Member for the public property.<br />
/// </summary><br />
private bool rdfMode = false;<br />
<br />
/// <summary><br />
/// Retrieves a <see cref="RssFeed">RssFeed</see> object using<br />
/// the url provided as the source of the Feed.<br />
/// </summary><br />
/// <param name="Url">The url to retrieve the RSS feed from, this can<br />
/// be in the format of http:// and also file://.. (ftp?)</param><br />
/// <param name="RdfFormat">If this is set to true, then the XML document<br />
/// is parsed slightly different, to cater sites with RDF feeds (such as<br />
/// slashdot.org and register.com). The whole RDF format is not supported,<br />
/// but those items in RSS which have a corresponding RDF property, such<br />
/// as description,title for the channel, and title,description for each<br />
/// item, are matched.</param><br />
/// <returns>A <see cref="RssFeed">RssFeed</see> object from the<br />
/// RSS feed's details.</returns><br />
public static RssFeed GetFeed(string Url, bool RdfFormat) {<br />
RssReader rssReader = new RssReader();<br />
rssReader.RdfMode = RdfFormat;<br />
return rssReader.Retrieve(Url);<br />
}<br />
<br />
/// <summary><br />
/// Retrieves a <see cref="RssFeed">RssFeed</see> object using<br />
/// the url provided as the source of the Feed.<br />
/// </summary><br />
/// <param name="Url">The url to retrieve the RSS feed from, this can<br />
/// be in the format of http:// and also file://.. (ftp?)</param><br />
/// <returns>A <see cref="RssFeed">RssFeed</see> object from the<br />
/// RSS feed's details.</returns><br />
public static RssFeed GetFeed(string Url) {<br />
RssReader rssReader = new RssReader();<br />
return rssReader.Retrieve(Url);<br />
}<br />
<br />
/// <summary><br />
/// A simplified method of creating a HTML (or any document) from an<br />
/// RSS Feed. See <see cref="RssHtmlMaker">RssHtmlMaker</see><br />
/// </summary><br />
/// <param name="Feed">The <see cref="RssFeed">RssFeed</see> object to<br />
/// get the tokens' data from.</param><br />
/// <param name="Template">The overall HTML template (or any other format)<br />
/// to replace the tokens in.</param><br />
/// <param name="ItemPrefix">A string template that is prepended to the beginning<br />
/// of each RSS item.</param><br />
/// <param name="ItemSuffix">A string template that is apppended to the end<br />
/// of each RSS item.</param><br />
/// <returns>A string with the templates provided parsed of their tokens, with<br />
/// the data values in their place.</returns><br />
public static string CreateHtml(RssFeed Feed, string Template, string ItemPrefix, string ItemSuffix) {<br />
return new RssHtmlMaker().GetHtmlContents(Feed, Template, ItemPrefix, ItemSuffix);<br />
}<br />
<br />
/// <summary><br />
/// A simplified method of creating a HTML (or any document) from an<br />
/// RSS Feed. See <see cref="RssHtmlMaker">RssHtmlMaker</see><br />
/// </summary><br />
/// <param name="Feed">The <see cref="RssFeed">RssFeed</see> object to<br />
/// get the tokens' data from.</param><br />
/// <param name="Template">The overall HTML template (or any other format)<br />
/// to replace the tokens in.</param><br />
/// <param name="ItemPrefix">A string template that is prepended to the beginning<br />
/// of each RSS item.</param><br />
/// <param name="ItemSuffix">A string template that is apppended to the end<br />
/// of each RSS item.</param><br />
/// <param name="MaxItems">The maximum number of RSS items to display.</param><br />
/// <returns>A string with the templates provided parsed of their tokens, with<br />
/// the data values in their place.</returns><br />
public static string CreateHtml(RssFeed Feed, string Template, string ItemPrefix, string ItemSuffix, int MaxItems) {<br />
RssHtmlMaker rssHtmlMaker = new RssHtmlMaker();<br />
rssHtmlMaker.MaxItems = MaxItems;<br />
return rssHtmlMaker.GetHtmlContents(Feed, Template, ItemPrefix, ItemSuffix);<br />
}<br />
<br />
/// <summary><br />
/// Retrieves an RSS feed using the given Url, parses it and<br />
/// creates and new <see cref="RssFeed">RssFeed</see> object with the information.<br />
/// If an error occurs in the XML loading of the document, or parsing of<br />
/// the RSS feed, the error is trapped and stored inside the RssFeed's<br />
/// ErrorMessage property.<br />
/// </summary><br />
/// <param name="Url">The url to retrieve the RSS feed from, this can<br />
/// be in the format of http:// and also file://.. (ftp?)</param><br />
/// <returns>An <see cref="RssFeed">RssFeed</see> object with information<br />
/// retrieved from the feed.</returns><br />
public RssFeed Retrieve(string Url) {<br />
<br />
RssFeed rssFeed = new RssFeed();<br />
rssFeed.Items = new RssItems();<br />
<br />
XmlTextReader xmlTextReader = new XmlTextReader(Url);<br />
XmlValidatingReader xmlValidatingReader = new XmlValidatingReader(xmlTextReader);<br />
xmlValidatingReader.ValidationType = ValidationType.None;<br />
<br />
XmlDocument xmlDoc = new XmlDocument();<br />
<br />
try {<br />
xmlDoc.Load(xmlTextReader);<br />
<br />
// Fire the load event<br />
if (this.FeedLoaded != null) {<br />
this.FeedLoaded(this, new EventArgs());<br />
}<br />
<br />
XmlNode rssXmlNode = null;<br />
<br />
// Loop child nodes till we find the rss one<br />
for (int i = 0; i < xmlDoc.ChildNodes.Count; i++) {<br />
System.Diagnostics.Debug.Write("Child: " + xmlDoc.ChildNodes[i].Name);<br />
System.Diagnostics.Debug.WriteLine(" has " + xmlDoc.ChildNodes[i].ChildNodes.Count + " children");<br />
<br />
if (xmlDoc.ChildNodes[i].Name == this.rootNodeName && xmlDoc.ChildNodes[i].ChildNodes.Count > 0) {<br />
rssXmlNode = xmlDoc.ChildNodes[i];<br />
<br />
// Fire the found event<br />
if (this.RssNodeFound != null) {<br />
this.RssNodeFound(this, new EventArgs());<br />
}<br />
<br />
break;<br />
}<br />
}<br />
<br />
if (rssXmlNode != null) {<br />
XmlNode channelXmlNode = null;<br />
<br />
// Loop through the rss node till we find the channel<br />
for (int i = 0; i < rssXmlNode.ChildNodes.Count; i++) {<br />
System.Diagnostics.Debug.WriteLine("Rss child: " + rssXmlNode.ChildNodes[i].Name);<br />
if (rssXmlNode.ChildNodes[i].Name == this.channelNodeName && rssXmlNode.ChildNodes[i].ChildNodes.Count > 0) {<br />
channelXmlNode = rssXmlNode.ChildNodes[i];<br />
<br />
// Fire the found event<br />
if (this.ChannelNodeFound != null) {<br />
this.ChannelNodeFound(this, new EventArgs());<br />
}<br />
<br />
break;<br />
}<br />
}<br />
<br />
// Found the channel node<br />
if (channelXmlNode != null) {<br />
// Loop through its children, copying details to the<br />
// RssFeed struct, and parsing the items<br />
for (int i = 0; i < channelXmlNode.ChildNodes.Count; i++) {<br />
System.Diagnostics.Debug.WriteLine(channelXmlNode.ChildNodes[i].Name);<br />
switch (channelXmlNode.ChildNodes[i].Name) {<br />
case "title": {<br />
rssFeed.Title = channelXmlNode.ChildNodes[i].InnerText;<br />
break;<br />
}<br />
case "description": {<br />
rssFeed.Description = channelXmlNode.ChildNodes[i].InnerText;<br />
break;<br />
}<br />
case "language": {<br />
rssFeed.Language = channelXmlNode.ChildNodes[i].InnerText;<br />
break;<br />
}<br />
case "copyright": {<br />
rssFeed.Copyright = channelXmlNode.ChildNodes[i].InnerText;<br />
break;<br />
}<br />
case "webmaster": {<br />
rssFeed.Webmaster = channelXmlNode.ChildNodes[i].InnerText;<br />
break;<br />
}<br />
case "pubDate": {<br />
rssFeed.PubDate = channelXmlNode.ChildNodes[i].InnerText;<br />
break;<br />
}<br />
case "lastBuildDate": {<br />
rssFeed.LastBuildDate = channelXmlNode.ChildNodes[i].InnerText;<br />
break;<br />
}<br />
case "category": {<br />
rssFeed.Category = channelXmlNode.ChildNodes[i].InnerText;<br />
break;<br />
}<br />
case "generator": {<br />
rssFeed.Generator = channelXmlNode.ChildNodes[i].InnerText;<br />
break;<br />
}<br />
case "ttl": {<br />
rssFeed.Ttl = channelXmlNode.ChildNodes[i].InnerText;<br />
break;<br />
}<br />
case "rating": {<br />
rssFeed.Rating = channelXmlNode.ChildNodes[i].InnerText;<br />
break;<br />
}<br />
case "skipHours": {<br />
rssFeed.Skiphours = channelXmlNode.ChildNodes[i].InnerText;<br />
break;<br />
}<br />
case "skipDays": {<br />
rssFeed.Skipdays = channelXmlNode.ChildNodes[i].InnerText;<br />
break;<br />
}<br />
case "managingEditor": {<br />
rssFeed.ManagingEditor = channelXmlNode.ChildNodes[i].InnerText;<br />
break;<br />
}<br />
case "item": {<br />
rssFeed.Items.Add(this.getRssItem(channelXmlNode.ChildNodes[i]));<br />
<br />
// Fire the found event<br />
if (this.ItemAdded != null) {<br />
this.ItemAdded(this, new EventArgs());<br />
}<br />
<br />
break;<br />
}<br />
}<br />
<br />
}<br />
<br />
// If rdf mode is set, then the channel node only contains<br />
// information about the channel, it doesn't hold the item<br />
// nodes. The item nodes are children of the root node in<br />
// an RDF document, so we use this instead.<br />
if (this.RdfMode) {<br />
for (int i = 0; i < rssXmlNode.ChildNodes.Count; i++) {<br />
switch (rssXmlNode.ChildNodes[i].Name) {<br />
case "item": {<br />
rssFeed.Items.Add(this.getRssItem(rssXmlNode.ChildNodes[i]));<br />
<br />
// Fire the found event<br />
if (this.ItemAdded != null) {<br />
this.ItemAdded(this, new EventArgs());<br />
}<br />
<br />
break;<br />
}<br />
}<br />
}<br />
}<br />
}<br />
else {<br />
rssFeed.ErrorMessage = "Unable to find rss <seehannel> node";<br />
<br />
// Fire the error event<br />
if (this.Error != null) {<br />
RssReaderErrorEventArgs args = new RssReaderErrorEventArgs();<br />
args.Message = rssFeed.ErrorMessage;<br />
this.Error(this, args);<br />
}<br />
}<br />
<br />
}<br />
else {<br />
rssFeed.ErrorMessage = "Unable to find root <rss> node";<br />
<br />
// Fire the error event<br />
if (this.Error != null) {<br />
RssReaderErrorEventArgs args = new RssReaderErrorEventArgs();<br />
args.Message = rssFeed.ErrorMessage;<br />
this.Error(this, args);<br />
}<br />
}<br />
<br />
}<br />
catch (XmlException err) {<br />
//<br />
rssFeed.ErrorMessage = "Xml error: " + err.Message;<br />
<br />
// Fire the error event<br />
if (this.Error != null) {<br />
RssReaderErrorEventArgs args = new RssReaderErrorEventArgs();<br />
args.Message = rssFeed.ErrorMessage;<br />
this.Error(this, args);<br />
}<br />
return rssFeed;<br />
}<br />
<br />
return rssFeed;<br />
}<br />
<br />
/// <summary><br />
/// Creates an RSS item from an XML node with the <br />
/// corresponding child nodes (title,description etc.)<br />
/// </summary><br />
/// <param name="xmlNode">The node to extract the details from</param><br />
/// <returns>An RssItem object with details taken from the item node.</returns><br />
private RssItem getRssItem(XmlNode xmlNode) {<br />
RssItem rssItem = new RssItem();<br />
<br />
for (int i = 0; i < xmlNode.ChildNodes.Count; i++) {<br />
switch (xmlNode.ChildNodes[i].Name.ToLower()) {<br />
case "title": {<br />
rssItem.Title = xmlNode.ChildNodes[i].InnerText;<br />
break;<br />
}<br />
case "description": {<br />
rssItem.Description = xmlNode.ChildNodes[i].InnerText;<br />
break;<br />
}<br />
case "link": {<br />
rssItem.Link = xmlNode.ChildNodes[i].InnerText;<br />
break;<br />
}<br />
case "author": {<br />
rssItem.Author = xmlNode.ChildNodes[i].InnerText;<br />
break;<br />
}<br />
case "comments": {<br />
rssItem.Comments = xmlNode.ChildNodes[i].InnerText;<br />
break;<br />
}<br />
case "pubdate": {<br />
rssItem.Pubdate = xmlNode.ChildNodes[i].InnerText;<br />
break;<br />
}<br />
case "guid": {<br />
rssItem.Guid = xmlNode.ChildNodes[i].InnerText;<br />
break;<br />
}<br />
}<br />
}<br />
<br />
return rssItem;<br />
}<br />
}<br />
#endregion<br />
<br />
#region Html creator class<br />
/// <summary><br />
/// This class provides an easy method of converting a <see cref="RssFeed">RssFeed</see><br />
/// object into a simple HTML document. This document can then be written to<br />
/// file, where it can be stored in a cached state (saving a feed request each<br />
/// time the feed is required). <br />
/// </summary><br />
public class RssHtmlMaker {<br />
<br />
/// <summary><br />
/// Restricts the number of items that are displayed and replaced<br />
/// using the %Items% token in the HTML template.<br />
/// </summary><br />
public int MaxItems {<br />
get {<br />
return this.maxItems;<br />
}<br />
set {<br />
this.maxItems = value;<br />
}<br />
}<br />
<br />
/// <summary><br />
/// Member for the public property.<br />
/// </summary><br />
private int maxItems = 0;<br />
<br />
/// <summary><br />
/// Creates a HTML document, or any format - this is only limited by<br />
/// the template you provide - from the provided<br />
/// <see cref="RssFeed">RssFeed</see> object. The tokens described in the<br />
/// remarks section are replaced with their values inside the template.<br />
/// The items in the RSS feed are replaced using the ItemPrefix and ItemSuffix<br />
/// templates, where the suffix is placed face, and the suffix is appended on the end.<br />
/// </summary><br />
/// <remarks><br />
/// The following are a list of tokens which are replaced inside the main Template,<br />
/// with their corresponding values from the provided <see cref="RssFeed">RssFeed</see> <br />
/// object. For details on each token, see its corresponding property in the <br />
/// <see cref="RssFeed">RssFeed</see> object.<br />
/// <list type="bullet"><br />
/// <item>%Title%</item><br />
/// <item>%Description%</item><br />
/// <item>%Link%</item><br />
/// <item>%Language%</item><br />
/// <item>%Copyright%</item><br />
/// <item>%Webmaster%</item><br />
/// <item>%PubDate%</item><br />
/// <item>%LastBuildDate%</item><br />
/// <item>%Category%</item><br />
/// <item>%Generator%</item><br />
/// <item>%Ttl%</item><br />
/// <item>%Rating%</item><br />
/// <item>%Skiphours%</item><br />
/// <item>%Skipdays%</item><br />
/// <item>%Skipdays%</item><br />
/// <item>%Items% - This is replaced by the parsed template of the items</item><br />
/// </list><br />
/// The following are a list of tokens which are replaced inside the ItemPrefix<br />
/// and ItemSuffix templates, with their corresponding values from the <br />
/// provided <see cref="RssItem">RssItem</see> object. For details<br />
/// on each token, see its corresponding property in <br />
/// the <see cref="RssItem">RssItem</see> object.<br />
/// <list type="bullet"><br />
/// <item>%Title%</item><br />
/// <item>%Description%</item><br />
/// <item>%Link%</item><br />
/// <item>%Author%</item><br />
/// <item>%Comments%</item><br />
/// <item>%Pubdate%</item><br />
/// <item>%Guid%</item><br />
/// </list><br />
/// </remarks><br />
/// <param name="Feed">The <see cref="RssFeed">RssFeed</see> object to<br />
/// get the tokens' data from.</param><br />
/// <param name="Template">The overall HTML template (or any other format)<br />
/// to replace the tokens in.</param><br />
/// <param name="ItemPrefix">A string template that is prepended to the beginning<br />
/// of each RSS item.</param><br />
/// <param name="ItemSuffix">A string template that is apppended to the end<br />
/// of each RSS item.</param><br />
/// <returns>A string with the templates provided parsed of their tokens, with<br />
/// the data values in their place.</returns><br />
public string GetHtmlContents(RssFeed Feed, string Template, string ItemPrefix, string ItemSuffix) {<br />
string result = Template;<br />
<br />
// Replace all template tokens<br />
result = result.Replace("%Title%", Feed.Title);<br />
result = result.Replace("%Description%", Feed.Description);<br />
result = result.Replace("%Link%", Feed.Link);<br />
result = result.Replace("%Language%", Feed.Language);<br />
result = result.Replace("%Copyright%", Feed.Copyright);<br />
result = result.Replace("%Webmaster%", Feed.Webmaster);<br />
result = result.Replace("%PubDate%", Feed.PubDate);<br />
result = result.Replace("%LastBuildDate%", Feed.LastBuildDate);<br />
result = result.Replace("%Category%", Feed.Category);<br />
result = result.Replace("%Generator%", Feed.Generator);<br />
result = result.Replace("%Ttl%", Feed.Ttl);<br />
result = result.Replace("%Rating%", Feed.Rating);<br />
result = result.Replace("%Skiphours%", Feed.Skiphours);<br />
result = result.Replace("%Skipdays%", Feed.Skipdays);<br />
result = result.Replace("%Skipdays%", Feed.ManagingEditor);<br />
<br />
// Parse item template<br />
string itemsContent = "";<br />
string tempContent = "";<br />
<br />
if (maxItems == 0 || maxItems > Feed.Items.Count) {<br />
maxItems = Feed.Items.Count;<br />
}<br />
<br />
for (int i = 0; i < maxItems; i++) {<br />
// Parse prefix template<br />
tempContent = ItemPrefix;<br />
tempContent = tempContent.Replace("%Title%", Feed.Items[i].Title);<br />
tempContent = tempContent.Replace("%Description%", Feed.Items[i].Description);<br />
tempContent = tempContent.Replace("%Link%", Feed.Items[i].Link);<br />
tempContent = tempContent.Replace("%Author%", Feed.Items[i].Author);<br />
tempContent = tempContent.Replace("%Comments%", Feed.Items[i].Comments);<br />
tempContent = tempContent.Replace("%Pubdate%", Feed.Items[i].Pubdate);<br />
tempContent = tempContent.Replace("%Guid%", Feed.Items[i].Guid);<br />
<br />
itemsContent += tempContent;<br />
<br />
// Parse suffix template<br />
tempContent = ItemSuffix;<br />
tempContent = tempContent.Replace("%Title%", Feed.Items[i].Title);<br />
tempContent = tempContent.Replace("%Description%", Feed.Items[i].Description);<br />
tempContent = tempContent.Replace("%Link%", Feed.Items[i].Link);<br />
tempContent = tempContent.Replace("%Author%", Feed.Items[i].Author);<br />
tempContent = tempContent.Replace("%Comments%", Feed.Items[i].Comments);<br />
tempContent = tempContent.Replace("%Pubdate%", Feed.Items[i].Pubdate);<br />
tempContent = tempContent.Replace("%Guid%", Feed.Items[i].Guid);<br />
<br />
itemsContent += tempContent;<br />
}<br />
<br />
// Replace %items% with items<br />
result = result.Replace("%Items%", itemsContent);<br />
<br />
return result;<br />
}<br />
}<br />
#endregion<br />
<br />
#region Data structures<br />
/// <summary><br />
/// A data type to represent all properties of single RSS feed.<br />
/// (one XML document). The descriptions for<br />
/// the properties of RssItem are para-phrased from the <br />
/// <see href="http://blogs.law.harvard.edu/tech/rss">RSS 2 specification</see>.<br />
/// See <see cref="RssReader">RssReader</see> for properties which <br />
/// have not yet been implemented in this version of the<br />
/// the RssReader class.<br />
/// </summary><br />
/// <remarks><br />
/// The following elements of the RSS &lt;channel&gt; node aren't<br />
/// supported by this version of RssReader:<br />
/// <list type="bullet"><br />
/// <item>image (has subelements: image,url,title,link)</item><br />
/// <item>cloud (has attributes: domain,port,path,registerProcedure,protocol)</item><br />
/// <item>textInput (has subelements: title,description,name,link)</item><br />
/// </list><br />
/// </remarks><br />
[Serializable()]<br />
public struct RssFeed {<br />
/// <summary><br />
/// The name of the channel.<br />
/// </summary><br />
public string Title;<br />
/// <summary><br />
/// Phrase or sentence describing the channel.<br />
/// </summary><br />
public string Description;<br />
/// <summary><br />
/// The URL to the HTML website corresponding to the channel.<br />
/// </summary><br />
public string Link;<br />
<br />
// Optional items<br />
<br />
/// <summary><br />
/// The language the channel is written in. This allows <br />
/// aggregators to group all Italian language sites, for example, on a single page. <br />
/// </summary><br />
public string Language;<br />
/// <summary><br />
/// Copyright notice for content in the channel.<br />
/// </summary><br />
public string Copyright;<br />
/// <summary><br />
/// Email address for person responsible for technical issues relating to channel.<br />
/// </summary><br />
public string Webmaster;<br />
/// <summary><br />
/// The publication date for the content in the channel. <br />
/// </summary><br />
public string PubDate;<br />
/// <summary><br />
/// The last time the content of the channel changed.<br />
/// </summary><br />
public string LastBuildDate;<br />
/// <summary><br />
/// Specify one or more categories that the channel belongs to.<br />
/// </summary><br />
public string Category;<br />
/// <summary><br />
/// A string indicating the program used to generate the channel.<br />
/// </summary><br />
public string Generator;<br />
/// <summary><br />
/// ttl stands for time to live. It's a number of minutes <br />
/// that indicates how long a channel can be cached before <br />
/// refreshing from the source<br />
/// </summary><br />
public string Ttl;<br />
/// <summary><br />
/// The <see href="http://www.w3.org/PICS/">PICS</see> rating for the channel.<br />
/// </summary><br />
public string Rating;<br />
/// <summary><br />
/// A hint for aggregators telling them which hours they can skip. <br />
/// </summary><br />
public string Skiphours;<br />
/// <summary><br />
/// A hint for aggregators telling them which days they can skip. <br />
/// </summary><br />
public string Skipdays;<br />
/// <summary><br />
/// Email address for person responsible for editorial content.<br />
/// </summary><br />
public string ManagingEditor;<br />
/// <summary><br />
/// A collection of RssItem datatypes, representing each<br />
/// item for the RSS feed.<br />
/// </summary><br />
public RssItems Items;<br />
/// <summary><br />
/// Contains any errors that occured during the loading or<br />
/// parsing of the XML document. Compare this to a blank string<br />
/// to see if any errors occured.<br />
/// </summary><br />
public string ErrorMessage;<br />
}<br />
<br />
/// <summary><br />
/// A data type to represent a single<br />
/// RSS item in a RSS feed. See <see cref="RssReader">RssReader</see> for<br />
/// properties of a RSS item which have not yet been implemented <br />
/// in this version of the the RssReader class. The descriptions for<br />
/// the properties of RssItem are para-phrased from the <br />
/// <see href="http://blogs.law.harvard.edu/tech/rss">RSS 2 specification.</see><br />
/// </summary><br />
/// <remarks><br />
/// The following elements of a RSS item aren't<br />
/// supported by this version of RssReader:<br />
/// <list type="bullet"><br />
/// <item>category (can have domain attribute)</item><br />
/// <item>enclosure ( has attributes: url,length,type )</item><br />
/// <item>source (has attributes: url)</item><br />
/// </list><br />
/// </remarks><br />
[Serializable()]<br />
public struct RssItem {<br />
/// <summary><br />
/// The title of the item.<br />
/// </summary><br />
public string Title;<br />
/// <summary><br />
/// The item synopsis.<br />
/// </summary><br />
public string Description;<br />
/// <summary><br />
/// The URL of the item.<br />
/// </summary><br />
public string Link;<br />
/// <summary><br />
/// Email address of the author of the item. <br />
/// </summary><br />
public string Author;<br />
/// <summary><br />
/// URL of a page for comments relating to the item<br />
/// </summary><br />
public string Comments;<br />
/// <summary><br />
/// Indicates when the item was published. <br />
/// </summary><br />
public string Pubdate;<br />
/// <summary><br />
/// A string that uniquely identifies the item.<br />
/// </summary><br />
public string Guid;<br />
}<br />
<br />
/// <summary><br />
/// Represents a collection of RSS items for<br />
/// the RSS feed.<br />
/// </summary><br />
[Serializable()]<br />
public class RssItems : CollectionBase {<br />
public RssItem this[int item] {<br />
get {<br />
return this.getItem(item);<br />
}<br />
}<br />
<br />
public void Add(RssItem rssItem) {<br />
List.Add(rssItem);<br />
}<br />
<br />
public bool Remove(int index) {<br />
if (index > Count - 1 || index < 0) {<br />
return false;<br />
}<br />
else {<br />
List.RemoveAt(index);<br />
return true;<br />
}<br />
}<br />
<br />
private RssItem getItem(int Index) {<br />
return (RssItem)List[Index];<br />
}<br />
<br />
}<br />
#endregion<br />
}</div>Ajastremhttps://wiki.itcollege.ee/index.php?title=RSS_voogude_v%C3%A4rskete_uudiste_korjamise_rakendus&diff=6768RSS voogude värskete uudiste korjamise rakendus2010-04-16T12:00:30Z<p>Ajastrem: </p>
<hr />
<div><p><br />
Idee oli koostada webi teenus mis oskaks kasutajate RSS voogude nimekirjast koostada viimaste uudiste nimekiri.<br />
<br /><br />
<br />Probleemide nimekiri oli teada: <br />
<br />1) RSS voogud on disaini poolest erinevad <br />
<br />2) RSS aja formaati standart on uurimata <br />
<br />3) Uudiste sünkrooniline uuendamine on aeglane <br />
<br /><br />
<br />Pakkutav lahendus oli: <br />
<br />1) Rakenduses kasutakse ainult ühine osa RSS voogudest <br />
<br />2) Aja formaat uurida ja leida lahendust <br />
<br />3) Uudised uuendada asünkroonselt <br />
<br /><br />
<br />Rakendus on paigaldatud siin [https://networksolutions2.googlecode.com/svn/trunk siin] ([https://www.googlecode.com google code])<br />
<br />Koodi saab kätte SVN kliendi abil, näiteks [http://tortoisesvn.net/downloads tortoise SVN]<br />
<br /><br />
<br />Huuvitavad kohad koodist: <br />
<br />[[Rfc822DateTimeFormat csharp]] RSS aja standarti c# implementatsioon <br />
<source lang=csharp>public static string[] Rfc822DateTimePatterns {<br />
get {<br />
formats = new string[35];<br />
<br />
// two-digit day, four-digit year patterns<br />
formats[0] = "ddd',' dd MMM yyyy HH':'mm':'ss'.'fffffff zzzz";<br />
</source><br />
<br />[[RssFeed Retrieve]] RSS voogu uudiste nimekiri kätte saamine<br />
<source lang=csharp>/// <summary><br />
/// Retrieves an RSS feed using the given Url, parses it and<br />
/// creates and new <see cref="RssFeed">RssFeed</see> object with the information.<br />
/// If an error occurs in the XML loading of the document, or parsing of<br />
/// the RSS feed, the error is trapped and stored inside the RssFeed's<br />
/// ErrorMessage property.<br />
/// </summary><br />
/// <param name="Url">The url to retrieve the RSS feed from, this can<br />
/// be in the format of http:// and also file://.. (ftp?)</param><br />
/// <returns>An <see cref="RssFeed">RssFeed</see> object with information<br />
/// retrieved from the feed.</returns><br />
public RssFeed Retrieve(string Url) {<br />
</source><br />
</p></div>Ajastremhttps://wiki.itcollege.ee/index.php?title=Rfc822DateTimeFormat_csharp&diff=6767Rfc822DateTimeFormat csharp2010-04-16T11:20:42Z<p>Ajastrem: New page: <source lang=csharp> using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Globalization; namespace Scream.RSS { /// <summary> /// P...</p>
<hr />
<div><source lang=csharp><br />
using System;<br />
using System.Collections.Generic;<br />
using System.Linq;<br />
using System.Text;<br />
using System.Globalization;<br />
<br />
namespace Scream.RSS {<br />
<br />
<br />
/// <summary><br />
/// Provides methods for converting <see cref="DateTime"/> structures <br />
/// to and from the equivalent <a href="http://www.w3.org/Protocols/rfc822/#z28">RFC 822</a> <br />
/// string representation.<br />
/// </summary><br />
public class Rfc822DateTime {<br />
//============================================================<br />
// Private members<br />
//============================================================<br />
#region Private Members<br />
/// <summary><br />
/// Private member to hold array of formats that RFC 822 date-time representations conform to.<br />
/// </summary><br />
private static string[] formats = new string[0];<br />
/// <summary><br />
/// Private member to hold the DateTime format string for representing a DateTime in the RFC 822 format.<br />
/// </summary><br />
private const string format = "ddd, dd MMM yyyy HH:mm:ss K";<br />
#endregion<br />
<br />
//============================================================<br />
// Public Properties<br />
//============================================================<br />
#region Rfc822DateTimeFormat<br />
/// <summary><br />
/// Gets the custom format specifier that may be used to represent a <see cref="DateTime"/> in the RFC 822 format.<br />
/// </summary><br />
/// <value>A <i>DateTime format string</i> that may be used to represent a <see cref="DateTime"/> in the RFC 822 format.</value><br />
/// <remarks><br />
/// <para><br />
/// This method returns a string representation of a <see cref="DateTime"/> that utilizes the time zone <br />
/// offset (local differential) to represent the offset from Greenwich mean time in hours and minutes. <br />
/// The <see cref="Rfc822DateTimeFormat"/> is a valid date-time format string for use <br />
/// in the <see cref="DateTime.ToString(String, IFormatProvider)"/> method.<br />
/// </para><br />
/// <para><br />
/// The <a href="http://www.w3.org/Protocols/rfc822/#z28">RFC 822</a> Date and Time specification <br />
/// specifies that the year will be represented as a two-digit value, but the <br />
/// <a href="http://www.rssboard.org/rss-profile#data-types-datetime">RSS Profile</a> recommends that <br />
/// all date-time values should use a four-digit year. The <see cref="Rfc822DateTime"/> class <br />
/// follows the RSS Profile recommendation when converting a <see cref="DateTime"/> to the equivalent <br />
/// RFC 822 string representation.<br />
/// </para><br />
/// </remarks><br />
public static string Rfc822DateTimeFormat {<br />
get {<br />
return format;<br />
}<br />
}<br />
#endregion<br />
<br />
#region Rfc822DateTimePatterns<br />
/// <summary><br />
/// Gets an array of the expected formats for RFC 822 date-time string representations.<br />
/// </summary><br />
/// <value><br />
/// An array of the expected formats for RFC 822 date-time string representations <br />
/// that may used in the <see cref="DateTime.TryParseExact(String, string[], IFormatProvider, DateTimeStyles, out DateTime)"/> method.<br />
/// </value><br />
/// <remarks><br />
/// The array of the expected formats that is returned assumes that the RFC 822 time zone <br />
/// is represented as or converted to a local differential representation.<br />
/// </remarks><br />
/// <seealso cref="ConvertZoneToLocalDifferential(String)"/><br />
public static string[] Rfc822DateTimePatterns {<br />
get {<br />
if (formats.Length > 0) {<br />
return formats;<br />
}<br />
else {<br />
formats = new string[35];<br />
<br />
// two-digit day, four-digit year patterns<br />
formats[0] = "ddd',' dd MMM yyyy HH':'mm':'ss'.'fffffff zzzz";<br />
formats[1] = "ddd',' dd MMM yyyy HH':'mm':'ss'.'ffffff zzzz";<br />
formats[2] = "ddd',' dd MMM yyyy HH':'mm':'ss'.'fffff zzzz";<br />
formats[3] = "ddd',' dd MMM yyyy HH':'mm':'ss'.'ffff zzzz";<br />
formats[4] = "ddd',' dd MMM yyyy HH':'mm':'ss'.'fff zzzz";<br />
formats[5] = "ddd',' dd MMM yyyy HH':'mm':'ss'.'ff zzzz";<br />
formats[6] = "ddd',' dd MMM yyyy HH':'mm':'ss'.'f zzzz";<br />
formats[7] = "ddd',' dd MMM yyyy HH':'mm':'ss zzzz";<br />
<br />
// two-digit day, two-digit year patterns<br />
formats[8] = "ddd',' dd MMM yy HH':'mm':'ss'.'fffffff zzzz";<br />
formats[9] = "ddd',' dd MMM yy HH':'mm':'ss'.'ffffff zzzz";<br />
formats[10] = "ddd',' dd MMM yy HH':'mm':'ss'.'fffff zzzz";<br />
formats[11] = "ddd',' dd MMM yy HH':'mm':'ss'.'ffff zzzz";<br />
formats[12] = "ddd',' dd MMM yy HH':'mm':'ss'.'fff zzzz";<br />
formats[13] = "ddd',' dd MMM yy HH':'mm':'ss'.'ff zzzz";<br />
formats[14] = "ddd',' dd MMM yy HH':'mm':'ss'.'f zzzz";<br />
formats[15] = "ddd',' dd MMM yy HH':'mm':'ss zzzz";<br />
<br />
// one-digit day, four-digit year patterns<br />
formats[16] = "ddd',' d MMM yyyy HH':'mm':'ss'.'fffffff zzzz";<br />
formats[17] = "ddd',' d MMM yyyy HH':'mm':'ss'.'ffffff zzzz";<br />
formats[18] = "ddd',' d MMM yyyy HH':'mm':'ss'.'fffff zzzz";<br />
formats[19] = "ddd',' d MMM yyyy HH':'mm':'ss'.'ffff zzzz";<br />
formats[20] = "ddd',' d MMM yyyy HH':'mm':'ss'.'fff zzzz";<br />
formats[21] = "ddd',' d MMM yyyy HH':'mm':'ss'.'ff zzzz";<br />
formats[22] = "ddd',' d MMM yyyy HH':'mm':'ss'.'f zzzz";<br />
formats[23] = "ddd',' d MMM yyyy HH':'mm':'ss zzzz";<br />
<br />
// two-digit day, two-digit year patterns<br />
formats[24] = "ddd',' d MMM yy HH':'mm':'ss'.'fffffff zzzz";<br />
formats[25] = "ddd',' d MMM yy HH':'mm':'ss'.'ffffff zzzz";<br />
formats[26] = "ddd',' d MMM yy HH':'mm':'ss'.'fffff zzzz";<br />
formats[27] = "ddd',' d MMM yy HH':'mm':'ss'.'ffff zzzz";<br />
formats[28] = "ddd',' d MMM yy HH':'mm':'ss'.'fff zzzz";<br />
formats[29] = "ddd',' d MMM yy HH':'mm':'ss'.'ff zzzz";<br />
formats[30] = "ddd',' d MMM yy HH':'mm':'ss'.'f zzzz";<br />
formats[31] = "ddd',' d MMM yy HH':'mm':'ss zzzz";<br />
<br />
// Fall back patterns<br />
formats[32] = "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK"; // RoundtripDateTimePattern<br />
formats[33] = DateTimeFormatInfo.InvariantInfo.UniversalSortableDateTimePattern;<br />
formats[34] = DateTimeFormatInfo.InvariantInfo.SortableDateTimePattern;<br />
<br />
return formats;<br />
}<br />
}<br />
}<br />
#endregion<br />
<br />
public static void ArgumentNotNullOrEmptyString(string arg, string s) {<br />
if (arg == null || arg.Trim().Length == 0) throw new Exception("Argument is null or is Empty string");<br />
}<br />
<br />
//============================================================<br />
// Public Methods<br />
//============================================================<br />
#region Parse(string s)<br />
/// <summary><br />
/// Converts the specified string representation of a date and time to its <see cref="DateTime"/> equivalent.<br />
/// </summary><br />
/// <param name="s">A string containing a date and time to convert.</param><br />
/// <returns><br />
/// A <see cref="DateTime"/> equivalent to the date and time contained in <paramref name="s"/>, <br />
/// expressed as <i>Coordinated Universal Time (UTC)</i>.<br />
/// </returns><br />
/// <remarks><br />
/// The string <paramref name="s"/> is parsed using formatting information in the <see cref="DateTimeFormatInfo.InvariantInfo"/> object.<br />
/// </remarks><br />
/// <exception cref="ArgumentNullException"><paramref name="s"/> is a <b>null</b> reference (Nothing in Visual Basic).</exception><br />
/// <exception cref="ArgumentNullException"><paramref name="s"/> is an empty string.</exception><br />
/// <exception cref="FormatException"><paramref name="s"/> does not contain a valid RFC 822 string representation of a date and time.</exception><br />
public static DateTime Parse(string s) {<br />
//------------------------------------------------------------<br />
// Validate parameter<br />
//------------------------------------------------------------<br />
// Guard.<br />
ArgumentNotNullOrEmptyString(s, "s");<br />
<br />
DateTime result;<br />
if (Rfc822DateTime.TryParse(s, out result)) {<br />
return result;<br />
}<br />
else {<br />
throw new FormatException(String.Format(null, "{0} is not a valid RFC 822 string representation of a date and time.", s));<br />
}<br />
}<br />
#endregion<br />
<br />
#region ConvertZoneToLocalDifferential(string s)<br />
/// <summary><br />
/// Converts the time zone component of an RFC 822 date and time string representation to its local differential (time zone offset).<br />
/// </summary><br />
/// <param name="s">A string containing an RFC 822 date and time to convert.</param><br />
/// <returns>A date and time string that uses local differential to describe the time zone equivalent to the date and time contained in <paramref name="s"/>.</returns><br />
/// <exception cref="ArgumentNullException"><paramref name="s"/> is a <b>null</b> reference (Nothing in Visual Basic).</exception><br />
/// <exception cref="ArgumentNullException"><paramref name="s"/> is an empty string.</exception><br />
public static string ConvertZoneToLocalDifferential(string s) {<br />
string zoneRepresentedAsLocalDifferential = String.Empty;<br />
<br />
//------------------------------------------------------------<br />
// Validate parameter<br />
//------------------------------------------------------------<br />
//Guard.<br />
ArgumentNotNullOrEmptyString(s, "s");<br />
<br />
if (s.EndsWith(" UT", StringComparison.OrdinalIgnoreCase)) {<br />
zoneRepresentedAsLocalDifferential = String.Concat(s.Substring(0, (s.LastIndexOf(" UT") + 1)), "+00:00");<br />
}<br />
else if (s.EndsWith(" GMT", StringComparison.OrdinalIgnoreCase)) {<br />
zoneRepresentedAsLocalDifferential = String.Concat(s.Substring(0, (s.LastIndexOf(" GMT") + 1)), "+00:00");<br />
}<br />
else if (s.EndsWith(" EST", StringComparison.OrdinalIgnoreCase)) {<br />
zoneRepresentedAsLocalDifferential = String.Concat(s.Substring(0, (s.LastIndexOf(" EST") + 1)), "-05:00");<br />
}<br />
else if (s.EndsWith(" EDT", StringComparison.OrdinalIgnoreCase)) {<br />
zoneRepresentedAsLocalDifferential = String.Concat(s.Substring(0, (s.LastIndexOf(" EDT") + 1)), "-04:00");<br />
}<br />
else if (s.EndsWith(" CST", StringComparison.OrdinalIgnoreCase)) {<br />
zoneRepresentedAsLocalDifferential = String.Concat(s.Substring(0, (s.LastIndexOf(" CST") + 1)), "-06:00");<br />
}<br />
else if (s.EndsWith(" CDT", StringComparison.OrdinalIgnoreCase)) {<br />
zoneRepresentedAsLocalDifferential = String.Concat(s.Substring(0, (s.LastIndexOf(" CDT") + 1)), "-05:00");<br />
}<br />
else if (s.EndsWith(" MST", StringComparison.OrdinalIgnoreCase)) {<br />
zoneRepresentedAsLocalDifferential = String.Concat(s.Substring(0, (s.LastIndexOf(" MST") + 1)), "-07:00");<br />
}<br />
else if (s.EndsWith(" MDT", StringComparison.OrdinalIgnoreCase)) {<br />
zoneRepresentedAsLocalDifferential = String.Concat(s.Substring(0, (s.LastIndexOf(" MDT") + 1)), "-06:00");<br />
}<br />
else if (s.EndsWith(" PST", StringComparison.OrdinalIgnoreCase)) {<br />
zoneRepresentedAsLocalDifferential = String.Concat(s.Substring(0, (s.LastIndexOf(" PST") + 1)), "-08:00");<br />
}<br />
else if (s.EndsWith(" PDT", StringComparison.OrdinalIgnoreCase)) {<br />
zoneRepresentedAsLocalDifferential = String.Concat(s.Substring(0, (s.LastIndexOf(" PDT") + 1)), "-07:00");<br />
}<br />
else if (s.EndsWith(" Z", StringComparison.OrdinalIgnoreCase)) {<br />
zoneRepresentedAsLocalDifferential = String.Concat(s.Substring(0, (s.LastIndexOf(" Z") + 1)), "+00:00");<br />
}<br />
else if (s.EndsWith(" A", StringComparison.OrdinalIgnoreCase)) {<br />
zoneRepresentedAsLocalDifferential = String.Concat(s.Substring(0, (s.LastIndexOf(" A") + 1)), "-01:00");<br />
}<br />
else if (s.EndsWith(" M", StringComparison.OrdinalIgnoreCase)) {<br />
zoneRepresentedAsLocalDifferential = String.Concat(s.Substring(0, (s.LastIndexOf(" M") + 1)), "-12:00");<br />
}<br />
else if (s.EndsWith(" N", StringComparison.OrdinalIgnoreCase)) {<br />
zoneRepresentedAsLocalDifferential = String.Concat(s.Substring(0, (s.LastIndexOf(" N") + 1)), "+01:00");<br />
}<br />
else if (s.EndsWith(" Y", StringComparison.OrdinalIgnoreCase)) {<br />
zoneRepresentedAsLocalDifferential = String.Concat(s.Substring(0, (s.LastIndexOf(" Y") + 1)), "+12:00");<br />
}<br />
else {<br />
zoneRepresentedAsLocalDifferential = s;<br />
}<br />
<br />
return zoneRepresentedAsLocalDifferential;<br />
}<br />
#endregion<br />
<br />
#region ToString(DateTime utcDateTime)<br />
/// <summary><br />
/// Converts the value of the specified <see cref="DateTime"/> object to its equivalent string representation.<br />
/// </summary><br />
/// <param name="utcDateTime">The Coordinated Universal Time (UTC) <see cref="DateTime"/> to convert.</param><br />
/// <returns>A RFC 822 string representation of the value of the <paramref name="utcDateTime"/>.</returns><br />
/// <exception cref="ArgumentException">The specified <paramref name="utcDateTime"/> object does not represent a <see cref="DateTimeKind.Utc">Coordinated Universal Time (UTC)</see> value.</exception><br />
public static string ToString(DateTime utcDateTime) {<br />
if (utcDateTime.Kind != DateTimeKind.Utc) {<br />
throw new ArgumentException("utcDateTime");<br />
}<br />
<br />
return utcDateTime.ToString(Rfc822DateTime.Rfc822DateTimeFormat, DateTimeFormatInfo.InvariantInfo);<br />
}<br />
#endregion<br />
<br />
#region TryParse(string s, out DateTime result)<br />
/// <summary><br />
/// Converts the specified string representation of a date and time to its <see cref="DateTime"/> equivalent.<br />
/// </summary><br />
/// <param name="s">A string containing a date and time to convert.</param><br />
/// <param name="result"><br />
/// When this method returns, contains the <see cref="DateTime"/> value equivalent to the date and time <br />
/// contained in <paramref name="s"/>, expressed as <i>Coordinated Universal Time (UTC)</i>, <br />
/// if the conversion succeeded, or <see cref="DateTime.MinValue">MinValue</see> if the conversion failed. <br />
/// The conversion fails if the s parameter is a <b>null</b> reference (Nothing in Visual Basic), <br />
/// or does not contain a valid string representation of a date and time. <br />
/// This parameter is passed uninitialized.<br />
/// </param><br />
/// <returns><b>true</b> if the <paramref name="s"/> parameter was converted successfully; otherwise, <b>false</b>.</returns><br />
/// <remarks><br />
/// The string <paramref name="s"/> is parsed using formatting information in the <see cref="DateTimeFormatInfo.InvariantInfo"/> object. <br />
/// </remarks><br />
public static bool TryParse(string s, out DateTime result) {<br />
//------------------------------------------------------------<br />
// Attempt to convert string representation<br />
//------------------------------------------------------------<br />
bool wasConverted = false;<br />
result = DateTime.MinValue;<br />
<br />
if (!String.IsNullOrEmpty(s)) {<br />
DateTime parseResult;<br />
if (DateTime.TryParseExact(Rfc822DateTime.ConvertZoneToLocalDifferential(s), Rfc822DateTime.Rfc822DateTimePatterns, DateTimeFormatInfo.InvariantInfo, DateTimeStyles.AdjustToUniversal, out parseResult)) {<br />
result = DateTime.SpecifyKind(parseResult, DateTimeKind.Utc);<br />
wasConverted = true;<br />
}<br />
}<br />
<br />
return wasConverted;<br />
}<br />
#endregion<br />
}<br />
<br />
}<br />
</source></div>Ajastremhttps://wiki.itcollege.ee/index.php?title=RSS_voogude_v%C3%A4rskete_uudiste_korjamise_rakendus&diff=6766RSS voogude värskete uudiste korjamise rakendus2010-04-16T11:18:57Z<p>Ajastrem: </p>
<hr />
<div><p><br />
Idee oli koostada webi teenus mis oskaks kasutajate RSS voogude nimekirjast koostada viimaste uudiste nimekiri.<br />
<br /><br />
<br />Probleemide nimekiri oli teada: <br />
<br />1) RSS voogud on disaini poolest erinevad <br />
<br />2) RSS aja formaati standart on uurimata <br />
<br />3) Uudiste sünkrooniline uuendamine on aeglane <br />
<br /><br />
<br />Pakkutav lahendus oli: <br />
<br />1) Rakenduses kasutakse ainult ühine osa RSS voogudest <br />
<br />2) Aja formaat uurida ja leida lahendust <br />
<br />3) Uudised uuendada asünkroonselt <br />
<br /><br />
<br />Rakendus on paigaldatud siin [https://networksolutions2.googlecode.com/svn/trunk siin] ([https://www.googlecode.com google code])<br />
<br />Koodi saab kätte SVN kliendi abil, näiteks [http://tortoisesvn.net/downloads tortoise SVN]<br />
<br /><br />
<br />Huuvitavad kohad koodist<br />
on [[Rfc822DateTimeFormat csharp]] RSS aja standarti c# implementatsioon <br />
<source lang=csharp>public static string[] Rfc822DateTimePatterns {<br />
get {<br />
formats = new string[35];<br />
<br />
// two-digit day, four-digit year patterns<br />
formats[0] = "ddd',' dd MMM yyyy HH':'mm':'ss'.'fffffff zzzz";<br />
</source><br />
</p></div>Ajastremhttps://wiki.itcollege.ee/index.php?title=RSS_voogude_v%C3%A4rskete_uudiste_korjamise_rakendus&diff=6765RSS voogude värskete uudiste korjamise rakendus2010-04-16T11:18:29Z<p>Ajastrem: </p>
<hr />
<div><p><br />
Idee oli koostada webi teenus mis oskaks kasutajate RSS voogude nimekirjast koostada viimaste uudiste nimekiri.<br />
<br /><br />
<br />Probleemide nimekiri oli teada: <br />
<br />1) RSS voogud on disaini poolest erinevad <br />
<br />2) RSS aja formaati standart on uurimata <br />
<br />3) Uudiste sünkrooniline uuendamine on aeglane <br />
<br /><br />
<br />Pakkutav lahendus oli: <br />
<br />1) Rakenduses kasutakse ainult ühine osa RSS voogudest <br />
<br />2) Aja formaat uurida ja leida lahendust <br />
<br />3) Uudised uuendada asünkroonselt <br />
<br /><br />
<br />Rakendus on paigaldatud siin [https://networksolutions2.googlecode.com/svn/trunk siin] ([https://www.googlecode.com google code])<br />
<br />Koodi saab kätte SVN kliendi abil, näiteks [http://tortoisesvn.net/downloads tortoise SVN]<br />
<br /><br />
<br />Huuvitavad kohad koodist<br />
on [[Rfc822DateTimeFormat c#]] RSS aja standarti c# implementatsioon <br />
<source lang=csharp>public static string[] Rfc822DateTimePatterns {<br />
get {<br />
formats = new string[35];<br />
<br />
// two-digit day, four-digit year patterns<br />
formats[0] = "ddd',' dd MMM yyyy HH':'mm':'ss'.'fffffff zzzz";<br />
</source><br />
</p></div>Ajastremhttps://wiki.itcollege.ee/index.php?title=Rfc822DateTimeFormat_(c&diff=6764Rfc822DateTimeFormat (c2010-04-16T11:18:10Z<p>Ajastrem: New page: <source lang=csharp> using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Globalization; namespace Scream.RSS { /// <summary> /// P...</p>
<hr />
<div><source lang=csharp><br />
using System;<br />
using System.Collections.Generic;<br />
using System.Linq;<br />
using System.Text;<br />
using System.Globalization;<br />
<br />
namespace Scream.RSS {<br />
<br />
<br />
/// <summary><br />
/// Provides methods for converting <see cref="DateTime"/> structures <br />
/// to and from the equivalent <a href="http://www.w3.org/Protocols/rfc822/#z28">RFC 822</a> <br />
/// string representation.<br />
/// </summary><br />
public class Rfc822DateTime {<br />
//============================================================<br />
// Private members<br />
//============================================================<br />
#region Private Members<br />
/// <summary><br />
/// Private member to hold array of formats that RFC 822 date-time representations conform to.<br />
/// </summary><br />
private static string[] formats = new string[0];<br />
/// <summary><br />
/// Private member to hold the DateTime format string for representing a DateTime in the RFC 822 format.<br />
/// </summary><br />
private const string format = "ddd, dd MMM yyyy HH:mm:ss K";<br />
#endregion<br />
<br />
//============================================================<br />
// Public Properties<br />
//============================================================<br />
#region Rfc822DateTimeFormat<br />
/// <summary><br />
/// Gets the custom format specifier that may be used to represent a <see cref="DateTime"/> in the RFC 822 format.<br />
/// </summary><br />
/// <value>A <i>DateTime format string</i> that may be used to represent a <see cref="DateTime"/> in the RFC 822 format.</value><br />
/// <remarks><br />
/// <para><br />
/// This method returns a string representation of a <see cref="DateTime"/> that utilizes the time zone <br />
/// offset (local differential) to represent the offset from Greenwich mean time in hours and minutes. <br />
/// The <see cref="Rfc822DateTimeFormat"/> is a valid date-time format string for use <br />
/// in the <see cref="DateTime.ToString(String, IFormatProvider)"/> method.<br />
/// </para><br />
/// <para><br />
/// The <a href="http://www.w3.org/Protocols/rfc822/#z28">RFC 822</a> Date and Time specification <br />
/// specifies that the year will be represented as a two-digit value, but the <br />
/// <a href="http://www.rssboard.org/rss-profile#data-types-datetime">RSS Profile</a> recommends that <br />
/// all date-time values should use a four-digit year. The <see cref="Rfc822DateTime"/> class <br />
/// follows the RSS Profile recommendation when converting a <see cref="DateTime"/> to the equivalent <br />
/// RFC 822 string representation.<br />
/// </para><br />
/// </remarks><br />
public static string Rfc822DateTimeFormat {<br />
get {<br />
return format;<br />
}<br />
}<br />
#endregion<br />
<br />
#region Rfc822DateTimePatterns<br />
/// <summary><br />
/// Gets an array of the expected formats for RFC 822 date-time string representations.<br />
/// </summary><br />
/// <value><br />
/// An array of the expected formats for RFC 822 date-time string representations <br />
/// that may used in the <see cref="DateTime.TryParseExact(String, string[], IFormatProvider, DateTimeStyles, out DateTime)"/> method.<br />
/// </value><br />
/// <remarks><br />
/// The array of the expected formats that is returned assumes that the RFC 822 time zone <br />
/// is represented as or converted to a local differential representation.<br />
/// </remarks><br />
/// <seealso cref="ConvertZoneToLocalDifferential(String)"/><br />
public static string[] Rfc822DateTimePatterns {<br />
get {<br />
if (formats.Length > 0) {<br />
return formats;<br />
}<br />
else {<br />
formats = new string[35];<br />
<br />
// two-digit day, four-digit year patterns<br />
formats[0] = "ddd',' dd MMM yyyy HH':'mm':'ss'.'fffffff zzzz";<br />
formats[1] = "ddd',' dd MMM yyyy HH':'mm':'ss'.'ffffff zzzz";<br />
formats[2] = "ddd',' dd MMM yyyy HH':'mm':'ss'.'fffff zzzz";<br />
formats[3] = "ddd',' dd MMM yyyy HH':'mm':'ss'.'ffff zzzz";<br />
formats[4] = "ddd',' dd MMM yyyy HH':'mm':'ss'.'fff zzzz";<br />
formats[5] = "ddd',' dd MMM yyyy HH':'mm':'ss'.'ff zzzz";<br />
formats[6] = "ddd',' dd MMM yyyy HH':'mm':'ss'.'f zzzz";<br />
formats[7] = "ddd',' dd MMM yyyy HH':'mm':'ss zzzz";<br />
<br />
// two-digit day, two-digit year patterns<br />
formats[8] = "ddd',' dd MMM yy HH':'mm':'ss'.'fffffff zzzz";<br />
formats[9] = "ddd',' dd MMM yy HH':'mm':'ss'.'ffffff zzzz";<br />
formats[10] = "ddd',' dd MMM yy HH':'mm':'ss'.'fffff zzzz";<br />
formats[11] = "ddd',' dd MMM yy HH':'mm':'ss'.'ffff zzzz";<br />
formats[12] = "ddd',' dd MMM yy HH':'mm':'ss'.'fff zzzz";<br />
formats[13] = "ddd',' dd MMM yy HH':'mm':'ss'.'ff zzzz";<br />
formats[14] = "ddd',' dd MMM yy HH':'mm':'ss'.'f zzzz";<br />
formats[15] = "ddd',' dd MMM yy HH':'mm':'ss zzzz";<br />
<br />
// one-digit day, four-digit year patterns<br />
formats[16] = "ddd',' d MMM yyyy HH':'mm':'ss'.'fffffff zzzz";<br />
formats[17] = "ddd',' d MMM yyyy HH':'mm':'ss'.'ffffff zzzz";<br />
formats[18] = "ddd',' d MMM yyyy HH':'mm':'ss'.'fffff zzzz";<br />
formats[19] = "ddd',' d MMM yyyy HH':'mm':'ss'.'ffff zzzz";<br />
formats[20] = "ddd',' d MMM yyyy HH':'mm':'ss'.'fff zzzz";<br />
formats[21] = "ddd',' d MMM yyyy HH':'mm':'ss'.'ff zzzz";<br />
formats[22] = "ddd',' d MMM yyyy HH':'mm':'ss'.'f zzzz";<br />
formats[23] = "ddd',' d MMM yyyy HH':'mm':'ss zzzz";<br />
<br />
// two-digit day, two-digit year patterns<br />
formats[24] = "ddd',' d MMM yy HH':'mm':'ss'.'fffffff zzzz";<br />
formats[25] = "ddd',' d MMM yy HH':'mm':'ss'.'ffffff zzzz";<br />
formats[26] = "ddd',' d MMM yy HH':'mm':'ss'.'fffff zzzz";<br />
formats[27] = "ddd',' d MMM yy HH':'mm':'ss'.'ffff zzzz";<br />
formats[28] = "ddd',' d MMM yy HH':'mm':'ss'.'fff zzzz";<br />
formats[29] = "ddd',' d MMM yy HH':'mm':'ss'.'ff zzzz";<br />
formats[30] = "ddd',' d MMM yy HH':'mm':'ss'.'f zzzz";<br />
formats[31] = "ddd',' d MMM yy HH':'mm':'ss zzzz";<br />
<br />
// Fall back patterns<br />
formats[32] = "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK"; // RoundtripDateTimePattern<br />
formats[33] = DateTimeFormatInfo.InvariantInfo.UniversalSortableDateTimePattern;<br />
formats[34] = DateTimeFormatInfo.InvariantInfo.SortableDateTimePattern;<br />
<br />
return formats;<br />
}<br />
}<br />
}<br />
#endregion<br />
<br />
public static void ArgumentNotNullOrEmptyString(string arg, string s) {<br />
if (arg == null || arg.Trim().Length == 0) throw new Exception("Argument is null or is Empty string");<br />
}<br />
<br />
//============================================================<br />
// Public Methods<br />
//============================================================<br />
#region Parse(string s)<br />
/// <summary><br />
/// Converts the specified string representation of a date and time to its <see cref="DateTime"/> equivalent.<br />
/// </summary><br />
/// <param name="s">A string containing a date and time to convert.</param><br />
/// <returns><br />
/// A <see cref="DateTime"/> equivalent to the date and time contained in <paramref name="s"/>, <br />
/// expressed as <i>Coordinated Universal Time (UTC)</i>.<br />
/// </returns><br />
/// <remarks><br />
/// The string <paramref name="s"/> is parsed using formatting information in the <see cref="DateTimeFormatInfo.InvariantInfo"/> object.<br />
/// </remarks><br />
/// <exception cref="ArgumentNullException"><paramref name="s"/> is a <b>null</b> reference (Nothing in Visual Basic).</exception><br />
/// <exception cref="ArgumentNullException"><paramref name="s"/> is an empty string.</exception><br />
/// <exception cref="FormatException"><paramref name="s"/> does not contain a valid RFC 822 string representation of a date and time.</exception><br />
public static DateTime Parse(string s) {<br />
//------------------------------------------------------------<br />
// Validate parameter<br />
//------------------------------------------------------------<br />
// Guard.<br />
ArgumentNotNullOrEmptyString(s, "s");<br />
<br />
DateTime result;<br />
if (Rfc822DateTime.TryParse(s, out result)) {<br />
return result;<br />
}<br />
else {<br />
throw new FormatException(String.Format(null, "{0} is not a valid RFC 822 string representation of a date and time.", s));<br />
}<br />
}<br />
#endregion<br />
<br />
#region ConvertZoneToLocalDifferential(string s)<br />
/// <summary><br />
/// Converts the time zone component of an RFC 822 date and time string representation to its local differential (time zone offset).<br />
/// </summary><br />
/// <param name="s">A string containing an RFC 822 date and time to convert.</param><br />
/// <returns>A date and time string that uses local differential to describe the time zone equivalent to the date and time contained in <paramref name="s"/>.</returns><br />
/// <exception cref="ArgumentNullException"><paramref name="s"/> is a <b>null</b> reference (Nothing in Visual Basic).</exception><br />
/// <exception cref="ArgumentNullException"><paramref name="s"/> is an empty string.</exception><br />
public static string ConvertZoneToLocalDifferential(string s) {<br />
string zoneRepresentedAsLocalDifferential = String.Empty;<br />
<br />
//------------------------------------------------------------<br />
// Validate parameter<br />
//------------------------------------------------------------<br />
//Guard.<br />
ArgumentNotNullOrEmptyString(s, "s");<br />
<br />
if (s.EndsWith(" UT", StringComparison.OrdinalIgnoreCase)) {<br />
zoneRepresentedAsLocalDifferential = String.Concat(s.Substring(0, (s.LastIndexOf(" UT") + 1)), "+00:00");<br />
}<br />
else if (s.EndsWith(" GMT", StringComparison.OrdinalIgnoreCase)) {<br />
zoneRepresentedAsLocalDifferential = String.Concat(s.Substring(0, (s.LastIndexOf(" GMT") + 1)), "+00:00");<br />
}<br />
else if (s.EndsWith(" EST", StringComparison.OrdinalIgnoreCase)) {<br />
zoneRepresentedAsLocalDifferential = String.Concat(s.Substring(0, (s.LastIndexOf(" EST") + 1)), "-05:00");<br />
}<br />
else if (s.EndsWith(" EDT", StringComparison.OrdinalIgnoreCase)) {<br />
zoneRepresentedAsLocalDifferential = String.Concat(s.Substring(0, (s.LastIndexOf(" EDT") + 1)), "-04:00");<br />
}<br />
else if (s.EndsWith(" CST", StringComparison.OrdinalIgnoreCase)) {<br />
zoneRepresentedAsLocalDifferential = String.Concat(s.Substring(0, (s.LastIndexOf(" CST") + 1)), "-06:00");<br />
}<br />
else if (s.EndsWith(" CDT", StringComparison.OrdinalIgnoreCase)) {<br />
zoneRepresentedAsLocalDifferential = String.Concat(s.Substring(0, (s.LastIndexOf(" CDT") + 1)), "-05:00");<br />
}<br />
else if (s.EndsWith(" MST", StringComparison.OrdinalIgnoreCase)) {<br />
zoneRepresentedAsLocalDifferential = String.Concat(s.Substring(0, (s.LastIndexOf(" MST") + 1)), "-07:00");<br />
}<br />
else if (s.EndsWith(" MDT", StringComparison.OrdinalIgnoreCase)) {<br />
zoneRepresentedAsLocalDifferential = String.Concat(s.Substring(0, (s.LastIndexOf(" MDT") + 1)), "-06:00");<br />
}<br />
else if (s.EndsWith(" PST", StringComparison.OrdinalIgnoreCase)) {<br />
zoneRepresentedAsLocalDifferential = String.Concat(s.Substring(0, (s.LastIndexOf(" PST") + 1)), "-08:00");<br />
}<br />
else if (s.EndsWith(" PDT", StringComparison.OrdinalIgnoreCase)) {<br />
zoneRepresentedAsLocalDifferential = String.Concat(s.Substring(0, (s.LastIndexOf(" PDT") + 1)), "-07:00");<br />
}<br />
else if (s.EndsWith(" Z", StringComparison.OrdinalIgnoreCase)) {<br />
zoneRepresentedAsLocalDifferential = String.Concat(s.Substring(0, (s.LastIndexOf(" Z") + 1)), "+00:00");<br />
}<br />
else if (s.EndsWith(" A", StringComparison.OrdinalIgnoreCase)) {<br />
zoneRepresentedAsLocalDifferential = String.Concat(s.Substring(0, (s.LastIndexOf(" A") + 1)), "-01:00");<br />
}<br />
else if (s.EndsWith(" M", StringComparison.OrdinalIgnoreCase)) {<br />
zoneRepresentedAsLocalDifferential = String.Concat(s.Substring(0, (s.LastIndexOf(" M") + 1)), "-12:00");<br />
}<br />
else if (s.EndsWith(" N", StringComparison.OrdinalIgnoreCase)) {<br />
zoneRepresentedAsLocalDifferential = String.Concat(s.Substring(0, (s.LastIndexOf(" N") + 1)), "+01:00");<br />
}<br />
else if (s.EndsWith(" Y", StringComparison.OrdinalIgnoreCase)) {<br />
zoneRepresentedAsLocalDifferential = String.Concat(s.Substring(0, (s.LastIndexOf(" Y") + 1)), "+12:00");<br />
}<br />
else {<br />
zoneRepresentedAsLocalDifferential = s;<br />
}<br />
<br />
return zoneRepresentedAsLocalDifferential;<br />
}<br />
#endregion<br />
<br />
#region ToString(DateTime utcDateTime)<br />
/// <summary><br />
/// Converts the value of the specified <see cref="DateTime"/> object to its equivalent string representation.<br />
/// </summary><br />
/// <param name="utcDateTime">The Coordinated Universal Time (UTC) <see cref="DateTime"/> to convert.</param><br />
/// <returns>A RFC 822 string representation of the value of the <paramref name="utcDateTime"/>.</returns><br />
/// <exception cref="ArgumentException">The specified <paramref name="utcDateTime"/> object does not represent a <see cref="DateTimeKind.Utc">Coordinated Universal Time (UTC)</see> value.</exception><br />
public static string ToString(DateTime utcDateTime) {<br />
if (utcDateTime.Kind != DateTimeKind.Utc) {<br />
throw new ArgumentException("utcDateTime");<br />
}<br />
<br />
return utcDateTime.ToString(Rfc822DateTime.Rfc822DateTimeFormat, DateTimeFormatInfo.InvariantInfo);<br />
}<br />
#endregion<br />
<br />
#region TryParse(string s, out DateTime result)<br />
/// <summary><br />
/// Converts the specified string representation of a date and time to its <see cref="DateTime"/> equivalent.<br />
/// </summary><br />
/// <param name="s">A string containing a date and time to convert.</param><br />
/// <param name="result"><br />
/// When this method returns, contains the <see cref="DateTime"/> value equivalent to the date and time <br />
/// contained in <paramref name="s"/>, expressed as <i>Coordinated Universal Time (UTC)</i>, <br />
/// if the conversion succeeded, or <see cref="DateTime.MinValue">MinValue</see> if the conversion failed. <br />
/// The conversion fails if the s parameter is a <b>null</b> reference (Nothing in Visual Basic), <br />
/// or does not contain a valid string representation of a date and time. <br />
/// This parameter is passed uninitialized.<br />
/// </param><br />
/// <returns><b>true</b> if the <paramref name="s"/> parameter was converted successfully; otherwise, <b>false</b>.</returns><br />
/// <remarks><br />
/// The string <paramref name="s"/> is parsed using formatting information in the <see cref="DateTimeFormatInfo.InvariantInfo"/> object. <br />
/// </remarks><br />
public static bool TryParse(string s, out DateTime result) {<br />
//------------------------------------------------------------<br />
// Attempt to convert string representation<br />
//------------------------------------------------------------<br />
bool wasConverted = false;<br />
result = DateTime.MinValue;<br />
<br />
if (!String.IsNullOrEmpty(s)) {<br />
DateTime parseResult;<br />
if (DateTime.TryParseExact(Rfc822DateTime.ConvertZoneToLocalDifferential(s), Rfc822DateTime.Rfc822DateTimePatterns, DateTimeFormatInfo.InvariantInfo, DateTimeStyles.AdjustToUniversal, out parseResult)) {<br />
result = DateTime.SpecifyKind(parseResult, DateTimeKind.Utc);<br />
wasConverted = true;<br />
}<br />
}<br />
<br />
return wasConverted;<br />
}<br />
#endregion<br />
}<br />
<br />
}<br />
</source></div>Ajastremhttps://wiki.itcollege.ee/index.php?title=RSS_voogude_v%C3%A4rskete_uudiste_korjamise_rakendus&diff=6763RSS voogude värskete uudiste korjamise rakendus2010-04-16T11:17:03Z<p>Ajastrem: </p>
<hr />
<div><p><br />
Idee oli koostada webi teenus mis oskaks kasutajate RSS voogude nimekirjast koostada viimaste uudiste nimekiri.<br />
<br /><br />
<br />Probleemide nimekiri oli teada: <br />
<br />1) RSS voogud on disaini poolest erinevad <br />
<br />2) RSS aja formaati standart on uurimata <br />
<br />3) Uudiste sünkrooniline uuendamine on aeglane <br />
<br /><br />
<br />Pakkutav lahendus oli: <br />
<br />1) Rakenduses kasutakse ainult ühine osa RSS voogudest <br />
<br />2) Aja formaat uurida ja leida lahendust <br />
<br />3) Uudised uuendada asünkroonselt <br />
<br /><br />
<br />Rakendus on paigaldatud siin [https://networksolutions2.googlecode.com/svn/trunk siin] ([https://www.googlecode.com google code])<br />
<br />Koodi saab kätte SVN kliendi abil, näiteks [http://tortoisesvn.net/downloads tortoise SVN]<br />
<br /><br />
<br />Huuvitavad kohad koodist<br />
on [[Rfc822DateTimeFormat (c#)]] RSS aja standarti c# implementatsioon <br />
<source lang=csharp>public static string[] Rfc822DateTimePatterns {<br />
get {<br />
formats = new string[35];<br />
<br />
// two-digit day, four-digit year patterns<br />
formats[0] = "ddd',' dd MMM yyyy HH':'mm':'ss'.'fffffff zzzz";<br />
</source><br />
</p></div>Ajastremhttps://wiki.itcollege.ee/index.php?title=RSS_voogude_v%C3%A4rskete_uudiste_korjamise_rakendus&diff=6762RSS voogude värskete uudiste korjamise rakendus2010-04-16T11:16:04Z<p>Ajastrem: </p>
<hr />
<div><p><br />
Idee oli koostada webi teenus mis oskaks kasutajate RSS voogude nimekirjast koostada viimaste uudiste nimekiri.<br />
<br /><br />
<br />Probleemide nimekiri oli teada: <br />
<br />1) RSS voogud on disaini poolest erinevad <br />
<br />2) RSS aja formaati standart on uurimata <br />
<br />3) Uudiste sünkrooniline uuendamine on aeglane <br />
<br /><br />
<br />Pakkutav lahendus oli: <br />
<br />1) Rakenduses kasutakse ainult ühine osa RSS voogudest <br />
<br />2) Aja formaat uurida ja leida lahendust <br />
<br />3) Uudised uuendada asünkroonselt <br />
<br /><br />
<br />Rakendus on paigaldatud siin [https://networksolutions2.googlecode.com/svn/trunk siin] ([https://www.googlecode.com google code])<br />
<br />Koodi saab kätte SVN kliendi abil, näiteks [http://tortoisesvn.net/downloads tortoise SVN]<br />
<br /><br />
<br />Huuvitavad kohad koodist<br />
on [[Rfc822DateTimeFormat (c#)]] RSS aja standarti c# implementatsioon <br />
<source lang=cs>public static string[] Rfc822DateTimePatterns {<br />
get {<br />
formats = new string[35];<br />
<br />
// two-digit day, four-digit year patterns<br />
formats[0] = "ddd',' dd MMM yyyy HH':'mm':'ss'.'fffffff zzzz";<br />
</source><br />
</p></div>Ajastremhttps://wiki.itcollege.ee/index.php?title=RSS_voogude_v%C3%A4rskete_uudiste_korjamise_rakendus&diff=6761RSS voogude värskete uudiste korjamise rakendus2010-04-16T11:07:15Z<p>Ajastrem: </p>
<hr />
<div><p><br />
Idee oli koostada webi teenus mis oskaks kasutajate RSS voogude nimekirjast koostada viimaste uudiste nimekiri.<br />
<br /><br />
<br />Probleemide nimekiri oli teada: <br />
<br />1) RSS voogud on disaini poolest erinevad <br />
<br />2) RSS aja formaati standart on uurimata <br />
<br />3) Uudiste sünkrooniline uuendamine on aeglane <br />
<br /><br />
<br />Pakkutav lahendus oli: <br />
<br />1) Rakenduses kasutakse ainult ühine osa RSS voogudest <br />
<br />2) Aja formaat uurida ja leida lahendust <br />
<br />3) Uudised uuendada asünkroonselt <br />
<br /><br />
<br />Rakendus on paigaldatud siin [https://networksolutions2.googlecode.com/svn/trunk siin] ([https://www.googlecode.com google code])<br />
<br />Koodi saab kätte SVN klient programmi abil, näiteks [http://tortoisesvn.net/downloads tortoiseSVN]<br />
</p></div>Ajastremhttps://wiki.itcollege.ee/index.php?title=RSS_voogude_v%C3%A4rskete_uudiste_korjamise_rakendus&diff=6760RSS voogude värskete uudiste korjamise rakendus2010-04-16T11:06:49Z<p>Ajastrem: </p>
<hr />
<div><p><br />
Idee oli koostada webi teenus mis oskaks kasutajate RSS voogude nimekirjast koostada viimaste uudiste nimekiri.<br />
<br /><br />
<br />Probleemide nimekiri oli teada: <br />
<br />1) RSS voogud on disaini poolest erinevad <br />
<br />2) RSS aja formaati standart on uurimata <br />
<br />3) Uudiste sünkrooniline uuendamine on aeglane <br />
<br /><br />
<br />Pakkutav lahendus oli: <br />
<br />1) Rakenduses kasutakse ainult ühine osa RSS voogudest <br />
<br />2) Aja formaat uurida ja leida lahendust <br />
<br />3) Uudised uuendada asünkroonselt <br />
<br /><br />
<br />Rakendus on paigaldatud siin [https://networksolutions2.googlecode.com/svn/trunk siin] ([https://www.googlecode.com www.googlecode.com])<br />
<br />Koodi saab kätte SVN klient programmi abil, näiteks [http://tortoisesvn.net/downloads tortoiseSVN]<br />
</p></div>Ajastrem