Skip to content

Commit

Permalink
extract UploadRequestProcessor (cherry pick amartynov/research-122)
Browse files Browse the repository at this point in the history
  • Loading branch information
AlekseyMartynov authored and MikhailTymchukDX committed May 31, 2016
1 parent 01008a2 commit a874f79
Showing 1 changed file with 169 additions and 133 deletions.
302 changes: 169 additions & 133 deletions AjaxControlToolkit/AjaxFileUpload/AjaxFileUpload.cs
Original file line number Diff line number Diff line change
Expand Up @@ -239,10 +239,23 @@ protected override void OnInit(EventArgs e) {
Page.Request.QueryString["controlID"] == ClientID)
IsInFileUploadPostBack = true;

ProcessRequest();
var processor = new UploadRequestProcessor {
Context = Context,
ClientID = ClientID,
UploadStart = UploadStart,
UploadComplete = UploadComplete,
UploadCompleteAll = UploadCompleteAll,
SetUploadedFilePath = SetUploadedFilePath
};

processor.ProcessRequest();
}
}

void SetUploadedFilePath(string path) {
_uploadedFilePath = path;
}

protected override void OnLoad(EventArgs e) {
base.OnLoad(e);

Expand All @@ -251,138 +264,6 @@ protected override void OnLoad(EventArgs e) {
ScriptManager.RegisterOnSubmitStatement(this, typeof(AjaxFileUpload), "AjaxFileUploadOnSubmit", "null;");
}

XhrType ParseRequest(out string fileId) {
fileId = Page.Request.QueryString["guid"];

if(Page.Request.QueryString["contextkey"] != ContextKey
||
Page.Request.QueryString["controlID"] != ClientID)
return XhrType.None;

if(!string.IsNullOrEmpty(fileId)) {
if(Page.Request.QueryString["poll"] == "1")
return XhrType.Poll;

if(Page.Request.QueryString["cancel"] == "1")
return XhrType.Cancel;

if(Page.Request.QueryString["done"] == "1")
return XhrType.Done;
}

if(Page.Request.QueryString["complete"] == "1")
return XhrType.Complete;

if(Page.Request.QueryString["start"] == "1")
return XhrType.Start;

return XhrType.None;
}

void ProcessRequest() {
string fileId;
var xhrType = ParseRequest(out fileId);

if(xhrType != XhrType.None) {
Page.Response.ClearContent();
Page.Response.Cache.SetCacheability(HttpCacheability.NoCache);

// Process xhr request
switch(xhrType) {
case XhrType.Poll:
// Upload progress polling request
XhrPoll(fileId);
break;

case XhrType.Cancel:
// Cancel upload request
XhrCancel(fileId);
break;

case XhrType.Done:
// A file is successfully uploaded
XhrDone(fileId);
break;

case XhrType.Complete:
// All files successfully uploaded
XhrComplete();
break;

case XhrType.Start:
XhrStart();
break;
}

Page.Response.End();
}
}

void XhrStart() {
var filesInQueue = int.Parse(Page.Request.QueryString["queue"] ?? "0");
var args = new AjaxFileUploadStartEventArgs(filesInQueue);
if(UploadStart != null)
UploadStart(this, args);
Page.Response.Write(new JavaScriptSerializer().Serialize(args));
}

void XhrComplete() {
var filesInQueue = int.Parse(Page.Request.QueryString["queue"] ?? "0");
var filesUploaded = int.Parse(Page.Request.QueryString["uploaded"] ?? "0");
var reason = Page.Request.QueryString["reason"];

AjaxFileUploadCompleteAllReason completeReason;
switch(reason) {
case "done":
completeReason = AjaxFileUploadCompleteAllReason.Success;
break;

case "cancel":
completeReason = AjaxFileUploadCompleteAllReason.Canceled;
break;

default:
completeReason = AjaxFileUploadCompleteAllReason.Unknown;
break;
}

var args = new AjaxFileUploadCompleteAllEventArgs(filesInQueue, filesUploaded, completeReason);
if(UploadCompleteAll != null)
UploadCompleteAll(this, args);
Page.Response.Write(new JavaScriptSerializer().Serialize(args));
}

void XhrDone(string fileId) {
AjaxFileUploadEventArgs args;

var tempFolder = BuildTempFolder(fileId);
if(!Directory.Exists(tempFolder))
return;

var files = Directory.GetFiles(tempFolder);
if(files.Length == 0)
return;

var fileInfo = new FileInfo(files[0]);
_uploadedFilePath = fileInfo.FullName;

args = new AjaxFileUploadEventArgs(
fileId, AjaxFileUploadState.Success, "Success", fileInfo.Name, (int)fileInfo.Length,
fileInfo.Extension);

if(UploadComplete != null)
UploadComplete(this, args);

Page.Response.Write(new JavaScriptSerializer().Serialize(args));
}

void XhrCancel(string fileId) {
AjaxFileUploadHelper.Abort(Context, fileId);
}

void XhrPoll(string fileId) {
Page.Response.Write((new AjaxFileUploadStates(Context, fileId)).Percent.ToString());
}
/// <summary>
/// Saves the uploaded file with the specified file name
/// </summary>
Expand Down Expand Up @@ -587,6 +468,161 @@ protected override void DescribeComponent(ScriptComponentDescriptor descriptor)
descriptor.AddElementProperty("throbber", control.ClientID);
}
}


