| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328 |
- /**
- * Namespace: System.Web.UI.WebControls
- * Class: AdRotator
- *
- * Author: Gaurav Vaish
- * Maintainer: [email protected]
- * Implementation: yes
- * Contact: <[email protected]>
- * Status: 100%
- *
- * (C) Gaurav Vaish (2001)
- */
- using System;
- using System.IO;
- using System.Collections;
- using System.Collections.Specialized;
- using System.Web;
- using System.Web.Caching;
- using System.Web.UI;
- using System.Xml;
- using System.Web.Utils;
- namespace System.Web.UI.WebControls
- {
- public class AdRotator: WebControl
- {
- private string advertisementFile;
- private static readonly object AdCreatedEvent = new object();
- // Will be set values during (On)PreRender-ing
- private string alternateText;
- private string imageUrl;
- private string navigateUrl;
- private string fileDirectory;
- private class AdRecord
- {
- public IDictionary adProps;
- public int hits; // or impressions or clicks
- public string keyword;
- public AdRecord(IDictionary adProps)
- {
- this.adProps = adProps;
- hits = 0;
- keyword = String.Empty;
- }
- }
- /*
- * Loading / Saving data from/to ad file and all the manipulations wrt to the URL...
- * are incorporated by the following functions.
- * GetData(string)
- * LoadAdFile(string)
- * IsAdMatching(AdRecord)
- * ResolveAdUrl(string)
- * SelectAd()
- * The exact control flow will be detailed. Let me first write the functions
- */
- private AdRecord[] LoadAdFile(string file)
- {
- Stream fStream;
- ArrayList list;
- XmlReader reader;
- XmlDocument document;
- XmlNode topNode, innerNode;
- IDictionary hybridDict = null;
- AdRecord[] adsArray = null;
- try
- {
- fStream = new FileStream(file, FileMode.Open, FileAccess.Read, FileShare.Read);
- } catch(Exception e)
- {
- throw new HttpException("AdRotator: Unable to open file");
- }
- try
- {
- list = new ArrayList();
- reader = new XmlTextReader(fStream);
- document = new XmlDocument();
- document.Load(reader);
- if(document.DocumentElement!=null)
- {
- if(document.DocumentElement.LocalName=="Advertisements")
- {
- topNode = document.DocumentElement.FirstChild;
- while(topNode!=null)
- {
- if(topNode.LocalName=="Ad")
- {
- innerNode = topNode.FirstChild;
- while(innerNode!=null)
- {
- if(innerNode.NodeType==XmlNodeType.Element)
- {
- if(hybridDict==null)
- {
- hybridDict = new HybridDictionary();
- }
- hybridDict.Add(innerNode.LocalName, innerNode.InnerText);
- }
- innerNode = innerNode.NextSibling;
- }
- if(hybridDict!=null)
- list.Add(hybridDict);
- }
- topNode = topNode.NextSibling;
- }
- }
- }
- if(list.Count>0)
- {
- adsArray = new AdRecord[list.Count];
- for(int i=0; i < list.Count; i++)
- {
- adsArray[i] = new AdRecord((IDictionary)list[i]);
- }
- }
- } catch(Exception e)
- {
- throw new HttpException("AdRotator_Parse_Error" + file);
- } finally
- {
- fStream.Close();
- }
- if(adsArray == null)
- {
- throw new HttpException("AdRotator_No_Advertisements_Found");
- }
- return adsArray;
- }
-
- private AdRecord[] GetData(string file)
- {
- string physPath = MapPathSecure(file);
- string AdKey = "AdRotatorCache: " + physPath;
- fileDirectory = UrlUtils.GetDirectory(UrlUtils.Combine(TemplateSourceDirectory, file));
- Cache cache = HttpRuntime.Cache;
- AdRecord[] records = (AdRecord[])cache[AdKey];
- if(records==null)
- {
- records = LoadAdFile(physPath);
- if(records==null)
- {
- return null;
- }
- cache.Insert(AdKey, records, new CacheDependency(physPath));
- }
- return records;
- }
-
- private IDictionary SelectAd()
- {
- AdRecord[] records = GetData(AdvertisementFile);
- if(records!=null && records.Length!=0)
- {
- int impressions = 0;
- for(int i=0 ; i < records.Length; i++)
- {
- if(IsAdMatching(records[i]))
- impressions += records[1].hits;
- }
- if(impressions!=0)
- {
- int rnd = (new Random()).Next(impressions) + 1;
- int counter = 0;
- int index = 0;
- for(int i=0; i < records.Length; i++)
- {
- if(IsAdMatching(records[i]))
- {
- if(rnd <= (counter + records[i].hits))
- {
- index = i;
- break;
- }
- counter += records[i].hits;
- }
- }
- return records[index].adProps;
- }
- }
- return null;
- }
-
- private bool IsAdMatching(AdRecord currAd)
- {
- if(KeywordFilter!=String.Empty)
- {
- if(currAd.keyword.ToLower() == KeywordFilter.ToLower())
- return false;
- }
- return true;
- }
-
- private string ResolveAdUrl(string relativeUrl)
- {
- if(relativeUrl.Length==0 || !UrlUtils.IsRelativeUrl(relativeUrl))
- return relativeUrl;
- string fullUrl = String.Empty;
- if(fileDirectory != null)
- fullUrl = fileDirectory;
- if(fullUrl.Length == 0)
- fullUrl = TemplateSourceDirectory;
- if(fullUrl.Length == 0)
- return relativeUrl;
- return (fullUrl + relativeUrl);
- }
-
- public event AdCreatedEventHandler AdCreated
- {
- add
- {
- Events.AddHandler(AdCreatedEvent, value);
- }
- remove
- {
- Events.RemoveHandler(AdCreatedEvent, value);
- }
- }
-
- public AdRotator(): base()
- {
- advertisementFile = string.Empty;
- fileDirectory = null;
- }
-
- public string AdvertisementFile
- {
- get
- {
- return advertisementFile;
- }
- set
- {
- advertisementFile = value;
- }
- }
-
- public string KeywordFilter
- {
- get
- {
- object o = ViewState["KeywordFilter"];
- if(o!=null)
- return (string)o;
- return String.Empty;
- }
- set
- {
- if(value!=null)
- ViewState["KeywordFilter"] = value.Trim();
- }
- }
- public string Target
- {
- get
- {
- object o = ViewState["Target"];
- if(o!=null)
- return (string)o;
- return String.Empty;
- }
- set
- {
- ViewState["Target"] = value;
- }
- }
-
- protected override ControlCollection CreateControlCollection()
- {
- return new EmptyControlCollection(this);
- }
-
- protected virtual void OnAdCreated(AdCreatedEventArgs e)
- {
- if(Events!=null)
- {
- AdCreatedEventHandler aceh = (AdCreatedEventHandler)(Events[AdCreatedEvent]);
- if(aceh!=null)
- aceh(this, e);
- }
- }
- protected override void OnPreRender(EventArgs e)
- {
- if(AdvertisementFile!=String.Empty)
- {
- AdCreatedEventArgs acea = new AdCreatedEventArgs(SelectAd());
- imageUrl = acea.ImageUrl;
- navigateUrl = acea.NavigateUrl;
- alternateText = acea.AlternateText;
- }
- }
-
- protected override void Render(HtmlTextWriter writer)
- {
- HyperLink hLink = new HyperLink();
- Image adImage = new Image();
- foreach(IEnumerable current in Attributes.Keys)
- {
- hLink.Attributes[(string)current] = Attributes[(string)current];
- }
- if(ID != null && ID.Length > 0)
- hLink.ID = ID;
- hLink.Target = Target;
- hLink.AccessKey = AccessKey;
- hLink.Enabled = Enabled;
- hLink.TabIndex = TabIndex;
- hLink.RenderBeginTag(writer);
- if(ControlStyleCreated)
- {
- adImage.ApplyStyle(ControlStyle);
- }
- if(imageUrl!=null && imageUrl.Length > 0)
- adImage.ImageUrl = ResolveAdUrl(imageUrl);
- adImage.AlternateText = alternateText;
- adImage.ToolTip = ToolTip;
- adImage.RenderControl(writer);
- hLink.RenderEndTag(writer);
- }
- }
- }
|