home *** CD-ROM | disk | FTP | other *** search
/ Chip 2002 September / Chip_2002-09_cd1.bin / zkuste / vbasic / Data / Utils / XZipComp.exe / XceedEncoding.Cab / F112891_unMemEncoding.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2001-05-11  |  13.4 KB  |  387 lines

  1. /*
  2.   Xceed Binary Encoding Library - Memory Encode Sample
  3.   Copyright (c) 2001 Xceed Software Inc.
  4.  
  5.   This sample demonstrates how to encode a chunk of memory data using
  6.   different encoding methods and how to decode encoded memory data.
  7.   It specifically uses:
  8.     - The Encode and Decode methods
  9.     - The ContinueOnInvalidData, IncludeHeaderFooter, EndOfLineType,
  10.       MaxLineLength, HeaderDataForkLength, HeaderResourceForkLength,
  11.       and the EncodingFormat properties.
  12.  
  13.   This file is part of the Xceed Binary Encoding Library sample applications.
  14.   The source code in this file is only intended as a supplement to the
  15.   Xceed Binary Encoding Library's documentation and is provided "as is",
  16.   without warranty of any kind, either expressed or implied.
  17. */
  18.  
  19. #include <vcl.h>
  20. #pragma hdrstop
  21.  
  22. #include "unMemEncoding.h"
  23. //---------------------------------------------------------------------------
  24. #pragma package(smart_init)
  25. #pragma link "XceedBinaryEncodingLib_OCX"
  26. #pragma link "XceedBinaryEncodingLib_TLB"
  27. #pragma resource "*.dfm"
  28. TfrmMemEncoding *frmMemEncoding;
  29. //---------------------------------------------------------------------------
  30. __fastcall TfrmMemEncoding::TfrmMemEncoding(TComponent* Owner)
  31.   : TForm(Owner)
  32. {
  33. }
  34.  
  35. //---------------------------------------------------------------------------
  36. // Initialize the decoded file size label and the combo boxes. For the
  37. // purposes of this example, the combo box items were entered using
  38. // C++Builder's property box.
  39. //---------------------------------------------------------------------------
  40. void __fastcall TfrmMemEncoding::FormCreate(TObject *Sender)
  41. {
  42.   cboEncodingMethod->ItemIndex = 0;
  43.   cboEndOfLineType->ItemIndex = 1;
  44.  
  45.   lblDecodedSize->Caption = IntToStr( mmoDecodedText->Text.Length() );
  46. }
  47.  
  48. //---------------------------------------------------------------------------
  49. // Update the encoded size label when the user modifies the encoded text
  50. //---------------------------------------------------------------------------
  51. void __fastcall TfrmMemEncoding::mmoEncodedTextChange(TObject *Sender)
  52. {
  53.   lblEncodedSize->Caption = IntToStr( mmoEncodedText->Text.Length() );
  54. }
  55.  
  56. //---------------------------------------------------------------------------
  57. // Update the decoded size label when the user modifies the decoded text
  58. //---------------------------------------------------------------------------
  59. void __fastcall TfrmMemEncoding::mmoDecodedTextChange(TObject *Sender)
  60. {
  61.   lblDecodedSize->Caption = IntToStr( mmoDecodedText->Text.Length() );
  62. }
  63.  
  64. //---------------------------------------------------------------------------
  65. // Prepare the encoding format accoring to the user. Return true is successful
  66. //---------------------------------------------------------------------------
  67. bool TfrmMemEncoding::PrepareEncodingFormat( IXceedBinaryEncodingPtr& piEncoder )
  68. {
  69.   try
  70.   {
  71.     switch( cboEncodingMethod->ItemIndex )
  72.     {
  73.       case 0 :    //UUEncode
  74.       {
  75.         IXceedUUEncodingFormatPtr piUUFormat;
  76.         piUUFormat.CreateInstance( CLSID_XceedUUEncodingFormat );
  77.  
  78.         // We don't want any header/footer since this is only a memory
  79.         // encoding process. The header/footer are mainly used with files
  80.         piUUFormat->IncludeHeaderFooter = false;
  81.         piUUFormat->EndOfLineType = EXBEndOfLineType( cboEndOfLineType->ItemIndex );
  82.  
  83.         // Set the maximum line length specified by the user. This is a mandatory
  84.         // value as the EndOfLineType cannot be None for UUEncoding.
  85.         piUUFormat->MaxLineLength = StrToInt( edtMaxLineLength->Text );
  86.  
  87.         // Set the previously initialized Encoding format of the Encoder object
  88.         // received as a parameter.
  89.         piEncoder->EncodingFormat = piUUFormat;
  90.  
  91.         break;
  92.       }
  93.       case 1 :    //XXEncode
  94.       {
  95.         IXceedXXEncodingFormatPtr piXXFormat;
  96.         piXXFormat.CreateInstance( CLSID_XceedXXEncodingFormat );
  97.  
  98.         piXXFormat->IncludeHeaderFooter = false;
  99.         piXXFormat->EndOfLineType = EXBEndOfLineType( cboEndOfLineType->ItemIndex );
  100.  
  101.         // Set the maximum line length specified by the user. This is a mandatory
  102.         // value as the EndOfLineType cannot be None for XXEncoding.
  103.         piXXFormat->MaxLineLength = StrToInt( edtMaxLineLength->Text );
  104.         piEncoder->EncodingFormat = piXXFormat;
  105.  
  106.         break;
  107.       }
  108.       case 2 :    //HexaDecimal
  109.       {
  110.         IXceedHexaEncodingFormatPtr piHexaFormat;
  111.         piHexaFormat.CreateInstance( CLSID_XceedHexaEncodingFormat );
  112.  
  113.         piHexaFormat->EndOfLineType = EXBEndOfLineType( cboEndOfLineType->ItemIndex );
  114.  
  115.         // Set the maximum line length specified by the user. This value will
  116.         // be ignored by the Xceed Binary Encoding Library if the EndOfLineType
  117.         // is set to None.
  118.         piHexaFormat->MaxLineLength = StrToInt( edtMaxLineLength->Text );
  119.         piEncoder->EncodingFormat = piHexaFormat;
  120.  
  121.         break;
  122.       }
  123.       case 3 :    //Base 64
  124.       {
  125.         IXceedBase64EncodingFormatPtr piBase64Format;
  126.         piBase64Format.CreateInstance( CLSID_XceedBase64EncodingFormat );
  127.  
  128.         piBase64Format->EndOfLineType = EXBEndOfLineType( cboEndOfLineType->ItemIndex );
  129.  
  130.         // Set the maximum line length specified by the user. This value will
  131.         // be ignored by the Xceed Binary Encoding Library if the EndOfLineType
  132.         // is set to None.
  133.         piBase64Format->MaxLineLength = StrToInt( edtMaxLineLength->Text );
  134.         piEncoder->EncodingFormat = piBase64Format;
  135.  
  136.         break;
  137.       }
  138.       case 4 :  //Quoted Printable
  139.       {
  140.         IXceedQuotedPrintableEncodingFormatPtr piQPFormat;
  141.         piQPFormat.CreateInstance( CLSID_XceedQuotedPrintableEncodingFormat );
  142.  
  143.         piQPFormat->EndOfLineType = EXBEndOfLineType( cboEndOfLineType->ItemIndex );
  144.  
  145.         // Set the maximum line length specified by the user. This value will
  146.         // be ignored by the Xceed Binary Encoding Library if the EndOfLineType
  147.         // is set to None.
  148.         piQPFormat->MaxLineLength = StrToInt( edtMaxLineLength->Text );
  149.         piEncoder->EncodingFormat = piQPFormat;
  150.  
  151.         break;
  152.       }
  153.       case 5 :  //BinHex
  154.       {
  155.         IXceedBinHexEncodingFormatPtr piBinHexFormat;
  156.         piBinHexFormat.CreateInstance( CLSID_XceedBinHexEncodingFormat );
  157.  
  158.         piBinHexFormat->EndOfLineType = EXBEndOfLineType( cboEndOfLineType->ItemIndex );
  159.  
  160.         // Set the maximum line length specified by the user. This value will
  161.         // be ignored by the Xceed Binary Encoding Library if the EndOfLineType
  162.         // is set to None.
  163.         piBinHexFormat->MaxLineLength = StrToInt( edtMaxLineLength->Text );
  164.  
  165.         // For the BinHex format, we must specify the data fork length and
  166.         // the resource fork length. The resource fork is not mandatory.
  167.         // The DataForkLength is mandatory and must be set to the size
  168.         // of the data that will be encoded.
  169.         piBinHexFormat->HeaderDataForkLength = mmoDecodedText->Text.Length();
  170.  
  171.         // The ResouceForkLength, used by MAC systems, is not relevant under
  172.         // a PC system so we set it to 0
  173.         piBinHexFormat->HeaderResourceForkLength = 0;
  174.         piEncoder->EncodingFormat = piBinHexFormat;
  175.  
  176.         break;
  177.       }
  178.     }
  179.     return true;
  180.   }
  181.   catch( Exception& xErr )
  182.   {
  183.     ShowMessage( xErr.Message );
  184.     return false;
  185.   }
  186.   catch( ... )
  187.   {
  188.     ShowMessage( "An unexpected error occured while preparing "
  189.                  "the encoding format" );
  190.     return false;
  191.   }
  192. }
  193.  
  194. //---------------------------------------------------------------------------
  195. // Prepare the decoding format accoring to the user. Return true is successful
  196. //---------------------------------------------------------------------------
  197. bool TfrmMemEncoding::PrepareDecodingFormat( IXceedBinaryEncodingPtr& piEncoder )
  198. {
  199.   try
  200.   {
  201.     switch( cboEncodingMethod->ItemIndex )
  202.     {
  203.       case 0 :    //UUEncode
  204.       {
  205.         IXceedUUEncodingFormatPtr piUUFormat;
  206.         piUUFormat.CreateInstance( CLSID_XceedUUEncodingFormat );
  207.  
  208.         // The encoded string does not contain and header/footer.
  209.         // The header/footer are usually present only in files.
  210.         piUUFormat->IncludeHeaderFooter = false;
  211.  
  212.         // We want to ignore invalid encoded characters
  213.         piUUFormat->ContinueOnInvalidData = true;
  214.         piEncoder->EncodingFormat = piUUFormat;
  215.  
  216.         break;
  217.       }
  218.       case 1 :    //XXEncode
  219.       {
  220.         IXceedXXEncodingFormatPtr piXXFormat;
  221.         piXXFormat.CreateInstance( CLSID_XceedXXEncodingFormat );
  222.  
  223.         piXXFormat->IncludeHeaderFooter = false;
  224.         piXXFormat->ContinueOnInvalidData = true;
  225.         piEncoder->EncodingFormat = piXXFormat;
  226.  
  227.         break;
  228.       }
  229.       case 2 :    //HexaDecimal
  230.       {
  231.         IXceedHexaEncodingFormatPtr piHexaFormat;
  232.         piHexaFormat.CreateInstance( CLSID_XceedHexaEncodingFormat );
  233.  
  234.         piHexaFormat->ContinueOnInvalidData = true;
  235.         piEncoder->EncodingFormat = piHexaFormat;
  236.  
  237.         break;
  238.       }
  239.       case 3 :    //Base64
  240.       {
  241.         IXceedBase64EncodingFormatPtr piBase64Format;
  242.         piBase64Format.CreateInstance( CLSID_XceedBase64EncodingFormat );
  243.  
  244.         piBase64Format->ContinueOnInvalidData = true;
  245.         piEncoder->EncodingFormat = piBase64Format;
  246.  
  247.         break;
  248.       }
  249.       case 4 :    //QuotedPrintable
  250.       {
  251.         IXceedQuotedPrintableEncodingFormatPtr piQPFormat;
  252.         piQPFormat.CreateInstance( CLSID_XceedQuotedPrintableEncodingFormat );
  253.  
  254.         piQPFormat->ContinueOnInvalidData = true;
  255.         piEncoder->EncodingFormat = piQPFormat;
  256.  
  257.         break;
  258.       }
  259.       case 6 :    //BinHex
  260.       {
  261.         IXceedBinHexEncodingFormatPtr piBinHexFormat;
  262.         piBinHexFormat.CreateInstance( CLSID_XceedBinHexEncodingFormat );
  263.  
  264.         // The encoded string does not contain any header/footer.
  265.         // The header/footer are usually present only in files.
  266.         piBinHexFormat->IncludeHeaderFooter = false;
  267.         piBinHexFormat->ContinueOnInvalidData = true;
  268.         piEncoder->EncodingFormat = piBinHexFormat;
  269.  
  270.         break;
  271.       }
  272.     }
  273.     return true;
  274.   }
  275.   catch( Exception& xErr )
  276.   {
  277.     ShowMessage( xErr.Message );
  278.     return false;
  279.   }
  280.   catch( ... )
  281.   {
  282.     ShowMessage( "An unexpected error occured while preparing "
  283.                  "the decoding format" );
  284.     return false;
  285.   }
  286. }
  287.  
  288. //---------------------------------------------------------------------------
  289. // Encode the text!
  290. //---------------------------------------------------------------------------
  291. void __fastcall TfrmMemEncoding::btEncodeClick(TObject *Sender)
  292. {
  293.   // Create our instance of the Xceed Binary Encoding object
  294.   IXceedBinaryEncodingPtr piEncoder;
  295.   piEncoder.CreateInstance( CLSID_XceedBinaryEncoding );
  296.  
  297.   // Create and prepare the encoding format (UU, XX, BinHex, ... )
  298.   if( PrepareEncodingFormat( piEncoder ) )
  299.   {
  300.     try
  301.     {
  302.       char* szSource         = mmoDecodedText->Text.c_str();
  303.       // We add 1 because we want to compress the null-char too
  304.       DWORD dwSourceSize     = mmoDecodedText->Text.Length() + 1;
  305.       BYTE* pcEncoded;
  306.       DWORD dwEncodedSize;
  307.  
  308.       // Encode the data in a single call (bEndOfData is True).
  309.       piEncoder->Encode( ( BYTE* )szSource, dwSourceSize, TRUE, &pcEncoded, &dwEncodedSize );
  310.  
  311.       if( !pcEncoded )
  312.       {
  313.         // no output was produced
  314.         mmoEncodedText->Text = "";
  315.         lblEncodedSize->Caption = "";
  316.       }
  317.       else
  318.       {
  319.         // Display the encoded result in the memo field and show the
  320.         // encoded string size
  321.         mmoEncodedText->Clear();
  322.         mmoEncodedText->SetTextBuf( ( CHAR*) pcEncoded );
  323.         lblEncodedSize->Caption = IntToStr( dwEncodedSize );
  324.       }
  325.  
  326.     }
  327.     catch( Exception& xErr )
  328.     {
  329.       ShowMessage( xErr.Message );
  330.     }
  331.     catch( ... )
  332.     {
  333.       ShowMessage( "An unexpected error occured while encoding the data." );
  334.     }
  335.   }
  336. }
  337.  
  338. //---------------------------------------------------------------------------
  339. // Decode the encoded text!
  340. //---------------------------------------------------------------------------
  341. void __fastcall TfrmMemEncoding::btDecodeClick(TObject *Sender)
  342. {
  343.   // Create our instance of the Xceed Binary Encoding object
  344.   IXceedBinaryEncodingPtr piEncoder;
  345.   piEncoder.CreateInstance( CLSID_XceedBinaryEncoding );
  346.  
  347.   // Create and prepare the decoding format (UU, XX, BinHex, ... )
  348.   if( PrepareDecodingFormat( piEncoder ) )
  349.   {
  350.     try
  351.     {
  352.       char* szSource         = mmoEncodedText->Text.c_str();
  353.       DWORD dwSourceSize     = mmoEncodedText->Text.Length();
  354.       BYTE* pcDecoded;
  355.       DWORD dwDecodedSize;
  356.  
  357.       // Decode the data in a single call (bEndOfData is True).
  358.       piEncoder->Decode( ( BYTE* )szSource, dwSourceSize, TRUE, &pcDecoded, &dwDecodedSize );
  359.  
  360.       if( !pcDecoded )
  361.       {
  362.         // no output was produced
  363.         mmoDecodedText->Text = "";
  364.         lblDecodedSize->Caption = "";
  365.       }
  366.       else
  367.       {
  368.         // Display the decoded result in the memo field and show the
  369.         // decoded string size
  370.         mmoDecodedText->Clear();
  371.         mmoDecodedText->SetTextBuf( ( CHAR* )pcDecoded );
  372.         lblDecodedSize->Caption = IntToStr( dwDecodedSize );
  373.       }
  374.     }
  375.     catch( Exception& xErr )
  376.     {
  377.       ShowMessage( xErr.Message );
  378.     }
  379.     catch( ... )
  380.     {
  381.       ShowMessage( "An unexpected error occured while decoding the data." );
  382.     }
  383.   }
  384. }
  385.  
  386.  
  387.