/*
Kooboo is a content management system based on ASP.NET MVC framework. Copyright 2009 Yardi Technology Limited.
This program is free software: you can redistribute it and/or modify it under the terms of the
GNU General Public License version 3 as published by the Free Software Foundation.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program.
If not, see http://www.kooboo.com/gpl3/.
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.Mvc;
using Everest.Library.Extjs;
using Everest.CmsServices.Models;
using Everest.Library.Net;
using System.Collections.Specialized;
using Everest.Library.Json;
using System.IO;
using Everest.CmsServices.Installation;
namespace Everest.CmsServices.Controllers{
internal abstract class DownloadManager<T>
where T : DownloadObject
{
private static Dictionary<string, ResourceDownloader> downloadList = new Dictionary<string, ResourceDownloader>();
private static object lockObj = new object();
internal static void RemoveDownloader(string downloadUrl)
{
lock (lockObj)
{
downloadList.Remove(downloadUrl);
}
}
private static void SetDownloader(string downloadUrl, ResourceDownloader item)
{
lock (lockObj)
{
downloadList[downloadUrl] = item;
}
}
internal static ResourceDownloader GetDownloader(string downloadUrl)
{
lock (lockObj)
{
return downloadList.ContainsKey(downloadUrl) ? downloadList[downloadUrl] : null;
}
}
protected abstract void DownloadComplete(T downloadObject);
protected abstract void SetStatus(T downloadObject);
public abstract string GetSavedFilePath(T downloadObject);
public virtual bool Download(T downloadObject)
{
if (string.IsNullOrEmpty(downloadObject.DownloadLink))
{
return false;
}
var downloader = GetDownloader(downloadObject.DownloadLink);
if (downloader == null)
{
// save to local path
var savePath = GetSavedFilePath(downloadObject);
if (File.Exists(savePath))
{
File.Delete(savePath);
}
var tempSavePath = savePath + "_tmp";
// create downloader
downloader = new ResourceDownloader(downloadObject.DownloadLink);
downloader.ProgressChanged += (object sender, ProgressChangedEventArgs e) =>
{
if (e.Complete == true)
{
System.IO.File.Move(tempSavePath, savePath);
RemoveDownloader(downloadObject.DownloadLink);
DownloadComplete(downloadObject);
}
};
downloader.Error += (object sender, DownloadErrorEventArgs e) =>
{
Everest.Library.HealthMonitor.HealthMonitoringLogging.LogError(e.Exception);
if (System.IO.File.Exists(tempSavePath))
{
System.IO.File.Delete(tempSavePath);
}
RemoveDownloader(downloadObject.DownloadLink);
};
// resource info
downloadObject.Status = DownloadStatus.Downloading;
downloader.BeginDownload(tempSavePath);
// cache downloader
SetDownloader(downloadObject.DownloadLink, downloader);
return true;
}
return false;
}
public virtual bool Cancel(T downloadObject)
{
var downloader = GetDownloader(downloadObject.DownloadLink);
if (downloader != null)
{
downloader.Cancel();
RemoveDownloader(downloadObject.DownloadLink);
}
return true;
}
public virtual void SetDownloadStatus(IEnumerable<T> downloads)
{
if (downloads == null)
{
return;
}
foreach (var download in downloads)
{
if (GetDownloader(download.DownloadLink) != null)
{
download.Status = DownloadStatus.Downloading;
continue;
}
SetStatus(download);
}
}
}
[PermissionFilter(Permission = FolderType.KoobooStore)]
public class CheckUpdatesController : CmsExtController
{
#region DownloadManager
internal class CheckUpdatesDownloadManager : DownloadManager<AvaliableUpdates>
{
public override string GetSavedFilePath(AvaliableUpdates downloadObject)
{
var version = ((AvaliableUpdates)downloadObject).Version;
var updatesDir = Path.Combine(CmsGlobal.TempPath, "Updates");
if (!Directory.Exists(updatesDir))
{
Directory.CreateDirectory(updatesDir);
}
return Path.Combine(updatesDir, version + ".zip");
}
protected override void DownloadComplete(AvaliableUpdates downloadObject)
{
}
protected override void SetStatus(AvaliableUpdates downloadObject)
{
string updateFile = GetSavedFilePath(downloadObject);
if (System.IO.File.Exists(updateFile))
{
downloadObject.Status = DownloadStatus.Downloaded;
}
}
}
private CheckUpdatesDownloadManager downloadManager = new CheckUpdatesDownloadManager();
#endregion
static string CheckUpdatesUrl
{
get
{
var url = System.Configuration.ConfigurationManager.AppSettings["CheckUpdatesUrl"];
if (string.IsNullOrEmpty(url))
{
url = "http://www.kooboo.com/CheckUpdates";
}
return url;
}
}
/// <summary>
/// Gets the list.
/// </summary>
/// <returns></returns>
public ActionResult GetList()
{
HtmlRequest htmlRequest = new HtmlRequest();
System.Net.HttpStatusCode statusCode;
NameValueCollection requestValues = new NameValueCollection(Request.Form);
requestValues["Version"] = CmsGlobal.KoobooVersion;
var jsonString = htmlRequest.Request(CheckUpdatesUrl, requestValues, "POST", out statusCode);
var data = JSONHelper.DeserializeJSON<ExtJsonReaderObject<AvaliableUpdates>>(jsonString);
downloadManager.SetDownloadStatus(data.Rows);
return Json(data);
}
public ActionResult Download(AvaliableUpdates update)
{
var started = downloadManager.Download(update);
return Json(started);
}
public ActionResult AbortDownload(AvaliableUpdates update)
{
return Json(downloadManager.Cancel(update));
}
public ActionResult Upgrade(AvaliableUpdates update)
{
KoobooInstance kooboo = new KoobooInstance(AppDomain.CurrentDomain.BaseDirectory);
Updater.IntergratedUpgrade(kooboo, downloadManager.GetSavedFilePath(update));
return null;
}
}
}
|