e79aa3c0ed
Former-commit-id: a2155e9bd80020e49e72e86c44da02a8ac0e57a4
324 lines
12 KiB
C#
324 lines
12 KiB
C#
//------------------------------------------------------------------------------
|
|
// <copyright file="AdRotator.cs" company="Microsoft">
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
// </copyright>
|
|
//------------------------------------------------------------------------------
|
|
|
|
using System.ComponentModel;
|
|
using System.Diagnostics;
|
|
using System.Drawing.Design;
|
|
using System.Web.Mobile;
|
|
using System.Web.UI.WebControls;
|
|
using System.Web.Util;
|
|
using WebCntrls = System.Web.UI.WebControls;
|
|
using System.Security.Permissions;
|
|
|
|
namespace System.Web.UI.MobileControls
|
|
{
|
|
|
|
/*
|
|
* Mobile AdRotator class.
|
|
* The AdRotator control is for rotating advertisement links every time the
|
|
* same page is revisited.
|
|
*
|
|
* This class aggregates the corresponding ASP.NET AdRotator for delegating
|
|
* the random selection task of advertisement info to the aggregated
|
|
* class. The ad info is selected during the PreRender phase of the
|
|
* aggregated control (So the aggregated control needs to have the
|
|
* property Visible set to true when entering the PreRender process).
|
|
* For markup adapters that collect the selected ad info for rendering,
|
|
* they should subscribe to AdCreated event property and collect the ad
|
|
* info through the event argument.
|
|
*
|
|
* This class also contains a mobile Image control for delegating the
|
|
* rendering since AdRotator's rendering is the same as Image's rendering
|
|
* by setting the corresponding properties on the control.
|
|
*
|
|
* Copyright (c) 2000 Microsoft Corporation
|
|
*/
|
|
/// <include file='doc\AdRotator.uex' path='docs/doc[@for="AdRotator"]/*' />
|
|
[
|
|
DefaultEvent("AdCreated"),
|
|
DefaultProperty("AdvertisementFile"),
|
|
Designer(typeof(System.Web.UI.Design.MobileControls.AdRotatorDesigner)),
|
|
DesignerAdapter(typeof(System.Web.UI.Design.MobileControls.Adapters.DesignerAdRotatorAdapter)),
|
|
ToolboxData("<{0}:AdRotator runat=\"server\"></{0}:AdRotator>"),
|
|
ToolboxItem(typeof(System.Web.UI.Design.WebControlToolboxItem))
|
|
]
|
|
[AspNetHostingPermission(SecurityAction.LinkDemand, Level=AspNetHostingPermissionLevel.Minimal)]
|
|
[AspNetHostingPermission(SecurityAction.InheritanceDemand, Level=AspNetHostingPermissionLevel.Minimal)]
|
|
[Obsolete("The System.Web.Mobile.dll assembly has been deprecated and should no longer be used. For information about how to develop ASP.NET mobile applications, see http://go.microsoft.com/fwlink/?LinkId=157231.")]
|
|
public class AdRotator : MobileControl
|
|
{
|
|
private WebCntrls.AdRotator _webAdRotator;
|
|
private Image _image = new Image();
|
|
|
|
private static readonly Object EventAdCreated = new Object();
|
|
private const String ImageKeyDefault = "ImageUrl";
|
|
private const String NavigateUrlKeyDefault = "NavigateUrl";
|
|
|
|
/// <include file='doc\AdRotator.uex' path='docs/doc[@for="AdRotator.AdRotator"]/*' />
|
|
public AdRotator() : base()
|
|
{
|
|
_webAdRotator = CreateWebAdRotator();
|
|
|
|
_image.EnableViewState = false;
|
|
|
|
this.Controls.Add(_webAdRotator);
|
|
this.Controls.Add(_image);
|
|
|
|
// The default value of the Target property of the web AdRotator is
|
|
// set to "_top". Since we are not exposing this property, we need
|
|
// to explicity set it to empty string so this property will not be
|
|
// shown in the rendered markup when the web AdRotator is used to do
|
|
// the rendering.
|
|
_webAdRotator.Target = String.Empty;
|
|
|
|
// Due to the fact that C# compiler doesn't allow direct
|
|
// manipulation of event properties outside of the class that
|
|
// defines the event variable, the way we delegate the event
|
|
// handlers to the aggregated web control is to provide a wrapper
|
|
// to capture the raised event from the aggregated control and
|
|
// apply the event argument to the event handlers subscribed to
|
|
// this class.
|
|
AdCreatedEventHandler adCreatedEventHandler =
|
|
new AdCreatedEventHandler(WebAdCreated);
|
|
|
|
_webAdRotator.AdCreated += adCreatedEventHandler;
|
|
}
|
|
|
|
/// <include file='doc\AdRotator.uex' path='docs/doc[@for="AdRotator.CreateWebAdRotator"]/*' />
|
|
protected virtual WebCntrls.AdRotator CreateWebAdRotator()
|
|
{
|
|
return new WebCntrls.AdRotator();
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
// Mimic the properties exposed in the original AdRotator.
|
|
// The properties are got and set directly from the original AdRotator.
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
/// <include file='doc\AdRotator.uex' path='docs/doc[@for="AdRotator.AdvertisementFile"]/*' />
|
|
/// <summary>
|
|
/// <para>
|
|
/// Gets or sets the path to the XML file that contains advertisement data.
|
|
/// </para>
|
|
/// </summary>
|
|
/// <value>
|
|
/// <para>
|
|
/// The path to the XML file containing the properties of the advertisements to
|
|
/// render in the <see langword='AdRotator'/>.
|
|
/// </para>
|
|
/// </value>
|
|
[
|
|
Bindable(true),
|
|
DefaultValue(""),
|
|
Editor(typeof(System.Web.UI.Design.XmlUrlEditor), typeof(UITypeEditor)),
|
|
MobileCategory(SR.Category_Behavior),
|
|
MobileSysDescription(SR.AdRotator_AdvertisementFile)
|
|
]
|
|
public String AdvertisementFile
|
|
{
|
|
get
|
|
{
|
|
return _webAdRotator.AdvertisementFile;
|
|
}
|
|
set
|
|
{
|
|
_webAdRotator.AdvertisementFile = value;
|
|
}
|
|
}
|
|
|
|
/// <include file='doc\AdRotator.uex' path='docs/doc[@for="AdRotator.KeywordFilter"]/*' />
|
|
/// <summary>
|
|
/// <para>
|
|
/// Gets or sets a keyword used to match related advertisements in the ad file.
|
|
/// </para>
|
|
/// </summary>
|
|
/// <value>
|
|
/// <para>
|
|
/// The keyword used to identify advertisements within a specific catagory.
|
|
/// </para>
|
|
/// </value>
|
|
/// <remarks>
|
|
/// <para>
|
|
/// If the ad source is AdvertisementFile and this property is not empty, an ad
|
|
/// with a matching keyword will be selected.
|
|
/// </para>
|
|
/// <para>
|
|
/// If the ad source is AdvertisementFile and this property set, but no match
|
|
/// exists, a blank image is displayed and a trace warning is generated.
|
|
/// </para>
|
|
/// If this property is not set, keyword filtering is not used to select an ad.
|
|
/// </remarks>
|
|
[
|
|
Bindable(true),
|
|
DefaultValue(""),
|
|
MobileCategory(SR.Category_Behavior),
|
|
MobileSysDescription(SR.AdRotator_KeywordFilter)
|
|
]
|
|
public String KeywordFilter
|
|
{
|
|
get
|
|
{
|
|
return _webAdRotator.KeywordFilter;
|
|
}
|
|
set
|
|
{
|
|
_webAdRotator.KeywordFilter = value;
|
|
}
|
|
}
|
|
|
|
/// <include file='doc\AdRotator.uex' path='docs/doc[@for="AdRotator.ImageKey"]/*' />
|
|
[
|
|
Bindable(true),
|
|
DefaultValue(ImageKeyDefault),
|
|
MobileCategory(SR.Category_Behavior),
|
|
MobileSysDescription(SR.AdRotator_ImageKey)
|
|
]
|
|
public String ImageKey
|
|
{
|
|
get
|
|
{
|
|
String s = (String) ViewState["ImageKey"];
|
|
return((s != null) ? s : ImageKeyDefault);
|
|
}
|
|
set
|
|
{
|
|
ViewState["ImageKey"] = value;
|
|
}
|
|
}
|
|
|
|
/// <include file='doc\AdRotator.uex' path='docs/doc[@for="AdRotator.NavigateUrlKey"]/*' />
|
|
[
|
|
Bindable(true),
|
|
DefaultValue(NavigateUrlKeyDefault),
|
|
MobileCategory(SR.Category_Behavior),
|
|
MobileSysDescription(SR.AdRotator_NavigateUrlKey)
|
|
]
|
|
public String NavigateUrlKey
|
|
{
|
|
get
|
|
{
|
|
String s = (String) ViewState["NavigateUrlKey"];
|
|
return((s != null) ? s : NavigateUrlKeyDefault);
|
|
}
|
|
set
|
|
{
|
|
ViewState["NavigateUrlKey"] = value;
|
|
}
|
|
}
|
|
|
|
/// <include file='doc\AdRotator.uex' path='docs/doc[@for="AdRotator.AdCreated"]/*' />
|
|
[
|
|
MobileCategory(SR.Category_Action),
|
|
MobileSysDescription(SR.AdRotator_AdCreated)
|
|
]
|
|
public event AdCreatedEventHandler AdCreated
|
|
{
|
|
add
|
|
{
|
|
Events.AddHandler(EventAdCreated, value);
|
|
}
|
|
remove
|
|
{
|
|
Events.RemoveHandler(EventAdCreated, value);
|
|
}
|
|
}
|
|
|
|
// protected method (which can be overridden by subclasses) for
|
|
// raising user events
|
|
/// <include file='doc\AdRotator.uex' path='docs/doc[@for="AdRotator.OnAdCreated"]/*' />
|
|
protected virtual void OnAdCreated(AdCreatedEventArgs e)
|
|
{
|
|
AdCreatedEventHandler handler = (AdCreatedEventHandler)Events[EventAdCreated];
|
|
if (handler != null)
|
|
{
|
|
handler(this, e);
|
|
}
|
|
}
|
|
|
|
/// <include file='doc\AdRotator.uex' path='docs/doc[@for="AdRotator.Render"]/*' />
|
|
protected override void Render(HtmlTextWriter writer)
|
|
{
|
|
const String accesskeyName = "accesskey";
|
|
|
|
// Delegate specific custom attribute to the child Image control
|
|
String accesskey = ((IAttributeAccessor) this).GetAttribute(accesskeyName);
|
|
if (!String.IsNullOrEmpty(accesskey))
|
|
{
|
|
_image.CustomAttributes[accesskeyName] = accesskey;
|
|
}
|
|
|
|
_image.RenderControl(writer);
|
|
}
|
|
|
|
private void WebAdCreated(Object sender, AdCreatedEventArgs e)
|
|
{
|
|
// Override the value since it may have been changed by device
|
|
// select
|
|
|
|
// AdProperties can be null when ad file is not specified
|
|
// correctly.
|
|
if (e.AdProperties != null)
|
|
{
|
|
e.ImageUrl = (String) e.AdProperties[ImageKey];
|
|
e.NavigateUrl = (String) e.AdProperties[NavigateUrlKey];
|
|
}
|
|
|
|
// Then invoke user events for further manipulation specified by
|
|
// user
|
|
OnAdCreated(e);
|
|
|
|
// Finally, set the necessary properties to the base Image class
|
|
_image.ImageUrl = ResolveAdRotatorUrl(e.ImageUrl);
|
|
_image.AlternateText = e.AlternateText;
|
|
_image.NavigateUrl = ResolveAdRotatorUrl(e.NavigateUrl);
|
|
}
|
|
|
|
// Helper function adopted from ASP.NET AdRotator class (modified
|
|
// slightly)
|
|
private String ResolveAdRotatorUrl(String relativeUrl)
|
|
{
|
|
if (relativeUrl == null)
|
|
{
|
|
return String.Empty;
|
|
}
|
|
|
|
// check if it is already absolute, or points to another form
|
|
if (!UrlPath.IsRelativeUrl(relativeUrl) ||
|
|
relativeUrl.StartsWith(Constants.FormIDPrefix, StringComparison.Ordinal))
|
|
{
|
|
return relativeUrl;
|
|
}
|
|
|
|
// Deal with app relative syntax (e.g. ~/foo)
|
|
string tplSourceDir = UrlPath.MakeVirtualPathAppAbsolute(TemplateSourceDirectory);
|
|
|
|
// For the AdRotator, use the AdvertisementFile directory as the
|
|
// base, and fall back to the page/user control location as the
|
|
// base.
|
|
String absoluteFile = UrlPath.Combine(tplSourceDir,
|
|
AdvertisementFile);
|
|
String fileDirectory = UrlPath.GetDirectory(absoluteFile);
|
|
|
|
String baseUrl = String.Empty;
|
|
if (fileDirectory != null)
|
|
{
|
|
baseUrl = fileDirectory;
|
|
}
|
|
if (baseUrl.Length == 0)
|
|
{
|
|
baseUrl = tplSourceDir;
|
|
}
|
|
if (baseUrl.Length == 0)
|
|
{
|
|
return relativeUrl;
|
|
}
|
|
|
|
// make it absolute
|
|
return UrlPath.Combine(baseUrl, relativeUrl);
|
|
}
|
|
}
|
|
}
|