--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/secureswitools/swisistools/source/makesis/parsecmd.cpp Thu Dec 17 08:51:10 2009 +0200
@@ -0,0 +1,335 @@
+/*
+* Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+* Note: This file may contain code to generate corrupt files for test purposes.
+* Such code is excluded from production builds by use of compiler defines;
+* it is recommended that such code should be removed if this code is ever published publicly.
+* handles parsing of makesis command line args
+* INCLUDES
+*
+*/
+
+
+/**
+ @file
+ @internalComponent
+ @released
+*/
+
+#include "utils.h"
+#include "utility_interface.h"
+#include "parsecmd.h"
+#include "utility.h"
+#include "siscontents.h"
+
+// ===========================================================================
+// CParseCmd
+// Responsable for processing and maintaining the command line options
+// ===========================================================================
+
+CParseCmd::CParseCmd ()
+:iOptions (0L),
+iShowSyntax (false),
+iShowSSL (false),
+iInterpretSisReport (false)
+ {
+ iDir [0] = '\0';
+ iSource[0] = '\0';
+ iTarget[0] = '\0';
+ }
+
+BOOL CParseCmd::ParseCommandLine(int argc, _TCHAR *argv[])
+// Purpose : Proceses the command line, and options
+// Inputs : argc, argv - command line as passed to the process
+ {
+ // Test the number of arguments
+ if(argc == 1)
+ throw ErrInsufficientArgs;
+
+ int wCount = 1;
+ // Parse the command line
+ // Check for options
+ while(wCount < argc)
+ {
+ if((argv[wCount][0] != '-') && ((argv[wCount][0] != '/') || (argv[wCount][0] != '\\')))
+ break;
+ else
+ {
+ if(argv[wCount][1] == '\0')
+ throw ErrBadCommandFlag;
+
+ // cope with multiple arguments following the '-' or '/'
+ int wCharacter = 1;
+ while (argv[wCount][wCharacter] !='\0')
+ {
+ switch(argv[wCount][wCharacter])
+ {
+ case 'a' : // Verbose
+ case 'A' :
+#if defined (_DEBUG)
+ iOptions |= EOptDump;
+#endif // _DEBUG
+ break;
+#ifdef GENERATE_ERRORS
+ case 'b' :
+ case 'B' :
+ {
+ for (int index = wCharacter+1; argv [wCount] [index]; index++)
+ {
+ switch(argv [wCount] [index])
+ {
+ case 'a' :
+ case 'A' :
+ CSISFieldRoot::SetBug (CSISFieldRoot::EBugArrayCount);
+ break;
+ case 'b' :
+ case 'B' :
+ CSISFieldRoot::SetBug (CSISFieldRoot::EBugInsaneBlob);
+ break;
+ case 'c' :
+ case 'C' :
+ CSISFieldRoot::SetBug (CSISFieldRoot::EBugCRCError);
+ break;
+ case 'e' :
+ case 'E' :
+ CSISFieldRoot::SetBug (CSISFieldRoot::EBugBigEndian);
+ break;
+ case 'f' :
+ case 'F' :
+ CSISFieldRoot::SetBug (CSISFieldRoot::EBugDuffFieldType);
+ break;
+ case 'h' :
+ case 'H' :
+ CSISFieldRoot::SetBug (CSISFieldRoot::EBugHashError);
+ break;
+ case 'k' :
+ case 'K' :
+ CSISFieldRoot::SetBug (CSISFieldRoot::EBugUnknownData);
+ break;
+ case 'l' :
+ case 'L' :
+ CSISFieldRoot::SetBug (CSISFieldRoot::EBugInvalidLength);
+ break;
+ case 'm' :
+ case 'M' :
+ CSISFieldRoot::SetBug (CSISFieldRoot::EBugMissingField);
+ break;
+ case 'n' :
+ case 'N' :
+ CSISFieldRoot::SetBug (CSISFieldRoot::EBugNegativeLength);
+ break;
+ case 'p' :
+ case 'P' :
+ CSISFieldRoot::SetBug (CSISFieldRoot::EBugEmptyCaps);
+ break;
+ case 's' :
+ case 'S' :
+ CSISFieldRoot::SetBug (CSISFieldRoot::EBugInsaneString);
+ break;
+ case 't' :
+ case 'T' :
+ CSISFieldRoot::SetBug (CSISFieldRoot::EBug32As64);
+ break;
+ case 'u' :
+ case 'U' :
+ CSISFieldRoot::SetBug (CSISFieldRoot::EBugUnexpectedField);
+ break;
+ case 'v' :
+ case 'V' :
+ CSISFieldRoot::SetBug (CSISFieldRoot::EBugInvalidValues);
+ break;
+ case 'x' :
+ case 'X' :
+ CSISFieldRoot::SetBug (CSISFieldRoot::EBugUnknownField);
+ break;
+ }
+ wCharacter++;
+ }
+ }
+ break;
+#endif // GENERATE_ERRORS
+ case 'c' : // Report InterpretSis errors
+ case 'C' :
+ iInterpretSisReport = true;
+ break;
+ case 'd' : // Search directory
+ case 'D' : iOptions |= EOptDirectory;
+ SetDirectory(&argv[wCount][wCharacter+1]);
+ // Change next char to a NUL so we don't process the directory as if it were an option string.
+ argv[wCount][wCharacter+1] = '\0';
+ break;
+ case 'h' : // Help. i.e Show Syntax
+ case 'H' :
+ iShowSyntax = true;
+ return TRUE;
+ case 'i' :
+ case 'I' :
+ iShowSSL = true;
+ return TRUE;
+ case 'p' : // Use Password for Private Key Decryption
+ case 'P' : iOptions |= EOptPassword;
+ break;
+#ifdef GENERATE_ERRORS
+ case 'q' :
+ case 'Q' :
+ CSISFieldRoot::SetBugStart (atoi (wstring2string (&argv [wCount] [wCharacter+1]).c_str ()));
+ wCharacter++;
+ break;
+ case 'r' :
+ case 'R' :
+ CSISFieldRoot::SetBugRepeat (atoi (wstring2string (&argv [wCount] [wCharacter+1]).c_str ()));
+ wCharacter++;
+ break;
+#endif // GENERATE_ERRORS
+ case 's' :
+ case 'S' :
+ iOptions |= EOptMakeStub;
+ CSISContents::SetStub (CSISContents::EStubROM);
+ break;
+ case 'v' : // Verbose
+ case 'V' : iOptions |= EOptVerbose;
+ break;
+ case 'x' :
+ case 'X' :
+ {
+ for (int index = wCharacter+1; argv [wCount][index]; index++)
+ {
+ switch(argv[wCount][index])
+ {
+ case 'c' :
+ case 'C' :
+ CSISFieldRoot::SetDebugOption (CSISFieldRoot::EDbgControllerChecksum);
+ break;
+ case 'd' :
+ case 'D' :
+ CSISFieldRoot::SetDebugOption (CSISFieldRoot::EDbgDataChecksum);
+ break;
+ case 'w' :
+ case 'W' :
+ CSISFieldRoot::SetDebugOption (CSISFieldRoot::EDbgCompress);
+ break;
+ case 'x' :
+ case 'X' :
+ CSISFieldRoot::SetDebugOption (CSISFieldRoot::EDbgNoCompress);
+ break;
+ }
+ wCharacter++;
+ }
+ }
+ break;
+ default : // Uh-Oh...
+ throw ErrBadCommandFlag;
+ }
+ wCharacter++;
+ }
+ wCount++;
+ }
+ }
+ // Get the source and (optionally) target filenames
+ if(wCount < argc)
+ {
+ SetSource(argv[wCount++]);
+ }
+ else
+ throw ErrNoSourceFile;
+
+ if(wCount < argc)
+ {
+ SetTarget(argv[wCount]);
+ }
+
+ return TRUE;
+ }
+
+void CParseCmd::SetDirectory(const wchar_t* aPath)
+// Purpose : Sets the search directory
+// Inputs : pszCmdLine - the path
+ {
+ wcsncpy(iDir, aPath, PATHMAX - 1);
+ DWORD len=wcslen(iDir);
+ wchar_t *pBuffer = iDir;
+ wchar_t *pCurrent = pBuffer;
+
+ while (pBuffer && *pBuffer && (pCurrent = wcschr(pBuffer,L'\\')) != NULL)
+ {
+ *pCurrent = L'/';
+ pBuffer = pCurrent + 1;
+ }
+ if(len>0 && iDir[len - 1] != '/')
+ {
+ iDir[len] = '/';
+ iDir[len+1] = '\0';
+ }
+ }
+
+void CParseCmd::SetTarget(const wchar_t* aTarget)
+// Purpose : Sets the target filename
+// Inputs : aTarget - The target filename
+ {
+ //Conversion of the filename consisting backward slashes with forward slashes
+ const wchar_t *pBuffer = aTarget;
+ wchar_t *pCurrent = const_cast<wchar_t*>(pBuffer);
+
+ while (pBuffer && *pBuffer && (pCurrent = wcschr(pBuffer,L'\\')) != NULL)
+ {
+ *pCurrent = L'/';
+ pBuffer = pCurrent + 1;
+ }
+ // Check that the filename is valid
+ if (wcslen(aTarget) < wcslen(DESTFILE) + 1) // Check that we have at least one character for the filename, and 4 for the extension: ".sis"
+ throw ErrBadTargetFile;
+ else
+ {
+ if(CompareTwoString((wchar_t*)&aTarget[wcslen(aTarget) - (wcslen(DESTFILE))],DESTFILE) != 0 )
+ throw ErrBadTargetFile;
+ else
+ {
+ wcsncpy(iTarget, aTarget, PATHMAX-1);
+ iTarget [PATHMAX - 1] = 0;
+ }
+ }
+ }
+
+void CParseCmd::SetSource(const wchar_t* aSource)
+// Purpose : Sets the source filename
+// Inputs : aSource - The source filename
+ {
+ // Check that the filename is valid
+ if (wcslen(aSource) <= wcslen(SOURCEFILE))
+ throw ErrBadSourceFile;
+ else
+ {
+ if(CompareTwoString((wchar_t*)&aSource[wcslen(aSource) - (wcslen(SOURCEFILE))],SOURCEFILE) != 0 )
+ throw ErrBadSourceFile;
+ else
+ {
+ wcsncpy(iSource, aSource, PATHMAX-1);
+ iTarget [PATHMAX - 1] = 0;
+ }
+ }
+ }
+
+const wchar_t* CParseCmd::TargetFile()
+// Returns the destination file. If none was set then it mugnes the source filename into
+// something acceptable
+ {
+ // Has a destination file been set ?
+ if(wcslen(iTarget) < 1)
+ {
+ wcscpy(iTarget, iSource);
+ iTarget[wcslen(iTarget) - (wcslen(SOURCEFILE))] = '\0';
+ wcscat(iTarget, DESTFILE);
+ }
+ return iTarget;
+ }