33251bf3f012069a984ccdede7a0b78faf1cbfcd
[pithos] / web_client / src / gr / grnet / pithos / web / client / FileUploadGearsIEDialog.java
1 /*
2  * Copyright 2011 GRNET S.A. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or
5  * without modification, are permitted provided that the following
6  * conditions are met:
7  *
8  *   1. Redistributions of source code must retain the above
9  *      copyright notice, this list of conditions and the following
10  *      disclaimer.
11  *
12  *   2. Redistributions in binary form must reproduce the above
13  *      copyright notice, this list of conditions and the following
14  *      disclaimer in the documentation and/or other materials
15  *      provided with the distribution.
16  *
17  * THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
18  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
20  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
21  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
24  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
25  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
27  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28  * POSSIBILITY OF SUCH DAMAGE.
29  *
30  * The views and conclusions contained in the software and
31  * documentation are those of the authors and should not be
32  * interpreted as representing official policies, either expressed
33  * or implied, of GRNET S.A.
34  */
35 package gr.grnet.pithos.web.client;
36
37 import java.util.List;
38
39 import gr.grnet.pithos.web.client.rest.RestCommand;
40
41 import com.google.gwt.gears.client.desktop.File;
42 import com.google.gwt.gears.client.httprequest.HttpRequest;
43 import com.google.gwt.gears.client.httprequest.ProgressEvent;
44 import com.google.gwt.gears.client.httprequest.ProgressHandler;
45 import com.google.gwt.gears.client.httprequest.RequestCallback;
46
47 /**
48  * The 'File upload' dialog box implementation with Google Gears support
49  * for IE.
50  */
51 public class FileUploadGearsIEDialog extends FileUploadGearsDialog {
52
53         /**
54          * Perform the HTTP request to upload the specified file.
55          */     
56         @Override
57         protected void doSend(final List<File> filesRemaining) {
58                 final Pithos app = Pithos.get();
59                 HttpRequest request = factory.createHttpRequest();
60                 requests.add(request);
61                 String method = "POST";
62
63                 String path;
64                 final String filename = getFilename(filesRemaining.get(0).getName());
65                 path = folder.getUri();
66                 if (!path.endsWith("/"))
67                         path = path + "/";
68                 path = path + encode(filename);
69
70                 String token = app.getToken();
71                 String resource = path.substring(app.getApiPath().length()-1, path.length());
72                 String date = RestCommand.getDate();
73                 String sig = RestCommand.calculateSig(method, date, resource, RestCommand.base64decode(token));
74                 request.open(method, path);
75                 request.setRequestHeader("Authorization", app.getCurrentUserResource().getUsername() + " " + sig);
76                 request.setRequestHeader("Accept", "application/json; charset=utf-8");
77                 request.setCallback(new RequestCallback() {
78                         @Override
79                         public void onResponseReceived(HttpRequest req) {
80                                 // XXX: No error checking, since IE throws an Internal Error
81                                 // when accessing req.getStatus().
82                                 filesRemaining.remove(0);
83                                 if(filesRemaining.isEmpty()){                                   
84                                         finish();                                       
85                                 }
86                                 doSend(filesRemaining); 
87                         }
88                 });
89                 request.getUpload().setProgressHandler(new ProgressHandler() {
90                         @Override
91                         public void onProgress(ProgressEvent event) {
92                                 double pcnt = (double) event.getLoaded() / event.getTotal();
93                                 progressBars.get(0).setProgress((int) Math.floor(pcnt * 100));
94                                 if(pcnt*100 == 100)
95                                         progressBars.remove(0);
96                         }
97                 });
98                 request.send(filesRemaining.get(0).getBlob());
99         }
100
101 }