boolean CNetRequestImpl::readHeaders(Hashtable<String,String>& oHeaders) { oHeaders.clear(); CAtlStringW strHeaders; DWORD dwLen = 0; DWORD nIndex = 0; if( !HttpQueryInfo( hRequest, HTTP_QUERY_RAW_HEADERS_CRLF, null, &dwLen, &nIndex) ) { DWORD dwErr = ::GetLastError(); if ( dwErr != ERROR_INSUFFICIENT_BUFFER ) { pszErrFunction = L"HttpQueryInfo"; return false; } } if( !HttpQueryInfo( hRequest, HTTP_QUERY_RAW_HEADERS_CRLF, strHeaders.GetBuffer(dwLen), &dwLen, &nIndex) ) { pszErrFunction = L"HttpQueryInfo"; return false; } strHeaders.ReleaseBuffer(); int nStart = 0; for(int nEnd = strHeaders.Find(L"\r\n", nStart); nEnd > 0; nStart = nEnd+2, nEnd = strHeaders.Find(L"\r\n", nStart) ) { CAtlStringW strHeader = strHeaders.Mid(nStart, nEnd-nStart); int nSep = strHeader.Find(':'); if (nSep < 0 ) continue; CAtlStringW strName = strHeader.Mid(0, nSep); strName.Trim(); strName.MakeLower(); CAtlStringW strValue = strHeader.Mid(nSep+1); strValue.Trim(); oHeaders.put(common::convertToStringA(strName.GetString()),common::convertToStringA(strValue.GetString())); } return true; }
void CNetRequestImpl::ErrorMessage(LPCTSTR pszFunction) { // Retrieve the system error message for the last-error code LPTSTR pszMessage = NULL; DWORD dwLastError = GetLastError(); DWORD dwLen = FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | //FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_FROM_HMODULE| FORMAT_MESSAGE_IGNORE_INSERTS, GetModuleHandle( _T("wininet.dll") ), dwLastError, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&pszMessage, 0, NULL ); CAtlStringW strExtError; if ( dwLastError == ERROR_INTERNET_EXTENDED_ERROR ) { DWORD dwInetError =0, dwExtLength = 0; InternetGetLastResponseInfo( &dwInetError, NULL, &dwExtLength ); if ( dwExtLength > 0 ) { InternetGetLastResponseInfo( &dwInetError, strExtError.GetBuffer(dwExtLength+1), &dwExtLength ); strExtError.ReleaseBuffer(); } } rho::LogMessage oLogMsg(__FILE__, __LINE__, L_ERROR, LOGCONF(), getLogCategory() ); oLogMsg + "Call " + pszFunction + " failed. With code : " + dwLastError; if ( pszMessage ) oLogMsg + ".Message: " + pszMessage; if ( strExtError.GetLength() ) oLogMsg + ".Extended info: " + strExtError.GetString(); if ( pszMessage ) LocalFree(pszMessage); }
String CNetRequestImpl::makeClientCookie() { DWORD nIndex = 0; String cookie; while(true) { CAtlStringW strCookie; DWORD dwLen = 0; if( !HttpQueryInfo( hRequest, HTTP_QUERY_SET_COOKIE, null, &dwLen, &nIndex) ) { DWORD dwErr = ::GetLastError(); if ( dwErr == ERROR_HTTP_HEADER_NOT_FOUND ) break; if ( dwErr != ERROR_INSUFFICIENT_BUFFER ) { pszErrFunction = L"HttpQueryInfo"; break; } } if( !HttpQueryInfo( hRequest, HTTP_QUERY_SET_COOKIE, strCookie.GetBuffer(dwLen), &dwLen, &nIndex) ) { pszErrFunction = L"HttpQueryInfo"; break; } strCookie.ReleaseBuffer(); URI::parseCookie(common::convertToStringA(strCookie.GetString()).c_str(), cookie); } if (pszErrFunction) return ""; // if ( cookie.strAuth.length() > 0 || cookie.strSession.length() >0 ) // return cookie.strAuth + ";" + cookie.strSession + ";"; return cookie; }
// Writes a set of properties for all objects. void WriteContentPropertiesBulk( IPortableDevice* pDevice) { if (pDevice == NULL) { printf("! A NULL IPortableDevice interface pointer was received\n"); return; } HRESULT hr = S_OK; GUID guidContext = GUID_NULL; CSetBulkValuesCallback* pCallback = NULL; CComPtr<IPortableDeviceProperties> pProperties; CComPtr<IPortableDevicePropertiesBulk> pPropertiesBulk; CComPtr<IPortableDeviceValues> pObjectProperties; CComPtr<IPortableDeviceContent> pContent; CComPtr<IPortableDeviceValuesCollection> pPropertiesToWrite; CComPtr<IPortableDevicePropVariantCollection> pObjectIDs; DWORD cObjectIDs = 0; // 1) Get an IPortableDeviceContent interface from the IPortableDevice interface to // access the content-specific methods. hr = pDevice->Content(&pContent); if (FAILED(hr)) { printf("! Failed to get IPortableDeviceContent from IPortableDevice, hr = 0x%lx\n",hr); } // 2) Get an IPortableDeviceProperties interface from the IPortableDeviceContent interface // to access the property-specific methods. if (SUCCEEDED(hr)) { hr = pContent->Properties(&pProperties); if (FAILED(hr)) { printf("! Failed to get IPortableDeviceProperties from IPortableDevice, hr = 0x%lx\n",hr); } } // 3) Check to see if the driver supports BULK property operations by call QueryInterface // on the IPortableDeviceProperties interface for IPortableDevicePropertiesBulk if (SUCCEEDED(hr)) { hr = pProperties->QueryInterface(IID_PPV_ARGS(&pPropertiesBulk)); if (FAILED(hr)) { printf("This driver does not support BULK property operations.\n"); } } // 4) CoCreate an IPortableDeviceValuesCollection interface to hold the the properties // we wish to write. if (SUCCEEDED(hr)) { hr = CoCreateInstance(CLSID_PortableDeviceValuesCollection, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pPropertiesToWrite)); if (FAILED(hr)) { printf("! Failed to CoCreate IPortableDeviceValuesCollection for bulk property values, hr = 0x%lx\n", hr); } } // 6) Create an instance of the IPortableDevicePropertiesBulkCallback object. if (SUCCEEDED(hr)) { pCallback = new (std::nothrow) CSetBulkValuesCallback(); if (pCallback == NULL) { hr = E_OUTOFMEMORY; printf("! Failed to allocate CSetBulkValuesCallback, hr = 0x%lx\n", hr); } } // 7) Call our helper function CreateIPortableDevicePropVariantCollectionWithAllObjectIDs // to enumerate and create an IPortableDevicePropVariantCollection with the object // identifiers needed to perform the bulk operation on. if (SUCCEEDED(hr)) { hr = CreateIPortableDevicePropVariantCollectionWithAllObjectIDs(pContent, &pObjectIDs); } if (SUCCEEDED(hr)) { hr = pObjectIDs->GetCount(&cObjectIDs); if (FAILED(hr)) { printf("! Failed to get number of objectIDs from IPortableDevicePropVariantCollection, hr = 0x%lx\n", hr); } } // 8) Iterate through object list and add appropriate IPortableDeviceValues to collection if (SUCCEEDED(hr)) { for(DWORD dwIndex = 0; (dwIndex < cObjectIDs) && (hr == S_OK); dwIndex++) { CComPtr<IPortableDeviceValues> pValues; PROPVARIANT pv = {0}; PropVariantInit(&pv); hr = CoCreateInstance(CLSID_PortableDeviceValues, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pValues)); if (FAILED(hr)) { printf("! Failed to CoCreate CLSID_PortableDeviceValues, hr = 0x%lx\n", hr); } // Get the Object ID whose properties we will set if (hr == S_OK) { hr = pObjectIDs->GetAt(dwIndex, &pv); if (FAILED(hr)) { printf("! Failed to get next Object ID from list, hr = 0x%lx\n", hr); } } // Save them into the IPortableDeviceValues so the driver knows which object this proeprty set belongs to if (hr == S_OK) { hr = pValues->SetStringValue(WPD_OBJECT_ID, pv.pwszVal); if (FAILED(hr)) { printf("! Failed to set WPD_OBJECT_ID, hr = 0x%lx\n", hr); } } // Set the new values. In this sample, we attempt to set the name property. if (hr == S_OK) { CAtlStringW strValue; strValue.Format(L"NewName%d", dwIndex); hr = pValues->SetStringValue(WPD_OBJECT_NAME, strValue.GetString()); if (FAILED(hr)) { printf("! Failed to set WPD_OBJECT_NAME, hr = 0x%lx\n", hr); } } // Add this property set to the collection if (hr == S_OK) { hr = pPropertiesToWrite->Add(pValues); if (FAILED(hr)) { printf("! Failed to add values to collection, hr = 0x%lx\n", hr); } } PropVariantClear(&pv); } } // 9) Call QueueSetValuesByObjectList to initialize the Asynchronous // property operation. if (SUCCEEDED(hr)) { hr = pPropertiesBulk->QueueSetValuesByObjectList(pPropertiesToWrite, pCallback, &guidContext); // 10) Call Start() to actually being the property operation if(SUCCEEDED(hr)) { // Cleanup any previously created global event handles. if (g_hBulkPropertyOperationEvent != NULL) { CloseHandle(g_hBulkPropertyOperationEvent); g_hBulkPropertyOperationEvent = NULL; } // In order to create a simpler to follow example we create and wait infinitly // for the bulk property operation to complete and ignore any errors. // Production code should be written in a more robust manner. // Create the global event handle to wait on for the bulk operation // to complete. g_hBulkPropertyOperationEvent = CreateEvent(NULL, FALSE, FALSE, NULL); if (g_hBulkPropertyOperationEvent != NULL) { // Call Start() to actually being the Asynchronous bulk operation. hr = pPropertiesBulk->Start(guidContext); if(FAILED(hr)) { printf("! Failed to start property operation, hr = 0x%lx\n", hr); } } else { printf("! Failed to create the global event handle to wait on for the bulk operation. Aborting operation.\n"); } } else { printf("! QueueSetValuesByObjectList Failed, hr = 0x%lx\n", hr); } } // In order to create a simpler to follow example we will wait infinitly for the operation // to complete and ignore any errors. Production code should be written in a more // robust manner. if (SUCCEEDED(hr)) { if (g_hBulkPropertyOperationEvent != NULL) { WaitForSingleObject(g_hBulkPropertyOperationEvent, INFINITE); } } if (pCallback != NULL) { pCallback->Release(); pCallback = NULL; } // Cleanup any created global event handles before exiting.. if (g_hBulkPropertyOperationEvent != NULL) { CloseHandle(g_hBulkPropertyOperationEvent); g_hBulkPropertyOperationEvent = NULL; } }
void RegisterForEventNotifications(IPortableDevice* pDevice) { HRESULT hr = S_OK; PWSTR pszEventCookie = NULL; CPortableDeviceEventsCallback* pCallback = NULL; if (pDevice == NULL) { return; } // Check to see if we already have an event registration cookie. If so, // then avoid registering again. // NOTE: An application can register for events as many times as they want. // This sample only keeps a single registration cookie around for // simplicity. if (g_strEventRegistrationCookie.GetLength() > 0) { printf("This application has already registered to receive device events.\n"); return; } // Create an instance of the callback object. This will be called when events // are received. if (hr == S_OK) { pCallback = new (std::nothrow) CPortableDeviceEventsCallback(); if (pCallback == NULL) { hr = E_OUTOFMEMORY; printf("Failed to allocate memory for IPortableDeviceEventsCallback object, hr = 0x%lx\n",hr); } } // Call Advise to register the callback and receive events. if (hr == S_OK) { hr = pDevice->Advise(0, pCallback, NULL, &pszEventCookie); if (FAILED(hr)) { printf("! Failed to register for device events, hr = 0x%lx\n",hr); } } // Save the event registration cookie if event registration was successful. if (hr == S_OK) { g_strEventRegistrationCookie = pszEventCookie; } // Free the event registration cookie, if one was returned. if (pszEventCookie != NULL) { CoTaskMemFree(pszEventCookie); pszEventCookie = NULL; } if (hr == S_OK) { printf("This application has registered for device event notifications and was returned the registration cookie '%ws'", g_strEventRegistrationCookie.GetString()); } // If a failure occurs, remember to delete the allocated callback object, if one exists. if (pCallback != NULL) { pCallback->Release(); } }
void UnregisterForEventNotifications(IPortableDevice* pDevice) { HRESULT hr = S_OK; if (pDevice == NULL) { return; } hr = pDevice->Unadvise(g_strEventRegistrationCookie); if (FAILED(hr)) { printf("! Failed to unregister for device events using registration cookie '%ws', hr = 0x%lx\n",g_strEventRegistrationCookie.GetString(), hr); } if (hr == S_OK) { printf("This application used the registration cookie '%ws' to unregister from receiving device event notifications", g_strEventRegistrationCookie.GetString()); } g_strEventRegistrationCookie = L""; }