class UploadRequestProcessor {
public HttpContext Context;
public string ClientID;

public EventHandler<AjaxFileUploadStartEventArgs> UploadStart;
public EventHandler<AjaxFileUploadEventArgs> UploadComplete;
public EventHandler<AjaxFileUploadCompleteAllEventArgs> UploadCompleteAll;
public Action<string> SetUploadedFilePath;

HttpRequest Request {
get { return Context.Request; }
}

HttpResponse Response {
get { return Context.Response; }
}

public void ProcessRequest() {
string fileId;
var xhrType = ParseRequest(out fileId);

if(xhrType != XhrType.None) {
Response.ClearContent();
Response.Cache.SetCacheability(HttpCacheability.NoCache);

// Process xhr request
switch(xhrType) {
case XhrType.Poll:
// Upload progress polling request
XhrPoll(fileId);
break;

case XhrType.Cancel:
// Cancel upload request
XhrCancel(fileId);
break;

case XhrType.Done:
// A file is successfully uploaded
XhrDone(fileId);
break;

case XhrType.Complete:
// All files successfully uploaded
XhrComplete();
break;

case XhrType.Start:
XhrStart();
break;
}

Response.End();
}
}

XhrType ParseRequest(out string fileId) {
fileId = Request.QueryString["guid"];

if(Request.QueryString["contextkey"] != ContextKey
||
Request.QueryString["controlID"] != ClientID)
return XhrType.None;

if(!string.IsNullOrEmpty(fileId)) {
if(Request.QueryString["poll"] == "1")
return XhrType.Poll;

if(Request.QueryString["cancel"] == "1")
return XhrType.Cancel;

if(Request.QueryString["done"] == "1")
return XhrType.Done;
}

if(Request.QueryString["complete"] == "1")
return XhrType.Complete;

if(Request.QueryString["start"] == "1")
return XhrType.Start;

return XhrType.None;
}

void XhrStart() {
var filesInQueue = int.Parse(Request.QueryString["queue"] ?? "0");
var args = new AjaxFileUploadStartEventArgs(filesInQueue);
if(UploadStart != null)
UploadStart(this, args);
Response.Write(new JavaScriptSerializer().Serialize(args));
}

void XhrComplete() {
var filesInQueue = int.Parse(Request.QueryString["queue"] ?? "0");
var filesUploaded = int.Parse(Request.QueryString["uploaded"] ?? "0");
var reason = Request.QueryString["reason"];

AjaxFileUploadCompleteAllReason completeReason;
switch(reason) {
case "done":
completeReason = AjaxFileUploadCompleteAllReason.Success;
break;

case "cancel":
completeReason = AjaxFileUploadCompleteAllReason.Canceled;
break;

default:
completeReason = AjaxFileUploadCompleteAllReason.Unknown;
break;
}

var args = new AjaxFileUploadCompleteAllEventArgs(filesInQueue, filesUploaded, completeReason);
if(UploadCompleteAll != null)
UploadCompleteAll(this, args);
Response.Write(new JavaScriptSerializer().Serialize(args));
}

void XhrDone(string fileId) {
AjaxFileUploadEventArgs args;

var tempFolder = BuildTempFolder(fileId);
if(!Directory.Exists(tempFolder))
return;

var files = Directory.GetFiles(tempFolder);
if(files.Length == 0)
return;

var fileInfo = new FileInfo(files[0]);
SetUploadedFilePath(fileInfo.FullName);

args = new AjaxFileUploadEventArgs(
fileId, AjaxFileUploadState.Success, "Success", fileInfo.Name, (int)fileInfo.Length,
fileInfo.Extension);

if(UploadComplete != null)
UploadComplete(this, args);

Response.Write(new JavaScriptSerializer().Serialize(args));
}

void XhrCancel(string fileId) {
AjaxFileUploadHelper.Abort(Context, fileId);
}

void XhrPoll(string fileId) {
Response.Write((new AjaxFileUploadStates(Context, fileId)).Percent.ToString());
}

}


}

}
Expand Down

0 comments on commit a874f79

Please sign in to comment.