/*++ awdvstub.c Copyright (c) 1997 Microsoft Corporation This program is a stub AWD viewer... it will first convert an awd file named on the command line to a tiff file in the temp directory, then it will launch the tiff viewer on that file. Also, when used with the '/c' switch, it's an AWD converter. Two programs in one! Author: Brian Dewey (t-briand) 1997-7-15 --*/ #include #include #include #include #include #include #include #include "awdlib.h" // Gives access to the AWD routines. #include "tifflib.h" // TIFF routines. #include "tifflibp.h" // I need access to the private TIFF definitions. #include "faxutil.h" // not sure why I need this... #include "viewrend.h" // win95 viewer library. #include "resource.h" // resource constants // ------------------------------------------------------------ // Prototypes void Useage(HINSTANCE hInst); void PopupError(UINT uID, HINSTANCE hModule); // ------------------------------------------------------------ // WinMain int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { LPWSTR *argv; DWORD argc; UINT uiCurrentArg; // Used for iterating through arguments. UINT uiNumFiles=0; // This is the number of files we've gotten // from the command line. WCHAR szTempPath[MAX_PATH]; // Holds the temporary path. WCHAR szTempFile[MAX_PATH]; // Holds the temporary file name. WCHAR szAwdFile[MAX_PATH]; // Holds the name of the AWD file we're viewing or converting. int iStrLen; BOOL bConvert = FALSE; // TRUE if we're to do a permanent conversion. // If FALSE, we do a conversion to a temporary file & // launch the viewer. BOOL bTempProvided = FALSE;// If TRUE, then the user provided the destination file. UINT uiHackPosition = 0; // Oh, this is part of some awful code below... argv = CommandLineToArgvW( GetCommandLine(), &argc ); if(NULL == argv) { return 1; } if(argc < 2) { Useage(hInstance); return 1; } for(uiCurrentArg = 1; uiCurrentArg < argc; uiCurrentArg++) { if((argv[uiCurrentArg][0] == L'-') || (argv[uiCurrentArg][0] == L'/')) { switch(argv[uiCurrentArg][1]) { // We're doing a switch based on the character after the // command-argument specifier ('-' or '/'). Put additional // arguments here as needed. case L'c': case L'C': if (argc<3) { Useage(hInstance); return 1; } bConvert = TRUE; // We're meant to do a permanent conversion. break; default: // Should an invalid parameter be an error? Useage(hInstance); return 1; } // Switch } else { switch(uiNumFiles) { case 0: // If we haven't encountered any files before, then // this is the name of the AWD file. wcscpy(szAwdFile, argv[uiCurrentArg]); break; case 1: // Now, we're reading the name of the TIF file for permanent conversion. bTempProvided = TRUE; wcscpy(szTempFile, argv[uiCurrentArg]); break; default: // Too many parameters! Useage(hInstance); return 1; } uiNumFiles++; } } // For if(!bTempProvided) { if(!bConvert) { // If the user didn't give a temp file name, we provide one. if(!GetTempPath(MAX_PATH, szTempPath)) { PopupError(IDS_NOTEMPPATH, hInstance); return 1; // Failed to get the path. } GetTempFileName( szTempPath, // put the file in this directory. TEXT("avs"), // prefix -- "awd viewer stub" 0, // Generate a unique name. szTempFile // Will hold the new name ); DeleteFile(szTempFile); // Get rid of that file name. // (created when obtained.) } else { // The user requested permanent conversion, but didn't // supply a name. In this case, change the extention of // the file to TIF instead of generating a temp file name. wcscpy(szTempFile, szAwdFile); } // Make sure the file has the TIF extension. iStrLen = wcslen(szTempFile); szTempFile[iStrLen-3] = L't'; szTempFile[iStrLen-2] = L'i'; szTempFile[iStrLen-1] = L'f'; } // if(bTempProvided)... if(ConvertAWDToTiff(szAwdFile, szTempFile)) { SHELLEXECUTEINFO sei = {0}; if(bConvert) { return 0; // We're done! } // now we have to tiff in szTempFile. // let's run ShellExecute on it to open it. // and wait for the viewer to close. sei.cbSize = sizeof (SHELLEXECUTEINFO); sei.fMask = SEE_MASK_NOCLOSEPROCESS; sei.lpVerb = TEXT("open"); sei.lpFile = szTempFile; sei.lpParameters = NULL; sei.lpDirectory = TEXT("."); sei.nShow = SW_MAXIMIZE; if(!ShellExecuteEx(&sei)) { PopupError(IDS_NOVIEW, hInstance); } WaitForSingleObject(sei.hProcess, INFINITE); // When we get here, the viewer has terminated. DeleteFile(szTempFile); // Erase our tracks. } else { PopupError(IDS_ERRCONV, hInstance); } return 0; } // Useage // // Displays command useage. // // Parameters: // hInst Current module instance. // // Returns: // Nothing. // // Author: // Brian Dewey (t-briand) 1997-8-7 void Useage(HINSTANCE hInst) { PopupError(IDS_USEAGE, hInst); } // PopupError // // Displays a message box with an error message. // // Parameters: // uID String resource ID // hModule Module instance. // // Returns: // Nothing. // // Author: // Brian Dewey (t-briand) 1997-8-19 void PopupError(UINT uID, HINSTANCE hModule) { TCHAR szTitle[512], szMsg[512]; if(!LoadString(hModule, IDS_TITLE, szTitle, sizeof(szTitle)/sizeof(TCHAR))) { return; } if(!LoadString(hModule, uID, szMsg, sizeof(szMsg)/sizeof(TCHAR))) { return; } AlignedMessageBox(NULL, szMsg, szTitle, MB_OK | MB_ICONSTOP); }