RANGE.C
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:5k
源码类别:

Windows编程

开发平台:

Visual C++

  1. // ===========================================================================
  2. // THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
  3. // ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
  4. // THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
  5. // PARTICULAR PURPOSE.
  6. //
  7. // Copyright 1996 Microsoft Corporation.  All Rights Reserved.
  8. // ===========================================================================
  9. #include <windows.h>
  10. #include <urlmon.h>
  11. #include <stdio.h>
  12. #include <stdlib.h>
  13. #include "range.h"
  14. DWORD g_dwThread;
  15. //==============================================================================
  16. void DumpBytes (PBYTE pBuf, DWORD cbBuf)
  17. {
  18.     DWORD i;
  19.     for (i=0; i<cbBuf; i++)
  20.     {
  21.         switch(pBuf[i])
  22.         {
  23.             case 10:  printf("[LF]"); break;
  24.             case 13:  printf("[CR]"); break;
  25.             default:  printf("%c", pBuf[i]); break;
  26.         }
  27.     }
  28. }
  29. //==============================================================================
  30. void PrintResultCode (HRESULT hr)
  31. {
  32. #define CASEMSG(hr) case hr: printf(#hr); break;
  33. printf ("Done with result ");
  34. switch (hr)
  35. {
  36. CASEMSG(S_OK)
  37. CASEMSG(S_FALSE)
  38. CASEMSG(E_FAIL)
  39.         CASEMSG(INET_E_INVALID_URL)
  40. CASEMSG(INET_E_NO_SESSION)
  41. CASEMSG(INET_E_CANNOT_CONNECT)
  42. CASEMSG(INET_E_RESOURCE_NOT_FOUND)
  43. CASEMSG(INET_E_OBJECT_NOT_FOUND)
  44. CASEMSG(INET_E_DATA_NOT_AVAILABLE)
  45. CASEMSG(INET_E_DOWNLOAD_FAILURE)
  46. CASEMSG(INET_E_AUTHENTICATION_REQUIRED)
  47. CASEMSG(INET_E_NO_VALID_MEDIA)  
  48. CASEMSG(INET_E_CONNECTION_TIMEOUT)
  49. CASEMSG(INET_E_INVALID_REQUEST)
  50. CASEMSG(INET_E_UNKNOWN_PROTOCOL)
  51. CASEMSG(INET_E_SECURITY_PROBLEM)
  52. CASEMSG(INET_E_CANNOT_LOAD_DATA)
  53. CASEMSG(INET_E_CANNOT_INSTANTIATE_OBJECT)
  54. default:
  55.     printf ("0x%x", hr);
  56. }
  57. printf ("n");
  58. }
  59. //==============================================================================
  60. BOOL RequestCallback (PHTTP_REQUESTCB_PARAM pCBParam)
  61. {
  62.     printf ("RequestCallback[%d] ", pCBParam->dwRequestCtx);
  63.     switch (pCBParam->CallbackType)
  64.     {
  65.         case REQUESTCB_STARTED:
  66.             printf ("Startedn");
  67.             printf ("  Status: %dn", pCBParam->dwResponseCode);
  68.             printf ("  Content-Length: %dn", pCBParam->dwContentLength);
  69.             if (pCBParam->fdwRequestFlags & HTTP_REQUEST_ACCEPT_RANGES)
  70.                 printf ("  Accept-Ranges: bytesn");
  71.             if (pCBParam->fdwRequestFlags & HTTP_REQUEST_FROM_CACHE)
  72.                 printf ("  From Cachen");
  73.             return TRUE;
  74.         case REQUESTCB_DATA:
  75.     // Dump some bytes so we can verify them.
  76.     printf ("offset=%5d got %4d bytes:",
  77.         pCBParam->dwDataOffset, pCBParam->cbDataLength);
  78.     DumpBytes ((PBYTE) pCBParam->lpDataBuffer, min(pCBParam->cbDataLength, 15));
  79.     printf ("n");
  80.     return TRUE;
  81.         case REQUESTCB_DONE:
  82.             PrintResultCode (pCBParam->hrRequest);
  83.             // Let the console app thread exit the message loop.
  84.             PostThreadMessage (g_dwThread, WM_QUIT, 0, 0);
  85.             return TRUE;
  86. }
  87. }
  88. //==============================================================================
  89. int __cdecl main (int argc, char *argv[])
  90. {
  91.     MSG msg;
  92.     HTTP_REQUEST_PARAM Param;
  93.     SYSTEMTIME st;
  94.     PSTR pszUrl;
  95.     HTTP_REQUEST_RANGE ranges[10];
  96.     DWORD cRanges;
  97.     // Check usage.
  98.     if (argc<2 || argc%2 || argc>(2*(sizeof(ranges))/sizeof(ranges[0])))
  99.     {
  100.         fprintf (stderr, "Usage:   range <http-url> [<offset1> <size1>]  [<offset2> <size2>]  [<offset3> <size3>]  ...n");
  101.         fprintf (stderr, "Example: range http://www.microsoft.com 2 5 10 52 20 4n");
  102.         exit (1);
  103.     }
  104.     // Get URL and ranges from command line.
  105.     pszUrl = argv[1];
  106.     cRanges = 0;
  107.     while (argc -= 2)
  108.     {
  109. if (argc <= 0)
  110. break;
  111.      ranges[cRanges].dwOffset = atoi(argv[2 * cRanges + 2]);
  112.      ranges[cRanges].dwSize   = atoi(argv[2 * cRanges + 3]);
  113.         cRanges++;
  114.     }
  115.     // Pass current time as unless-modified-since time.
  116.     GetSystemTime (&st);
  117.     
  118.     // Save the thread ID so the we can post ourselves
  119.     // WM_QUIT from the callback without creating a window.
  120.     g_dwThread = GetCurrentThreadId();
  121.     // Read range depends on URL monikers which depend on COM.
  122.     if (FAILED(CoInitialize(NULL)))
  123.         exit (1);
  124.     
  125.     // Initiate the read range request.
  126.     ZeroMemory (&Param, sizeof(Param));
  127.     Param.cbStruct     = sizeof(Param);
  128.     Param.pszUrl       = pszUrl;
  129.     Param.pfnRequestCB = RequestCallback;
  130.     Param.dwRequestCtx = 15;
  131.     Param.pRanges      = &ranges[0];
  132.     Param.cRanges      = cRanges;
  133.     Param.pstUnlessModifiedSince = &st;
  134.       
  135.     if (HttpReadRequest (&Param))
  136.     {
  137.         // Must enter a message loop for the binding to progress.
  138.         while (GetMessage (&msg, NULL, 0, 0))
  139.         {
  140.             TranslateMessage (&msg);
  141.             DispatchMessage (&msg);
  142.         }
  143.     }
  144.     CoUninitialize();
  145.     return 1;
  146. }