using System; using System.Data; using System.Web; using System.Web.UI.WebControls; using System.Linq; using CMS.CMSHelper; using CMS.ExtendedControls; using CMS.GlobalHelper; using CMS.IO; using CMS.SettingsProvider; using CMS.SiteProvider; using CMS.UIControls; using CMS.FormControls; using System.ComponentModel; using System.Collections.Generic; public partial class CMSModules_AdminControls_Controls_MetaFiles_File : ReadOnlyFormEngineUserControl { #region "Variables" private bool mAlreadyUploadedDontDelete = false; private string baseUrl = null; private int width = 0; private int height = 0; protected bool columnUpdateVisible = false; #endregion #region "Properties" /// /// Object id. /// public int ObjectID { get { return ValidationHelper.GetInteger(ViewState["ObjectID"], 0); } set { ViewState["ObjectID"] = value; } } /// /// Object type. /// public string ObjectType { get { return ValidationHelper.GetString(ViewState["ObjectType"], ""); } set { ViewState["ObjectType"] = value; } } /// /// Site id. /// public int SiteID { get { return ValidationHelper.GetInteger(ViewState["SiteID"], 0); } set { ViewState["SiteID"] = value; } } /// /// Attachment category/group /// public string Category { get { return ValidationHelper.GetString(ViewState["Category"], ""); } set { ViewState["Category"] = value; } } /// /// Returns true if saving of the file failed. /// public bool SavingFailed { get { return ValidationHelper.GetBoolean(ViewState["SavingFailed"], false); } } /// /// Returns true if deleting of the file failed. /// public bool DeletingFailed { get { return ValidationHelper.GetBoolean(ViewState["DeletingFailed"], false); } } /// /// Gets or sets the semicolon-separated list of allowed file extensions (without dots). /// public string AllowedExtensions { get { return ValidationHelper.GetString(ViewState["AllowedExtensions"], null); } set { ViewState["AllowedExtensions"] = value; } } /// /// Indicates if uploader is enabled. /// public override bool Enabled { get { return uploader.Enabled; } set { uploader.Enabled = value; plcUploader.Visible = value; plcUploaderDisabled.Visible = !value; } } /// /// Returns the currently posted file or null when no file posted. /// public HttpPostedFile PostedFile { get { return uploader.PostedFile; } } /// /// Currently handled meta file. /// public MetaFileInfo CurrentlyHandledMetaFile { get; set; } /// /// Allow modify flag. /// protected bool AllowModify { get { return Enabled && UserInfoProvider.IsAuthorizedPerObject(ObjectType, ObjectID, PermissionsEnum.Modify, CMSContext.CurrentSiteName, CMSContext.CurrentUser); } } #endregion #region "Events" /// /// Occurs after the meta file was uploaded. /// public event EventHandler OnAfterUpload; /// /// Raises the OnAfterUpload event. /// private void RaiseOnAfterUpload() { if (OnAfterUpload != null) { OnAfterUpload(this, EventArgs.Empty); } } /// /// Occurs after the meta file was deleted. /// public event EventHandler OnAfterDelete; /// /// Raises the OnAfterDelete event. /// private void RaiseOnAfterDelete() { if (OnAfterDelete != null) { OnAfterDelete(this, EventArgs.Empty); } } #endregion #region "Methods" protected void Page_Load(object sender, EventArgs e) { // Register dialog script for Image Editor ScriptHelper.RegisterDialogScript(Page); ScriptHelper.RegisterTooltip(Page); ScriptHelper.RegisterClientScriptBlock(this, typeof(string), "OpenImageEditor", ScriptHelper.GetScript(String.Format(@" function OpenImageEditor(query) {{ modalDialog('{0}/CMSModules/Content/CMSDesk/Edit/ImageEditor.aspx' + query, 'EditImage', 905, 670); return false; }}", URLHelper.GetFullApplicationUrl()))); ScriptHelper.RegisterClientScriptBlock(this, typeof(string), "OpenEditor", ScriptHelper.GetScript(String.Format(@" function OpenEditor(query) {{ modalDialog('{0}/CMSModules/AdminControls/Controls/MetaFiles/MetaDataEditor.aspx' + query, 'EditMetadata', 500, 350); return false; }} ", URLHelper.GetFullApplicationUrl()))); // Register javascript 'postback' function ScriptHelper.RegisterClientScriptBlock(this, typeof(string), "PostBack", ScriptHelper.GetScript(String.Format(@" function UpdatePage(){{ {0}; }}", Page.ClientScript.GetPostBackEventReference(hdnPostback, "")))); // Refresh script string script = String.Format(@" function InitRefresh_{0}(msg, fullRefresh, action, fileId) {{ if((msg != null) && (msg != '')){{ alert(msg); action='error'; }} var hidden = document.getElementById('{1}'); if (hidden) {{ hidden.value = fileId; }} if(fullRefresh){{ {2} }} else {{ {3} }} }} function ConfirmDelete() {{ return confirm({4}); }} ", ClientID, hdnField.ClientID, ControlsHelper.GetPostBackEventReference(hdnFullPostback, ""), ControlsHelper.GetPostBackEventReference(hdnPostback, ""), ScriptHelper.GetString(GetString("general.confirmdelete"))); ScriptHelper.RegisterClientScriptBlock(this, typeof(string), "MetafileScripts_" + ClientID, ScriptHelper.GetScript(script)); SetupControls(); } private void SetupControls() { if (Enabled) { uploader.OnUploadFile += uploader_OnUploadFile; uploader.OnDeleteFile += uploader_OnDeleteFile; } // Initialize UniGrid only if ObjectID is present if (ObjectID > 0) { gridFile.OnAction += gridFile_OnAction; gridFile.OnExternalDataBound += gridFile_OnExternalDataBound; gridFile.IsLiveSite = IsLiveSite; gridFile.WhereCondition = MetaFileInfoProvider.GetWhereCondition(ObjectID, ObjectType, Category, null); gridFile.StopProcessing = StopProcessing; pnlGrid.Visible = true; pnlAttachmentList.CssClass = "AttachmentsList SingleAttachment"; // Hide update column if modify not enabled gridFile.GridColumns.Columns[0].Visible = AllowModify; } else { pnlGrid.Visible = false; } uploader.CurrentFileName = String.Empty; uploader.CurrentFileUrl = String.Empty; if ((ObjectID > 0) && (ObjectType != "") && (Category != "")) { gridFile.ReloadData(); } if (ObjectID > 0) { if (AllowModify) { // Initialize button for adding metafile newMetafileElem.ImageUrl = ResolveUrl(GetImageUrl("Design/Controls/DirectUploader/upload_new.png")); newMetafileElem.ImageWidth = 16; newMetafileElem.ImageHeight = 16; newMetafileElem.ObjectID = ObjectID; newMetafileElem.ObjectType = ObjectType; newMetafileElem.Category = Category; newMetafileElem.ParentElemID = ClientID; newMetafileElem.SiteID = SiteID; newMetafileElem.ForceLoad = true; newMetafileElem.InnerDivHtml = GetString("attach.uploadfile"); newMetafileElem.InnerDivClass = "NewAttachment"; newMetafileElem.InnerLoadingDivHtml = GetString("attach.loading"); newMetafileElem.InnerLoadingDivClass = "NewAttachmentLoading"; newMetafileElem.IsLiveSite = IsLiveSite; newMetafileElem.SourceType = MediaSourceEnum.MetaFile; newMetafileElem.Visible = true; if (AllowedExtensions != null) { newMetafileElem.AllowedExtensions = AllowedExtensions; } } plcUploader.Visible = AllowModify; plcUploaderDisabled.Visible = !AllowModify; plcOldUploader.Visible = false; } else { newMetafileElem.Visible = false; plcUploader.Visible = false; plcUploaderDisabled.Visible = false; plcOldUploader.Visible = true; } lblDisabled.CssClass = "NewAttachmentDisabled"; imgDisabled.ImageUrl = ResolveUrl(GetImageUrl("Design/Controls/DirectUploader/upload_newdisabled.png")); } /// /// Reloads file uploader. /// public void ReloadData() { SetupControls(); } /// /// Inits uploaded file name based on file name and GUID. /// /// File name /// File GUID public void InitUploader(string fileName, Guid fileGuid) { uploader.CurrentFileName = Path.GetFileName(fileName); uploader.CurrentFileUrl = "~/CMSPages/GetMetaFile.aspx?fileguid=" + fileGuid; } protected object gridFile_OnExternalDataBound(object sender, string sourceName, object parameter) { GridViewRow gvr = null; DataRowView drv = null; string fileGuid = null; switch (sourceName.ToLowerCSafe()) { case "edit": if (sender is ImageButton) { gvr = (GridViewRow)parameter; drv = (DataRowView)gvr.DataItem; fileGuid = ValidationHelper.GetString(drv["MetaFileGUID"], ""); string fileExtension = ValidationHelper.GetString(drv["MetaFileExtension"], ""); // Initialize properties ImageButton btnImageEditor = (ImageButton)sender; btnImageEditor.Visible = true; // Display button only if 'Modify' is allowed if (AllowModify) { string query = String.Format("?refresh=1&metafileguid={0}&clientid={1}", fileGuid, ClientID); query = URLHelper.AddUrlParameter(query, "hash", QueryHelper.GetHash(query)); // Display button only if metafile is in supported image format if (ImageHelper.IsSupportedByImageEditor(fileExtension)) { // Initialize button with script btnImageEditor.Attributes.Add("onclick", String.Format("OpenImageEditor({0}); return false;", ScriptHelper.GetString(query))); } // Non-image metafile else { // Initialize button with script btnImageEditor.Attributes.Add("onclick", String.Format("OpenEditor({0}); return false;", ScriptHelper.GetString(query))); } } else { btnImageEditor.ImageUrl = GetImageUrl("Design/Controls/UniGrid/Actions/editdisabled.png"); btnImageEditor.Enabled = false; } } break; case "delete": if (sender is ImageButton) { ImageButton btnDelete = ((ImageButton)sender); if (!AllowModify) { btnDelete.ImageUrl = GetImageUrl("Design/Controls/Uploader/deletedisabled.png"); btnDelete.Enabled = false; } } break; case "name": drv = (DataRowView)parameter; string fileName = ValidationHelper.GetString(DataHelper.GetDataRowViewValue(drv, "MetaFileName"), string.Empty); fileGuid = ValidationHelper.GetString(DataHelper.GetDataRowViewValue(drv, "MetaFileGUID"), string.Empty); string fileExt = ValidationHelper.GetString(DataHelper.GetDataRowViewValue(drv, "MetaFileExtension"), string.Empty); string iconUrl = GetFileIconUrl(fileExt, "List"); bool isImage = ImageHelper.IsImage(fileExt); string fileUrl = String.Format("{0}?fileguid={1}&chset={2}", URLHelper.GetAbsoluteUrl("~/CMSPages/GetMetaFile.aspx"), fileGuid, Guid.NewGuid()); // Tooltip string title = ValidationHelper.GetString(DataHelper.GetDataRowViewValue(drv, "MetaFileTitle"), string.Empty); ; string description = ValidationHelper.GetString(DataHelper.GetDataRowViewValue(drv, "MetaFileDescription"), string.Empty); int imageWidth = ValidationHelper.GetInteger(DataHelper.GetDataRowViewValue(drv, "MetaFileImageWidth"), 0); int imageHeight = ValidationHelper.GetInteger(DataHelper.GetDataRowViewValue(drv, "MetaFileImageHeight"), 0); string tooltip = UIHelper.GetTooltipAttributes(fileUrl, imageWidth, imageHeight, title, fileName, fileExt, description, null, 300); // Icon string imageTag = String.Format("\"{1}\"", iconUrl, fileName); if (isImage) { return String.Format("{3}{4}", fileUrl, fileGuid, tooltip, imageTag, fileName); } else { return String.Format("{3}{4}", fileUrl, fileGuid, tooltip, imageTag, fileName); } case "size": return DataHelper.GetSizeString(ValidationHelper.GetLong(parameter, 0)); case "update": { drv = (DataRowView)parameter; Panel pnlBlock = new Panel() { ID = "pnlBlock" }; string fileExtension = ValidationHelper.GetString(drv["MetaFileExtension"], null); string siteName = null; if (SiteID > 0) { SiteInfo si = SiteInfoProvider.GetSiteInfo(SiteID); if (si != null) { siteName = si.SiteName; } } else { siteName = CMSContext.CurrentSiteName; } // Add update control // Dynamically load uploader control DirectFileUploader dfuElem = Page.LoadUserControl("~/CMSModules/Content/Controls/Attachments/DirectFileUploader/DirectFileUploader.ascx") as DirectFileUploader; // Set uploader's properties if (dfuElem != null) { dfuElem.ID = "dfuElem" + ObjectID; dfuElem.SourceType = MediaSourceEnum.MetaFile; dfuElem.ControlGroup = "Uploader_" + ObjectID; dfuElem.DisplayInline = true; dfuElem.ForceLoad = true; dfuElem.MetaFileID = ValidationHelper.GetInteger(drv["MetaFileID"], 0); dfuElem.ObjectID = ObjectID; dfuElem.ObjectType = ObjectType; dfuElem.Category = Category; dfuElem.ParentElemID = ClientID; dfuElem.ImageUrl = ResolveUrl(GetImageUrl("Design/Controls/DirectUploader/upload.png")); dfuElem.ImageHeight = 16; dfuElem.ImageWidth = 16; dfuElem.InsertMode = false; dfuElem.ParentElemID = ClientID; dfuElem.IncludeNewItemInfo = true; dfuElem.SiteID = SiteID; dfuElem.IsLiveSite = IsLiveSite; // Setting of the direct single mode dfuElem.UploadMode = MultifileUploaderModeEnum.DirectSingle; dfuElem.Width = 16; dfuElem.Height = 16; dfuElem.MaxNumberToUpload = 1; if (AllowedExtensions != null) { dfuElem.AllowedExtensions = AllowedExtensions; } pnlBlock.Controls.Add(dfuElem); } // If the WebDAV is enabled and windows authentication if (CMSContext.IsWebDAVEnabled(siteName) && RequestHelper.IsWindowsAuthentication() && WebDAVSettings.IsExtensionAllowedForEditMode(fileExtension, siteName)) { // Dynamically load control WebDAVEditControl webDAVElem = Page.LoadUserControl("~/CMSModules/WebDAV/Controls/MetaFileWebDAVEditControl.ascx") as WebDAVEditControl; // Set editor's properties if (webDAVElem != null) { // Initialize WebDAV control fileGuid = ValidationHelper.GetString(drv["MetaFileGUID"], ""); webDAVElem.MetaFileGUID = ValidationHelper.GetGuid(fileGuid, Guid.Empty); webDAVElem.FileName = ValidationHelper.GetString(drv["MetaFileName"], null); webDAVElem.Enabled = true; // Initialize general info webDAVElem.ID = "webDAVElem"; webDAVElem.IsLiveSite = IsLiveSite; // Add to panel pnlBlock.Controls.Add(webDAVElem); //columnUpdateVisible = true; } } return pnlBlock; } } return parameter; } protected void gridFile_OnAction(string actionName, object actionArgument) { switch (actionName.ToLowerCSafe()) { case "delete": try { // Delete the meta file int metaFileId = ValidationHelper.GetInteger(actionArgument, 0); MetaFileInfoProvider.DeleteMetaFileInfo(metaFileId); RaiseOnAfterDelete(); } catch (Exception ex) { ShowError(ex.Message); } break; } } protected void uploader_OnUploadFile(object sender, EventArgs e) { UploadFile(); } protected void uploader_OnDeleteFile(object sender, EventArgs e) { // Careful with upload and delete in on postback - ignore delete request if (mAlreadyUploadedDontDelete) { return; } try { using (DataSet ds = MetaFileInfoProvider.GetMetaFiles(ObjectID, ObjectType, Category, null, null)) { if (!DataHelper.DataSourceIsEmpty(ds)) { foreach (DataRow dr in ds.Tables[0].Rows) { MetaFileInfo mfi = new MetaFileInfo(dr); if ((mfi != null) && (mfi.MetaFileName.ToLowerCSafe() == uploader.CurrentFileName.ToLowerCSafe())) { MetaFileInfoProvider.DeleteMetaFileInfo(mfi.MetaFileID); } } } } RaiseOnAfterDelete(); SetupControls(); } catch (Exception ex) { ViewState["DeletingFailed"] = true; ShowError(ex.Message); SetupControls(); } } protected override void OnPreRender(EventArgs e) { base.OnPreRender(e); if (!AllowModify) { // Hide the update column gridFile.GridView.Columns[1].Visible = false; } if (!string.IsNullOrEmpty(baseUrl)) { ScriptHelper.RegisterClientScriptBlock(this, typeof(string), "OpenEditor", ScriptHelper.GetScript(String.Format(@" function OpenEditor(queryString) {{ modalDialog('{0}{1}' + queryString, 'editorDialog', {2}, {3}); return false; }}", URLHelper.GetFullApplicationUrl(), baseUrl, width, height))); } if (ObjectID > 0) { bool gridHasData = !DataHelper.DataSourceIsEmpty(gridFile.GridView.DataSource); // Ensure uploader button plcUploader.Visible = (AllowModify && !gridHasData); plcUploaderDisabled.Visible = (!AllowModify && !gridHasData); } } /// /// Returns true if entered data is valid. If data is invalid, it returns false and displays an error message. /// public override bool IsValid() { if ((plcOldUploader.Visible) && (uploader.PostedFile != null)) { string extensions = string.IsNullOrEmpty(AllowedExtensions) ? SettingsKeyProvider.GetStringValue(CMSContext.CurrentSiteName + ".CMSUploadExtensions") : AllowedExtensions; if (extensions != String.Empty) { string extension = Path.GetExtension(uploader.PostedFile.FileName).TrimStart('.').ToLowerCSafe(); string haystack = String.Format(";{0};", extensions); string needle = String.Format(";{0};", extension); if (!haystack.Contains(needle)) { string format = GetString("attach.notallowedextension"); ValidationError = String.Format(format, extension, extensions); return false; } } } return true; } /// /// Uploads file. /// public void UploadFile() { if ((uploader.PostedFile != null) && (ObjectID > 0)) { try { MetaFileInfo existing = null; // Check if uploaded file already exists and delete it DataSet ds = MetaFileInfoProvider.GetMetaFiles(ObjectID, ObjectType, Category, null, null); if (!DataHelper.DataSourceIsEmpty(ds)) { // Get existing record ID and delete it existing = new MetaFileInfo(ds.Tables[0].Rows[0]); MetaFileInfoProvider.DeleteMetaFileInfo(existing); } // Create new meta file MetaFileInfo mfi = new MetaFileInfo(uploader.PostedFile, ObjectID, ObjectType, Category); if (existing != null) { // Preserve GUID mfi.MetaFileGUID = existing.MetaFileGUID; mfi.MetaFileTitle = existing.MetaFileTitle; mfi.MetaFileDescription = existing.MetaFileDescription; } mfi.MetaFileSiteID = SiteID; // Save to the database MetaFileInfoProvider.SetMetaFileInfo(mfi); CurrentlyHandledMetaFile = mfi; RaiseOnAfterUpload(); SetupControls(); } catch (Exception ex) { ShowError(ex.Message); ViewState["SavingFailed"] = true; SetupControls(); } // File was uploaded, do not delete in one postback mAlreadyUploadedDontDelete = true; } } /// /// Clears the content (file name & file URL) of the control. /// public void ClearControl() { uploader.CurrentFileName = ""; uploader.CurrentFileUrl = ""; } protected void hdnPostback_Click(object sender, EventArgs e) { try { int fileId = ValidationHelper.GetInteger(hdnField.Value, 0); if (fileId > 0) { CurrentlyHandledMetaFile = MetaFileInfoProvider.GetMetaFileInfo(fileId); RaiseOnAfterUpload(); gridFile.ReloadData(); } } catch (Exception ex) { ShowError(ex.Message); } } #endregion }