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

Windows编程

开发平台:

Visual C++

  1. /****************************************************************************
  2.                    Microsoft RPC Version 2.0
  3.            Copyright Microsoft Corp. 1992, 1993, 1994- 1996
  4.                       picklp Example
  5.     FILE:       picklpc.c
  6.     USAGE:      picklpc  -f filename  (file to write to/read from)
  7.                          -d           (serialization direction: decode)
  8.                          -e           (serialization direction: encode)
  9.                          -i           (incremental serialization on)
  10.     PURPOSE:    The only side of RPC application
  11.     FUNCTIONS:  main() - serializes data to or from a file
  12.     COMMENTS:   Data procedure serialization is demonstrated here
  13. ****************************************************************************/
  14. #include <stdlib.h>
  15. #include <stdio.h>
  16. #include "picklp.h"    // header file generated by MIDL compiler
  17. #define PURPOSE 
  18. "This Microsoft RPC Version 2.0 sample program demonstratesn
  19. the use of the [encode,decode] attributes. For more informationn
  20. about the attributes and RPC API functions, see the RPC programmingn
  21. guide and reference.nn"
  22. /*  Used for incremental style only. */
  23. void __RPC_USER PicAlloc( void * pState, char ** ppBuf, unsigned int * pCount);
  24. void __RPC_USER PicWrite( void * pState, char *  pBuf,  unsigned int Count);
  25. void __RPC_USER PicRead ( void * pState, char ** pBuf,  unsigned int * pCount);
  26. typedef struct PickleControlBlock
  27. {
  28.     unsigned char *         pMemBuffer;
  29.     unsigned char *         pBufferStart;
  30.     unsigned long           LastSize;
  31. } PickleControlBlock;
  32. static PickleControlBlock                 UserState;
  33. static PickleControlBlock * pUserState = &UserState;
  34. void Usage(char * pszProgramName)
  35. {
  36.     fprintf(stderr, "%s", PURPOSE);
  37.     fprintf(stderr, "Usage:  %sn", pszProgramName);
  38.     fprintf(stderr, " -dn");
  39.     fprintf(stderr, " -en");
  40.     fprintf(stderr, " -ffilenamen");
  41.     fprintf(stderr, " -i n");
  42.     exit(1);
  43. }
  44. void DumpData(
  45.     char * pszComment,
  46.     char * pszText,
  47.     OBJECT1 * pObject1,
  48.     OBJECT2 * pObject2 )
  49. {
  50.     int i;
  51.     printf( "n%sn", pszComment );
  52.     printf( "tStringntt%sn", pszText );
  53.     printf( "tObject1");
  54.     for (i=0; i < ARR_SIZE; i++)
  55.         {
  56.         if ( (i % 5) == 0 )
  57.             printf( "ntt");
  58.         printf( "%08xl  ", pObject1->al[i] );
  59.         }
  60.     printf( "ntt%xn", pObject1->s );
  61.     printf( "tObject2");
  62.     printf( "ntt%x", pObject2->sSize );
  63.     for (i=0; i < ARR_SIZE; i++)
  64.         {
  65.         if ( (i % 10) == 0 )
  66.             printf( "ntt");
  67.         printf( "%04x  ", pObject2->as[i] );
  68.         }
  69.     printf( "n" );
  70. }
  71. void WriteDataToFile(
  72.     char *          pszFileName,
  73.     char *          pbBuffer,
  74.     unsigned long   ulSizeToWrite )
  75. {
  76.     FILE *      pFile;
  77.     size_t      Count;
  78.     if ( pszFileName ) {
  79.         pFile = fopen( pszFileName, "w+b" );
  80.         if ( pFile == NULL ) {
  81.             printf("Cannot open the file for writingn");
  82.             exit(1);
  83.             }
  84.         Count = sizeof(long);
  85.         if ( fwrite( &ulSizeToWrite, sizeof(byte), Count, pFile) != Count ) {
  86.             printf("Cannot write1 to the filen");
  87.             exit(1);
  88.             }
  89.         Count = (size_t) ulSizeToWrite;
  90.         if ( fwrite( pbBuffer, sizeof(byte), Count, pFile) != Count ) {
  91.             printf("Cannot write2 to the filen");
  92.             exit(1);
  93.             }
  94.         if ( fclose( pFile ) != 0) {
  95.             printf("Failed to close the filen");
  96.             exit(1);
  97.             }
  98.         }
  99. }
  100. void ReadDataFromFile(
  101.     char *          pszFileName,
  102.     char *          pbBuffer,
  103.     unsigned long   ulBufferSize )
  104. {
  105.     FILE *          pFile;
  106.     size_t          Count;
  107.     unsigned long   ulWrittenSize;
  108.     if ( pszFileName ) {
  109.         pFile = fopen( pszFileName, "r+b" );
  110.         if ( pFile == NULL ) {
  111.             printf("Cannot open the file for readingn");
  112.             exit(1);
  113.             }
  114.         Count = sizeof(long);
  115.         if ( fread( &ulWrittenSize, sizeof(byte), Count, pFile) != Count ) {
  116.             printf("Cannot read1 from the filen");
  117.             exit(1);
  118.             }
  119.         Count = (size_t)ulWrittenSize;
  120.         if ( fread( pbBuffer, sizeof(byte), Count, pFile) != Count ) {
  121.             printf("Cannot read2 from the filen");
  122.             exit(1);
  123.             }
  124.         if ( fclose( pFile ) != 0) {
  125.             printf("Failed to close the filen");
  126.             exit(1);
  127.             }
  128.         }
  129. }
  130. void _CRTAPI1 main(int argc, char **argv)
  131. {
  132.     RPC_STATUS status;
  133.     unsigned char * pbPicklingBuffer = NULL;
  134.     char * pszStyle      = NULL;
  135.     char * pszFileName   = "pickle.dat";
  136.     int i;
  137.     int fEncode = 1;
  138.     int fFixedStyle = 1;
  139.     /* allow the user to override settings with command line switches */
  140.     for (i = 1; i < argc; i++) {
  141.         if ((*argv[i] == '-') || (*argv[i] == '/')) {
  142.             switch (tolower(*(argv[i]+1))) {
  143.             case 'd':
  144.                 fEncode = 0;
  145.                 break;
  146.             case 'e':
  147.                 fEncode = 1;
  148.                 break;
  149.             case 'i':
  150.                 fFixedStyle = 0;
  151.                 break;
  152.             case 'f':
  153.                 pszFileName = argv[i] + 2;
  154.                 break;
  155.             case 'h':
  156.             case '?':
  157.             default:
  158.                 Usage(argv[0]);
  159.             }
  160.         }
  161.         else
  162.             Usage(argv[0]);
  163.     }
  164.     /* Fixed buffer style: the buffer should be big enough.  */
  165.     /* Please note that the buffer has to be aligned at 8.   */
  166.     pbPicklingBuffer = (unsigned char *)
  167.             midl_user_allocate( BUFSIZE * sizeof(unsigned char));
  168.     if ( pbPicklingBuffer == NULL ) {
  169.         printf("Cannot allocate the pickling buffern");
  170.         exit(1);
  171.         }
  172.     else
  173.         memset( pbPicklingBuffer, 0xdd, BUFSIZE );
  174.     /*
  175.         Set the pickling handle that will be used for data serialization.
  176.         The global ImplicitPicHandle is used, but it has to be set up.
  177.     */
  178.     if ( fEncode ) {
  179.         unsigned char * pszNameId;
  180.         OBJECT1         Object1;
  181.         OBJECT2   *     pObject2;
  182.         unsigned long   ulEncodedSize = 0;
  183.         printf("nEncoding run: use -d for decodingnn");
  184.         if ( fFixedStyle ) {
  185.             printf("Creating a fixed buffer encoding handlen");
  186.             status = MesEncodeFixedBufferHandleCreate( pbPicklingBuffer,
  187.                                                        BUFSIZE,
  188.                                                        & ulEncodedSize,
  189.                                                        & ImplicitPicHandle );
  190.             printf("MesEncodeFixedBufferHandleCreate returned 0x%xn", status);
  191.             if (status) {
  192.                 exit(status);
  193.             }
  194.         }
  195.         else {
  196.             pUserState->LastSize = 0;
  197.             pUserState->pMemBuffer = (char *)pbPicklingBuffer;
  198.             pUserState->pBufferStart = (char *)pbPicklingBuffer;
  199.             printf("Creating an incremental encoding handlen");
  200.             status = MesEncodeIncrementalHandleCreate( pUserState,
  201.                                                        PicAlloc,
  202.                                                        PicWrite,
  203.                                                        & ImplicitPicHandle );
  204.             printf("MesEncodeIncrementalHandleCreate returned 0x%xn", status);
  205.             if (status) {
  206.                 exit(status);
  207.             }
  208.         }
  209.         /* Creating objects to manipulate */
  210.         pszNameId = "Procedure pickling sample";
  211.         for (i = 0; i < ARR_SIZE; i++)
  212.             Object1.al[i] = 0x37370000 + i;
  213.         Object1.s = 0x4646;
  214.         pObject2 = midl_user_allocate( sizeof(OBJECT2) + ARR_SIZE*sizeof(short) );
  215.         if (pObject2 == NULL ) {
  216.             printf("Out of memory for Object2n");
  217.             exit(1);
  218.         }
  219.         pObject2->sSize = ARR_SIZE;
  220.         for (i = 0; i < ARR_SIZE; i++)
  221.             pObject2->as[i] = 0x7700 + i;
  222.         DumpData( "Data to be encoded", pszNameId, &Object1, pObject2 );
  223.         printf("nEncoding all the arguments to the buffernn");
  224.         ProcPickle( pszNameId, & Object1, pObject2 );
  225.         printf("Writing the data to the file: %sn", pszFileName);
  226.         WriteDataToFile( pszFileName,
  227.                          pbPicklingBuffer,
  228.                          fFixedStyle  ? ulEncodedSize
  229.                                       : pUserState->LastSize);
  230.         midl_user_free( pObject2 );
  231.     }
  232.     else {
  233.         char            acNameBuffer[50];
  234.         OBJECT1         Object1;
  235.         OBJECT2   *     pObject2;
  236.         printf("nDecoding run: use -e for encodingnn");
  237.         printf("Reading the data from the file: %snn", pszFileName );
  238.         ReadDataFromFile( pszFileName,
  239.                           pbPicklingBuffer,
  240.                           BUFSIZE );
  241.         if ( fFixedStyle ) {
  242.             printf("Creating a decoding handlen");
  243.             status = MesDecodeBufferHandleCreate( pbPicklingBuffer,
  244.                                                   BUFSIZE,
  245.                                                   & ImplicitPicHandle );
  246.             printf("MesDecodeFixedBufferHandleCreate returned 0x%xn", status);
  247.             if (status) {
  248.                 exit(status);
  249.             }
  250.         }
  251.         else {
  252.             pUserState->LastSize = 0;
  253.             pUserState->pMemBuffer = (char *)pbPicklingBuffer;
  254.             pUserState->pBufferStart = (char *)pbPicklingBuffer;
  255.             printf("Creating an incremental decoding handlen");
  256.             status = MesDecodeIncrementalHandleCreate( pUserState,
  257.                                                        PicRead,
  258.                                                        & ImplicitPicHandle );
  259.             printf("MesDecodeIncrementalHandleCreate returned 0x%xn", status);
  260.             if (status) {
  261.                 exit(status);
  262.             }
  263.         }
  264.         /* Creating objects to manipulate */
  265.         pObject2 = midl_user_allocate( sizeof(OBJECT2) + ARR_SIZE*sizeof(short));
  266.         if (pObject2 == NULL ) {
  267.             printf("Out of memory for Object2n");
  268.             exit(1);
  269.         }
  270.         printf("nDecoding all the arguments from the buffern");
  271.         ProcPickle( acNameBuffer, & Object1, pObject2 );
  272.         DumpData( "Decoded data", acNameBuffer, &Object1, pObject2 );
  273.         midl_user_free( pObject2 );
  274.     }
  275.     printf("nData serialization done.n");
  276.     midl_user_free( pbPicklingBuffer );
  277.     printf("nFreeing the serialization handle.n");
  278.     status = MesHandleFree( ImplicitPicHandle );
  279.     printf("MesHandleFree returned 0x%xn", status);
  280.     exit(0);
  281. }  // end main()
  282. /*********************************************************************/
  283. /*                 MIDL allocate and free                            */
  284. /*********************************************************************/
  285. /* A pickling buffer has to be aligned at 8.
  286.    malloc() doesn't guarantee that, so some gimmick has to be done.
  287. */
  288. #define ALIGN_TO8( p)   (char *)((unsigned long)((char *)p + 7) & ~7)
  289. void __RPC_FAR * __RPC_USER  MIDL_user_allocate(size_t s)
  290. {
  291.     unsigned char * pcAllocated;
  292.     unsigned char * pcUserPtr;
  293.     pcAllocated = (unsigned char *) malloc( s + 15 );
  294.     pcUserPtr =  ALIGN_TO8( pcAllocated );
  295.     if ( pcUserPtr == pcAllocated )
  296.         pcUserPtr = pcAllocated + 8;
  297.     *(pcUserPtr - 1) = pcUserPtr - pcAllocated;
  298.     return( pcUserPtr );
  299. }
  300. void __RPC_USER  MIDL_user_free(void __RPC_FAR *f)
  301. {
  302.     unsigned char * pcAllocated;
  303.     unsigned char * pcUserPtr;
  304.     pcUserPtr = (unsigned char *) f;
  305.     pcAllocated = pcUserPtr - *(pcUserPtr - 1);
  306.     free( pcAllocated );
  307. }
  308. /*********************************************************************/
  309. /*                 Incremental style helper routines                 */
  310. /*********************************************************************/
  311. void  __RPC_USER
  312. PicAlloc(
  313.     void *          pState,
  314.     char **         ppBuf,
  315.     unsigned int  * pCount )
  316. {
  317.     /* This routines "allocates" the next part from the preallocated
  318.        buffer. It could call midl_user_allocate, too.
  319.     */
  320.     PickleControlBlock * pPic = (PickleControlBlock *)pState;
  321.     if ( (pPic->pMemBuffer - pPic->pBufferStart) + *pCount <= BUFSIZE )
  322.         *ppBuf = (char *)pPic->pMemBuffer;
  323.     else {
  324.         printf(" Buffer too smalln");
  325.         exit(1);
  326.     }
  327. }
  328. void __RPC_USER
  329. PicWrite(
  330.     void *          pState,
  331.     char *          pBuf,
  332.     unsigned int    Count )
  333. {
  334.     /* This routine just marks how much of the preallocated buffer is used.
  335.     */
  336.     PickleControlBlock * pPic = (PickleControlBlock *)pState;
  337.     if ( pPic->pMemBuffer != pBuf ) {
  338.         printf(" Buffer poiner corruptedn");
  339.         exit(1);
  340.     }
  341.     pPic->pMemBuffer += Count;
  342.     pPic->LastSize += Count;
  343. }
  344. void __RPC_USER
  345. PicRead(
  346.     void *          pState,
  347.     char **         ppBuf,
  348.     unsigned int  * pCount )
  349. {
  350.     /* This routine returns another portion of the preread buffer. */
  351.     PickleControlBlock * pPic = (PickleControlBlock *)pState;
  352.     *ppBuf = (char *)pPic->pMemBuffer;
  353.     pPic->pMemBuffer += *pCount;
  354. }
  355. /* end picklpc.c */