//------------------------------------------------------------------------------
// 
//     Copyright (c) Microsoft Corporation.  All rights reserved.
// 
//------------------------------------------------------------------------------
/*
 * HtmlInputFile.cs
 *
 * Copyright (c) 2000 Microsoft Corporation
 */
namespace System.Web.UI.HtmlControls {
    using System;
    using System.Collections;
    using System.Collections.Specialized;
    using System.ComponentModel;
    using System.Globalization;
    using System.Web;
    using System.Web.UI;
    using System.Security.Permissions;
/// 
///    
///       The  class defines the
///       methods, properties, and events for the  control. This class allows
///       programmatic access to the HTML <input type= file> element on the server.
///       It provides access to the stream, as well as a useful SaveAs functionality
///       provided by the 
///       property.
///    
///    
///       This class only works if the
///       HtmlForm.Enctype property is set to "multipart/form-data".
///       Also, it does not maintain its
///       state across multiple round trips between browser and server. If the user sets
///       this value after a round trip, the value is lost.
///    
/// 
    [
    ValidationProperty("Value")
    ]
    public class HtmlInputFile : HtmlInputControl, IPostBackDataHandler {
        /*
         * Creates an intrinsic Html INPUT type=file control.
         */
        /// 
        /// Initializes a new instance of the  class.
        /// 
        public HtmlInputFile() : base("file") {
        }
        /*
         * Accept type property.
         */
        /// 
        ///    
        ///       Gets
        ///       or sets a comma-separated list of MIME encodings that
        ///       can be used to constrain the file types that the browser lets the user
        ///       select. For example, to restrict the
        ///       selection to images, the accept value image/* should be specified.
        ///    
        /// 
        [
        WebCategory("Behavior"),
        DefaultValue(""),
        DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)
        ]
        public string Accept {
            get {
                string s = Attributes["accept"];
                return((s != null) ? s : String.Empty);
            }
            set {
                Attributes["accept"] = MapStringAttributeToString(value);
            }
        }
        /*
         * The property for the maximum characters allowed.
         */
        /// 
        ///    
        ///       Gets or sets the
        ///       maximum length of the file path of the file to upload
        ///       from the client machine.
        ///    
        /// 
        [
        WebCategory("Behavior"),
        DefaultValue(""),
        DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)
        ]
        public int MaxLength {
            get {
                string s = Attributes["maxlength"];
                return((s != null) ? Int32.Parse(s, CultureInfo.InvariantCulture) : -1);
            }
            set {
                Attributes["maxlength"] = MapIntegerAttributeToString(value);
            }
        }
        /*
         * PostedFile property.
         */
        /// 
        ///    Gets access to the uploaded file specified by a client.
        /// 
        [
        WebCategory("Default"),
        DefaultValue(""),
        DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)
        ]
        public HttpPostedFile PostedFile {
            get { return Context.Request.Files[RenderedNameAttribute];}
        }
        /*
         * The property for the width in characters.
         */
        /// 
        ///    Gets or sets the width of the file-path text box that the
        ///       browser displays when the 
        ///       control is used on a page.
        /// 
        [
        WebCategory("Appearance"),
        DefaultValue(-1),
        DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)
        ]
        public int Size {
            get {
                string s = Attributes["size"];
                return((s != null) ? Int32.Parse(s, CultureInfo.InvariantCulture) : -1);
            }
            set {
                Attributes["size"] = MapIntegerAttributeToString(value);
            }
        }
        // ASURT 122262 : The value property isn't submitted back to us when the a page
        // containing this control postsback, so required field validators are broken
        // (value would contain the empty string).  To fix this, we return the filename.
        [
        Browsable(false)
        ]
        public override string Value {
            get {
                HttpPostedFile postedFile = PostedFile;
                if (postedFile != null) {
                    return postedFile.FileName;
                }
                return String.Empty;
            }
            set {
                // Throw here because setting the value on this tag has no effect on the
                // rendering behavior and since we're always returning the posted file's
                // filename, we don't want to get into a situation where the user
                // sets a value and does not get back that value.
                throw new NotSupportedException(SR.GetString(SR.Value_Set_Not_Supported, this.GetType().Name));
            }
        }
        /*
         * Method of IPostBackDataHandler interface to process posted data.
         */
        /// 
        bool IPostBackDataHandler.LoadPostData(string postDataKey, NameValueCollection postCollection) {
            return LoadPostData(postDataKey, postCollection);
        }
        protected virtual bool LoadPostData(string postDataKey, NameValueCollection postCollection) {
            return false;
        }
        /*
         * Method of IPostBackDataHandler interface which is invoked whenever
         * posted data for a control has changed.  RadioButton fires an
         * OnServerChange event.
         */
        /// 
        void IPostBackDataHandler.RaisePostDataChangedEvent() {
            RaisePostDataChangedEvent();
        }
        protected virtual void RaisePostDataChangedEvent() {
        }
        /// 
        /// Raises the  event. This method uses event arguments
        ///    to pass the event data to the control.
        /// 
        protected internal override void OnPreRender(EventArgs e) {
            base.OnPreRender(e);
            // ASURT 35328: use multipart encoding if no encoding is currently specified
            HtmlForm form = Page.Form;
            if (form != null && form.Enctype.Length == 0) {
                form.Enctype = "multipart/form-data";
            }
        }
    }
}