2001:11:11 Gaurav Vaish <gvaish@iitk.ac.in>
[mono.git] / mcs / class / System.Web / System.Web.UI.WebControls / AdRotator.cs
1 /**\r
2  * Namespace: System.Web.UI.WebControls\r
3  * Class:     AdRotator\r
4  * \r
5  * Author:  Gaurav Vaish\r
6  * Contact: <gvaish@iitk.ac.in>\r
7  * Status:  10??%\r
8  * \r
9  * (C) Gaurav Vaish (2001)\r
10  */\r
11 \r
12 using System;\r
13 using System.IO;\r
14 using System.Collections;\r
15 using System.Collections.Specialized;\r
16 using System.Web;\r
17 using System.Web.UI;\r
18 using System.Xml;\r
19 // Namespace with internal classes, in System.Web assembly\r
20 using System.Web.WebUtils;\r
21 \r
22 namespace System.Web.UI.WebControls\r
23 {\r
24         public class AdRotator: WebControl\r
25         {\r
26 \r
27                 private string advertisementFile;\r
28                 private string keywordFilter;\r
29                 private string target;\r
30                 private static readonly object AdCreatedEvent = new object();\r
31 \r
32                 // Will be set values during (On)PreRender-ing\r
33                 private string alternateText;\r
34                 private string imageUrl;\r
35                 private string navigateUrl;\r
36 \r
37                 private string fileDirctory;\r
38 \r
39                 private static class AdRecord\r
40                 {\r
41                         public IDictionary adProps;\r
42                         public int         hits; // or impressions or clicks\r
43                         public string      keyword;\r
44 \r
45                         public AdRecord()\r
46                         {\r
47                         }\r
48                         \r
49                         public void Initialize(IDictionary adProps)\r
50                         {\r
51                                 this.adProps = adProps;\r
52                         }\r
53                 }\r
54 \r
55 /*\r
56  * Loading / Saving data from/to ad file and all the manipulations wrt to the URL...\r
57  * are incorporated by the following functions.\r
58  * GetData(string)\r
59  * LoadAdFile(string)\r
60  * IsAdMatching(AdRecord)\r
61  * ResolveAdUrl(string)\r
62  * SelectAd()\r
63  * The exact control flow will be detailed. Let me first write the functions\r
64  */\r
65 \r
66                 private AdRecord[] LoadAdFile(string file)\r
67                 {\r
68                         Stream      fSream;\r
69                         ArrayList   list;\r
70                         XmlReader   reader;\r
71                         XmlDocument document;\r
72                         XmlNode     topNode, innerNode;\r
73                         IDictionary hybridDict;\r
74                         AdRecord[]  adsArray = null;\r
75                         try\r
76                         {\r
77                                 fStream = new FileStream(file, FileMode.Open, FileAccess.Read, FileShare.Read);\r
78                         } catch(Exception e)\r
79                         {\r
80                                 throw new HttpException("AdRotator: Unable to open file");\r
81                         }\r
82                         try\r
83                         {\r
84                                 list = new ArrayList();\r
85                                 reader = new XmlTextReader(fStream);\r
86                                 document = new XmlDocument();\r
87                                 document.Load(reader);\r
88                                 if(document.DocumentElement!=null)\r
89                                 {\r
90                                         if(docuent.DocumentElement.LocalName=="Advertisements")\r
91                                         {\r
92                                                 topNode = documentElement.FirstChild;\r
93                                                 while(topNode!=null)\r
94                                                 {\r
95                                                         if(topNode.LocalName=="Ad")\r
96                                                         {\r
97                                                                 innerNode = topNode.FirstChild;\r
98                                                                 while(innerNode!=null)\r
99                                                                 {\r
100                                                                         if(innerNode.NodeType==NodeType.Element)\r
101                                                                         {\r
102                                                                                 if(hybridDic==null)\r
103                                                                                 {\r
104                                                                                         hybirdDict = new HybridDictionary();\r
105                                                                                 }\r
106                                                                                 hybridDic.Add(innerNode.LocalName, innerNode.InnerText);\r
107                                                                         }\r
108                                                                         innerNode = innerNode.NextSibling;\r
109                                                                 }\r
110                                                                 if(hybridDict!=null)\r
111                                                                         list.Add(hybridDict);\r
112                                                         }\r
113                                                         topNode = topNode.NextSibling;\r
114                                                 }\r
115                                         }\r
116                                 }\r
117                                 if(list.Count>0)\r
118                                 {\r
119                                         adsArray = new AdRecord[list.Count];\r
120                                         for(int i=0; i < list.Count; i++)\r
121                                         {\r
122                                                 adsArray[i] = new AdRecord((IDictionary)list.Item[i]);\r
123                                         }\r
124                                 }\r
125                         } catch(Excetion e)\r
126                         {\r
127                                 //TODO: Write error. Parsing error has occured\r
128                                 throw new HttpException("AdRotator: Unable to parse file" + file);\r
129                         } finally\r
130                         {\r
131                                 fStream.close();\r
132                         }\r
133                         if(adsArray == null)\r
134                         {\r
135                                 throw new HttpException("AdRotator: No Advertisements Fount");\r
136                         }\r
137                         return adsArray;\r
138                 }\r
139                 \r
140                 private AdRecord[] GetData(string file)\r
141                 {\r
142                         //TODO: Implement me\r
143                         fileDirectory = UrlUtils.GetDirectory(TemplateSourceDirectory + MapPathSecure(file));\r
144                         //TODO: Do I need to check caching?\r
145                 }\r
146                 \r
147                 private IDictionary SelectAd()\r
148                 {\r
149                         //TODO: I have to select a Random Ad from the file\r
150                         AdRecord[] records = GetFileData(AdvertisementFile);\r
151                         if(records!=null)\r
152                         {\r
153                                 if(records.Length > 0)\r
154                                 {\r
155                                         //TODO: Implement Me\r
156                                 }\r
157                         }\r
158                         return null;\r
159                 }\r
160                 \r
161                 private bool IsAdMatching(AdRecord currAd)\r
162                 {\r
163                         if(KeywordFilter!=String.Empty)\r
164                         {\r
165                                 /* Perform a case-insensitive keyword filtering\r
166                                  * From the documentation, it looks like there's only one keyword attached.\r
167                                 */\r
168                                 if(currAd.keyword.ToLower() == KeywordFilter.ToLower())\r
169                                         return false;\r
170                         }\r
171                         return true;\r
172                 }\r
173                 \r
174                 private string ResolveAdUrl(string relativeUrl)\r
175                 {\r
176                         //TODO: Implement me\r
177                         //TODO: Get the full Url from the relativeUrl\r
178                 }\r
179                 \r
180                 public event AdCreatedEventHandler AdCreated\r
181                 {\r
182                         add\r
183                         {\r
184                                 Events.AddHandler(AdCreatedEvent, value);\r
185                         }\r
186                         remove\r
187                         {\r
188                                 Events.RemoveHandler(AdCreatedEvent, value);\r
189                         }\r
190                 }\r
191                 \r
192                 public AdRotator()\r
193                 {\r
194                         base();\r
195                         advertisementFile = string.Empty;\r
196                         keywordFilter     = string.Empty;\r
197                         target            = string.Empty;\r
198                 }\r
199                 \r
200                 public string AdvertisementFile\r
201                 {\r
202                         get\r
203                         {\r
204                                 return advertisementFile;\r
205                         }\r
206                         set\r
207                         {\r
208                                 advertisementFile = value;\r
209                         }\r
210                 }\r
211                 \r
212                 public string KeywordFilter\r
213                 {\r
214                         get\r
215                         {\r
216                                 return keywordFilter;\r
217                         }\r
218                         set\r
219                         {\r
220                                 keywordFilter = value;\r
221                         }\r
222                 }\r
223                 \r
224                 public string Target\r
225                 {\r
226                         get\r
227                         {\r
228                                 return target;\r
229                         }\r
230                         set\r
231                         {\r
232                                 target = value;\r
233                         }\r
234                 }\r
235                 \r
236                 protected override ControlCollection CreateControlCollection()\r
237                 {\r
238                         return new EmptyControlCollection(this);\r
239                 }\r
240                 \r
241                 protected virtual void OnAdCreated(AdCreatedEventArgs e)\r
242                 {\r
243                         if(Events!=null)\r
244                         {\r
245                                 AdCreatedEventHandler aceh = (AdCreatedEventHandler)(Events[AdCreatedEvent]);\r
246                                 if(aceh!=null)\r
247                                         aceh(this, e);\r
248                         }\r
249                 }\r
250 \r
251                 protected override void OnPreRender(EventArgs e)\r
252                 {\r
253                         if(AdvertisementFile!=String.Empty)\r
254                         {\r
255                                 AdCreatedEventArgs acea = new AdCreatedEventArgs(SelectAd());\r
256                                 imageUrl      = acea.ImageUrl;\r
257                                 navigateUrl   = acea.NavigateUrl;\r
258                                 alternateText = acea.AlternateText;\r
259                         }\r
260                 }\r
261                 \r
262                 protected override void Render(HtmlTextWriter writer)\r
263                 {\r
264                         HyperLink hLink = new HyperLink();\r
265                         Image     image;\r
266 \r
267                         AttributeCollection attributeColl = base.Attributes;\r
268                         ICollection keys = attributeColl.Keys;\r
269                         IEnumerator iterator = keys.GetEnumerator();\r
270                         \r
271                         \r
272                 }\r
273         }\r
274 }\r