// // System.Web.UI.WebControls.AdRotator // // Author: // Ben Maurer // // Copyright (C) 2005 Novell, Inc (http://www.novell.com) // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System.Xml; using System.Collections; using System.ComponentModel; using System.Security.Permissions; namespace System.Web.UI.WebControls { // CAS [AspNetHostingPermissionAttribute (SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)] [AspNetHostingPermissionAttribute (SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)] // attributes [DefaultEvent("AdCreated")] [DefaultProperty("AdvertisementFile")] [Designer("System.Web.UI.Design.WebControls.AdRotatorDesigner, " + Consts.AssemblySystem_Design, "System.ComponentModel.Design.IDesigner")] #if NET_2_0 [ToolboxData("<{0}:AdRotator runat=\"server\">")] #else [ToolboxData("<{0}:AdRotator runat=\"server\" Height=\"60px\" Width=\"468px\">")] #endif public class AdRotator : #if NET_2_0 DataBoundControl #else WebControl #endif { #if NET_2_0 [MonoTODO] protected internal override void OnInit (EventArgs e) { base.OnInit(e); } #endif #if NET_2_0 protected internal #else protected #endif override void OnPreRender (EventArgs eee) { Hashtable ht = null; if (ad_file != "" && ad_file != null) { ReadAdsFromFile (Page.MapPath (ad_file)); ht = ChooseAd (); } AdCreatedEventArgs e = new AdCreatedEventArgs (ht); OnAdCreated (e); createdargs = e; } #if NET_2_0 [MonoTODO] protected internal override void PerformDataBinding (IEnumerable data) { throw new NotImplementedException (); } [MonoTODO] protected override void PerformSelect () { throw new NotImplementedException (); } #endif AdCreatedEventArgs createdargs; #if NET_2_0 protected internal #else protected #endif override void Render (HtmlTextWriter w) { AdCreatedEventArgs e = createdargs; base.AddAttributesToRender (w); if (e.NavigateUrl != null) w.AddAttribute (HtmlTextWriterAttribute.Href, ResolveUrl (e.NavigateUrl)); w.AddAttribute (HtmlTextWriterAttribute.Target, Target); w.RenderBeginTag (HtmlTextWriterTag.A); if (e.NavigateUrl != null) w.AddAttribute (HtmlTextWriterAttribute.Src, ResolveUrl (e.ImageUrl)); w.AddAttribute (HtmlTextWriterAttribute.Alt, e.AlternateText == null ? "" : e.AlternateText); w.AddAttribute (HtmlTextWriterAttribute.Border, "0"); w.RenderBeginTag (HtmlTextWriterTag.Img); w.RenderEndTag (); // img w.RenderEndTag (); // a } // // We take all the ads in the ad file and add up their // impression weight. We then take a random number [0, // TotalImpressions). We then choose the ad that is // that number or less impressions for the beginning // of the file. This lets us respect the weights // given. // Hashtable ChooseAd () { // cache for performance string KeywordFilter = this.KeywordFilter; int total_imp = 0; int cur_imp = 0; foreach (Hashtable a in ads) { if (KeywordFilter == "" || KeywordFilter == (string) a ["Keyword"]) total_imp += a ["Impressions"] != null ? int.Parse ((string) a ["Impressions"]) : 1; } int r = new Random ().Next (total_imp); foreach (Hashtable a in ads) { if (KeywordFilter != "" && KeywordFilter != (string) a ["Keyword"]) continue; cur_imp += a ["Impressions"] != null ? int.Parse ((string) a ["Impressions"]) : 1; if (cur_imp > r) return a; } if (total_imp != 0) throw new Exception ("I should only get here if no ads matched"); return null; } ArrayList ads = new ArrayList (); void ReadAdsFromFile (string s) { XmlDocument d = new XmlDocument (); try { d.Load (s); } catch (Exception e) { throw new HttpException ("AdRotator could not parse the xml file", e); } ads.Clear (); foreach (XmlNode n in d.DocumentElement.ChildNodes) { Hashtable ad = new Hashtable (); foreach (XmlNode nn in n.ChildNodes) ad.Add (nn.Name, nn.InnerText); ads.Add (ad); } } string ad_file = ""; #if NET_2_0 [UrlProperty] #endif [Bindable(true)] [DefaultValue("")] [Editor("System.Web.UI.Design.XmlUrlEditor, " + Consts.AssemblySystem_Design, typeof(System.Drawing.Design.UITypeEditor))] [WebSysDescription("")] [WebCategory("Behavior")] public string AdvertisementFile { get { return ad_file; } set { ad_file = value; } } #if NET_2_0 [DefaultValue ("AlternateText")] [WebSysDescriptionAttribute ("")] [WebCategoryAttribute ("Behavior")] [MonoTODO] public string AlternateTextField { get { throw new NotImplementedException (); } set { throw new NotImplementedException (); } } #endif [Browsable(false)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [EditorBrowsable(EditorBrowsableState.Never)] public override FontInfo Font { get { return base.Font; } } #if NET_2_0 [DefaultValue ("ImageUrl")] [MonoTODO] [WebSysDescriptionAttribute ("")] [WebCategoryAttribute ("Behavior")] public string ImageUrlField { get { throw new NotImplementedException (); } set { throw new NotImplementedException (); } } #endif [Bindable(true)] [DefaultValue("")] [WebSysDescription("")] [WebCategory("Behavior")] public string KeywordFilter { get { return ViewState.GetString ("KeywordFilter", ""); } set { ViewState ["KeywordFilter"] = value; } } #if NET_2_0 [DefaultValue ("NavigateUrl")] [MonoTODO] [WebSysDescriptionAttribute ("")] [WebCategoryAttribute ("Behavior")] public string NavigateUrlField { get { throw new NotImplementedException (); } set { throw new NotImplementedException (); } } #endif [Bindable(true)] [DefaultValue("_top")] [TypeConverter(typeof(System.Web.UI.WebControls.TargetConverter))] [WebSysDescription("")] [WebCategory("Behavior")] public string Target { get { return ViewState.GetString ("Target", "_top"); } set { ViewState ["Target"] = value; } } #if NET_2_0 /* all these are listed in corcompare */ [MonoTODO] public override string UniqueID { get { return base.UniqueID; } } [MonoTODO] protected override HtmlTextWriterTag TagKey { get { return base.TagKey; } } #endif protected virtual void OnAdCreated (AdCreatedEventArgs e) { AdCreatedEventHandler h = (AdCreatedEventHandler) Events [AdCreatedEvent]; if (h != null) h (this, e); } static readonly object AdCreatedEvent = new object (); [WebSysDescription("")] [WebCategory("Action")] public event AdCreatedEventHandler AdCreated { add { Events.AddHandler (AdCreatedEvent, value); } remove { Events.RemoveHandler (AdCreatedEvent, value); } } } }