VOID INTERNET_SendCallback(object_header_t *hdr, DWORD_PTR dwContext, DWORD dwInternetStatus, LPVOID lpvStatusInfo, DWORD dwStatusInfoLength) { LPVOID lpvNewInfo = NULL; if( !hdr->lpfnStatusCB ) return; /* the IE5 version of wininet does not send callbacks if dwContext is zero */ if( !dwContext ) return; lpvNewInfo = lpvStatusInfo; if(hdr->dwInternalFlags & INET_CALLBACKW) { switch(dwInternetStatus) { case INTERNET_STATUS_NAME_RESOLVED: case INTERNET_STATUS_CONNECTING_TO_SERVER: case INTERNET_STATUS_CONNECTED_TO_SERVER: lpvNewInfo = heap_strdupAtoW(lpvStatusInfo); dwStatusInfoLength *= sizeof(WCHAR); break; case INTERNET_STATUS_RESOLVING_NAME: case INTERNET_STATUS_REDIRECT: lpvNewInfo = heap_strdupW(lpvStatusInfo); break; } }else { switch(dwInternetStatus) { case INTERNET_STATUS_NAME_RESOLVED: case INTERNET_STATUS_CONNECTING_TO_SERVER: case INTERNET_STATUS_CONNECTED_TO_SERVER: lpvNewInfo = heap_alloc(strlen(lpvStatusInfo) + 1); if (lpvNewInfo) strcpy(lpvNewInfo, lpvStatusInfo); break; case INTERNET_STATUS_RESOLVING_NAME: case INTERNET_STATUS_REDIRECT: lpvNewInfo = heap_strdupWtoA(lpvStatusInfo); dwStatusInfoLength /= sizeof(WCHAR); break; } } TRACE(" callback(%p) (%p (%p), %08lx, %d (%s), %p, %d)\n", hdr->lpfnStatusCB, hdr->hInternet, hdr, dwContext, dwInternetStatus, get_callback_name(dwInternetStatus), lpvNewInfo, dwStatusInfoLength); hdr->lpfnStatusCB(hdr->hInternet, dwContext, dwInternetStatus, lpvNewInfo, dwStatusInfoLength); TRACE(" end callback().\n"); if(lpvNewInfo != lpvStatusInfo) HeapFree(GetProcessHeap(), 0, lpvNewInfo); }
VOID INTERNET_SendCallback(LPWININETHANDLEHEADER hdr, DWORD dwContext, DWORD dwInternetStatus, LPVOID lpvStatusInfo, DWORD dwStatusInfoLength) { HINTERNET hHttpSession; LPVOID lpvNewInfo = NULL; if( !hdr->lpfnStatusCB ) return; /* the IE5 version of wininet does not send callbacks if dwContext is zero */ if( !dwContext ) return; hHttpSession = WININET_FindHandle( hdr ); if( !hHttpSession ) { TRACE(" Could not convert header '%p' into a handle !\n", hdr); return; } lpvNewInfo = lpvStatusInfo; if(hdr->dwInternalFlags & INET_CALLBACKW) { switch(dwInternetStatus) { case INTERNET_STATUS_NAME_RESOLVED: case INTERNET_STATUS_CONNECTING_TO_SERVER: case INTERNET_STATUS_CONNECTED_TO_SERVER: lpvNewInfo = WININET_strdup_AtoW(lpvStatusInfo); } }else { switch(dwInternetStatus) { case INTERNET_STATUS_RESOLVING_NAME: case INTERNET_STATUS_REDIRECT: lpvNewInfo = WININET_strdup_WtoA(lpvStatusInfo); } } TRACE(" callback(%p) (%p (%p), %08lx, %ld (%s), %p, %ld)\n", hdr->lpfnStatusCB, hHttpSession, hdr, dwContext, dwInternetStatus, get_callback_name(dwInternetStatus), lpvNewInfo, dwStatusInfoLength); hdr->lpfnStatusCB(hHttpSession, dwContext, dwInternetStatus, lpvNewInfo, dwStatusInfoLength); TRACE(" end callback().\n"); if(lpvNewInfo != lpvStatusInfo) HeapFree(GetProcessHeap(), 0, lpvNewInfo); WININET_Release( hdr ); }
void INTERNET_SendCallback(object_header_t *hdr, DWORD_PTR context, DWORD status, void *info, DWORD info_len) { void *new_info = info; if( !hdr->lpfnStatusCB ) return; /* the IE5 version of wininet does not send callbacks if dwContext is zero */ if(!context) return; switch(status) { case INTERNET_STATUS_NAME_RESOLVED: case INTERNET_STATUS_CONNECTING_TO_SERVER: case INTERNET_STATUS_CONNECTED_TO_SERVER: new_info = heap_alloc(info_len); if(new_info) memcpy(new_info, info, info_len); break; case INTERNET_STATUS_RESOLVING_NAME: case INTERNET_STATUS_REDIRECT: if(hdr->dwInternalFlags & INET_CALLBACKW) { new_info = heap_strdupW(info); break; }else { new_info = heap_strdupWtoA(info); info_len = strlen(new_info)+1; break; } } TRACE(" callback(%p) (%p (%p), %08lx, %d (%s), %s, %d)\n", hdr->lpfnStatusCB, hdr->hInternet, hdr, context, status, get_callback_name(status), debugstr_status_info(status, new_info), info_len); hdr->lpfnStatusCB(hdr->hInternet, context, status, new_info, info_len); TRACE(" end callback().\n"); if(new_info != info) heap_free(new_info); }
VOID SendAsyncCallback(LPWININETHANDLEHEADER hdr, DWORD_PTR dwContext, DWORD dwInternetStatus, LPVOID lpvStatusInfo, DWORD dwStatusInfoLength) { TRACE("(%p, %08lx, %d (%s), %p, %d): %sasync call with callback %p\n", hdr, dwContext, dwInternetStatus, get_callback_name(dwInternetStatus), lpvStatusInfo, dwStatusInfoLength, hdr->dwFlags & INTERNET_FLAG_ASYNC ? "" : "non ", hdr->lpfnStatusCB); if (!(hdr->lpfnStatusCB)) return; if (hdr->dwFlags & INTERNET_FLAG_ASYNC) { WORKREQUEST workRequest; struct WORKREQ_SENDCALLBACK *req; void *lpvStatusInfo_copy = lpvStatusInfo; if (lpvStatusInfo) { lpvStatusInfo_copy = HeapAlloc(GetProcessHeap(), 0, dwStatusInfoLength); memcpy(lpvStatusInfo_copy, lpvStatusInfo, dwStatusInfoLength); } workRequest.asyncproc = SendAsyncCallbackProc; workRequest.hdr = WININET_AddRef( hdr ); req = &workRequest.u.SendCallback; req->dwContext = dwContext; req->dwInternetStatus = dwInternetStatus; req->lpvStatusInfo = lpvStatusInfo_copy; req->dwStatusInfoLength = dwStatusInfoLength; INTERNET_AsyncCall(&workRequest); } else INTERNET_SendCallback(hdr, dwContext, dwInternetStatus, lpvStatusInfo, dwStatusInfoLength); }
void SendAsyncCallback(object_header_t *hdr, DWORD_PTR dwContext, DWORD dwInternetStatus, LPVOID lpvStatusInfo, DWORD dwStatusInfoLength) { TRACE("(%p, %08lx, %d (%s), %p, %d): %sasync call with callback %p\n", hdr, dwContext, dwInternetStatus, get_callback_name(dwInternetStatus), lpvStatusInfo, dwStatusInfoLength, hdr->dwFlags & INTERNET_FLAG_ASYNC ? "" : "non ", hdr->lpfnStatusCB); if (!(hdr->lpfnStatusCB)) return; if (hdr->dwFlags & INTERNET_FLAG_ASYNC) { send_callback_task_t *task; void *lpvStatusInfo_copy = lpvStatusInfo; if (lpvStatusInfo) { lpvStatusInfo_copy = heap_alloc(dwStatusInfoLength); memcpy(lpvStatusInfo_copy, lpvStatusInfo, dwStatusInfoLength); } task = alloc_async_task(hdr, SendAsyncCallbackProc, sizeof(*task)); task->context = dwContext; task->status = dwInternetStatus; task->status_info = lpvStatusInfo_copy; task->status_info_len = dwStatusInfoLength; INTERNET_AsyncCall(&task->hdr); } else INTERNET_SendCallback(hdr, dwContext, dwInternetStatus, lpvStatusInfo, dwStatusInfoLength); }