Example #1
0
//----------------------------------------------------------------------------
//  
BOOL CAnchoBackgroundAPI::GetURL(CStringW & sURL)
{
  CString s;
  DWORD dwLength = INTERNET_MAX_URL_LENGTH;
  BOOL b = InternetCombineUrlW(m_sRootURL, sURL, s.GetBuffer(INTERNET_MAX_URL_LENGTH), &dwLength, 0);
  s.ReleaseBuffer();
  if (b)
  {
    sURL = s;
  }
  return b;
}
CImage* HTMLImageElement::GetImage()
{
	if (m_pImage == NULL)
	{
		if (false)
		{
			String src = get_src();
			if (src.GetLength())
			{
				WCHAR result[2048];
				{
					String documentUrl = m_ownerDocument->get_url();
					// documentUrl = _bstr_t(bdocumentUrl, false);

					String baseUrl = documentUrl;

					ASSERT(0);
#if 0
					DWORD resultLen = sizeof(result) - sizeof(result[0]);
					InternetCombineUrlW(baseUrl->c_str(), src->c_str(), result, &resultLen, 0);
#endif
				}

			//	StringA localfilename = DownloadFile(result);

				m_pImage = new CImage;//LXML::g_Images.OpenImage(Convert2W(result));
				m_pImage->m_url = string_copy(result);

				DWORD threadId;
				
				::CreateThread(NULL, 0, ThreadFunc, this, 0, &threadId);

			}
		}
	}

	return m_pImage;
}
Response * WinHTTPSession::receive(HINTERNET wrequest, const Request & request,
                                   std::basic_string<WCHAR> & redirect) {
	
	
	
	if(!WinHttpReceiveResponse(wrequest, NULL)) {
		return new Response("Error receiving response: " + errorString());
	}
	
	DWORD status = 0;
	DWORD statusSize = sizeof(status);
	
	if(!WinHttpQueryHeaders(wrequest, WINHTTP_QUERY_STATUS_CODE | WINHTTP_QUERY_FLAG_NUMBER,
	                        WINHTTP_HEADER_NAME_BY_INDEX, &status, &statusSize,
	                        WINHTTP_NO_HEADER_INDEX)) {
		return new Response("Error getting status code: " + errorString());
	}
	
	std::string url;
	if(!request.followRedirects()) {
		DWORD urlSize = 0;
		WinHttpQueryHeaders(wrequest, WINHTTP_QUERY_LOCATION, WINHTTP_HEADER_NAME_BY_INDEX,
		                    WINHTTP_NO_OUTPUT_BUFFER, &urlSize, WINHTTP_NO_HEADER_INDEX);
		if(GetLastError() ==  ERROR_INSUFFICIENT_BUFFER && urlSize % sizeof(WCHAR) == 0) {
			platform::WideString redirect;
			redirect.allocate(urlSize / sizeof(WCHAR));
			if(WinHttpQueryHeaders(wrequest, WINHTTP_QUERY_LOCATION, WINHTTP_HEADER_NAME_BY_INDEX,
			                       redirect.data(), &urlSize, WINHTTP_NO_HEADER_INDEX)) {
				redirect.resize(urlSize / sizeof(WCHAR));
				platform::WideString base(request.url());
				platform::WideString wurl;
				wurl.allocate(2 * (base.size() + redirect.size()));
				urlSize = wurl.size();
				if(InternetCombineUrlW(base, redirect, wurl.data(), &urlSize, ICU_BROWSER_MODE)) {
					wurl.resize(urlSize);
					url = wurl.toUTF8();
				}
			}
		}
	} else {
		url = redirect.empty() ? request.url() : platform::WideString::toUTF8(redirect);
	}
	
	std::string data;
	DWORD size;
	for(;;) {
		
		// Check for available data.
		size = 0;
		if(!WinHttpQueryDataAvailable(wrequest, &size)) {
			return new Response("Error reading response: " + errorString());
		}
		if(!size) {
			break;
		}
		
		size_t oldsize = data.size();
		data.resize(oldsize + size);
		
		if(!WinHttpReadData(wrequest, &data[oldsize], size, &size)) {
			return new Response("Error reading response: " + errorString());
		}
		
		data.resize(oldsize + size);
	}
	
	return new Response(status, data, url);
}