Changeset 58265 in vbox for trunk/src/VBox/Frontends/VirtualBox
- Timestamp:
- Oct 15, 2015 3:18:45 PM (9 years ago)
- Location:
- trunk/src/VBox/Frontends/VirtualBox/src/net
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Frontends/VirtualBox/src/net/UINetworkReply.cpp
r58255 r58265 1 1 /* $Id$ */ 2 2 /** @file 3 * VBox Qt GUI - UINetworkReply , i.e. HTTP/HTTPS for update pings++.3 * VBox Qt GUI - UINetworkReply stuff implementation. 4 4 */ 5 5 … … 33 33 # include "VBoxGlobal.h" 34 34 # include "VBoxUtils.h" 35 # else 35 # else /* VBOX_GUI_IN_TST_SSL_CERT_DOWNLOADS */ 36 36 # include <VBox/log.h> 37 # endif 38 39 /* Other VBox includes ;*/37 # endif /* VBOX_GUI_IN_TST_SSL_CERT_DOWNLOADS */ 38 39 /* Other VBox includes: */ 40 40 # include <iprt/initterm.h> 41 41 42 42 #endif /* !VBOX_WITH_PRECOMPILED_HEADERS */ 43 43 44 /* Other VBox includes: */ 44 45 #include <iprt/crypto/pem.h> 45 46 #include <iprt/crypto/store.h> … … 52 53 53 54 54 /** 55 * Our network-reply thread 56 */ 55 /** QThread extension 56 * used as network-reply thread instance. */ 57 57 class UINetworkReplyPrivateThread : public QThread 58 58 { … … 62 62 signals: 63 63 64 /** Notifies listeners about downloadprogress change.65 * @param iCurrent holds the current amount of bytes downloaded.66 * @param iTotal holds the total amount of bytes to be downloaded. */67 void sigDownloadProgress(qint64 i Current, qint64 iTotal);64 /** Notifies listeners about reply progress change. 65 * @param iBytesReceived Holds the current amount of bytes received. 66 * @param iBytesTotal Holds the total amount of bytes to be received. */ 67 void sigDownloadProgress(qint64 iBytesReceived, qint64 iBytesTotal); 68 68 #endif /* !VBOX_GUI_IN_TST_SSL_CERT_DOWNLOADS */ 69 69 70 70 public: 71 71 72 /** Constructs networkreply thread for the passed @a request of the passed @a type. */72 /** Constructs reply thread for the passed @a request of the passed @a type. */ 73 73 UINetworkReplyPrivateThread(const QNetworkRequest &request, UINetworkRequestType type); 74 74 … … 78 78 /** @name APIs 79 79 * @{ */ 80 /** Read everything. */ 81 const QByteArray& readAll() const { return m_reply; } 82 /** IRPT error status. */ 83 int error() const { return m_iError; } 84 /** Abort HTTP request. */ 85 void abort(); 86 /** Returns value for the cached reply header of the passed @a type. */ 87 QString header(QNetworkRequest::KnownHeaders type) const 88 { 89 /* Look for known header type: */ 90 switch (type) 91 { 92 case QNetworkRequest::ContentTypeHeader: return m_headers.value("Content-Type"); 93 case QNetworkRequest::ContentLengthHeader: return m_headers.value("Content-Length"); 94 case QNetworkRequest::LastModifiedHeader: return m_headers.value("Last-Modified"); 95 default: break; 80 /** Returns binary content of the reply. */ 81 const QByteArray& readAll() const { return m_reply; } 82 /** Returns the last cached IPRT HTTP error of the reply. */ 83 int error() const { return m_iError; } 84 /** Aborts reply. */ 85 void abort(); 86 /** Returns value for the cached reply header of the passed @a type. */ 87 QString header(QNetworkRequest::KnownHeaders type) const 88 { 89 /* Look for known header type: */ 90 switch (type) 91 { 92 case QNetworkRequest::ContentTypeHeader: return m_headers.value("Content-Type"); 93 case QNetworkRequest::ContentLengthHeader: return m_headers.value("Content-Length"); 94 case QNetworkRequest::LastModifiedHeader: return m_headers.value("Last-Modified"); 95 default: break; 96 } 97 /* Return null-string by default: */ 98 return QString(); 96 99 } 97 /* Return null-string by default: */ 98 return QString(); 99 } 100 /** Returns URL of the reply which is the URL of the request for now. */ 101 QUrl url() const { return m_request.url(); } 100 /** Returns the URL of the reply which is the URL of the request for now. */ 101 QUrl url() const { return m_request.url(); } 102 102 /** @} */ 103 103 … … 106 106 /** @name Helpers - HTTP stuff 107 107 * @{ */ 108 int applyConfiguration(); 109 int applyProxyRules(); 110 int applyHttpsCertificates(); 111 int applyRawHeaders(); 112 int performMainRequest(); 108 /** Applies configuration. */ 109 int applyConfiguration(); 110 /** Applies proxy rules. */ 111 int applyProxyRules(); 112 /** Applies security certificates. */ 113 int applyHttpsCertificates(); 114 /** Applies raw headers. */ 115 int applyRawHeaders(); 116 /** Performs main request. */ 117 int performMainRequest(); 118 /** Performs whole thread functionality. */ 119 void run(); 113 120 /** @} */ 114 115 /* Helper: Main thread runner: */116 void run();117 121 118 122 /** Additinoal download nfo about wanted certificate. */ 119 123 typedef struct CERTINFO 120 124 { 121 /** Filename inthe zip file we download (PEM). */125 /** Holds the filename of the zip file we download (PEM). */ 122 126 const char *pszZipFile; 123 /** List of direct URLs to PEM formatted files.. */127 /** Lists direct URLs to PEM formatted files. */ 124 128 const char *apszUrls[4]; 125 129 } CERTINFO; … … 127 131 /** @name Static helpers for HTTP and Certificates handling. 128 132 * @{ */ 129 static QString fullCertificateFileName(); 130 static int applyProxyRules(RTHTTP hHttp, const QString &strHostName, int iPort); 131 static int applyRawHeaders(RTHTTP hHttp, const QList<QByteArray> &headers, const QNetworkRequest &request); 132 static unsigned countCertsFound(bool const *pafFoundCerts); 133 static bool areAllCertsFound(bool const *pafFoundCerts); 134 static int refreshCertificates(RTHTTP hHttp, PRTCRSTORE phStore, bool *pafFoundCerts, const char *pszCaCertFile); 135 static void downloadMissingCertificates(RTCRSTORE hNewStore, bool *pafNewFoundCerts, RTHTTP hHttp, 136 PRTERRINFOSTATIC pStaticErrInfo); 137 static int convertVerifyAndAddPemCertificateToStore(RTCRSTORE hStore, void const *pvResponse, 138 size_t cbResponse, PCRTCRCERTWANTED pWantedCert); 133 /** Returns full certificate file-name. */ 134 static QString fullCertificateFileName(); 135 136 /** Applies proxy rules. 137 * @remarks Implementation doesn't exists, to be removed? */ 138 static int applyProxyRules(RTHTTP hHttp, const QString &strHostName, int iPort); 139 140 /** Applies raw headers. 141 * @param hHttp Brings the HTTP client instance. 142 * @param headers Brings the list of headers to be applied. 143 * @param request Brings the request which contains values for the headers to be applied. */ 144 static int applyRawHeaders(RTHTTP hHttp, const QList<QByteArray> &headers, const QNetworkRequest &request); 145 146 /** Returns the number of certificates found in a search result array. 147 * @param pafFoundCerts Brings the array parallel to s_aCerts with the status of each wanted certificate. */ 148 static unsigned countCertsFound(bool const *pafFoundCerts); 149 150 /** Returns whether we've found all the necessary certificates. 151 * @param pafFoundCerts Brings the array parallel to s_aCerts with the status of each wanted certificate. */ 152 static bool areAllCertsFound(bool const *pafFoundCerts); 153 154 /** Refreshes the certificates. 155 * @param hHttp Brings the HTTP client instance. (Can be NIL when running the testcase.) 156 * @param phStore On input, this holds the current store, so that we can fish out wanted 157 * certificates from it. On successful return, this is replaced with a new 158 * store reflecting the refrehsed content of @a pszCaCertFile. 159 * @param pafFoundCerts On input, this holds the certificates found in the current store. 160 * On return, this reflects what is current in the @a pszCaCertFile. 161 * The array runs parallel to s_aCerts. 162 * @param pszCaCertFile Where to write the refreshed certificates if we've managed to gather 163 * a collection that is at least as good as the old one. */ 164 static int refreshCertificates(RTHTTP hHttp, PRTCRSTORE phStore, bool *pafFoundCerts, const char *pszCaCertFile); 165 166 /** Downloads missing certificates. 167 * @param hNewStore On successful return, this store will contain newly downloaded certificates. 168 * @param pafNewFoundCerts On successful return, this array parallel to s_aCerts will contain the 169 * status of each newly downloaded certificate. 170 * @param hHttp Brings the HTTP client instance. 171 * @param pStaticErrInfo Unused currently. */ 172 static void downloadMissingCertificates(RTCRSTORE hNewStore, bool *pafNewFoundCerts, RTHTTP hHttp, 173 PRTERRINFOSTATIC pStaticErrInfo); 174 175 /** Converts a PEM certificate, verifies it against @a pCertInfo and adds it to the given store. 176 * @param hStore The store to add certificate to. 177 * @param pvResponse The raw PEM certificate file bytes. 178 * @param cbResponse The number of bytes. 179 * @param pWantedCert The certificate info (we use hashes and encoded size). */ 180 static int convertVerifyAndAddPemCertificateToStore(RTCRSTORE hStore, void const *pvResponse, 181 size_t cbResponse, PCRTCRCERTWANTED pWantedCert); 139 182 /** @} */ 140 183 141 184 /** @name HTTP download progress handling. 142 185 * @{ */ 143 /** Redirects download progress callback to particular object which can handle it. */ 144 static DECLCALLBACK(void) handleProgressChange(RTHTTP hHttp, void *pvUser, uint64_t cbDownloadTotal, uint64_t cbDownloaded); 145 /** Handles download progress callback. */ 146 void handleProgressChange(uint64_t cbDownloadTotal, uint64_t cbDownloaded); 186 /** Redirects download progress callback to particular object which can handle it. 187 * @param hHttp Brings the HTTP client instance. 188 * @param pvUser Brings the convenience pointer for the 189 * user-agent object which should handle that callback. 190 * @param cbDownloadTotal Brings the total amount of bytes to be received. 191 * @param cbDownloaded Brings the current amount of bytes received. */ 192 static DECLCALLBACK(void) handleProgressChange(RTHTTP hHttp, void *pvUser, uint64_t cbDownloadTotal, uint64_t cbDownloaded); 193 194 /** Handles download progress callback. 195 * @param cbDownloadTotal Brings the total amount of bytes to be received. 196 * @param cbDownloaded Brings the current amount of bytes received. */ 197 void handleProgressChange(uint64_t cbDownloadTotal, uint64_t cbDownloaded); 147 198 /** @} */ 148 199 … … 150 201 QString m_strContext; 151 202 152 /* Variables:*/203 /** Holds the request instance. */ 153 204 QNetworkRequest m_request; 154 205 /** Holds the request type. */ 155 206 UINetworkRequestType m_type; 207 208 /** Holds the last cached IPRT HTTP error of the reply. */ 156 209 int m_iError; 157 /** IPRT HTTP client instance handle. */210 /** Holds the IPRT HTTP client instance handle. */ 158 211 RTHTTP m_hHttp; 212 /** Holds the reply instance. */ 159 213 QByteArray m_reply; 160 /* Holds the cached reply headers. */214 /** Holds the cached reply headers. */ 161 215 QMap<QString, QString> m_headers; 162 216 217 /** Holds the URLs to root zip files containing certificates we want. */ 163 218 static const char * const s_apszRootsZipUrls[]; 219 /** Holds the download details. */ 164 220 static const CERTINFO s_CertInfoPcaCls3Gen5; 221 /** Holds the details on the certificates we are after. 222 * The pvUser member points to a UINetworkReplyPrivateThread::CERTINFO. */ 165 223 static const RTCRCERTWANTED s_aCerts[]; 224 /** Holds the certificate file name (no path). */ 166 225 static const QString s_strCertificateFileName; 167 226 168 227 #ifdef VBOX_GUI_IN_TST_SSL_CERT_DOWNLOADS 169 228 public: 229 /** Starts the test routine. */ 170 230 static void testIt(RTTEST hTest); 171 #endif 231 #endif /* VBOX_GUI_IN_TST_SSL_CERT_DOWNLOADS */ 172 232 }; 173 233 174 175 /** 176 * URLs to root zip files containing certificates we want. 177 */ 178 /*static*/ const char * const UINetworkReplyPrivateThread::s_apszRootsZipUrls[] = 234 /* static */ 235 const char * const UINetworkReplyPrivateThread::s_apszRootsZipUrls[] = 179 236 { 180 237 "http://www.symantec.com/content/en/us/enterprise/verisign/roots/roots.zip" 181 238 }; 182 239 183 184 /** 185 * Download details for 186 */ 187 /*static*/ const UINetworkReplyPrivateThread::CERTINFO UINetworkReplyPrivateThread::s_CertInfoPcaCls3Gen5 = 240 /* static */ 241 const UINetworkReplyPrivateThread::CERTINFO UINetworkReplyPrivateThread::s_CertInfoPcaCls3Gen5 = 188 242 { 189 243 /*.pszZipFile =*/ … … 198 252 }; 199 253 200 201 /** 202 * Details on the certificates we are after. 203 * The pvUser member points to a UINetworkReplyPrivateThread::CERTINFO. 204 */ 205 /* static */ const RTCRCERTWANTED UINetworkReplyPrivateThread::s_aCerts[] = 254 /* static */ 255 const RTCRCERTWANTED UINetworkReplyPrivateThread::s_aCerts[] = 206 256 { 207 257 /*[0] =*/ … … 233 283 }; 234 284 235 236 /** The certificate file name (no path). */ 237 /* static */ const QString UINetworkReplyPrivateThread::s_strCertificateFileName = QString("vbox-ssl-cacertificate.crt"); 238 285 /* static */ 286 const QString UINetworkReplyPrivateThread::s_strCertificateFileName = QString("vbox-ssl-cacertificate.crt"); 239 287 240 288 UINetworkReplyPrivateThread::UINetworkReplyPrivateThread(const QNetworkRequest &request, UINetworkRequestType type) … … 501 549 const QDir homeDir(QDir::toNativeSeparators(vboxGlobal().homeFolder())); 502 550 return QDir::toNativeSeparators(homeDir.absoluteFilePath(s_strCertificateFileName)); 503 #else 551 #else /* VBOX_GUI_IN_TST_SSL_CERT_DOWNLOADS */ 504 552 return QString("/not/such/agency/non-existing-file.cer"); 505 #endif 553 #endif /* VBOX_GUI_IN_TST_SSL_CERT_DOWNLOADS */ 506 554 } 507 555 … … 529 577 } 530 578 531 /** 532 * Counts the number of certificates found in a search result array. 533 * 534 * @returns Number of wanted certifcates we've found. 535 * @param pafFoundCerts Array parallel to s_aCerts with the status of 536 * each wanted certificate. 537 */ 538 /*static*/ unsigned 539 UINetworkReplyPrivateThread::countCertsFound(bool const *pafFoundCerts) 579 /* static */ 580 unsigned UINetworkReplyPrivateThread::countCertsFound(bool const *pafFoundCerts) 540 581 { 541 582 unsigned cFound = 0; … … 545 586 } 546 587 547 /** 548 * Checks if we've found all the necessary certificates or not. 549 * 550 * @returns true if we have, false if we haven't. 551 * @param pafFoundCerts Array parallel to s_aCerts with the status of 552 * each wanted certificate. 553 */ 554 /*static*/ bool 555 UINetworkReplyPrivateThread::areAllCertsFound(bool const *pafFoundCerts) 588 /* static */ 589 bool UINetworkReplyPrivateThread::areAllCertsFound(bool const *pafFoundCerts) 556 590 { 557 591 for (uint32_t i = 0; i < RT_ELEMENTS(s_aCerts); i++) … … 561 595 } 562 596 563 /** 564 * Refresh the certificates. 565 * 566 * @return IPRT status code for the testcase. 567 * @param hHttp The HTTP client instance. (Can be NIL when 568 * running the testcase.) 569 * @param phStore On input, this holds the current store, so that 570 * we can fish out wanted certificates from it. 571 * On successful return, this is replaced with a 572 * new store reflecting the refrehsed content of 573 * @a pszCaCertFile. 574 * @param pafFoundCerts On input, this holds the certificates found in 575 * the current store. On return, this reflects 576 * what is current in the @a pszCaCertFile. The 577 * array runs parallel to s_aCerts. 578 * @param pszCaCertFile Where to write the refreshed certificates if 579 * we've managed to gather a collection that is at 580 * least as good as the old one. 581 */ 582 /*static*/ int 583 UINetworkReplyPrivateThread::refreshCertificates(RTHTTP hHttp, PRTCRSTORE phStore, bool *pafFoundCerts, 584 const char *pszCaCertFile) 597 /* static */ 598 int UINetworkReplyPrivateThread::refreshCertificates(RTHTTP hHttp, PRTCRSTORE phStore, bool *pafFoundCerts, 599 const char *pszCaCertFile) 585 600 { 586 601 /* … … 676 691 } 677 692 678 /* static*/ void679 UINetworkReplyPrivateThread::downloadMissingCertificates(RTCRSTORE hNewStore, bool *pafNewFoundCerts, RTHTTP hHttp,680 PRTERRINFOSTATIC pStaticErrInfo)693 /* static */ 694 void UINetworkReplyPrivateThread::downloadMissingCertificates(RTCRSTORE hNewStore, bool *pafNewFoundCerts, RTHTTP hHttp, 695 PRTERRINFOSTATIC pStaticErrInfo) 681 696 { 682 697 int rc; … … 751 766 } 752 767 753 /** 754 * Converts a PEM certificate, verifies it against @a pCertInfo and adds it to 755 * the given store. 756 * 757 * @returns IPRT status code. 758 * @param hStore The store to add it to. 759 * @param pvResponse The raw PEM certificate file bytes. 760 * @param cbResponse The number of bytes. 761 * @param pWantedCert The certificate info (we use hashes and encoded 762 * size). 763 */ 764 /*static*/ int 765 UINetworkReplyPrivateThread::convertVerifyAndAddPemCertificateToStore(RTCRSTORE hStore, 766 void const *pvResponse, size_t cbResponse, 767 PCRTCRCERTWANTED pWantedCert) 768 /* static */ 769 int UINetworkReplyPrivateThread::convertVerifyAndAddPemCertificateToStore(RTCRSTORE hStore, 770 void const *pvResponse, size_t cbResponse, 771 PCRTCRCERTWANTED pWantedCert) 768 772 { 769 773 /* … … 831 835 /* Notify listeners about progress change: */ 832 836 emit sigDownloadProgress(cbDownloaded, cbDownloadTotal); 833 #endif /* !VBOX_GUI_IN_TST_SSL_CERT_DOWNLOADS */ 837 #else /* VBOX_GUI_IN_TST_SSL_CERT_DOWNLOADS */ 838 Q_UNUSED(cbDownloaded); 839 Q_UNUSED(cbDownloadTotal); 840 #endif /* VBOX_GUI_IN_TST_SSL_CERT_DOWNLOADS */ 834 841 } 835 842 836 843 #ifndef VBOX_GUI_IN_TST_SSL_CERT_DOWNLOADS 837 844 838 /** 839 * Our network-reply (HTTP) object. 840 */ 845 /** QObject extension 846 * used as network-reply private data instance. */ 841 847 class UINetworkReplyPrivate : public QObject 842 848 { … … 845 851 signals: 846 852 847 /* Notifiers: */ 853 /** Notifies listeners about reply progress change. 854 * @param iBytesReceived Holds the current amount of bytes received. 855 * @param iBytesTotal Holds the total amount of bytes to be received. */ 848 856 void downloadProgress(qint64 iBytesReceived, qint64 iBytesTotal); 857 858 /** Notifies listeners about reply has finished processing. */ 849 859 void finished(); 850 860 851 861 public: 852 862 853 /* Constructor:*/863 /** Constructs reply private data for the passed @a request of the passed @a type. */ 854 864 UINetworkReplyPrivate(const QNetworkRequest &request, UINetworkRequestType type) 855 865 : m_error(QNetworkReply::NoError) … … 858 868 /* Prepare full error template: */ 859 869 m_strErrorTemplate = tr("%1: %2", "Context description: Error description"); 860 /* Create and run network-reply thread: */870 /* Create and run reply thread: */ 861 871 m_pThread = new UINetworkReplyPrivateThread(request, type); 862 872 #ifndef VBOX_GUI_IN_TST_SSL_CERT_DOWNLOADS … … 868 878 } 869 879 870 /* Destructor:*/880 /** Destructs reply private data. */ 871 881 ~UINetworkReplyPrivate() 872 882 { … … 878 888 } 879 889 880 /* API: Abort reply:*/890 /** Aborts reply. */ 881 891 void abort() { m_pThread->abort(); } 882 892 … … 884 894 QUrl url() const { return m_pThread->url(); } 885 895 886 /* API: Error-code getter:*/896 /** Returns the last cached error of the reply. */ 887 897 QNetworkReply::NetworkError error() const { return m_error; } 888 898 889 /* API: Error-string getter:*/899 /** Returns the user-oriented string corresponding to the last cached error of the reply. */ 890 900 QString errorString() const 891 901 { … … 907 917 } 908 918 909 /* API: Reply getter:*/919 /** Returns binary content of the reply. */ 910 920 QByteArray readAll() const { return m_pThread->readAll(); } 911 921 … … 918 928 private slots: 919 929 920 /* Handler: Thread finished:*/930 /** Handles signal about reply has finished processing. */ 921 931 void sltFinished() 922 932 { … … 945 955 QString m_strErrorTemplate; 946 956 947 /* Variables:*/957 /** Holds the last cached error of the reply. */ 948 958 QNetworkReply::NetworkError m_error; 959 960 /** Holds the reply thread instance. */ 949 961 UINetworkReplyPrivateThread *m_pThread; 950 962 }; … … 955 967 *********************************************************************************************************************************/ 956 968 957 UINetworkReply::UINetworkReply(const QNetworkRequest &request, UINetworkRequestType requestType)958 : m_pReply(new UINetworkReplyPrivate(request, requestType))969 UINetworkReply::UINetworkReply(const QNetworkRequest &request, UINetworkRequestType type) 970 : m_pReply(new UINetworkReplyPrivate(request, type)) 959 971 { 960 972 /* Prepare network-reply object connections: */ -
trunk/src/VBox/Frontends/VirtualBox/src/net/UINetworkReply.h
r58252 r58265 5 5 6 6 /* 7 * Copyright (C) 2012-201 3Oracle Corporation7 * Copyright (C) 2012-2015 Oracle Corporation 8 8 * 9 9 * This file is part of VirtualBox Open Source Edition (OSE), as … … 16 16 */ 17 17 18 #ifndef __ UINetworkReply_h__19 #define __ UINetworkReply_h__18 #ifndef ___UINetworkReply_h___ 19 #define ___UINetworkReply_h___ 20 20 21 21 /* Qt includes: */ … … 29 29 class UINetworkReplyPrivate; 30 30 31 /* Network-reply interface: */ 31 /** QObject extension 32 * used as network-reply interface. */ 32 33 class UINetworkReply : public QObject 33 34 { … … 36 37 signals: 37 38 38 /* Notifiers: */ 39 /** Notifies listeners about reply progress change. 40 * @param iBytesReceived Holds the current amount of bytes received. 41 * @param iBytesTotal Holds the total amount of bytes to be received. */ 39 42 void downloadProgress(qint64 iBytesReceived, qint64 iBytesTotal); 43 44 /** Notifies listeners about reply has finished processing. */ 40 45 void finished(); 41 46 42 47 public: 43 48 44 /* Constructor/destructor: */ 45 UINetworkReply(const QNetworkRequest &request, UINetworkRequestType requestType); 49 /** Constructs reply for the passed @a request of the passed @a type. */ 50 UINetworkReply(const QNetworkRequest &request, UINetworkRequestType type); 51 /** Destructs reply. */ 46 52 ~UINetworkReply(); 47 53 48 /* API:*/54 /** Aborts reply. */ 49 55 void abort(); 56 57 /** Returns the URL of the reply. */ 50 58 QUrl url() const; 59 60 /** Returns the last cached error of the reply. */ 51 61 QNetworkReply::NetworkError error() const; 62 /** Returns the user-oriented string corresponding to the last cached error of the reply. */ 52 63 QString errorString() const; 64 65 /** Returns binary content of the reply. */ 53 66 QByteArray readAll() const; 67 /** Returns value for the cached reply header of the passed @a type. */ 54 68 QVariant header(QNetworkRequest::KnownHeaders header) const; 69 /** Returns value for the cached reply attribute of the passed @a code. */ 55 70 QVariant attribute(QNetworkRequest::Attribute code) const; 56 71 57 72 private: 58 73 59 /** Holds the network reply privateinstance. */74 /** Holds the reply private data instance. */ 60 75 UINetworkReplyPrivate *m_pReply; 61 76 }; 62 77 63 #endif // __UINetworkReply_h__ 78 #endif /* !___UINetworkReply_h___ */ 79
Note:
See TracChangeset
for help on using the changeset viewer.