diff --git a/src/Umbraco.Core/Constants-Packaging.cs b/src/Umbraco.Core/Constants-Packaging.cs
new file mode 100644
index 0000000000..a73adf10de
--- /dev/null
+++ b/src/Umbraco.Core/Constants-Packaging.cs
@@ -0,0 +1,51 @@
+namespace Umbraco.Core
+{
+ public static partial class Constants
+ {
+ ///
+ /// Defines the constants used for Umbraco packages in the package.config xml
+ ///
+ public static class Packaging
+ {
+ public const string UmbPackageNodeName = "umbPackage";
+ public const string DataTypesNodeName = "DataTypes";
+ public const string PackageXmlFileName = "package.xml";
+ public const string UmbracoPackageExtention = ".umb";
+ public const string DataTypeNodeName = "DataType";
+ public const string LanguagesNodeName = "Languages";
+ public const string FilesNodeName = "Files";
+ public const string StylesheetsNodeName = "Stylesheets";
+ public const string TemplatesNodeName = "Templates";
+ public const string OrgnameNodeName = "orgName";
+ public const string NameNodeName = "Name";
+ public const string TemplateNodeName = "Template";
+ public const string AliasNodeName = "Alias";
+ public const string DictionaryitemsNodeName = "DictionaryItems";
+ public const string MacrosNodeName = "macros";
+ public const string DocumentSetNodeName = "DocumentSet";
+ public const string DocumentTypesNodeName = "DocumentTypes";
+ public const string DocumentTypeNodeName = "DocumentType";
+ public const string FileNodeName = "file";
+ public const string OrgPathNodeName = "orgPath";
+ public const string GuidNodeName = "guid";
+ public const string StylesheetNodeName = "styleSheet";
+ public const string MacroNodeName = "macro";
+ public const string InfoNodeName = "info";
+ public const string PackageRequirementsMajorXpath = "/package/requirements/major";
+ public const string PackageRequirementsMinorXpath = "/package/requirements/minor";
+ public const string PackageRequirementsPatchXpath = "/package/requirements/patch";
+ public const string PackageNameXpath = "/package/name";
+ public const string PackageVersionXpath = "/package/version";
+ public const string PackageUrlXpath = "/package/url";
+ public const string PackageLicenseXpath = "/package/license";
+ public const string AuthorNameXpath = "/author/name";
+ public const string AuthorWebsiteXpath = "/author/website";
+ public const string ReadmeXpath = "/readme";
+ public const string ControlNodeName = "control";
+ public const string ActionNodeName = "Action";
+ public const string ActionsNodeName = "Actions";
+ public const string UndoNodeAttribute = "undo";
+ public const string RunatNodeAttribute = "runat";
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Umbraco.Core/Packaging/Models/InstallAction.cs b/src/Umbraco.Core/Packaging/Models/InstallAction.cs
new file mode 100644
index 0000000000..257f0c5a03
--- /dev/null
+++ b/src/Umbraco.Core/Packaging/Models/InstallAction.cs
@@ -0,0 +1,21 @@
+using System;
+using System.Runtime.Serialization;
+using System.Xml;
+
+namespace Umbraco.Core.Packaging.Models
+{
+ [Serializable]
+ [DataContract(IsReference = true)]
+ internal class InstallAction
+ {
+ public string Alias { get; set; }
+
+ public string PackageName { get; set; }
+
+ public string RunAt { get; set; }//NOTE Should this default to "install"
+
+ public bool Undo { get; set; }
+
+ public XmlNode XmlData { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/src/Umbraco.Core/Packaging/Models/InstallationSummary.cs b/src/Umbraco.Core/Packaging/Models/InstallationSummary.cs
new file mode 100644
index 0000000000..7ee077855d
--- /dev/null
+++ b/src/Umbraco.Core/Packaging/Models/InstallationSummary.cs
@@ -0,0 +1,24 @@
+using System;
+using System.Collections.Generic;
+using System.Runtime.Serialization;
+
+namespace Umbraco.Core.Packaging.Models
+{
+ [Serializable]
+ [DataContract(IsReference = true)]
+ internal class InstallationSummary
+ {
+ public MetaData MetaData { get; set; }
+ public IEnumerable DataTypesInstalled { get; set; }
+ public IEnumerable LanguagesInstalled { get; set; }
+ public IEnumerable DictionaryItemsInstalled { get; set; }
+ public IEnumerable MacrosInstalled { get; set; }
+ public IEnumerable> FilesInstalled { get; set;}
+ public IEnumerable TemplatesInstalled { get; set; }
+ public IEnumerable DocumentTypesInstalled { get; set; }
+ public IEnumerable StylesheetsInstalled { get; set; }
+ public IEnumerable DocumentsInstalled { get; set; }
+ public IEnumerable InstallActions { get; set; }
+ public IEnumerable UninstallActions { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/src/Umbraco.Core/Packaging/Models/MetaData.cs b/src/Umbraco.Core/Packaging/Models/MetaData.cs
new file mode 100644
index 0000000000..28f1af230e
--- /dev/null
+++ b/src/Umbraco.Core/Packaging/Models/MetaData.cs
@@ -0,0 +1,23 @@
+using System;
+using System.Runtime.Serialization;
+
+namespace Umbraco.Core.Packaging.Models
+{
+ [Serializable]
+ [DataContract(IsReference = true)]
+ internal class MetaData
+ {
+ public string Name { get; set; }
+ public string Version { get; set; }
+ public string Url { get; set; }
+ public string License { get; set; }
+ public string LicenseUrl { get; set; }
+ public int ReqMajor { get; set; }
+ public int ReqMinor { get; set; }
+ public int ReqPatch { get; set; }
+ public string AuthorName { get; set; }
+ public string AuthorUrl { get; set; }
+ public string Readme { get; set; }
+ public string Control { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/src/Umbraco.Core/Packaging/Models/UninstallAction.cs b/src/Umbraco.Core/Packaging/Models/UninstallAction.cs
new file mode 100644
index 0000000000..886c10afba
--- /dev/null
+++ b/src/Umbraco.Core/Packaging/Models/UninstallAction.cs
@@ -0,0 +1,21 @@
+using System;
+using System.Runtime.Serialization;
+using System.Xml;
+
+namespace Umbraco.Core.Packaging.Models
+{
+ [Serializable]
+ [DataContract(IsReference = true)]
+ internal class UninstallAction
+ {
+ public string Alias { get; set; }
+
+ public string PackageName { get; set; }
+
+ public string RunAt { get; set; }//NOTE Should this default to "install"
+
+ public bool Undo { get; set; }//NOTE: Should thid default to "False"?
+
+ public XmlNode XmlData { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/src/Umbraco.Core/Packaging/PackageBuilding.cs b/src/Umbraco.Core/Packaging/PackageBuilding.cs
new file mode 100644
index 0000000000..6cbb17b158
--- /dev/null
+++ b/src/Umbraco.Core/Packaging/PackageBuilding.cs
@@ -0,0 +1,18 @@
+using Umbraco.Core.Services;
+
+namespace Umbraco.Core.Packaging
+{
+ internal interface IPackageBuilding
+ {
+ }
+
+ internal class PackageBuilding : IPackageBuilding
+ {
+ private readonly PackagingService _packagingService;
+
+ public PackageBuilding(PackagingService packagingService)
+ {
+ _packagingService = packagingService;
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Umbraco.Core/Packaging/PackageExtraction.cs b/src/Umbraco.Core/Packaging/PackageExtraction.cs
new file mode 100644
index 0000000000..d3de2a3da4
--- /dev/null
+++ b/src/Umbraco.Core/Packaging/PackageExtraction.cs
@@ -0,0 +1,34 @@
+using System;
+using System.IO;
+using Umbraco.Core.IO;
+
+namespace Umbraco.Core.Packaging
+{
+ internal interface IPackageExtraction
+ {
+ bool Extract(string packageFilePath, string destinationFolder);
+ string ExtractToTemporaryFolder(string packageFilePath);
+ string GetPackageConfigFromArchive(string packageFilePath, string fileToRead = "package.xml");
+ }
+
+ internal class PackageExtraction : IPackageExtraction
+ {
+ public bool Extract(string packageFilePath, string destinationFolder)
+ {
+ return true;
+ }
+
+ public string ExtractToTemporaryFolder(string packageFilePath)
+ {
+ string tempDir = Path.Combine(IOHelper.MapPath(SystemDirectories.Data), Guid.NewGuid().ToString("D"));
+ Directory.CreateDirectory(tempDir);
+ Extract(packageFilePath, tempDir);
+ return tempDir;
+ }
+
+ public string GetPackageConfigFromArchive(string packageFilePath, string fileToRead = "package.xml")
+ {
+ return string.Empty;
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Umbraco.Core/Packaging/PackageInstallation.cs b/src/Umbraco.Core/Packaging/PackageInstallation.cs
new file mode 100644
index 0000000000..5d8c292098
--- /dev/null
+++ b/src/Umbraco.Core/Packaging/PackageInstallation.cs
@@ -0,0 +1,35 @@
+using Umbraco.Core.Packaging.Models;
+using Umbraco.Core.Services;
+
+namespace Umbraco.Core.Packaging
+{
+ internal interface IPackageInstallation
+ {
+ InstallationSummary InstallPackage(string packageFilePath, int userId = 0);
+ MetaData GetPackageMetaData(string packageFilePath);
+ }
+
+ internal class PackageInstallation : IPackageInstallation
+ {
+ private readonly PackagingService _packagingService;
+ private readonly PackageExtraction _packageExtraction;
+
+ public PackageInstallation(PackagingService packagingService, PackageExtraction packageExtraction)
+ {
+ _packagingService = packagingService;
+ _packageExtraction = packageExtraction;
+ }
+
+ public InstallationSummary InstallPackage(string packageFilePath, int userId = 0)
+ {
+ var summary = new InstallationSummary();
+ return summary;
+ }
+
+ public MetaData GetPackageMetaData(string packageFilePath)
+ {
+ var metaData = new MetaData();
+ return metaData;
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Umbraco.Core/Services/PackagingService.cs b/src/Umbraco.Core/Services/PackagingService.cs
index 816865d807..c06cec03fc 100644
--- a/src/Umbraco.Core/Services/PackagingService.cs
+++ b/src/Umbraco.Core/Services/PackagingService.cs
@@ -12,6 +12,8 @@ using Umbraco.Core.IO;
using Umbraco.Core.Logging;
using Umbraco.Core.Models;
using Umbraco.Core.Models.Rdbms;
+using Umbraco.Core.Packaging;
+using Umbraco.Core.Packaging.Models;
using Umbraco.Core.Persistence;
using Umbraco.Core.Persistence.Querying;
using Umbraco.Core.Persistence.UnitOfWork;
@@ -1198,5 +1200,21 @@ namespace Umbraco.Core.Services
#region Stylesheets
#endregion
+
+ #region Installation
+
+ internal InstallationSummary InstallPackage(string packageFilePath, int userId = 0)
+ {
+ //TODO Add events ?
+ //NOTE The PackageInstallation class should be passed as IPackageInstallation through the
+ //constructor (probably as an overload to avoid breaking stuff), so that its extendable.
+ var installer = new PackageInstallation(this, new PackageExtraction());
+ return installer.InstallPackage(packageFilePath, userId);
+ }
+
+ #endregion
+
+ #region Package Building
+ #endregion
}
}
\ No newline at end of file
diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj
index 2158fb1409..929ec806b0 100644
--- a/src/Umbraco.Core/Umbraco.Core.csproj
+++ b/src/Umbraco.Core/Umbraco.Core.csproj
@@ -211,6 +211,13 @@
+
+
+
+
+
+
+
@@ -854,6 +861,9 @@
Constants.cs
+
+
+ Constants.cs
Constants.cs
@@ -917,9 +927,7 @@
-
-
-
+