--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/commands/startup/startup.cpp Wed Jun 23 15:52:26 2010 +0100
@@ -0,0 +1,141 @@
+// startup.cpp
+//
+// Copyright (c) 2009 - 2010 Accenture. All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the "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:
+// Accenture - Initial contribution
+//
+
+#include <fshell/ioutils.h>
+#include <fshell/common.mmh>
+#include <dscstore.h>
+#include <dscitem.h>
+
+using namespace IoUtils;
+
+class CCmdStartup : public CCommandBase
+ {
+public:
+ static CCommandBase* NewLC();
+ ~CCmdStartup();
+private:
+ CCmdStartup();
+private: // From CCommandBase.
+ virtual const TDesC& Name() const;
+ virtual void DoRunL();
+ virtual void ArgumentsL(RCommandArgumentList& aArguments);
+ virtual void OptionsL(RCommandOptionList& aOptions);
+private:
+ enum TOp
+ {
+ EList,
+ EAdd,
+ EDelete,
+ };
+ TOp iOperation;
+ TUid iDscUid;
+ RDscStore iDsc;
+
+ TUid iItemUid;
+ HBufC* iItemFileName;
+ HBufC* iItemArgs;
+ TBool iCreate;
+ };
+
+EXE_BOILER_PLATE(CCmdStartup)
+
+CCommandBase* CCmdStartup::NewLC()
+ {
+ CCmdStartup* self = new(ELeave) CCmdStartup();
+ CleanupStack::PushL(self);
+ self->BaseConstructL();
+ return self;
+ }
+
+CCmdStartup::~CCmdStartup()
+ {
+ iDsc.Close();
+ delete iItemFileName;
+ delete iItemArgs;
+ }
+
+CCmdStartup::CCmdStartup()
+ : iDscUid(TUid::Uid(KDefaultSymbianDsc))
+ {
+ }
+
+const TDesC& CCmdStartup::Name() const
+ {
+ _LIT(KName, "startup");
+ return KName;
+ }
+
+void CCmdStartup::ArgumentsL(RCommandArgumentList& aArguments)
+ {
+ aArguments.AppendEnumL((TInt&)iOperation, _L("command"));
+ aArguments.AppendStringL(iItemFileName, _L("filename"));
+ aArguments.AppendStringL(iItemArgs, _L("arguments"));
+ }
+
+void CCmdStartup::OptionsL(RCommandOptionList& aOptions)
+ {
+ aOptions.AppendUintL((TUint&)iDscUid.iUid, _L("dsc-uid"));
+ aOptions.AppendBoolL(iCreate, _L("create"));
+ }
+
+void EnumClose(TAny* aPtr)
+ {
+ static_cast<RDscStore*>(aPtr)->EnumClose();
+ }
+
+void CCmdStartup::DoRunL()
+ {
+ TRAPL(iDsc.OpenL(), _L("Couldn't open RDscStore"));
+
+ if (iCreate && !iDsc.DscExistsL(iDscUid))
+ {
+ TRAPL(iDsc.CreateDscL(iDscUid, _L("[DSC created by fshell_startup.exe]")), _L("Couldn't create DSC 0x%08x"), iDscUid.iUid);
+ }
+
+ if (iOperation == EList)
+ {
+ TRAPL(iDsc.EnumOpenLC(iDscUid); CleanupStack::Pop(), _L("Couldn't list DSC 0x%x"), iDscUid.iUid);
+ CleanupStack::PushL(TCleanupItem(&EnumClose, &iDsc)); // Can't use the EnumOpenLC's cleanupitem because we have to pop it, because we need it inside its own TRAP harness to get good error messages out
+ for (;;)
+ {
+ CDscItem* item = iDsc.EnumReadNextL();
+ if (!item) break;
+ TPtrC args = item->Args();
+ TPtrC fn = item->FileName();
+ Printf(_L("DscId=0x%08x ItemId=0x%08x FileName=%S Args=%S\r\n"), item->DscId(), item->ItemId(), &fn, &args);
+ delete item;
+ }
+ CleanupStack::PopAndDestroy(); // close enum
+ }
+ else if (iOperation == EAdd)
+ {
+ if (iItemFileName == NULL) LeaveIfErr(KErrArgument, _L("Must specify a file name for the 'add' operation"));
+ CDscItem* item = CDscItem::NewLC(*iItemFileName, iItemArgs ? *iItemArgs : KNullDesC());
+ item->SetStartMethodL(EFireAndForget);
+ item->SetStartupTypeL(EStartProcess);
+ item->SetDscId(iDscUid);
+ TRAPL(iDsc.AddItemL(*item), _L("Couldn't add DSC item (try using --create option?)"));
+ CleanupStack::PopAndDestroy(item);
+ }
+ else if (iOperation == EDelete)
+ {
+ if (iItemFileName == NULL) LeaveIfErr(KErrArgument, _L("Must specify a file name for the 'delete' operation"));
+ CDscItem* item = CDscItem::NewLC(*iItemFileName, iItemArgs ? *iItemArgs : KNullDesC());
+ item->SetDscId(iDscUid);
+ TRAPL(iDsc.DeleteItemL(*item), _L("Couldn't delete DSC item"));
+ CleanupStack::PopAndDestroy(item);
+ }
+ else
+ {
+ LeaveIfErr(KErrArgument, _L("Unrecognised operation %d"), iOperation);
+ }
+ }