diff -r 7333d7932ef7 -r 8b7f4e561641 installationservices/refsoftwareappmgr/source/command.cpp --- a/installationservices/refsoftwareappmgr/source/command.cpp Tue Aug 31 15:21:33 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,439 +0,0 @@ -/* -* Copyright (c) 2008-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: -* -*/ - - -#include -#include -#include -#include "command.h" - -using namespace Usif; - -_LIT(KTxtOptionPrefix, "--"); -_LIT(KTxtDeleteCommand, "delete"); -_LIT(KTxtListCommand, "list"); -_LIT(KTxtListOptName, "name"); -_LIT(KTxtListOptVendor, "vendor"); -_LIT(KTxtListOptType, "type"); -_LIT(KTxtListOptActivated, "activated"); -_LIT(KTxtListOptDeactivated, "deactivated"); -_LIT(KTxtListOptRemovable, "removable"); -_LIT(KTxtListOptProperty, "property"); -_LIT(KTxtListOptIntProperty, "intproperty"); -_LIT(KTxtListOptDrives, "drives"); -_LIT(KTxtListOptLocale, "locale"); -_LIT(KTxtActivated, "Activated"); -_LIT(KTxtDeactivated, "Deactivated"); -_LIT(KTxtPressToContinue, "\nPress any key to continue..."); -_LIT(KTxtSifConnectionFailure, "\nFailed to connect to the SIF server\n"); -_LIT(KTxtDeleting, "Deleting...\n"); - -// ================================================================================== - -CConsoleCommand::CConsoleCommand() - { - } - -CConsoleCommand::~CConsoleCommand() - { - } - -// ================================================================================== - -CListCommand* CListCommand::NewLC() - { - - CListCommand* self = new (ELeave) CListCommand; - CleanupStack::PushL(self); - self->iFilter = CComponentFilter::NewL(); - return self; - } - -CListCommand::CListCommand(): iLocale(KUnspecifiedLocale) - { - } - -CListCommand::~CListCommand() - { - delete iFilter; - } - -const TDesC& CListCommand::Name() - { - return KTxtListCommand; - } - -namespace - { - // Leave if the number of values differs from aCount - void AssertNumValuesL(const RArray& aValues, TInt aCount) - { - if (aValues.Count() != aCount) - { - User::Leave(KErrArgument); - } - } - } - -void CListCommand::OptionHandlerL(const TPtrC& aName, const RArray& aValues) - { - // Configure the component query filter: - - // Component name - if (aName == KTxtListOptName) - { - AssertNumValuesL(aValues, 1); - iFilter->SetNameL(aValues[0]); - } - - // Vendor - else if (aName == KTxtListOptVendor) - { - AssertNumValuesL(aValues, 1); - iFilter->SetVendorL(aValues[0]); - } - - // Software type - else if (aName == KTxtListOptType) - { - AssertNumValuesL(aValues, 1); - iFilter->SetSoftwareTypeL(aValues[0]); - } - - // SCOMO state - Activated - else if (aName == KTxtListOptActivated) - { - AssertNumValuesL(aValues, 0); - - // The activated and deactivated options are mutually exclusive - if (iScomoStateSet) - { - User::Leave(KErrArgument); - } - iScomoStateSet = ETrue; - - iFilter->SetScomoStateL(EActivated); - } - - // SCOMO state - Deactivated - else if (aName == KTxtListOptDeactivated) - { - AssertNumValuesL(aValues, 0); - - // The activated and deactivated options are mutually exclusive - if (iScomoStateSet) - { - User::Leave(KErrArgument); - } - iScomoStateSet = ETrue; - - iFilter->SetScomoStateL(EDeactivated); - } - - // Removable - else if (aName == KTxtListOptRemovable) - { - AssertNumValuesL(aValues, 0); - iFilter->SetRemovable(ETrue); - } - - // String property - else if (aName == KTxtListOptProperty) - { - const TInt numValues = aValues.Count(); - if (numValues < 2 || numValues > 3) - { - User::Leave(KErrArgument); - } - - // Convert language from string to int if specified - TInt language = KUnspecifiedLocale; - if (numValues == 3) - { - TLex lex(aValues[2]); - if (lex.Val(language) != KErrNone || language < ELangEnglish || language >= ELangMaximum) - { - User::Leave(KErrArgument); - } - } - - // Add the property to the filter - iFilter->AddPropertyL(aValues[0], aValues[1], static_cast(language)); - } - - // Integer property - else if (aName == KTxtListOptIntProperty) - { - AssertNumValuesL(aValues, 2); - TLex lex(aValues[1]); - TInt64 val; - if (lex.Val(val) != KErrNone) - { - User::Leave(KErrArgument); - } - iFilter->AddPropertyL(aValues[0], val); - } - - // Drives - else if (aName == KTxtListOptDrives) - { - AssertNumValuesL(aValues, 1); - TPtrC drives = aValues[0]; - TDriveList driveList; - driveList.FillZ(KMaxDrives); - for (TInt i=0; i(drives[i]); - TInt driveNumber = 0; - User::LeaveIfError(RFs::CharToDrive(driveLetter, driveNumber)); - driveList[driveNumber] = ETrue; - } - iFilter->SetInstalledDrivesL(driveList); - } - - // Locale - else if (aName == KTxtListOptLocale) - { - AssertNumValuesL(aValues, 1); - TLex lex(aValues[0]); - TInt val; - if (lex.Val(val) != KErrNone || val < ELangEnglish || val >= ELangNone) - { - User::Leave(KErrArgument); - } - iLocale = static_cast(val); - } - - // Unknown - else - { - User::Leave(KErrArgument); - } - } - -void CListCommand::ExecuteL(CConsoleBase& aConsole) - { - // Connect to the SCR server - RSoftwareComponentRegistry scr; - TInt err = scr.Connect(); - if (err != KErrNone) - { - aConsole.Printf(_L("\nFailed to connect to the SCR server")); - User::Leave(err); - } - CleanupClosePushL(scr); - - // Create an SCR view - RSoftwareComponentRegistryView scrView; - scrView.OpenViewL(scr, iFilter); - CleanupClosePushL(scrView); - - // Iterate over the matching components - CComponentEntry* entry = CComponentEntry::NewLC(); - TBool first(ETrue); - while (scrView.NextComponentL(*entry, iLocale)) - { - if (first) - { - first = EFalse; - } - else - { - aConsole.Printf(KTxtPressToContinue); - aConsole.Getch(); - aConsole.ClearScreen(); - } - - aConsole.Printf(_L("\n============= Component Info =============\n")); - aConsole.Printf(_L("\nComponent ID : %d"), entry->ComponentId()); - aConsole.Printf(_L("\nComponent name : %S"), &entry->Name()); - aConsole.Printf(_L("\nVendor name : %S"), &entry->Vendor()); - aConsole.Printf(_L("\nSoftware type : %S"), &entry->SoftwareType()); - aConsole.Printf(_L("\nSCOMO state : %S"), entry->ScomoState() == EActivated ? &KTxtActivated : &KTxtDeactivated ); - aConsole.Printf(_L("\nComponent size : %d"), entry->ComponentSize()); - aConsole.Printf(_L("\nInstalled drives : %S"), &entry->InstalledDrives()); - aConsole.Printf(_L("\nVersion : %S"), &entry->Version()); - aConsole.Printf(_L("\n\n=========================================\n")); - } - - // Disconnect from the SCR server and cleanup the entry - CleanupStack::PopAndDestroy(3, &scr); - } - -// ================================================================================== - -CDeleteCommand* CDeleteCommand::NewLC() - { - CDeleteCommand* self = new (ELeave) CDeleteCommand; - CleanupStack::PushL(self); - return self; - } - -CDeleteCommand::CDeleteCommand(): iComponentId(EInvalidComponentId) - { - } - -CDeleteCommand::~CDeleteCommand() - { - } - -const TDesC& CDeleteCommand::Name() - { - return KTxtDeleteCommand; - } - -void CDeleteCommand::OptionHandlerL(const TPtrC& aName, const RArray& aValues) - { - // The delete command takes only the id of a component - if (aName.Length() || aValues.Count() != 1) - { - User::Leave(KErrArgument); - } - - // Convert the id of the component from string to int - TLex lex(aValues[0]); - if (lex.Val(iComponentId) != KErrNone) - { - User::Leave(KErrArgument); - } - } - -void CDeleteCommand::ExecuteL(CConsoleBase& aConsole) - { - // Connect to the SIF server - RSoftwareInstall sif; - TInt err = sif.Connect(); - if (err != KErrNone) - { - aConsole.Printf(KTxtSifConnectionFailure); - User::Leave(err); - } - CleanupClosePushL(sif); - - // Delete the component - TRequestStatus status; - sif.Uninstall(iComponentId, status); - aConsole.Printf(KTxtDeleting); - User::WaitForRequest(status); - if (status.Int() != KErrNone) - { - User::Leave(status.Int()); - } - - // Disconnect from the SIF server - CleanupStack::PopAndDestroy(&sif); - } - -// ================================================================================== - -CCommandLineParser* CCommandLineParser::NewLC() - { - CCommandLineParser* self = new (ELeave) CCommandLineParser; - CleanupStack::PushL(self); - self->iCmdLineArgs = CCommandLineArguments::NewL(); - return self; - } - -CCommandLineParser::CCommandLineParser() - { - } - -CCommandLineParser::~CCommandLineParser() - { - delete iCmdLineArgs; - iCommands.Close(); - } - -void CCommandLineParser::RegisterCommandL(CConsoleCommand& aCommand) - { - iCommands.Append(&aCommand); - } - -CConsoleCommand& CCommandLineParser::ParseL() - { - const TInt numArgs = iCmdLineArgs->Count(); - - // There must be at least two arguments: the name of the program and the name of a command - if (numArgs <= 1) - { - User::Leave(KErrArgument); - } - - // Extract the name of the command - TPtrC arg0 = iCmdLineArgs->Arg(1); - if (arg0.Left(KTxtOptionPrefix.iTypeLength) != KTxtOptionPrefix) - { - User::Leave(KErrArgument); - } - TPtrC cmdName = arg0.Mid(KTxtOptionPrefix.iTypeLength); - - // Look for the command in iCommands - CConsoleCommand* cmd = NULL; - for (TInt i=0; iName()) - { - cmd = iCommands[i]; - } - } - if (cmd == NULL) - { - User::Leave(KErrArgument); - } - - // Iterate over the command's options and build pairs of optName and optValues - TPtrC optName; - RArray optValues; - CleanupClosePushL(optValues); - for (TInt i=2; iArg(i); - // Option name - if (arg.Left(KTxtOptionPrefix.iTypeLength) == KTxtOptionPrefix) - { - // Process the previous option - if (optName.Length()) - { - cmd->OptionHandlerL(optName, optValues); - } - - // Set new option - optName.Set(arg.Mid(KTxtOptionPrefix.iTypeLength)); - if (optName.Length() == 0) - { - User::Leave(KErrArgument); - } - optValues.Reset(); - } - else - { - // Store the option's value - optValues.AppendL(arg); - } - } - - // Process the last option - if (optName.Length() || optValues.Count()) - { - cmd->OptionHandlerL(optName, optValues); - } - - CleanupStack::PopAndDestroy(&optValues); - - // Return the current command - return *cmd; - }