hti/HtiFileHlp/src/HtiFileHlp.cpp
branchRCL_3
changeset 59 8ad140f3dd41
parent 0 a03f92240627
equal deleted inserted replaced
49:7fdc9a71d314 59:8ad140f3dd41
       
     1 /*
       
     2 * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:  HtiFileHlp implementation. This exe is used for file operations
       
    15 *                to TCB folders (requiring capability ALL).
       
    16 *
       
    17 */
       
    18 
       
    19 
       
    20 // INCLUDE FILES
       
    21 #include <e32std.h>
       
    22 #include <f32file.h>
       
    23 
       
    24 // CONSTANTS
       
    25 _LIT( KFileHlpName, "HtiFileHlp" );
       
    26 
       
    27 _LIT( KCmdCopy,   "c" );
       
    28 _LIT( KCmdDelete, "d" );
       
    29 _LIT( KCmdMkd,    "m" );
       
    30 _LIT( KCmdRmd,    "r" );
       
    31 _LIT( KCmdMove,   "mv" );
       
    32 _LIT( KCmdRename, "re" );
       
    33 _LIT( KDelimiter, "|" );
       
    34 
       
    35 // MACROS
       
    36 
       
    37 // LOCAL CONSTANTS AND MACROS
       
    38 
       
    39 // MODULE DATA STRUCTURES
       
    40 
       
    41 // LOCAL FUNCTION PROTOTYPES
       
    42 
       
    43 // FORWARD DECLARATIONS
       
    44 
       
    45 // ============================ LOCAL FUNCTIONS ===============================
       
    46 
       
    47 LOCAL_C void HandleCopyMoveRenameL( TDesC& aCmd,
       
    48 		TDesC& aFromFile, TDesC& aToFile )
       
    49     {
       
    50     RFs fs;
       
    51     User::LeaveIfError( fs.Connect() );
       
    52     CleanupClosePushL( fs );
       
    53 
       
    54     CFileMan* fileMan = CFileMan::NewL( fs );
       
    55     CleanupStack::PushL( fileMan );
       
    56 
       
    57     if ( aCmd == KCmdCopy )
       
    58     	{
       
    59     	User::LeaveIfError( fileMan->Copy( aFromFile, aToFile,
       
    60     			CFileMan::ERecurse|CFileMan::EOverWrite ) );
       
    61     	}
       
    62     else if ( aCmd == KCmdMove )
       
    63     	{
       
    64     	User::LeaveIfError( fileMan->Move( aFromFile, aToFile,
       
    65     			CFileMan::ERecurse|CFileMan::EOverWrite ) );
       
    66     	}
       
    67     else
       
    68     	{
       
    69     	User::LeaveIfError( fileMan->Rename( aFromFile, aToFile ) );
       
    70     	}
       
    71 
       
    72     CleanupStack::PopAndDestroy();  // fileman
       
    73     CleanupStack::PopAndDestroy();  // fs
       
    74     }
       
    75 
       
    76 LOCAL_C void HandleDeleteL( TDesC& aFilename )
       
    77     {
       
    78     RFs fs;
       
    79     User::LeaveIfError( fs.Connect() );
       
    80     CleanupClosePushL( fs );
       
    81 
       
    82     // check that filenames are valid
       
    83     if ( !fs.IsValidName( aFilename ) )
       
    84         {
       
    85         User::Leave( KErrBadName );
       
    86         }
       
    87 
       
    88     // delete file
       
    89     User::LeaveIfError( fs.Delete( aFilename ) );
       
    90 
       
    91     CleanupStack::PopAndDestroy();
       
    92     }
       
    93 
       
    94 LOCAL_C void HandleMkdL( TDesC& aDirName )
       
    95     {
       
    96     RFs fs;
       
    97     User::LeaveIfError( fs.Connect() );
       
    98     CleanupClosePushL( fs );
       
    99 
       
   100     User::LeaveIfError( fs.MkDirAll( aDirName ) );
       
   101 
       
   102     CleanupStack::PopAndDestroy();
       
   103     }
       
   104 
       
   105 LOCAL_C void HandleRmdL( TDesC& aDirName )
       
   106     {
       
   107     RFs fs;
       
   108     User::LeaveIfError( fs.Connect() );
       
   109     CleanupClosePushL( fs );
       
   110 
       
   111     CFileMan* fileMan = CFileMan::NewL( fs );
       
   112     CleanupStack::PushL( fileMan );
       
   113 
       
   114     User::LeaveIfError( fileMan->RmDir( aDirName ) );
       
   115 
       
   116     CleanupStack::PopAndDestroy();
       
   117     CleanupStack::PopAndDestroy();
       
   118     }
       
   119 
       
   120 LOCAL_C TInt StartL()
       
   121     {
       
   122     TInt cmdLen = User::CommandLineLength();
       
   123     if ( cmdLen < 3 )
       
   124         {
       
   125         User::Leave( KErrArgument );
       
   126         }
       
   127     HBufC* cmdLine = HBufC::NewLC( cmdLen );
       
   128     TPtr ptCmdLine = cmdLine->Des();
       
   129     User::CommandLine( ptCmdLine );
       
   130 
       
   131     TInt paramStart = 0;
       
   132     TInt paramEnd = 0;
       
   133 
       
   134     // Take first parameter (the command)
       
   135     paramEnd = cmdLine->Find( KDelimiter );
       
   136     if ( paramEnd <= paramStart )
       
   137         {
       
   138         User::Leave( KErrArgument );
       
   139         }
       
   140     TPtrC cmd = cmdLine->Mid( paramStart, paramEnd - paramStart );
       
   141 
       
   142     // Take the next parameter either until next delimiter or
       
   143     // the rest of the command line.
       
   144     paramStart = paramEnd + 1;
       
   145     paramEnd = cmdLine->Mid( paramStart ).Find( KDelimiter ) + paramStart;
       
   146     if ( paramEnd < paramStart )
       
   147         {
       
   148         // No delimiter found - this is the last parameter
       
   149         paramEnd = cmdLen;
       
   150         }
       
   151 
       
   152     TPtrC param1 = cmdLine->Mid( paramStart, paramEnd - paramStart );
       
   153 
       
   154     paramStart = paramEnd + 1;
       
   155 
       
   156     if ( cmd == KCmdCopy || cmd == KCmdMove || cmd == KCmdRename )
       
   157         {
       
   158         // Copy, Move and Rename should have also the destination parameter
       
   159         // It is assumed to be the rest of the command line from previous delim
       
   160         if ( paramStart >= cmdLen )
       
   161             {
       
   162             User::Leave( KErrArgument );
       
   163             }
       
   164         TPtrC param2 = cmdLine->Mid( paramStart );
       
   165         HandleCopyMoveRenameL( cmd, param1, param2 );
       
   166         }
       
   167     else if ( cmd == KCmdDelete )
       
   168         {
       
   169         HandleDeleteL( param1 );
       
   170         }
       
   171     else if ( cmd == KCmdMkd )
       
   172         {
       
   173         HandleMkdL( param1 );
       
   174         }
       
   175     else if ( cmd == KCmdRmd )
       
   176         {
       
   177         HandleRmdL( param1 );
       
   178         }
       
   179     else
       
   180         {
       
   181         User::Leave( KErrArgument );
       
   182         }
       
   183 
       
   184     CleanupStack::PopAndDestroy(); // cmdLine
       
   185 
       
   186     return KErrNone;
       
   187     }
       
   188 
       
   189 GLDEF_C TInt E32Main()
       
   190     {
       
   191     __UHEAP_MARK;
       
   192 
       
   193     CTrapCleanup* cleanup = CTrapCleanup::New();
       
   194     CActiveScheduler* scheduler = new ( ELeave ) CActiveScheduler;
       
   195     CActiveScheduler::Install( scheduler );
       
   196 
       
   197     User::RenameThread( KFileHlpName );
       
   198 
       
   199     TRAPD( error, StartL() );
       
   200 
       
   201     delete scheduler;
       
   202     delete cleanup;
       
   203     __UHEAP_MARKEND;
       
   204 
       
   205     //__ASSERT_ALWAYS( !error, User::Panic( KFileHlpName, error ) );
       
   206     return error;
       
   207     }
       
   208 
       
   209 
       
   210 // End of File