@@ -206,6 +206,9 @@ namespace umbraco
|
||||
if (!UmbracoSettings.UseAspNetMasterPages)
|
||||
initUmbracoPage();
|
||||
base.OnInit(e);
|
||||
|
||||
// Add Umbraco header
|
||||
Response.AddHeader("X-Umbraco-Version", string.Format("{0}.{1}", GlobalSettings.VersionMajor, GlobalSettings.VersionMinor));
|
||||
}
|
||||
|
||||
private void initUmbracoPage()
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Data;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Net;
|
||||
using System.Reflection;
|
||||
using System.Security.Permissions;
|
||||
using System.Text;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Web;
|
||||
@@ -14,19 +14,18 @@ using System.Web.UI;
|
||||
using System.Web.UI.WebControls;
|
||||
using System.Xml;
|
||||
using System.Xml.Xsl;
|
||||
|
||||
using umbraco.BusinessLogic;
|
||||
using umbraco.cms.businesslogic;
|
||||
using Content = umbraco.cms.businesslogic.Content;
|
||||
using umbraco.cms.businesslogic.macro;
|
||||
using umbraco.cms.businesslogic.member;
|
||||
using umbraco.DataLayer;
|
||||
using umbraco.interfaces;
|
||||
using umbraco.IO;
|
||||
using umbraco.Models;
|
||||
using umbraco.presentation.nodeFactory;
|
||||
using umbraco.presentation.templateControls;
|
||||
using umbraco.presentation.xslt.Exslt;
|
||||
using umbraco.scripting;
|
||||
using umbraco.presentation.nodeFactory;
|
||||
using templateControls = umbraco.presentation.templateControls;
|
||||
using umbraco.IO;
|
||||
using Content = umbraco.cms.businesslogic.Content;
|
||||
using Macro = umbraco.cms.businesslogic.macro.Macro;
|
||||
|
||||
namespace umbraco
|
||||
{
|
||||
@@ -37,85 +36,65 @@ namespace umbraco
|
||||
{
|
||||
#region private properties
|
||||
|
||||
private readonly StringBuilder mContent = new StringBuilder();
|
||||
private readonly Cache macroCache = HttpRuntime.Cache;
|
||||
|
||||
private readonly String macroCacheIdentifier = "umbMacro";
|
||||
private readonly string macrosAddedKey = "macrosAdded";
|
||||
private readonly string loadUserControlKey = "loadUserControl";
|
||||
|
||||
// Alias hashable
|
||||
private static Hashtable _macroAlias = new Hashtable();
|
||||
|
||||
/// <summary>Cache for <see cref="GetPredefinedXsltExtensions"/>.</summary>
|
||||
private static Dictionary<string, object> m_PredefinedExtensions;
|
||||
|
||||
private readonly string loadUserControlKey = "loadUserControl";
|
||||
|
||||
private readonly StringBuilder mContent = new StringBuilder();
|
||||
private readonly Cache macroCache = HttpRuntime.Cache;
|
||||
|
||||
private readonly String macroCacheIdentifier = "umbMacro";
|
||||
private readonly int macroType;
|
||||
private readonly string macrosAddedKey = "macrosAdded";
|
||||
private readonly Hashtable propertyDefinitions = new Hashtable();
|
||||
|
||||
// Macro-elements
|
||||
private int macroID;
|
||||
private bool cacheByPersonalization;
|
||||
private bool cacheByPage;
|
||||
private int cacheRefreshRate;
|
||||
private String alias;
|
||||
private String name;
|
||||
private String xsltFile;
|
||||
private Hashtable properties = new Hashtable();
|
||||
private String scriptAssembly;
|
||||
private String scriptFile;
|
||||
private String scriptType;
|
||||
private String scriptAssembly;
|
||||
private Hashtable properties = new Hashtable();
|
||||
private readonly Hashtable propertyDefinitions = new Hashtable();
|
||||
private readonly int macroType;
|
||||
private bool dontRenderInEditor;
|
||||
private String xsltFile;
|
||||
|
||||
protected static ISqlHelper SqlHelper
|
||||
{
|
||||
get { return umbraco.BusinessLogic.Application.SqlHelper; }
|
||||
get { return BusinessLogic.Application.SqlHelper; }
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region public properties
|
||||
|
||||
public enum eMacroType
|
||||
{
|
||||
XSLT = 1,
|
||||
CustomControl = 2,
|
||||
UserControl = 3,
|
||||
Unknown = 4,
|
||||
Python = 5,
|
||||
Script = 6
|
||||
}
|
||||
|
||||
public int MacroID
|
||||
{
|
||||
set { macroID = value; }
|
||||
get { return macroID; }
|
||||
}
|
||||
|
||||
public bool CacheByPersonalization
|
||||
{
|
||||
set { cacheByPersonalization = value; }
|
||||
get { return cacheByPersonalization; }
|
||||
}
|
||||
public bool CacheByPersonalization { set; get; }
|
||||
|
||||
public bool CacheByPage
|
||||
{
|
||||
set { cacheByPage = value; }
|
||||
get { return cacheByPage; }
|
||||
}
|
||||
public bool CacheByPage { set; get; }
|
||||
|
||||
public bool DontRenderInEditor
|
||||
{
|
||||
get { return dontRenderInEditor; }
|
||||
set { dontRenderInEditor = value; }
|
||||
}
|
||||
public bool DontRenderInEditor { get; set; }
|
||||
|
||||
public int RefreshRate
|
||||
{
|
||||
set { cacheRefreshRate = value; }
|
||||
get { return cacheRefreshRate; }
|
||||
}
|
||||
public int RefreshRate { set; get; }
|
||||
|
||||
public String Alias
|
||||
{
|
||||
set { alias = value; }
|
||||
get { return alias; }
|
||||
}
|
||||
public String Alias { set; get; }
|
||||
|
||||
public String Name
|
||||
{
|
||||
set { name = value; }
|
||||
get { return name; }
|
||||
}
|
||||
public String Name { set; get; }
|
||||
|
||||
public String XsltFile
|
||||
{
|
||||
@@ -158,16 +137,6 @@ namespace umbraco
|
||||
get { return mContent.ToString(); }
|
||||
}
|
||||
|
||||
public enum eMacroType
|
||||
{
|
||||
XSLT = 1,
|
||||
CustomControl = 2,
|
||||
UserControl = 3,
|
||||
Unknown = 4,
|
||||
Python = 5,
|
||||
Script = 6
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
/// <summary>
|
||||
@@ -177,31 +146,6 @@ namespace umbraco
|
||||
{
|
||||
}
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return Name;
|
||||
}
|
||||
|
||||
public static macro ReturnFromAlias(string alias)
|
||||
{
|
||||
if (_macroAlias.ContainsKey(alias))
|
||||
return new macro((int)_macroAlias[alias]);
|
||||
else
|
||||
{
|
||||
try
|
||||
{
|
||||
int macroID = Macro.GetByAlias(alias).Id;
|
||||
_macroAlias.Add(alias, macroID);
|
||||
return new macro(macroID);
|
||||
}
|
||||
catch
|
||||
{
|
||||
HttpContext.Current.Trace.Warn("macro", "No macro with alias '" + alias + "' found");
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Creates a macro object
|
||||
/// </summary>
|
||||
@@ -212,7 +156,7 @@ namespace umbraco
|
||||
|
||||
if (macroCache[macroCacheIdentifier + id] != null)
|
||||
{
|
||||
macro tempMacro = (macro)macroCache[macroCacheIdentifier + id];
|
||||
var tempMacro = (macro)macroCache[macroCacheIdentifier + id];
|
||||
Name = tempMacro.Name;
|
||||
Alias = tempMacro.Alias;
|
||||
ScriptType = tempMacro.ScriptType;
|
||||
@@ -231,8 +175,11 @@ namespace umbraco
|
||||
}
|
||||
else
|
||||
{
|
||||
using (IRecordsReader macroDef = SqlHelper.ExecuteReader("select * from cmsMacro left join cmsMacroProperty property on property.macro = cmsMacro.id left join cmsMacroPropertyType editPropertyType on editPropertyType.id = property.macroPropertyType where cmsMacro.id = @macroID order by property.macroPropertySortOrder",
|
||||
SqlHelper.CreateParameter("@macroID", id)))
|
||||
using (
|
||||
IRecordsReader macroDef =
|
||||
SqlHelper.ExecuteReader(
|
||||
"select * from cmsMacro left join cmsMacroProperty property on property.macro = cmsMacro.id left join cmsMacroPropertyType editPropertyType on editPropertyType.id = property.macroPropertyType where cmsMacro.id = @macroID order by property.macroPropertySortOrder",
|
||||
SqlHelper.CreateParameter("@macroID", id)))
|
||||
{
|
||||
if (!macroDef.HasRecords)
|
||||
HttpContext.Current.Trace.Warn("Macro", "No definition found for id " + id);
|
||||
@@ -271,11 +218,13 @@ namespace umbraco
|
||||
{
|
||||
string typeAlias;
|
||||
|
||||
if (TryGetColumnString(macroDef, "macroPropertyTypeAlias", out typeAlias) && !properties.ContainsKey(tmpStr))
|
||||
if (TryGetColumnString(macroDef, "macroPropertyTypeAlias", out typeAlias) &&
|
||||
!properties.ContainsKey(tmpStr))
|
||||
properties.Add(tmpStr, typeAlias);
|
||||
|
||||
string baseType;
|
||||
if (TryGetColumnString(macroDef, "macroPropertyTypeBaseType", out baseType) && !propertyDefinitions.ContainsKey(tmpStr))
|
||||
if (TryGetColumnString(macroDef, "macroPropertyTypeBaseType", out baseType) &&
|
||||
!propertyDefinitions.ContainsKey(tmpStr))
|
||||
propertyDefinitions.Add(tmpStr, baseType);
|
||||
}
|
||||
}
|
||||
@@ -304,9 +253,33 @@ namespace umbraco
|
||||
macroType = (int)eMacroType.Unknown;
|
||||
}
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return Name;
|
||||
}
|
||||
|
||||
public static macro ReturnFromAlias(string alias)
|
||||
{
|
||||
if (_macroAlias.ContainsKey(alias))
|
||||
return new macro((int)_macroAlias[alias]);
|
||||
else
|
||||
{
|
||||
try
|
||||
{
|
||||
int macroID = Macro.GetByAlias(alias).Id;
|
||||
_macroAlias.Add(alias, macroID);
|
||||
return new macro(macroID);
|
||||
}
|
||||
catch
|
||||
{
|
||||
HttpContext.Current.Trace.Warn("macro", "No macro with alias '" + alias + "' found");
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static bool TryGetColumnString(IRecordsReader reader, string columnName, out string value)
|
||||
{
|
||||
|
||||
if (reader.ContainsField(columnName) && !reader.IsNull(columnName))
|
||||
{
|
||||
value = reader.GetString(columnName);
|
||||
@@ -469,8 +442,10 @@ namespace umbraco
|
||||
case (int)eMacroType.Script:
|
||||
try
|
||||
{
|
||||
HttpContext.Current.Trace.Write("umbracoMacro", "DLR Script script added (" + ScriptFile + ")");
|
||||
macroControl = loadMacroDLR(this, attributes, pageElements);
|
||||
HttpContext.Current.Trace.Write("umbracoMacro",
|
||||
"DLR Script script added (" + ScriptFile + ")");
|
||||
MacroModel model = new MacroModel(this, attributes);
|
||||
macroControl = loadMacroDLR(model);
|
||||
break;
|
||||
}
|
||||
catch (Exception e)
|
||||
@@ -479,7 +454,7 @@ namespace umbraco
|
||||
"Error loading python script (file: " + ScriptFile +
|
||||
", Type: '" + scriptType + "'", e);
|
||||
|
||||
LiteralControl result = new LiteralControl("Error loading DLR script (file: " + ScriptFile + ")");
|
||||
var result = new LiteralControl("Error loading DLR script (file: " + ScriptFile + ")");
|
||||
|
||||
/*
|
||||
string args = "<ul>";
|
||||
@@ -514,18 +489,18 @@ namespace umbraco
|
||||
{
|
||||
if (macroControl != null)
|
||||
{
|
||||
using (StringWriter sw = new StringWriter())
|
||||
using (var sw = new StringWriter())
|
||||
{
|
||||
HtmlTextWriter hw = new HtmlTextWriter(sw);
|
||||
var hw = new HtmlTextWriter(sw);
|
||||
macroControl.RenderControl(hw);
|
||||
|
||||
macroCache.Insert("macroHtml_" + macroGuid,
|
||||
sw.ToString(),
|
||||
null,
|
||||
DateTime.Now.AddSeconds(RefreshRate),
|
||||
TimeSpan.Zero,
|
||||
CacheItemPriority.Low,
|
||||
null);
|
||||
sw.ToString(),
|
||||
null,
|
||||
DateTime.Now.AddSeconds(RefreshRate),
|
||||
TimeSpan.Zero,
|
||||
CacheItemPriority.Low,
|
||||
null);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -547,10 +522,10 @@ namespace umbraco
|
||||
}
|
||||
else
|
||||
{
|
||||
XmlTextReader xslReader =
|
||||
var xslReader =
|
||||
new XmlTextReader(IOHelper.MapPath(SystemDirectories.Xslt + "/" + XsltFile));
|
||||
|
||||
XslCompiledTransform macroXSLT = CreateXsltTransform(xslReader, umbraco.GlobalSettings.DebugMode);
|
||||
XslCompiledTransform macroXSLT = CreateXsltTransform(xslReader, GlobalSettings.DebugMode);
|
||||
HttpRuntime.Cache.Insert(
|
||||
"macroXslt_" + XsltFile,
|
||||
macroXSLT,
|
||||
@@ -561,8 +536,8 @@ namespace umbraco
|
||||
|
||||
public static XslCompiledTransform CreateXsltTransform(XmlTextReader xslReader, bool debugMode)
|
||||
{
|
||||
XslCompiledTransform macroXSLT = new XslCompiledTransform(debugMode);
|
||||
XmlUrlResolver xslResolver = new XmlUrlResolver();
|
||||
var macroXSLT = new XslCompiledTransform(debugMode);
|
||||
var xslResolver = new XmlUrlResolver();
|
||||
xslResolver.Credentials = CredentialCache.DefaultCredentials;
|
||||
|
||||
xslReader.EntityHandling = EntityHandling.ExpandEntities;
|
||||
@@ -594,12 +569,13 @@ namespace umbraco
|
||||
|
||||
private Hashtable keysToLowerCase(Hashtable input)
|
||||
{
|
||||
Hashtable retval = new Hashtable();
|
||||
var retval = new Hashtable();
|
||||
foreach (object key in input.Keys)
|
||||
retval.Add(key.ToString().ToLower(), input[key]);
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
public Control loadMacroXSLT(macro macro, Hashtable attributes, Hashtable pageElements)
|
||||
{
|
||||
if (XsltFile.Trim() != string.Empty)
|
||||
@@ -611,7 +587,7 @@ namespace umbraco
|
||||
XmlDocument umbracoXML = content.Instance.XmlContent;
|
||||
|
||||
// Create XML document for Macro
|
||||
XmlDocument macroXML = new XmlDocument();
|
||||
var macroXML = new XmlDocument();
|
||||
macroXML.LoadXml("<macro/>");
|
||||
|
||||
foreach (DictionaryEntry macroDef in macro.properties)
|
||||
@@ -691,7 +667,7 @@ namespace umbraco
|
||||
const string tagEnd = "]]]]";
|
||||
|
||||
// container that will hold parsed controls
|
||||
PlaceHolder container = new PlaceHolder();
|
||||
var container = new PlaceHolder();
|
||||
|
||||
// loop through all text
|
||||
int textPos = 0;
|
||||
@@ -713,7 +689,7 @@ namespace umbraco
|
||||
Hashtable attributes = helper.ReturnAttributes(tag);
|
||||
|
||||
// create item with the parameters specified in the tag
|
||||
templateControls.Item item = new templateControls.Item();
|
||||
var item = new Item();
|
||||
item.NodeId = helper.FindAttribute(attributes, "nodeid");
|
||||
item.Field = helper.FindAttribute(attributes, "field");
|
||||
item.Xslt = helper.FindAttribute(attributes, "xslt");
|
||||
@@ -738,14 +714,15 @@ namespace umbraco
|
||||
return GetXsltTransformResult(macroXML, xslt, null);
|
||||
}
|
||||
|
||||
public static string GetXsltTransformResult(XmlDocument macroXML, XslCompiledTransform xslt, Dictionary<string, object> parameters)
|
||||
public static string GetXsltTransformResult(XmlDocument macroXML, XslCompiledTransform xslt,
|
||||
Dictionary<string, object> parameters)
|
||||
{
|
||||
TextWriter tw = new StringWriter();
|
||||
|
||||
HttpContext.Current.Trace.Write("umbracoMacro", "Before adding extensions");
|
||||
XsltArgumentList xslArgs;
|
||||
xslArgs = AddXsltExtensions();
|
||||
library lib = new library();
|
||||
var lib = new library();
|
||||
xslArgs.AddExtensionObject("urn:umbraco.library", lib);
|
||||
HttpContext.Current.Trace.Write("umbracoMacro", "After adding extensions");
|
||||
|
||||
@@ -756,7 +733,7 @@ namespace umbraco
|
||||
}
|
||||
if (parameters != null)
|
||||
{
|
||||
foreach (KeyValuePair<string, object> parameter in parameters)
|
||||
foreach (var parameter in parameters)
|
||||
xslArgs.AddParam(parameter.Key, string.Empty, parameter.Value);
|
||||
}
|
||||
|
||||
@@ -778,10 +755,10 @@ namespace umbraco
|
||||
public static Dictionary<string, object> GetXsltExtensions()
|
||||
{
|
||||
// fill a dictionary with the predefined extensions
|
||||
Dictionary<string, object> extensions = new Dictionary<string, object>(GetPredefinedXsltExtensions());
|
||||
var extensions = new Dictionary<string, object>(GetPredefinedXsltExtensions());
|
||||
|
||||
// Load the XSLT extensions configuration
|
||||
XmlDocument xsltExt = new XmlDocument();
|
||||
var xsltExt = new XmlDocument();
|
||||
xsltExt.Load(IOHelper.MapPath(SystemDirectories.Config + "/xsltExtensions.config"));
|
||||
|
||||
// add all descendants of the XsltExtensions element
|
||||
@@ -794,7 +771,9 @@ namespace umbraco
|
||||
Debug.Assert(xsltEx.Attributes["alias"] != null, "Extension attribute 'alias' not specified.");
|
||||
|
||||
// load the extension assembly
|
||||
string extensionFile = IOHelper.MapPath(string.Format("{0}/{1}.dll", SystemDirectories.Bin, xsltEx.Attributes["assembly"].Value));
|
||||
string extensionFile =
|
||||
IOHelper.MapPath(string.Format("{0}/{1}.dll", SystemDirectories.Bin,
|
||||
xsltEx.Attributes["assembly"].Value));
|
||||
|
||||
Assembly extensionAssembly;
|
||||
try
|
||||
@@ -803,15 +782,19 @@ namespace umbraco
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw new Exception(String.Format("Could not load assembly {0} for XSLT extension {1}. Please check config/xsltExentions.config.",
|
||||
extensionFile, xsltEx.Attributes["alias"].Value), ex);
|
||||
throw new Exception(
|
||||
String.Format(
|
||||
"Could not load assembly {0} for XSLT extension {1}. Please check config/xsltExentions.config.",
|
||||
extensionFile, xsltEx.Attributes["alias"].Value), ex);
|
||||
}
|
||||
|
||||
// load the extension type
|
||||
Type extensionType = extensionAssembly.GetType(xsltEx.Attributes["type"].Value);
|
||||
if (extensionType == null)
|
||||
throw new Exception(String.Format("Could not load type {0} ({1}) for XSLT extension {1}. Please check config/xsltExentions.config.",
|
||||
xsltEx.Attributes["type"].Value, extensionFile, xsltEx.Attributes["alias"].Value));
|
||||
throw new Exception(
|
||||
String.Format(
|
||||
"Could not load type {0} ({1}) for XSLT extension {1}. Please check config/xsltExentions.config.",
|
||||
xsltEx.Attributes["type"].Value, extensionFile, xsltEx.Attributes["alias"].Value));
|
||||
|
||||
// create an instance and add it to the extensions list
|
||||
extensions.Add(xsltEx.Attributes["alias"].Value, Activator.CreateInstance(extensionType));
|
||||
@@ -821,17 +804,20 @@ namespace umbraco
|
||||
Assembly appCodeAssembly;
|
||||
try
|
||||
{
|
||||
if (Directory.Exists(GlobalSettings.FullpathToRoot + System.IO.Path.DirectorySeparatorChar + "App_Code"))
|
||||
if (Directory.Exists(GlobalSettings.FullpathToRoot + Path.DirectorySeparatorChar + "App_Code"))
|
||||
{
|
||||
if (Directory.GetFiles(GlobalSettings.FullpathToRoot + System.IO.Path.DirectorySeparatorChar + "App_Code",
|
||||
"*.*",
|
||||
SearchOption.AllDirectories).Length > 0)
|
||||
if (Directory.GetFiles(GlobalSettings.FullpathToRoot + Path.DirectorySeparatorChar + "App_Code",
|
||||
"*.*",
|
||||
SearchOption.AllDirectories).Length > 0)
|
||||
{
|
||||
appCodeAssembly = Assembly.Load("__code");
|
||||
Type[] appCodeType = appCodeAssembly.GetExportedTypes();
|
||||
if (appCodeType.Length == 0)
|
||||
{
|
||||
Log.Add(LogTypes.System, Node.GetCurrent().Id, String.Format("Could not load types in App_Code ({0}) for XSLT extensions. Ensure you have used the public keyword to ensure class and method exposure.", appCodeAssembly.FullName));
|
||||
Log.Add(LogTypes.System, Node.GetCurrent().Id,
|
||||
String.Format(
|
||||
"Could not load types in App_Code ({0}) for XSLT extensions. Ensure you have used the public keyword to ensure class and method exposure.",
|
||||
appCodeAssembly.FullName));
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -856,11 +842,12 @@ namespace umbraco
|
||||
}
|
||||
else
|
||||
{
|
||||
Directory.CreateDirectory(GlobalSettings.FullpathToRoot + System.IO.Path.DirectorySeparatorChar + "App_Code");
|
||||
Directory.CreateDirectory(GlobalSettings.FullpathToRoot + Path.DirectorySeparatorChar + "App_Code");
|
||||
}
|
||||
}
|
||||
catch (FileNotFoundException)
|
||||
{ //Do nothing - just means there's nothing to load.
|
||||
{
|
||||
//Do nothing - just means there's nothing to load.
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
@@ -903,15 +890,15 @@ namespace umbraco
|
||||
/// <returns>A new XSLT argument list.</returns>
|
||||
public static XsltArgumentList AddMacroXsltExtensions()
|
||||
{
|
||||
XsltArgumentList xslArgs = new XsltArgumentList();
|
||||
var xslArgs = new XsltArgumentList();
|
||||
|
||||
foreach (KeyValuePair<string, object> extension in GetXsltExtensions())
|
||||
foreach (var extension in GetXsltExtensions())
|
||||
{
|
||||
string extensionNamespace = "urn:" + extension.Key;
|
||||
xslArgs.AddExtensionObject(extensionNamespace, extension.Value);
|
||||
HttpContext.Current.Trace.Write("umbracoXsltExtension",
|
||||
String.Format("Extension added: {0}, {1}",
|
||||
extensionNamespace, extension.Value.GetType().Name));
|
||||
extensionNamespace, extension.Value.GetType().Name));
|
||||
}
|
||||
|
||||
return xslArgs;
|
||||
@@ -921,13 +908,13 @@ namespace umbraco
|
||||
String macroPropertyType, String macroPropertyValue)
|
||||
{
|
||||
XmlNode macroXmlNode = macroXML.CreateNode(XmlNodeType.Element, macroPropertyAlias, string.Empty);
|
||||
XmlDocument x = new XmlDocument();
|
||||
var x = new XmlDocument();
|
||||
|
||||
int currentID = -1;
|
||||
// If no value is passed, then use the current pageID as value
|
||||
if (macroPropertyValue == string.Empty)
|
||||
{
|
||||
page umbPage = (page)HttpContext.Current.Items["umbPageObject"];
|
||||
var umbPage = (page)HttpContext.Current.Items["umbPageObject"];
|
||||
if (umbPage == null)
|
||||
return;
|
||||
currentID = umbPage.PageID;
|
||||
@@ -1014,11 +1001,11 @@ namespace umbraco
|
||||
") doesn't exists!");
|
||||
break;
|
||||
case "mediaCurrent":
|
||||
Content c = new Content(int.Parse(macroPropertyValue));
|
||||
var c = new Content(int.Parse(macroPropertyValue));
|
||||
macroXmlNode.AppendChild(macroXML.ImportNode(c.ToXml(content.Instance.XmlContent, false), true));
|
||||
break;
|
||||
default:
|
||||
macroXmlNode.InnerText = System.Web.HttpContext.Current.Server.HtmlDecode(macroPropertyValue);
|
||||
macroXmlNode.InnerText = HttpContext.Current.Server.HtmlDecode(macroPropertyValue);
|
||||
break;
|
||||
}
|
||||
macroXML.FirstChild.AppendChild(macroXmlNode);
|
||||
@@ -1026,8 +1013,8 @@ namespace umbraco
|
||||
|
||||
private string transformMacroXML(XmlDocument xmlSource, string xslt_File)
|
||||
{
|
||||
StringBuilder sb = new StringBuilder();
|
||||
StringWriter sw = new StringWriter(sb);
|
||||
var sb = new StringBuilder();
|
||||
var sw = new StringWriter(sb);
|
||||
|
||||
XslCompiledTransform result = getXslt(xslt_File);
|
||||
//XmlDocument xslDoc = new XmlDocument();
|
||||
@@ -1049,12 +1036,12 @@ namespace umbraco
|
||||
/// <returns>Returns a LiteralControl stuffed with the StandardOutput of the script execution.</returns>
|
||||
public Control loadMacroPython(macro macro, Hashtable attributes, Hashtable pageElements)
|
||||
{
|
||||
LiteralControl ret = new LiteralControl();
|
||||
var ret = new LiteralControl();
|
||||
try
|
||||
{
|
||||
// Adding some global accessible variables to the enviroment.
|
||||
// Currently no cleanup after execution is done.
|
||||
Hashtable args = new Hashtable();
|
||||
var args = new Hashtable();
|
||||
HttpContext.Current.Session.Add("pageElements", pageElements);
|
||||
HttpContext.Current.Session.Add("macro", this);
|
||||
HttpContext.Current.Session.Add("args", args);
|
||||
@@ -1105,40 +1092,12 @@ namespace umbraco
|
||||
}
|
||||
|
||||
|
||||
public Control loadMacroDLR(macro macro, Hashtable attributes, Hashtable pageElements)
|
||||
public Control loadMacroDLR(MacroModel macro)
|
||||
{
|
||||
LiteralControl ret = new LiteralControl();
|
||||
Hashtable args = new Hashtable();
|
||||
var ret = new LiteralControl();
|
||||
|
||||
foreach (DictionaryEntry macroDef in macro.properties)
|
||||
{
|
||||
try
|
||||
{
|
||||
args.Add(macroDef.Key.ToString(), helper.FindAttribute(pageElements, attributes, macroDef.Key.ToString()));
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
HttpContext.Current.Trace.Warn("umbracoMacro", "Could not add global variable (" + macroDef.Key + ") to DLR enviroment", e);
|
||||
}
|
||||
}
|
||||
|
||||
foreach (DictionaryEntry pageVal in pageElements)
|
||||
{
|
||||
try
|
||||
{
|
||||
args.Add(pageVal.Key.ToString(), pageVal.Value);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
HttpContext.Current.Trace.Warn("umbracoMacro", "Could not add page value (" + pageVal.Key + ") to DLR enviroment", e);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
args.Add("currentPage", umbraco.presentation.nodeFactory.Node.GetCurrent());
|
||||
|
||||
string path = IOHelper.MapPath(SystemDirectories.Python + "/" + macro.scriptFile);
|
||||
ret.Text = MacroScript.ExecuteFile(path, args);
|
||||
string path = IOHelper.MapPath(SystemDirectories.Python + "/" + macro.ScriptName);
|
||||
// ret.Text = MacroScript.ExecuteFile(path, args);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -1182,7 +1141,7 @@ namespace umbraco
|
||||
{
|
||||
throw new ArgumentException(string.Format("ASSEMBLY NOT LOADED PATH: {0} NOT FOUND!!",
|
||||
IOHelper.MapPath(SystemDirectories.Bin + "/" + fileName +
|
||||
".dll")));
|
||||
".dll")));
|
||||
}
|
||||
|
||||
if (HttpContext.Current != null)
|
||||
@@ -1193,7 +1152,7 @@ namespace umbraco
|
||||
return new LiteralControl(string.Format("Unable to get type {0} from assembly {1}",
|
||||
controlName, asm.FullName));
|
||||
|
||||
Control control = Activator.CreateInstance(type) as Control;
|
||||
var control = Activator.CreateInstance(type) as Control;
|
||||
if (control == null)
|
||||
return new LiteralControl(string.Format("Unable to create control {0} from assembly {1}",
|
||||
controlName, asm.FullName));
|
||||
@@ -1230,7 +1189,7 @@ namespace umbraco
|
||||
object o = propertyDefinitions[propertyAlias];
|
||||
if (o == null)
|
||||
continue;
|
||||
TypeCode st = (TypeCode)Enum.Parse(typeof(TypeCode), o.ToString(), true);
|
||||
var st = (TypeCode)Enum.Parse(typeof(TypeCode), o.ToString(), true);
|
||||
|
||||
// Special case for booleans
|
||||
if (prop.PropertyType == typeof(bool))
|
||||
@@ -1278,7 +1237,7 @@ namespace umbraco
|
||||
if (!File.Exists(IOHelper.MapPath(userControlPath)))
|
||||
return new LiteralControl(string.Format("UserControl {0} does not exist.", fileName));
|
||||
|
||||
UserControl oControl = (UserControl)new UserControl().LoadControl(userControlPath);
|
||||
var oControl = (UserControl)new UserControl().LoadControl(userControlPath);
|
||||
|
||||
int slashIndex = fileName.LastIndexOf("/") + 1;
|
||||
if (slashIndex < 0)
|
||||
@@ -1327,7 +1286,7 @@ namespace umbraco
|
||||
object o = propertyDefinitions[propertyAlias];
|
||||
if (o == null)
|
||||
continue;
|
||||
TypeCode st = (TypeCode)Enum.Parse(typeof(TypeCode), o.ToString(), true);
|
||||
var st = (TypeCode)Enum.Parse(typeof(TypeCode), o.ToString(), true);
|
||||
|
||||
// Special case for booleans
|
||||
if (prop.PropertyType == typeof(bool))
|
||||
@@ -1345,8 +1304,8 @@ namespace umbraco
|
||||
propValue = Convert.ChangeType(propValue, st);
|
||||
|
||||
Trace.Write("macro.loadControlProperties",
|
||||
string.Format("Property added '{0}' with value '{1}'", propertyAlias,
|
||||
propValue));
|
||||
string.Format("Property added '{0}' with value '{1}'", propertyAlias,
|
||||
propValue));
|
||||
}
|
||||
catch (Exception PropException)
|
||||
{
|
||||
@@ -1450,10 +1409,10 @@ namespace umbraco
|
||||
|
||||
public static string GetRenderedMacro(int MacroId, page umbPage, Hashtable attributes, int pageId)
|
||||
{
|
||||
macro m = new macro(MacroId);
|
||||
var m = new macro(MacroId);
|
||||
Control c = m.renderMacro(attributes, umbPage.Elements, pageId);
|
||||
TextWriter writer = new StringWriter();
|
||||
HtmlTextWriter ht = new HtmlTextWriter(writer);
|
||||
var ht = new HtmlTextWriter(writer);
|
||||
c.RenderControl(ht);
|
||||
string result = writer.ToString();
|
||||
|
||||
@@ -1469,7 +1428,9 @@ namespace umbraco
|
||||
|
||||
public static string MacroContentByHttp(int PageID, Guid PageVersion, Hashtable attributes)
|
||||
{
|
||||
string tempAlias = (attributes["macroalias"] != null) ? attributes["macroalias"].ToString() : attributes["macroAlias"].ToString();
|
||||
string tempAlias = (attributes["macroalias"] != null)
|
||||
? attributes["macroalias"].ToString()
|
||||
: attributes["macroAlias"].ToString();
|
||||
if (!ReturnFromAlias(tempAlias).DontRenderInEditor)
|
||||
{
|
||||
string querystring = "umbPageId=" + PageID + "&umbVersionId=" + PageVersion;
|
||||
@@ -1480,15 +1441,17 @@ namespace umbraco
|
||||
// Create a new 'HttpWebRequest' Object to the mentioned URL.
|
||||
string retVal = string.Empty;
|
||||
string url = "http://" + HttpContext.Current.Request.ServerVariables["SERVER_NAME"] + ":" +
|
||||
HttpContext.Current.Request.ServerVariables["SERVER_PORT"] + IOHelper.ResolveUrl(SystemDirectories.Umbraco) +
|
||||
HttpContext.Current.Request.ServerVariables["SERVER_PORT"] +
|
||||
IOHelper.ResolveUrl(SystemDirectories.Umbraco) +
|
||||
"/macroResultWrapper.aspx?" +
|
||||
querystring;
|
||||
|
||||
HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(url);
|
||||
var myHttpWebRequest = (HttpWebRequest)WebRequest.Create(url);
|
||||
|
||||
// propagate the user's context
|
||||
HttpCookie inCookie = HttpContext.Current.Request.Cookies["UserContext"];
|
||||
Cookie cookie = new Cookie(inCookie.Name, inCookie.Value, inCookie.Path, HttpContext.Current.Request.ServerVariables["SERVER_NAME"]);
|
||||
var cookie = new Cookie(inCookie.Name, inCookie.Value, inCookie.Path,
|
||||
HttpContext.Current.Request.ServerVariables["SERVER_NAME"]);
|
||||
myHttpWebRequest.CookieContainer = new CookieContainer();
|
||||
myHttpWebRequest.CookieContainer.Add(cookie);
|
||||
|
||||
@@ -1500,12 +1463,12 @@ namespace umbraco
|
||||
if (myHttpWebResponse.StatusCode == HttpStatusCode.OK)
|
||||
{
|
||||
Stream streamResponse = myHttpWebResponse.GetResponseStream();
|
||||
StreamReader streamRead = new StreamReader(streamResponse);
|
||||
Char[] readBuff = new Char[256];
|
||||
var streamRead = new StreamReader(streamResponse);
|
||||
var readBuff = new Char[256];
|
||||
int count = streamRead.Read(readBuff, 0, 256);
|
||||
while (count > 0)
|
||||
{
|
||||
String outputData = new String(readBuff, 0, count);
|
||||
var outputData = new String(readBuff, 0, count);
|
||||
retVal += outputData;
|
||||
count = streamRead.Read(readBuff, 0, 256);
|
||||
}
|
||||
@@ -1552,9 +1515,9 @@ namespace umbraco
|
||||
/// <returns></returns>
|
||||
public static string AddXsltExtensionsToHeader(string xslt)
|
||||
{
|
||||
StringBuilder namespaceList = new StringBuilder();
|
||||
StringBuilder namespaceDeclaractions = new StringBuilder();
|
||||
foreach (KeyValuePair<string, object> extension in macro.GetXsltExtensions())
|
||||
var namespaceList = new StringBuilder();
|
||||
var namespaceDeclaractions = new StringBuilder();
|
||||
foreach (var extension in GetXsltExtensions())
|
||||
{
|
||||
namespaceList.Append(extension.Key).Append(' ');
|
||||
namespaceDeclaractions.AppendFormat("xmlns:{0}=\"urn:{0}\" ", extension.Key);
|
||||
@@ -1565,13 +1528,18 @@ namespace umbraco
|
||||
xslt = xslt.Replace("{1}", namespaceList.ToString());
|
||||
return xslt;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public class MacroCacheContent
|
||||
{
|
||||
private Control _control;
|
||||
private string _id;
|
||||
private readonly Control _control;
|
||||
private readonly string _id;
|
||||
|
||||
public MacroCacheContent(Control control, string ID)
|
||||
{
|
||||
_control = control;
|
||||
_id = ID;
|
||||
}
|
||||
|
||||
public string ID
|
||||
{
|
||||
@@ -1582,12 +1550,6 @@ namespace umbraco
|
||||
{
|
||||
get { return _control; }
|
||||
}
|
||||
|
||||
public MacroCacheContent(Control control, string ID)
|
||||
{
|
||||
_control = control;
|
||||
_id = ID;
|
||||
}
|
||||
}
|
||||
|
||||
public class macroCacheRefresh : ICacheRefresher
|
||||
@@ -1631,6 +1593,7 @@ namespace umbraco
|
||||
{
|
||||
new macro(Id).removeFromCache();
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
|
||||
@@ -1641,18 +1604,121 @@ namespace umbraco
|
||||
/// An optional XML namespace can be specified using [XsltExtension("MyNamespace")].
|
||||
/// </remarks>
|
||||
[AttributeUsage(AttributeTargets.Class)]
|
||||
[AspNetHostingPermission(System.Security.Permissions.SecurityAction.Demand, Level = AspNetHostingPermissionLevel.Medium, Unrestricted = false)]
|
||||
[AspNetHostingPermission(SecurityAction.Demand, Level = AspNetHostingPermissionLevel.Medium, Unrestricted = false)]
|
||||
public class XsltExtensionAttribute : Attribute
|
||||
{
|
||||
public XsltExtensionAttribute()
|
||||
{
|
||||
this.Namespace = String.Empty;
|
||||
Namespace = String.Empty;
|
||||
}
|
||||
|
||||
public XsltExtensionAttribute(string ns)
|
||||
{
|
||||
this.Namespace = ns;
|
||||
Namespace = ns;
|
||||
}
|
||||
|
||||
public string Namespace { get; set; }
|
||||
public override string ToString() { return this.Namespace; }
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return Namespace;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
namespace umbraco.Models
|
||||
{
|
||||
[Serializable]
|
||||
public class MacroModel
|
||||
{
|
||||
public string Name { get; set; }
|
||||
public string Alias { get; set; }
|
||||
|
||||
public string TypeAssembly { get; set; }
|
||||
public string TypeName { get; set; }
|
||||
public string Xslt { get; set; }
|
||||
public string ScriptName { get; set; }
|
||||
public string ScriptCode { get; set; }
|
||||
|
||||
public int CacheDuration { get; set; }
|
||||
public bool CacheByPage { get; set; }
|
||||
public bool CacheByMember { get; set; }
|
||||
|
||||
public List<MacroPropertyModel> Properties { get; set; }
|
||||
|
||||
public MacroModel()
|
||||
{
|
||||
Properties = new List<MacroPropertyModel>();
|
||||
}
|
||||
|
||||
public MacroModel(string name, string alias, string typeAssembly, string typeName, string xslt, string scriptName, int cacheDuration, bool cacheByPage, bool cacheByMember)
|
||||
{
|
||||
Name = name;
|
||||
Alias = alias;
|
||||
TypeAssembly = typeAssembly;
|
||||
TypeName = typeName;
|
||||
Xslt = xslt;
|
||||
ScriptName = scriptName;
|
||||
CacheDuration = cacheDuration;
|
||||
CacheByPage = cacheByPage;
|
||||
CacheByMember = cacheByMember;
|
||||
|
||||
Properties = new List<MacroPropertyModel>();
|
||||
}
|
||||
|
||||
public MacroModel(macro macro, Hashtable attributes)
|
||||
{
|
||||
Name = macro.Name;
|
||||
Alias = macro.Alias;
|
||||
TypeAssembly = macro.ScriptAssembly;
|
||||
TypeName = macro.ScriptType;
|
||||
Xslt = macro.XsltFile;
|
||||
ScriptName = macro.ScriptFile;
|
||||
CacheDuration = macro.RefreshRate;
|
||||
CacheByPage = macro.CacheByPage;
|
||||
CacheByMember = macro.CacheByPersonalization;
|
||||
|
||||
Properties = new List<MacroPropertyModel>();
|
||||
foreach (string key in attributes.Keys)
|
||||
{
|
||||
Properties.Add(new MacroPropertyModel(key, attributes[key].ToString()));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
public class MacroPropertyModel
|
||||
{
|
||||
public string Key { get; set; }
|
||||
public string Value { get; set; }
|
||||
|
||||
public MacroPropertyModel()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public MacroPropertyModel(string key, string value)
|
||||
{
|
||||
Key = key;
|
||||
Value = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
namespace umbraco.interfaces {
|
||||
public interface IMacroEngine
|
||||
{
|
||||
string Name
|
||||
{
|
||||
get;
|
||||
}
|
||||
List<string> SupportedExtensions
|
||||
{
|
||||
get;
|
||||
}
|
||||
|
||||
string Execute(MacroModel macro, Node currentPage);
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user