summaryrefslogtreecommitdiffstats
path: root/private/oleutest/cfmex/cfmex.cxx
diff options
context:
space:
mode:
authorAdam <you@example.com>2020-05-17 05:51:50 +0200
committerAdam <you@example.com>2020-05-17 05:51:50 +0200
commite611b132f9b8abe35b362e5870b74bce94a1e58e (patch)
treea5781d2ec0e085eeca33cf350cf878f2efea6fe5 /private/oleutest/cfmex/cfmex.cxx
downloadNT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.gz
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.bz2
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.lz
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.xz
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.zst
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.zip
Diffstat (limited to 'private/oleutest/cfmex/cfmex.cxx')
-rw-r--r--private/oleutest/cfmex/cfmex.cxx449
1 files changed, 449 insertions, 0 deletions
diff --git a/private/oleutest/cfmex/cfmex.cxx b/private/oleutest/cfmex/cfmex.cxx
new file mode 100644
index 000000000..37e8c08ed
--- /dev/null
+++ b/private/oleutest/cfmex/cfmex.cxx
@@ -0,0 +1,449 @@
+
+//+===============================================================
+//
+// File: CFMEx.cxx
+//
+// Purpose: This file provides the main() and global functions
+// for the CreateFileMonikerEx (CFMEx) DRT.
+// This DRT tests the CreateFileMonikerEx API (new to
+// Cairo), as well as related changes to BIND_OPTS
+// (use of the BIND_OPTS2 structure).
+//
+// All moniker activity is performed in the CMoniker
+// object (such as creating a bind context, creating
+// a link source file, moving it, binding it, etc.).
+//
+// The test engine is in the CTest object. When a link
+// source file is moved to test link-tracking, the
+// original and final location of the file may be
+// specified by the user (on the command-line). CTest
+// is aware of the filesystem type (FAT, NTFS, OFS)
+// of these locations, and is aware of how that will
+// effect the results.
+//
+// This file also provides global functions (not associated
+// with an object).
+//
+// Usage: cfmex [-o<Directory>] [-f<Directory>]
+//
+// -o<Directory> specifies the original directory for link sources
+// -f<Directory> specifies the final directory for link sources
+//
+// Examples: cfmex
+// cfmex -oC:\ -fC:\
+//
+//+===============================================================
+
+
+// ----
+// TODO:
+// ----
+//
+// - Replace CRT calls with Win32 calls.
+// - Validate the directory in CDirectory.
+// - Add a flag to CDirectory to indicate "indexed".
+// - Add a flag to CDirectory to indicate local vs remote.
+// - Add a test to verify that the moniker returned from Reduce is
+// not a tracking moniker.
+//
+
+
+// -------------
+// Include Files
+// -------------
+
+
+#define _DCOM_ // Allow DCOM extensions (e.g., CoInitializeEx).
+
+#include <windows.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <wchar.h>
+#include <wtypes.h>
+#include <oaidl.h>
+#include <dsys.h>
+#include <olecairo.h>
+#include "CFMEx.hxx"
+#include "CMoniker.hxx"
+#include "CTest.hxx"
+#include "CDir.hxx"
+
+
+// ------
+// Macros
+// ------
+
+// Early-exit macro: put the error message in a global array,
+// and jump to Exit
+
+WCHAR wszErrorMessage[ 512 ];
+
+#undef EXIT
+#define EXIT( error ) \
+ {\
+ wcscpy( wszErrorMessage, ##error );\
+ goto Exit;\
+ }
+
+
+
+// Run a Test: Display a new paragraph on the screen, run a test,
+// and update stats.
+
+#define RUN_TEST( testID ) \
+ {\
+ nTotalTests++; \
+ wprintf( L"----------------------------------------------\n" ); \
+ wprintf( L"Test %d: ", nTotalTests ); \
+ if( cTest.##testID ) \
+ wprintf( L"Passed\n" ); \
+ else \
+ nTestsFailed++; \
+ }
+
+
+//+---------------------------------------------------------------------------------------
+//
+// Function: DisplayHelp
+//
+// Synopsis: Display a help screen with usage information.
+//
+// Inputs: None.
+//
+// Outputs: None.
+//
+// Effects: None
+//
+//+---------------------------------------------------------------------------------------
+
+
+void DisplayHelp( void )
+{
+
+ wprintf( L"This DRT tests the CreateFileMonikerEx API, and related changes.\n"
+ L"Most of these tests create a link source file, create a moniker\n"
+ L"representing that file, then move the file. You can specify the\n"
+ L"original and/or final locations of the link source, or let those\n"
+ L"locations default to the \%TEMP\% directory\n"
+ L"\n"
+ L"Usage: cfmex [-o<Directory>] [-f<Directory>]\n"
+ L"\n"
+ L"Where: -o<Directory> specifies the original directory for link sources\n"
+ L" -f<Directory> specifies the final directory for link sources\n"
+ L"\n"
+ L"Note: If an original or final directory is specified on the command-\n"
+ L" line, that directory must already exist. If one of these locations\n"
+ L" is not specified, the TEMP environment variable must be defined\n"
+ L" and it must specify an extant directory.\n"
+ L"\n"
+ L"E.g.: cfmex\n"
+ L" cfmex -oC:\\\n"
+ L" cfmex -oE:\\ -fF:\\temp\n"
+ L"\n" );
+ return;
+}
+
+
+
+//+---------------------------------------------------------------------------------------
+//
+// Function: UnicodeToAnsi
+//
+// Synopsis: Convert a Unicode (wide) string to ANSI
+//
+// Inputs: The Unicode String
+// The buffer for the ANSI string
+// The size of the above buffer
+//
+// Outputs: 0 if successful
+// GetLastError() otherwise
+//
+// Effects: None
+//
+//+---------------------------------------------------------------------------------------
+
+DWORD UnicodeToAnsi( const WCHAR * wszUnicode,
+ CHAR * szAnsi,
+ int cbAnsiMax )
+{
+ int cbAnsi = 0;
+
+ // Convert WCS to the MBCS, using the ANSI code page.
+
+ cbAnsi = WideCharToMultiByte( CP_ACP,
+ WC_COMPOSITECHECK | WC_DEFAULTCHAR,
+ wszUnicode,
+ wcslen( wszUnicode ),
+ szAnsi,
+ cbAnsiMax,
+ NULL,
+ NULL );
+ if( !cbAnsi )
+ {
+ // No characters were converted - there was an error.
+ // Note that this will be returned if a null Unicode string is
+ // passed in.
+
+ return( GetLastError() );
+ }
+ else
+ {
+ // Terminate the Ansi string and return.
+
+ szAnsi[ cbAnsi ] = '\0';
+ return( 0L );
+ }
+
+} // UnicodeToAnsi()
+
+
+
+//+---------------------------------------------------------------------------------------
+//
+// Function: AnsiToUnicode
+//
+// Synopsis: Convert an ANSI string to Unicode (i.e. Wide)
+//
+// Inputs: The ANSI String
+// The buffer for the Unicode string
+// The size of the above buffer.
+//
+// Outputs: 0 if successful
+// GetLastError() otherwise
+//
+// Effects: None
+//
+//+---------------------------------------------------------------------------------------
+
+DWORD AnsiToUnicode( const CHAR * szAnsi,
+ WCHAR * wszUnicode,
+ int cbUnicodeMax )
+{
+ int cbUnicode = 0;
+
+ cbUnicode = MultiByteToWideChar( CP_ACP,
+ MB_PRECOMPOSED,
+ szAnsi,
+ strlen( szAnsi ),
+ wszUnicode,
+ cbUnicodeMax );
+
+ if( !cbUnicode )
+ {
+ // If no characters were converted, then there was an error.
+
+ return( GetLastError() );
+ }
+ else
+ {
+ // Terminate the Unicode string and return.
+
+ wszUnicode[ cbUnicode ] = L'\0';
+ return( 0L );
+ }
+
+} // AnsiToUnicode()
+
+
+
+//+---------------------------------------------------------------------------------------
+//
+// Function: main
+//
+// Synopsis: Run the CFMEx DRT. All tests are in the CTest object. These
+// tests are simply called sequentially.
+//
+// Inputs: (argc) the count of arguments
+// (argv) the arguments. See DisplayHelp() for a description.
+//
+// Outputs: 0 if completely successful
+// 1 if help was displayed
+// 2 if a test failed
+//
+// Effects: None
+//
+//+---------------------------------------------------------------------------------------
+
+
+int main( int argc, char** argv )
+{
+
+ // ---------------
+ // Local Variables
+ // ---------------
+
+ // Test statistics.
+
+ int nTotalTests = 0;
+ int nTestsFailed = 0;
+
+ // The original and final directories (in ANSI) of the link source file.
+
+ CHAR* szOriginalDirectory = NULL;
+ CHAR* szFinalDirectory = NULL;
+
+ // Objects representing the original and final directories.
+
+ CDirectory cDirectoryOriginal;
+ CDirectory cDirectoryFinal;
+
+ // The test engine.
+
+ CTest cTest;
+
+ int index = 0;
+
+
+ // --------------
+ // Opening Banner
+ // --------------
+
+ printf( "\n"
+ "*** CreateFileMonikerEx DRT ***\n"
+ "(use \"cfmex -?\" for help)\n"
+ "\n" );
+
+
+ // ------------------------------
+ // Handle command-line parameters
+ // ------------------------------
+
+
+ for( index = 1; index < argc; index++ )
+ {
+ // The first character of an argument should be an "-" or "/"
+ // (they are interchangable).
+
+ if( ( ( argv[index][0] != '-' )
+ &&
+ ( argv[index][0] != '/' )
+ )
+ ||
+ ( strlen( &argv[index][0] ) < 2 ) // Must have more than '-' & an option.
+ )
+ {
+ printf( "Invalid argument ignored: %s\n", argv[ index ] );
+ continue;
+ }
+
+
+ // Switch based on the first character (which defines the option).
+
+ switch( argv[index][1] )
+ {
+ // Help requested
+
+ case '?':
+ DisplayHelp();
+ exit( 1 );
+
+ // An original directory is specified.
+
+ case 'o':
+ case 'O':
+
+ // Verify the specified path length.
+
+ if( strlen( &argv[index][2] ) > MAX_PATH )
+ {
+ printf( "Path is too long, ignored: %s\n", &argv[index][2] );
+ break; // From the switch
+ }
+
+ szOriginalDirectory = &argv[index][2];
+ break; // From the switch
+
+ // A final directory is specified
+
+ case 'f':
+ case 'F':
+
+ if( strlen( &argv[index][2] ) > MAX_PATH )
+ {
+ printf( "Path is too long, ignored: %s\n", &argv[index][2] );
+ break; // From the switch
+ }
+
+ szFinalDirectory = &argv[index][2];
+ break; // From the switch
+
+ // Invalid argument.
+
+ default:
+
+ printf( "Invalid option ignored: \"-%c\"\n", argv[index][1] );
+ break;
+ }
+ }
+
+ // --------------
+ // Initialization
+ // --------------
+
+ // Initialize COM
+
+ CoInitialize( NULL );
+
+
+ // Initialize the CDirectory and CTest objects. If no original/final
+ // directory was specified above, CDirectory will create a default
+ // (based on %TEMP%).
+
+ if( !cDirectoryOriginal.Initialize( szOriginalDirectory ) )
+ EXIT( L"Could not initialize cDirectoryOriginal" );
+
+ if( !cDirectoryFinal.Initialize( szFinalDirectory ) )
+ EXIT( L"Could not initialize cDirectoryFinal" );
+
+ if( !cTest.Initialize( cDirectoryOriginal, cDirectoryFinal ) )
+ EXIT( L"Could not initialize CTest" );
+
+
+ // Show the end result.
+
+ wprintf( L"Link sources will be created in \"%s\" (%s)\n",
+ cDirectoryOriginal.GetDirectoryName(),
+ cDirectoryOriginal.GetFileSystemName() );
+ wprintf( L"and will be moved to \"%s\" (%s)\n",
+ cDirectoryFinal.GetDirectoryName(),
+ cDirectoryFinal.GetFileSystemName() );
+
+
+ // ---------
+ // Run Tests
+ // ---------
+
+ RUN_TEST( GetOversizedBindOpts() );
+ RUN_TEST( GetUndersizedBindOpts() );
+ RUN_TEST( SetOversizedBindOpts() );
+ RUN_TEST( SetUndersizedBindOpts() );
+ RUN_TEST( CreateFileMonikerEx() );
+ RUN_TEST( GetDisplayName() );
+ RUN_TEST( GetTimeOfLastChange() );
+ RUN_TEST( ComposeWith() );
+ RUN_TEST( IPersist() );
+ RUN_TEST( BindToStorage() );
+ RUN_TEST( BindToObject() );
+ RUN_TEST( DeleteLinkSource( 0 )); // Timeout immediately.
+ RUN_TEST( DeleteLinkSource( 200 )); // Timeout in multi-threaded search
+ RUN_TEST( DeleteLinkSource( INFINITE )); // Don't timeout
+
+ // ----
+ // Exit
+ // ----
+
+Exit:
+
+ // Show test results.
+
+ wprintf( L"\n\nTesting complete:\n"
+ L" Total Tests = %d\n"
+ L" Failed = %d\n",
+ nTotalTests, nTestsFailed );
+
+ // Free COM
+
+ CoUninitialize();
+
+ return( nTestsFailed ? 2 : 0 );
+}