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

Windows编程

开发平台:

Visual C++

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