File: HttpFileDownload.h

package info (click to toggle)
caret 5.6.4~dfsg.1-3
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd, wheezy
  • size: 31,904 kB
  • ctags: 28,901
  • sloc: cpp: 378,050; python: 6,718; ansic: 5,507; makefile: 333; sh: 46
file content (214 lines) | stat: -rw-r--r-- 6,683 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
/*LICENSE_START*/
/*
 *  Copyright 1995-2002 Washington University School of Medicine
 *
 *  http://brainmap.wustl.edu
 *
 *  This file is part of CARET.
 *
 *  CARET is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  CARET 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 CARET; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 */
/*LICENSE_END*/

#ifndef __HTTP_FILE_DOWNLOAD_H__
#define __HTTP_FILE_DOWNLOAD_H__

#include <map>
#include <vector>

#include <QMutex>
#include <QObject>

class QHttp;
class QHttpResponseHeader;
class QTimer;

/// class for downloading a file specified by a URL synchronously
class HttpFileDownload : public QObject  {
   Q_OBJECT
   
   public:
      /// the type of HTTP request
      enum HTTP_REQUEST_TYPE {
         HTTP_REQUEST_TYPE_GET,
         HTTP_REQUEST_TYPE_POST
      };
      
      /// where to place downloaded data
      enum DOWNLOAD_MODE {
         DOWNLOAD_MODE_TO_FILE,
         DOWNLOAD_MODE_TO_STRING
      };
      
      /// Constructor for downloading to a file
      HttpFileDownload(const QString& fileUrlIn, 
                       const QString& outputFileNameIn,
                       const int timeoutAmountInSeconds);
      
      /// Constructor for downloading to a string 
      HttpFileDownload(const QString& fileUrlIn, 
                       const int timeoutAmountInSeconds);

      /// Destructor
      ~HttpFileDownload();

      /// set the type of HTTP request
      void setHttpRequestType(const HTTP_REQUEST_TYPE hrt) { httpRequestType = hrt; }
      
      /// get the type of HTTP request
      HTTP_REQUEST_TYPE getHttpRequestType() const { return httpRequestType; }
      
      /// set the post request content
      void setPostRequestContent(const QString& s) { postRequestContent = s; }
      
      /// get the post request content
      QString getPostRequestContent() const { return postRequestContent; }
      
      /// downloads the file
      void download();

      /// find out if the download was successful
      bool getDownloadSuccessful() const { return fileDownloadSuccessful; }
      
      /// get the error message if the download is unsuccessful
      QString getErrorMessage() const { return errorMessage; }
       
      /// Get the content of the downloaded data.
      void getContent(QString& content) const;
      
      /// Get the content of the downloaded data as UTF-8 string.
      void getContentUTF8(QString& content) const;
      
      /// get the response code
      int getResponseCode() const { return responseCode; }
      
      /// get all response header elements
      std::map<QString, QString> getResponseHeader() const
                                       { return responseHeaderElements; }
      
      /// additional items for the request header
      void addToRequestHeader(const std::map<QString, QString>& rh) {
         requestHeaderElements = rh;
      }
      
      /// get a respone header element with the specified key
      QString getResponseHeaderElement(const QString& key) const;
      
      /// set the upload file name
      void setUploadFileName(const QString& dataFileName,
                             const QString& sumsFileName);
      
      /// get the upload file name
      QString getUploadFileName() const { return uploadFileName; }
      
      /// Upload a file to SuMS.
      void uploadFileToSums(const std::vector<QString>& additionalTags,
                            const std::vector<QString>& additionalValues);
      
      /// set the upload file comment
      void setUploadFileComment(const QString& s) { uploadFileComment = s; }
      
      /// get the upload file comment
      QString getUploadFileComment() const { return uploadFileComment; }
      
   protected slots:
      /// Called when the download completes
      void slotDone(bool error);
      
      /// Called when timeout occurs
      void slotTimeout();
      
      /// States of http request.
      void slotStateChanged(int state);
   
      /// http header from get
      void slotResponseHeaderReceived(const QHttpResponseHeader& resp);
      
      /// called when data available to read
      void slotReadyRead(const QHttpResponseHeader& resp);
      
   protected:
      /// Initialize this instance.
      void initialize(const QString& fileUrlIn,
                      const int timeoutAmountInSeconds,
                      const DOWNLOAD_MODE downloadModeIn);
                             
      /// see if the download is complete
      bool getDownloadComplete();
      
      /// print the request header
      void printRequestHeader();

      /// set the download complete
      void setDownloadComplete(const bool b);
      
      /// type of http request
      HTTP_REQUEST_TYPE httpRequestType;
      
      /// content for a post request
      QString postRequestContent;
      
      /// URL of file that is to be downloaded
      QString fileUrl;
      
      /// timeout amount 
      int timeoutAmount;
      
      /// the timeout timer
      QTimer* timeoutTimer;
      
      /// the HTTP object used to download the file
      QHttp* http;
      
      /// mutex for download complete flag
      QMutex downloadCompleteMutex;
      
      /// completed flag
      bool fileDownloadComplete;
      
      /// file download was successful
      bool fileDownloadSuccessful;
      
      /// error message if a failure
      QString errorMessage;
      
      /// output file name when writing to a file
      QString outputFileName;
      
      /// the download mode
      DOWNLOAD_MODE downloadMode;
      
      /// the response code from the HTTP request
      int responseCode;
      
      /// response header elements
      std::map<QString, QString> responseHeaderElements;
      
      /// additional header items for request
      std::map<QString, QString> requestHeaderElements;
      
      /// name of file for uploading
      QString uploadFileName;
      
      /// name of file to put in sums when uploading
      QString uploadSumsFileName;
      
      /// upload file comment
      QString uploadFileComment;
};

#endif // __HTTP_FILE_DOWNLOAD_H__