//
// System.Web.UI.WebControls.AdRotator
//
// Author:
// Ben Maurer <bmaurer@novell.com>
//
// 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;
using System.Web.Util;
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\"></{0}:AdRotator>")]
#else
[ToolboxData("<{0}:AdRotator runat=\"server\" Height=\"60px\" Width=\"468px\"></{0}:AdRotator>")]
#endif
public class AdRotator :
#if NET_2_0
DataBoundControl
#else
WebControl
#endif
{
#if NET_2_0
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 (
#if NET_2_0
GetPhysicalFilePath (ad_file)
#else
Page.MapPath (ad_file)
#endif
);
ht = ChooseAd ();
}
AdCreatedEventArgs e = new AdCreatedEventArgs (ht);
OnAdCreated (e);
createdargs = e;
}
#if NET_2_0
[MonoTODO ("Not implemented")]
protected internal override void PerformDataBinding (IEnumerable data)
{
throw new NotImplementedException ();
}
[MonoTODO ("Not implemented")]
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 && e.NavigateUrl.Length > 0)
w.AddAttribute (HtmlTextWriterAttribute.Href, ResolveAdUrl (e.NavigateUrl));
if (Target != null && Target.Length > 0)
w.AddAttribute (HtmlTextWriterAttribute.Target, Target);
w.RenderBeginTag (HtmlTextWriterTag.A);
if (e.ImageUrl != null && e.ImageUrl.Length > 0)
w.AddAttribute (HtmlTextWriterAttribute.Src, ResolveAdUrl (e.ImageUrl));
w.AddAttribute (HtmlTextWriterAttribute.Alt, e.AlternateText == null ? "" : e.AlternateText);
w.AddAttribute (HtmlTextWriterAttribute.Border, "0", false);
w.RenderBeginTag (HtmlTextWriterTag.Img);
w.RenderEndTag (); // img
w.RenderEndTag (); // a
}
string ResolveAdUrl (string url)
{
string path = url;
if (AdvertisementFile != null && AdvertisementFile.Length > 0 && path [0] != '/' && path [0] != '~')
try {
new Uri (path);
}
catch {
return UrlUtils.Combine (UrlUtils.GetDirectory (ResolveUrl (AdvertisementFile)), path);
}
return ResolveUrl (path);
}
//
// 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 ("Not implemented")]
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 ("Not implemented")]
[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 ("Not implemented")]
[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 */
public override string UniqueID
{
get {
return base.UniqueID;
}
}
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); }
}
}
}
|