00001
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #include "InternetRequest.h"
00028
00030 #define REQUESTBUFFER_MINSIZE 1024
00031
00032
00038 bool InternetRequestBuffer::AddData(const char* pBuffer, unsigned int dwSize)
00039 {
00040
00041 if (m_dwSize + dwSize > m_dwRealSize)
00042 {
00043
00044 unsigned int dwNewSize = (m_dwRealSize == 0) ? REQUESTBUFFER_MINSIZE : m_dwRealSize * 2;
00045 while (dwNewSize < m_dwSize + dwSize)
00046 dwNewSize *= 2;
00047
00048
00049 char* pNewBuffer = new char[dwNewSize];
00050 if (pNewBuffer == NULL)
00051
00052 return false;
00053
00054 if (m_dwSize > 0)
00055 memcpy(pNewBuffer, m_pData, m_dwSize);
00056
00057
00058 m_dwRealSize = dwNewSize;
00059
00060
00061 delete [] m_pData;
00062 m_pData = pNewBuffer;
00063 }
00064
00065
00066 memcpy(m_pData + m_dwSize, pBuffer, dwSize);
00067
00068 m_dwSize += dwSize;
00069 return true;
00070 }
00071
00072
00073
00074
00075
00079 InternetRequest::InternetRequest() : m_hSession(NULL), m_hConnection(NULL), m_hRequest(NULL),
00080 m_bInRequest(false), m_bInCreation(false)
00081 {
00082 }
00083
00087 InternetRequest::~InternetRequest()
00088 {
00089
00090 CloseAll();
00091 }
00092
00096 void InternetRequest::CloseAll()
00097 {
00098
00099 try
00100 {
00101
00102 if (m_hSession != NULL)
00103 {
00104
00105 if (m_hRequest != NULL)
00106 ::InternetSetStatusCallback(m_hRequest, NULL);
00107 if (m_hConnection != NULL)
00108 ::InternetSetStatusCallback(m_hConnection, NULL);
00109 ::InternetSetStatusCallback(m_hSession, NULL);
00110 }
00111
00112
00113 if (m_hRequest != NULL)
00114 {
00115
00116 InternetCloseHandle(m_hRequest);
00117 m_hRequest = NULL;
00118 }
00119
00120 if (m_hConnection != NULL)
00121 {
00122
00123 InternetCloseHandle(m_hConnection);
00124 m_hConnection = NULL;
00125 }
00126
00127 if (m_hSession != NULL)
00128 {
00129
00130 InternetCloseHandle(m_hSession);
00131 m_hSession = NULL;
00132 }
00133 }
00134 catch(...)
00135 {
00136 }
00137 }
00138
00142 bool InternetRequest::OpenSession()
00143 {
00144
00145 CloseAll();
00146
00147 try
00148 {
00149
00150 m_hSession = ::InternetOpen(_T("CogniView CCInfo/0.1"), INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
00151 if (m_hSession == NULL)
00152 {
00153
00154 m_sError = _T("Cannot connect to the internet");
00155 return false;
00156 }
00157
00158
00159 if (::InternetSetStatusCallback(m_hSession, InternetCallback) == INTERNET_INVALID_STATUS_CALLBACK)
00160 {
00161
00162 m_sError = _T("Cannot set connection callback");
00163 return false;
00164 }
00165 }
00166 catch (...)
00167 {
00168 return false;
00169 }
00170
00171
00172 return true;
00173 }
00174
00182 void __stdcall InternetRequest::InternetCallback(HINTERNET hInternet, DWORD_PTR dwContext, DWORD dwInternetStatus, LPVOID lpvStatusInformation, DWORD dwStatusInformationLength)
00183 {
00184
00185 InternetRequest* pRequest = (InternetRequest*)dwContext;
00186
00187 pRequest->OnInternetCallback(dwInternetStatus, lpvStatusInformation, dwStatusInformationLength);
00188 }
00189
00195 void InternetRequest::OnInternetCallback(DWORD dwInternetStatus, LPVOID lpvStatusInformation, DWORD dwStatusInformationLength)
00196 {
00197
00198 switch (dwInternetStatus)
00199 {
00200 case INTERNET_STATUS_HANDLE_CREATED:
00201
00202 m_bInCreation = false;
00203 return;
00204 case INTERNET_STATUS_HANDLE_CLOSING:
00205
00206 m_bInRequest = false;
00207 m_bInCreation = false;
00208 return;
00209 case INTERNET_STATUS_REQUEST_COMPLETE:
00210
00211 if (dwStatusInformationLength < sizeof(INTERNET_ASYNC_RESULT))
00212 {
00213 m_sError = _T("Error while receving information");
00214 m_bInRequest = false;
00215 }
00216 else
00217 {
00218 LPINTERNET_ASYNC_RESULT pResult = (LPINTERNET_ASYNC_RESULT)lpvStatusInformation;
00219 if (pResult->dwError != ERROR_SUCCESS)
00220 {
00221 TCHAR c[128];
00222 _stprintf_s (c, sizeof(c)/sizeof(TCHAR), _T("Receiving information error %d"), pResult->dwError);
00223 m_sError = c;
00224 }
00225 m_bInRequest = false;
00226 }
00227 return;
00228 }
00229 }
00230
00240 bool InternetRequest::DoRequest(const std::tstring& sRequest, InternetRequestBuffer& buffer, LPCTSTR lpServer , LPCSTR lpOptional , LPCTSTR lpHeaders , ProgressInterface* pProgress )
00241 {
00242
00243 RequestData* pData = new RequestData(this, sRequest, pProgress, buffer, lpServer, lpOptional, lpHeaders);
00244
00245 return DoRequest(pData);
00246 }
00247
00257 bool InternetRequest::DoRequestThread(const std::tstring& sRequest, InternetRequestBuffer& buffer, LPCTSTR lpServer , LPCSTR lpOptional , LPCTSTR lpHeaders , ProgressInterface* pProgress )
00258 {
00259
00260 RequestData* pData = new RequestData(this, sRequest, pProgress, buffer, lpServer, lpOptional, lpHeaders);
00261
00262
00263 DWORD dwThreadID;
00264 HANDLE hThread = ::CreateThread(NULL, 0, RequestThreadProc, (LPVOID)pData, 0, &dwThreadID);
00265 if (hThread == NULL)
00266 {
00267
00268 delete pData;
00269 m_sError = _T("Cannot create request thread");
00270 return false;
00271 }
00272
00273
00274 ::CloseHandle(hThread);
00275 return true;
00276 }
00277
00282 DWORD WINAPI InternetRequest::RequestThreadProc(LPVOID lpData)
00283 {
00284
00285 RequestData* pData = (RequestData*)lpData;
00286
00287 pData->m_pThis->DoRequest(pData);
00288 return 0;
00289 }
00290
00295 bool InternetRequest::DoRequest(RequestData* pData)
00296 {
00297
00298 bool bRet = InnerDoRequest(pData);
00299
00300 pData->m_pProgress->OnFinished(bRet);
00301
00302
00303 delete pData;
00304 return bRet;
00305 }
00306
00311 bool InternetRequest::InnerDoRequest(RequestData* pData)
00312 {
00313 m_sError = _T("");
00314
00315
00316 try
00317 {
00318
00319 if (m_hSession == NULL)
00320 {
00321
00322 if (!OpenSession())
00323 return false;
00324 }
00325
00326
00327 if (m_hRequest != NULL)
00328 {
00329
00330 ::InternetCloseHandle(m_hRequest);
00331 m_hRequest = NULL;
00332 }
00333
00334
00335 if (pData->m_sServer.empty())
00336 {
00337
00338 if (m_sServer.empty())
00339 {
00340
00341 m_sError = _T("No server defined for the request");
00342 return false;
00343 }
00344 }
00345 else if (m_sServer != pData->m_sServer)
00346 {
00347
00348 if (m_hConnection != NULL)
00349 ::InternetCloseHandle(m_hConnection);
00350 m_hConnection = NULL;
00351
00352
00353 m_bInCreation = true;
00354 m_hConnection = ::InternetConnect(m_hSession, pData->m_sServer.c_str(), INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, (DWORD)this);
00355 while (m_bInCreation && !pData->m_pProgress->GetCancel())
00356 ::Sleep(100);
00357 if (!m_sError.empty())
00358 return false;
00359
00360 m_sServer = pData->m_sServer;
00361 }
00362
00363
00364 m_bInCreation = true;
00365 m_hRequest = ::HttpOpenRequest(m_hConnection, pData->m_sOptional.empty() ? NULL : _T("POST"), pData->m_sRequest.c_str(), _T("HTTP/1.1"), NULL, NULL, INTERNET_FLAG_NO_CACHE_WRITE|INTERNET_FLAG_NO_COOKIES|INTERNET_FLAG_NO_UI|INTERNET_FLAG_PRAGMA_NOCACHE, (DWORD)this);
00366 while (m_bInCreation && !pData->m_pProgress->GetCancel())
00367 ::Sleep(100);
00368
00369 if (m_hRequest == NULL)
00370 {
00371
00372 m_sError = _T("Cannot create request");
00373 return false;
00374 }
00375
00376
00377 if (!pData->m_sHeaders.empty())
00378 {
00379
00380 if (!::HttpAddRequestHeaders(m_hRequest, pData->m_sHeaders.c_str(), -1, HTTP_ADDREQ_FLAG_ADD|HTTP_ADDREQ_FLAG_REPLACE))
00381 {
00382
00383 m_sError = _T("Cannot send request (2)");
00384 return false;
00385 }
00386 }
00387
00388
00389 LPVOID lpOptional = pData->m_sOptional.empty() ? NULL : (LPVOID)pData->m_sOptional.c_str();
00390
00391 if (!::HttpSendRequest(m_hRequest, NULL, 0, lpOptional, (lpOptional == NULL) ? 0 : (DWORD)pData->m_sOptional.size()))
00392 {
00393
00394 if (m_sError.empty())
00395 m_sError = _T("Cannot send request");
00396 return false;
00397 }
00398
00399
00400 if (!m_sError.empty())
00401 return false;
00402 }
00403 catch (...)
00404 {
00405
00406 m_sError = _T("Unknown error while connecting");
00407 return false;
00408 }
00409
00410 char* pBuffer = NULL;
00411
00412 try
00413 {
00414 DWORD dwRead, dwSize;
00415 do
00416 {
00417
00418 if (pData->m_pProgress->GetCancel())
00419
00420 return false;
00421
00422
00423 if (!::InternetQueryDataAvailable(m_hRequest, &dwSize, 0, 0))
00424 {
00425 m_sError = _T("Cannot retrieve data from query");
00426 return false;
00427 }
00428
00429 if (dwSize == 0)
00430
00431 break;
00432
00433
00434 pBuffer = new char[dwSize];
00435
00436 if (!::InternetReadFile(m_hRequest, pBuffer, dwSize, &dwRead))
00437 {
00438
00439 m_sError = _T("Cannot retrieve data from query (2)");
00440 delete [] pBuffer;
00441 return false;
00442 }
00443
00444
00445 if (dwRead == 0)
00446 break;
00447
00448
00449 if (!pData->m_pBuffer->AddData(pBuffer, dwRead))
00450 {
00451
00452 m_sError = _T("Cannot add data to query buffer");
00453 delete [] pBuffer;
00454 return false;
00455 }
00456
00457
00458 delete [] pBuffer;
00459 pBuffer = NULL;
00460
00461 } while (true);
00462
00463
00464 pData->m_pBuffer->AddData("\0", 1);
00465 }
00466 catch (...)
00467 {
00468
00469 if (pBuffer != NULL)
00470 delete [] pBuffer;
00471
00472
00473 m_sError = _T("Unknown error while retriving data");
00474 return false;
00475 }
00476
00477
00478 return true;
00479 }