Revision: 201033
authorDremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 02 Sep 2010 20:16:57 +0300
changeset 41 fc4654ce4fcb
parent 35 060d0b1ab845
child 44 22e202702210
Revision: 201033 Kit: 201035
filemanager/src/filemanager/filemanager.pri
filemanager/src/filemanager/filemanager.pro
filemanager/src/filemanager/filemanager.qrc
filemanager/src/filemanager/resources/hblistviewitem.css
filemanager/src/filemanager/resources/hblistviewitem.widgetml
filemanager/src/filemanager/src/backuprestore/fmbackuprestorehandler.cpp
filemanager/src/filemanager/src/backuprestore/fmbackupwidget.cpp
filemanager/src/filemanager/src/components/fmsingletextquery.h
filemanager/src/filemanager/src/components/fmtimequery.cpp
filemanager/src/filemanager/src/components/fmtimequery.h
filemanager/src/filemanager/src/components/fmviewdetailsdialog.cpp
filemanager/src/filemanager/src/fmdriverlistwidget.cpp
filemanager/src/filemanager/src/fmdriverlistwidget.h
filemanager/src/filemanager/src/fmfindthread.cpp
filemanager/src/filemanager/src/fmmainwindow.cpp
filemanager/src/filemanager/src/fmviewmanager.cpp
filemanager/src/filemanager/src/fmviewmanager.h
filemanager/src/filemanager/src/listviewitems.cpp
filemanager/src/filemanager/src/listviewitems.h
filemanager/src/filemanager/src/main.cpp
filemanager/src/filemanager/src/operationservice/fmoperationbase.cpp
filemanager/src/filemanager/src/operationservice/fmoperationbase.h
filemanager/src/filemanager/src/operationservice/fmoperationcopyormove.cpp
filemanager/src/filemanager/src/operationservice/fmoperationcopyormove.h
filemanager/src/filemanager/src/operationservice/fmoperationformat_win.cpp
filemanager/src/filemanager/src/operationservice/fmoperationresultprocesser.cpp
filemanager/src/filemanager/src/operationservice/fmoperationservice.cpp
filemanager/src/fmfiledialog/fmfiledialog.pro
filemanager/src/fmfiledialog/src/fmfilewidget.cpp
filemanager/src/inc/commonutils.pri
filemanager/src/inc/fmcommon.h
filemanager/src/inc/fmdefine.h
filemanager/src/inc/fmdrivemodel.cpp
filemanager/src/inc/fmdrivemodel.h
filemanager/src/inc/fmdrivewatcher/private/symbian/fmdriveevent.cpp
filemanager/src/inc/fmfileiconprovider.cpp
filemanager/src/inc/fmfiletyperecognizer.h
filemanager/src/inc/fmutils.cpp
filemanager/src/inc/fmutils.h
filemanager/src/inc/fmutils_s60.cpp
filemanager/src/inc/fmutils_win.cpp
--- a/filemanager/src/filemanager/filemanager.pri	Wed Aug 18 09:39:39 2010 +0300
+++ b/filemanager/src/filemanager/filemanager.pri	Thu Sep 02 20:16:57 2010 +0300
@@ -19,8 +19,7 @@
 INCLUDEPATH += ./src/backuprestore
 INCLUDEPATH += ./src/operationservice
 
-HEADERS += src/fmdriverlistwidget.h \
-           src/listviewitems.h \
+HEADERS += src/fmdriverlistwidget.h \           
            src/fmfileview.h \
            src/fmfilebrowsewidget.h \
            src/fmdriverview.h \
@@ -62,8 +61,7 @@
            src/components/fmdrivequery.h
 
 SOURCES += src/main.cpp \
-           src/fmdriverlistwidget.cpp \
-           src/listviewitems.cpp \
+           src/fmdriverlistwidget.cpp \           
            src/fmfileview.cpp \
            src/fmfilebrowsewidget.cpp \
            src/fmdriverview.cpp \
--- a/filemanager/src/filemanager/filemanager.pro	Wed Aug 18 09:39:39 2010 +0300
+++ b/filemanager/src/filemanager/filemanager.pro	Thu Sep 02 20:16:57 2010 +0300
@@ -41,8 +41,8 @@
             -lshareui \
             -lefsrv \
             -lapgrfx \
-	    -lcone \
-            -ldirectorylocalizer
+    	    -lcone \
+            -lsysutil
 
     TARGET.UID3 = 0x2002BCC0
     TARGET.EPOCHEAPSIZE = 0x020000 0x1000000
--- a/filemanager/src/filemanager/filemanager.qrc	Wed Aug 18 09:39:39 2010 +0300
+++ b/filemanager/src/filemanager/filemanager.qrc	Thu Sep 02 20:16:57 2010 +0300
@@ -6,6 +6,8 @@
         <file>image/qgn_prop_fmgr_mmc_no_sub.svg</file>
         <file>image/qgn_prop_phone_memc.svg</file>
         <file>image/qgn_prop_usb_memc.svg</file>
-        <file>image/qgn_prop_fmgr_ms.svg</file>
+        <file>image/qgn_prop_fmgr_ms.svg</file>        
+        <file>resources/hblistviewitem.css</file>        
+        <file>resources/hblistviewitem.widgetml</file>
     </qresource>    
 </RCC>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/filemanager/src/filemanager/resources/hblistviewitem.css	Thu Sep 02 20:16:57 2010 +0300
@@ -0,0 +1,57 @@
+	
+HbListViewItem[layoutName="drive"]:portrait{
+    layout: drive-portrait;
+}
+
+
+HbListViewItem[layoutName="drive"]:landscape{
+    layout: drive-landscape;
+}
+
+HbListViewItem::text-1[layoutName="drive"]:portrait{
+ 	top: -var(hb-param-margin-gene-middle-vertical);
+	font-variant: primary;
+	text-align: left;
+}
+
+HbListViewItem::text-2[layoutName="drive"]:portrait{
+	font-variant: secondary;
+	text-align: left;
+}
+HbListViewItem::text-3[layoutName="drive"]:portrait{
+ 	bottom: var(hb-param-margin-gene-middle-vertical);
+	font-variant: secondary-small;
+	text-align: left;
+}
+HbListViewItem::icon-1[layoutName="drive"]:portrait{
+ 	top: -var(hb-param-margin-gene-top);
+    left: -var(hb-param-margin-gene-middle-horizontal);
+
+	fixed-height: var(hb-param-graphic-size-primary-large);
+	fixed-width: var(hb-param-graphic-size-primary-large);
+}
+
+HbListViewItem::text-1[layoutName="drive"]:landscape{
+ 	top: -var(hb-param-margin-gene-top);
+	font-variant: primary;
+	text-align: left;
+}
+
+HbListViewItem::text-2[layoutName="drive"]:landscape {
+	top: -var(hb-param-margin-gene-top);
+	font-variant: secondary;
+	text-align: left;
+}
+HbListViewItem::text-3[layoutName="drive"]:landscape{
+ 	bottom: var(hb-param-margin-gene-top);
+	font-variant: secondary-small;
+	text-align: left;
+}
+HbListViewItem::icon-1[layoutName="drive"]:landscape{
+    top: -var(hb-param-margin-gene-top);
+    left: -var(hb-param-margin-gene-middle-horizontal);
+    bottom: var(hb-param-margin-gene-bottom);
+    fixed-height: var(hb-param-graphic-size-primary-large);
+    fixed-width: var(hb-param-graphic-size-primary-large);
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/filemanager/src/filemanager/resources/hblistviewitem.widgetml	Thu Sep 02 20:16:57 2010 +0300
@@ -0,0 +1,46 @@
+<hbwidget version="0.1" type="HbListViewItem">
+    <layout name="drive-portrait" type="mesh">
+
+ 	  <meshitem src="icon-1" srcEdge="LEFT" dst="" dstEdge="LEFT" />
+      <meshitem src="icon-1" srcEdge="TOP" dst="" dstEdge="TOP" />      
+      
+      
+      <meshitem src="text-1" srcEdge="LEFT" dst="icon-1" dstEdge="RIGHT" />
+      <meshitem src="text-1" srcEdge="TOP" dst="" dstEdge="TOP" />
+      <meshitem src="text-1" srcEdge="RIGHT" dst="" dstEdge="RIGHT" />
+      
+	  
+	  <meshitem src="text-2" srcEdge="LEFT" dst="text-1" dstEdge="LEFT" />
+	  <meshitem src="text-2" srcEdge="TOP" dst="text-1" dstEdge="BOTTOM" />
+	  <meshitem src="text-2" srcEdge="RIGHT" dst="" dstEdge="RIGHT" />
+	  
+
+ 	  <meshitem src="text-3" srcEdge="LEFT" dst="text-1" dstEdge="LEFT" />
+ 	  <meshitem src="text-3" srcEdge="TOP" dst="text-2" dstEdge="BOTTOM" /> 	  
+      <meshitem src="text-3" srcEdge="RIGHT" dst="" dstEdge="RIGHT" />
+      <meshitem src="text-3" srcEdge="BOTTOM" dst="" dstEdge="BOTTOM" />
+      
+	  
+  </layout>
+  <layout name="drive-landscape" type="mesh">
+
+    <meshitem src="icon-1" srcEdge="LEFT" dst="" dstEdge="LEFT" />
+    <meshitem src="icon-1" srcEdge="TOP" dst="" dstEdge="TOP" />
+    
+
+    <meshitem src="text-1" srcEdge="LEFT" dst="icon-1" dstEdge="RIGHT" spacing ="-3un"/>
+    <meshitem src="text-1" srcEdge="TOP" dst="" dstEdge="TOP" />    
+
+
+    <meshitem src="text-2" srcEdge="LEFT" dst="text-1" dstEdge="RIGHT" spacing ="-4un"/>
+    <meshitem src="text-2" srcEdge="TOP" dst="" dstEdge="TOP" />
+    <meshitem src="text-2" srcEdge="RIGHT" dst="" dstEdge="RIGHT" spacing ="20un"/>
+
+
+    <meshitem src="text-3" srcEdge="LEFT" dst="text-2" dstEdge="LEFT" />
+    <meshitem src="text-3" srcEdge="TOP" dst="text-2" dstEdge="BOTTOM" />
+    <meshitem src="text-3" srcEdge="RIGHT" dst="" dstEdge="RIGHT" spacing ="20un"/>
+    <meshitem src="text-3" srcEdge="BOTTOM" dst="" dstEdge="BOTTOM" />
+
+  </layout>
+</hbwidget>
\ No newline at end of file
--- a/filemanager/src/filemanager/src/backuprestore/fmbackuprestorehandler.cpp	Wed Aug 18 09:39:39 2010 +0300
+++ b/filemanager/src/filemanager/src/backuprestore/fmbackuprestorehandler.cpp	Thu Sep 02 20:16:57 2010 +0300
@@ -72,8 +72,8 @@
     mCurrentProcess = ProcessBackup;
     bool ret = mBkupEngine->startBackup( backupConfigLoader()->driversAndOperationList(),
         backupConfigLoader()->backupCategoryList(), 
-        mBkupEngine->BackupSettingsL()->availableTargetDrive(),
-        mBkupEngine->BackupSettingsL()->content() );
+        operationBackup->targetDrive(), // targetDrive is stored in FmOperationBackup
+        operationBackup->content() );   // content     is stored in FmOperationBackup
 
     if( !ret ) {
         mCurrentProcess = ProcessNone;
--- a/filemanager/src/filemanager/src/backuprestore/fmbackupwidget.cpp	Wed Aug 18 09:39:39 2010 +0300
+++ b/filemanager/src/filemanager/src/backuprestore/fmbackupwidget.cpp	Thu Sep 02 20:16:57 2010 +0300
@@ -131,10 +131,12 @@
     mContentsItem = mModel->appendDataFormItem(
         HbDataFormModelItem::TextItem, QString( "" ), mContentsGroup );
     mContentsItem->setContentWidgetData( QString("readOnly"), QString("true") );
+    mContentsItem->setContentWidgetData( QString("objectName"), QString("backupContentItem") );
 
     mTargetItem = mModel->appendDataFormItem(
         HbDataFormModelItem::TextItem, QString( "" ), mContentsGroup );
     mTargetItem->setContentWidgetData( QString("readOnly"), QString("true") );
+    mTargetItem->setContentWidgetData( QString("objectName"), QString("backupTargetItem") );
 
     mSchedulingGroup = mModel->appendDataFormGroup(
         QString( hbTrId( "Scheduling" ) ), mModel->invisibleRootItem());
@@ -142,19 +144,22 @@
     mSchedulingItem = mModel->appendDataFormItem(
         HbDataFormModelItem::TextItem, QString( "" ), mSchedulingGroup );
     mSchedulingItem->setContentWidgetData( QString("readOnly"), QString("true") );
+    mSchedulingItem->setContentWidgetData( QString("objectName"), QString("backupSchedulingItem") );
 
     mWeekdayItem = mModel->appendDataFormItem(
         HbDataFormModelItem::TextItem, QString( "" ), mSchedulingGroup );
     mWeekdayItem->setContentWidgetData( QString("readOnly"), QString("true") );
+    mWeekdayItem->setContentWidgetData( QString("objectName"), QString("backupWeekdayItem") );
 
     mTimeItem = mModel->appendDataFormItem(
         HbDataFormModelItem::TextItem, QString( "" ), mSchedulingGroup );
     mTimeItem->setContentWidgetData( QString("readOnly"), QString("true") );
+    mTimeItem->setContentWidgetData( QString("objectName"), QString("backupTimeItem") );
     
     mLastBackupDateItem = mModel->appendDataFormItem(
         HbDataFormModelItem::TextItem, QString( ( "" )), mModel->invisibleRootItem() );
     mLastBackupDateItem->setContentWidgetData( QString("readOnly"), QString("true") );   
-    
+    mLastBackupDateItem->setContentWidgetData( QString("objectName"), QString("backupLastBackupDateItem") );
 }
 
 
--- a/filemanager/src/filemanager/src/components/fmsingletextquery.h	Wed Aug 18 09:39:39 2010 +0300
+++ b/filemanager/src/filemanager/src/components/fmsingletextquery.h	Thu Sep 02 20:16:57 2010 +0300
@@ -29,7 +29,7 @@
 Q_OBJECT
 public:
     
-    FmSingleTextQuery( HbLineEdit::EchoMode echoMode = HbLineEdit::Normal, QGraphicsItem *parent = 0 );
+    explicit FmSingleTextQuery( HbLineEdit::EchoMode echoMode = HbLineEdit::Normal, QGraphicsItem *parent = 0 );
     ~FmSingleTextQuery();
 
 public:
@@ -49,7 +49,7 @@
     HbLineEdit  *mTextEdit;
     HbLineEdit::EchoMode mEchoMode;
 
-    // used to check if input text is vaild. Disable primary action when text is not vaild
+    // used to check if input text is valid. Disable primary action when text is not valid
     QStringList mRegExpStringList;
 };
 
--- a/filemanager/src/filemanager/src/components/fmtimequery.cpp	Wed Aug 18 09:39:39 2010 +0300
+++ b/filemanager/src/filemanager/src/components/fmtimequery.cpp	Thu Sep 02 20:16:57 2010 +0300
@@ -21,7 +21,7 @@
 #include <QGraphicsItem>
 #include <QGraphicsLinearLayout>
 
-#include <hbdatetimeedit.h>
+#include <hbdatetimepicker.h>
 
 
 FmTimeQuery::FmTimeQuery( QGraphicsItem *parent ) : FmDialog( parent )
@@ -33,7 +33,7 @@
 	QGraphicsLinearLayout *vLayout = new QGraphicsLinearLayout();
     vLayout->setOrientation( Qt::Vertical );
 
-    mTimeWidget = new HbDateTimeEdit();
+    mTimeWidget = new HbDateTimePicker();
     mTimeWidget->setObjectName( "timeQueryTimeWidget" );
 	vLayout->addItem( mTimeWidget );
 
--- a/filemanager/src/filemanager/src/components/fmtimequery.h	Wed Aug 18 09:39:39 2010 +0300
+++ b/filemanager/src/filemanager/src/components/fmtimequery.h	Thu Sep 02 20:16:57 2010 +0300
@@ -25,7 +25,7 @@
 #include <QTime>
 
 class QGraphicsWidget;
-class HbDateTimeEdit;
+class HbDateTimePicker;
 class FmTimeQuery : public FmDialog
 {
 public:
@@ -46,7 +46,7 @@
 
 private:
     QGraphicsWidget *mContentWidget;
-    HbDateTimeEdit  *mTimeWidget;
+    HbDateTimePicker *mTimeWidget;
 
 };
 
--- a/filemanager/src/filemanager/src/components/fmviewdetailsdialog.cpp	Wed Aug 18 09:39:39 2010 +0300
+++ b/filemanager/src/filemanager/src/components/fmviewdetailsdialog.cpp	Thu Sep 02 20:16:57 2010 +0300
@@ -26,7 +26,6 @@
 #include <QDateTime>
 #include <QStandardItemModel>
 #include <QStringList>
-#include <QFileInfo>
 
 #include <hblabel.h>
 #include <hblistview.h>
--- a/filemanager/src/filemanager/src/fmdriverlistwidget.cpp	Wed Aug 18 09:39:39 2010 +0300
+++ b/filemanager/src/filemanager/src/fmdriverlistwidget.cpp	Thu Sep 02 20:16:57 2010 +0300
@@ -16,7 +16,6 @@
  *     The driver model file for file manager
  */
 #include "fmdriverlistwidget.h"
-#include "listviewitems.h"
 #include "fmutils.h"
 #include "fmdlgutils.h"
 #include "fmviewmanager.h"
@@ -24,7 +23,8 @@
 #include "fmoperationbase.h"
 #include "fmdrivemodel.h"
 #include "fmfiledialog.h"
-
+#include "fmoperationservice.h"
+#include <hbabstractviewitem.h>
 #include <QDir>
 #include <QGraphicsLinearLayout>
 #include <QFileSystemWatcher>
@@ -36,12 +36,10 @@
 
 FmDriverListWidget::FmDriverListWidget( QGraphicsItem *parent )
 : HbWidget( parent ), mListView(0), mModel(0),
-  mCurrentItem(0), mSearchPanel(0),  mOperationService(0),
+  mCurrentItem(0), mSearchPanel(0),
   mFileSystemWatcher(0), mLayout(0), mContextMenu(0), mListLongPressed( false )
 {
-	init();
-	mOperationService = FmViewManager::viewManager()->operationService();
-
+	init();	
     mFileSystemWatcher = new QFileSystemWatcher( this );
     connect( mFileSystemWatcher, SIGNAL( directoryChanged ( const QString & ) ), 
             this, SLOT( on_directoryChanged( const QString & ) ) ); 
@@ -72,23 +70,18 @@
 	mLayout = new QGraphicsLinearLayout( this );
 	mLayout->setOrientation( Qt::Vertical );
 
-	mListView = new HbListView( this );
-	mListView->setSelectionMode( HbAbstractItemView::SingleSelection );
-
+	mListView = new HbListView( this );	
+	mListView->setLayoutName( "drive" );
 	mModel = new FmDriveModel( this,
-         FmDriveModel::FillWithVolume | FmDriveModel::FillWithDefaultVolume );
+         FmDriveModel::FillWithVolume | FmDriveModel::FillWithDefaultVolume |
+         FmDriveModel::FillWithTotalSize | FmDriveModel::FillWithFreeSize );
 	mListView->setModel( mModel );
-
-	mLayout->addItem( mListView );
-	
+	mLayout->addItem( mListView );	
 	mSearchPanel = new HbSearchPanel( this );
 	mSearchPanel->setObjectName( "searchPanel" );
 	mSearchPanel->setSearchOptionsEnabled( true );
 	mSearchPanel->setProgressive( false );
 	mSearchPanel->hide();
-//	mLayout->addItem( mSearchPanel );
-    
-	mListView->setItemPrototype( new DiskListViewItem(this) );
 	connect( mListView, SIGNAL( activated( const QModelIndex & ) ),
 		     this, SLOT( on_list_activated( const QModelIndex & ) ) );
 	connect( mListView, SIGNAL( pressed( const QModelIndex & ) ),
@@ -188,19 +181,20 @@
                          this, SLOT( on_setPwdAction_triggered() ), Qt::QueuedConnection );
                     }
                 }
-                
-                // Eject action
-                if( state & FmDriverInfo::EDriveEjectable ){
-                    HbAction *ejectAction = new HbAction();
-                    ejectAction->setObjectName( "ejectAction" );
-                    ejectAction->setText( hbTrId( "txt_fmgr_menu_eject" ) );
-                    mContextMenu->addAction( ejectAction );
-                    
-                    connect( ejectAction, SIGNAL( triggered() ),
-                    this, SLOT( on_ejectAction_triggered() ), Qt::QueuedConnection );
-                }  
-            }
-        }
+            } //if( driveType == FmDriverInfo::EDriveTypeMemoryCard || driveType == FmDriverInfo::EDriveTypeUsbMemory )
+        } //if( state & FmDriverInfo::EDriveAvailable )
+        
+        // Eject action
+        // put outside of EDriveAvailable so that removable drive which is corrupted or locked can be removed
+        if( state & FmDriverInfo::EDriveEjectable ){
+            HbAction *ejectAction = new HbAction();
+            ejectAction->setObjectName( "ejectAction" );
+            ejectAction->setText( hbTrId( "txt_fmgr_menu_eject" ) );
+            mContextMenu->addAction( ejectAction );
+            
+            connect( ejectAction, SIGNAL( triggered() ),
+            this, SLOT( on_ejectAction_triggered() ), Qt::QueuedConnection );
+        } 
         
         // Format action
         if ( ( state & FmDriverInfo::EDriveRemovable ) || ( state & FmDriverInfo::EDriveCorrupted )
@@ -213,10 +207,10 @@
                 connect( formatAction, SIGNAL( triggered() ),
                     this, SLOT( on_formatAction_triggered() ), Qt::QueuedConnection );
         }
-    }
+    } //if( !( state & FmDriverInfo::EDriveNotPresent ) )
     
     // Unlock action
-    // put ouside of !EDriveNotPresent judgement so that
+    // put ouside of !EDriveNotPresent judgment so that
     // user could unlock drive if connected to PC with mass storage mode
     if( state & FmDriverInfo::EDriveLocked ){
         HbAction *unLockedAction = new HbAction();
@@ -239,13 +233,14 @@
 
 void FmDriverListWidget::on_list_pressed( const QModelIndex &  index )
 {
+    Q_UNUSED( index );
     mListLongPressed = false;
 }
 
 void FmDriverListWidget::on_viewAction_triggered()
 {
-    QString diskName = mModel->driveName( mCurrentItem->modelIndex() );
-    mOperationService->asyncViewDriveDetails( diskName );
+    QString diskName = mModel->driveName( mCurrentItem->modelIndex() );    
+    FmViewManager::viewManager()->operationService()->asyncViewDriveDetails( diskName );
 }
 
 void FmDriverListWidget::on_renameAction_triggered()
@@ -408,7 +403,7 @@
     QString diskName = mModel->driveName( mCurrentItem->modelIndex() );
     
     if( FmDlgUtils::question( hbTrId( "Format? Data will be deleted during formatting." ) ) ){
-        if( FmErrNone != mOperationService->asyncFormat( diskName ) )
+        if( FmErrNone != FmViewManager::viewManager()->operationService()->asyncFormat( diskName ) )
             FmDlgUtils::information( hbTrId( "Formatting failed." ) );
         }
 }
--- a/filemanager/src/filemanager/src/fmdriverlistwidget.h	Wed Aug 18 09:39:39 2010 +0300
+++ b/filemanager/src/filemanager/src/fmdriverlistwidget.h	Thu Sep 02 20:16:57 2010 +0300
@@ -20,7 +20,6 @@
 #define FMDRIVERLISTWIDGET_H
 
 #include "fmcommon.h"
-#include "fmoperationservice.h"
 #include <hbwidget.h>
 
 class FmDriveModel;
@@ -76,7 +75,6 @@
     HbAbstractViewItem* mCurrentItem;
     HbSearchPanel* mSearchPanel;
     
-    FmOperationService *mOperationService;
     QFileSystemWatcher *mFileSystemWatcher;
     
     QString mFindTargetPath;
--- a/filemanager/src/filemanager/src/fmfindthread.cpp	Wed Aug 18 09:39:39 2010 +0300
+++ b/filemanager/src/filemanager/src/fmfindthread.cpp	Thu Sep 02 20:16:57 2010 +0300
@@ -27,10 +27,10 @@
 #define ParentDir QString( ".." )
 
 // if got 5 result and have not send notify event, then send notify event
-#define notifyPerCount 5
+const int notifyPerCount = 5;
 
 // if got notifyPerElapsedTime milliseconds and have not send notify event, then send notify event.
-#define notifyPerElapsedTime 500
+const int notifyPerElapsedTime = 500;
 
 /*!
     \fn void found( const QStringList &dataList )
--- a/filemanager/src/filemanager/src/fmmainwindow.cpp	Wed Aug 18 09:39:39 2010 +0300
+++ b/filemanager/src/filemanager/src/fmmainwindow.cpp	Thu Sep 02 20:16:57 2010 +0300
@@ -23,11 +23,14 @@
 
 FmMainWindow::FmMainWindow() : mViewManager( 0 ), mFirstViewLoaded( false )
 {
-    connect(this, SIGNAL(viewReady()), this, SLOT(delayedLoading()));
+   // connect(this, SIGNAL(viewReady()), this, SLOT(delayedLoading()));
+    init();
 }
 
 FmMainWindow::~FmMainWindow()
 {
+   //save file manager activity to activity manager.
+    mViewManager->saveActivity();   
     FmViewManager::RemoveViewManager();
 }
 
@@ -48,6 +51,8 @@
     FM_LOG("FmMainWindow::init start");
     mViewManager = FmViewManager::CreateViewManager( this );
     mViewManager->createDriverView();
+    connect(this, SIGNAL(aboutToChangeView(HbView *, HbView *)), 
+            mViewManager, SLOT(onAboutToChangeView(HbView *, HbView *)));
     connect( this, SIGNAL( orientationChanged( Qt::Orientation ) ),
              this, SLOT( onOrientationChanged( Qt::Orientation ) ) );
     
--- a/filemanager/src/filemanager/src/fmviewmanager.cpp	Wed Aug 18 09:39:39 2010 +0300
+++ b/filemanager/src/filemanager/src/fmviewmanager.cpp	Thu Sep 02 20:16:57 2010 +0300
@@ -32,9 +32,12 @@
 #include "fmdlgutils.h"
 
 #include <hbview.h>
+#include <hbmainwindow.h>
+#include <hbapplication.h>
+#include <hbactivitymanager.h>
 #include <QFileSystemWatcher>
 #include <QFileInfo>
-
+#include <QPixmap>
 
 FmViewManager *FmViewManager::mViewManager = 0;
 
@@ -70,12 +73,9 @@
 	return mDialog;
 }
 
-FmViewManager::FmViewManager( FmMainWindow* mainWindow )
+FmViewManager::FmViewManager( FmMainWindow* mainWindow ) : mOperationService( 0 )
 {
     mMainWindow = mainWindow;
-    mOperationService = new FmOperationService( this );
-    mOperationService->setObjectName( "operationService" );
-
     mDriveWatcher = new FmDriveWatcher( this );
     mDriveWatcher->setObjectName( "driveWatcher" );
     mDriveWatcher->startWatch();
@@ -85,7 +85,6 @@
 
 FmViewManager::~FmViewManager(void)
 {
-    
     FmViewBase *view = static_cast<FmViewBase *>( mMainWindow->currentView() );
     while( view ) {
         mMainWindow->removeView( view );
@@ -123,6 +122,10 @@
 
 FmOperationService *FmViewManager::operationService()
 {
+    if ( !mOperationService ) {
+        mOperationService = new FmOperationService( this );
+        mOperationService->setObjectName( "operationService" );
+    }    
     return mOperationService;
 }
 
@@ -130,7 +133,10 @@
 {
     FmViewBase *view = static_cast<FmViewBase *>( mMainWindow->currentView() );
     view->setNavigationAction( 0 );
-
+    // grap the screen when only the drive view is in view stack.
+    if( viewCount() == 1 ) {
+        mScreenShot = QPixmap::grabWidget(mMainWindow, mMainWindow->rect());
+    }
     mMainWindow->removeView( view );   
     delete view;
 
@@ -175,11 +181,17 @@
 
     mMainWindow->addView( driverView );
     mMainWindow->setCurrentView( driverView );
+    HbActivityManager* activityManager = qobject_cast<HbApplication*>(qApp)->activityManager();        
+    bool ok = activityManager->removeActivity("FMMemoryStoragesList");
 
     connect( this, SIGNAL( driveSpaceChanged() ), 
         driverView, SLOT( refreshDrive() ) );
+    // Refresh drive view when gaining foreground
+    // ( switch back to filemanager from home screen or any other applications )
+    connect( mMainWindow, SIGNAL( revealed() ), 
+        driverView, SLOT( refreshDrive() ) );
     
-    // use Qt::QueuedConnection becuase synchronous refresh is not work well while
+    // use Qt::QueuedConnection because synchronous refresh is not work well while
     // connected with another OTG device which have more than one external drive in it.
     // File server only give driveChanged event once, but two drive is inserted.
     // Synchronous refresh will miss another drive.
@@ -302,3 +314,32 @@
 		}
 	}
 }
+
+void FmViewManager::saveActivity()
+{    
+    //grap the screen when current view is drive view.
+    FmDriverView *driveView = qobject_cast<FmDriverView *>(mMainWindow->currentView());
+    if ( ( driveView != 0 ) && ( driveView->viewType() == FmViewBase::EDriverView ) ) {
+        mScreenShot = QPixmap::grabWidget(mMainWindow, mMainWindow->rect());
+    }
+    QVariantHash metadata;
+    metadata.insert("screenshot", mScreenShot);
+    HbActivityManager* activityManager = qobject_cast<HbApplication*>(qApp)->activityManager();     
+    // add the activity to the activity manager
+    bool ok = activityManager->addActivity("FMMemoryStoragesList", QVariant(), metadata);
+    if ( !ok )
+    {
+    qFatal("Add failed" );
+    }
+
+}
+
+void FmViewManager::onAboutToChangeView(HbView * oldView, HbView *newView)
+{
+    Q_UNUSED(newView);
+    //grap the screen when oldView is drive view.
+    FmDriverView *driveView = qobject_cast<FmDriverView *>(oldView);
+    if ( ( driveView != 0 ) && ( driveView->viewType() == FmViewBase::EDriverView ) ) {        
+        mScreenShot = QPixmap::grabWidget(mMainWindow, mMainWindow->rect());
+    }
+}
--- a/filemanager/src/filemanager/src/fmviewmanager.h	Wed Aug 18 09:39:39 2010 +0300
+++ b/filemanager/src/filemanager/src/fmviewmanager.h	Thu Sep 02 20:16:57 2010 +0300
@@ -22,6 +22,7 @@
 #include <QObject>
 #include <QList>
 #include "fmcommon.h"
+#include <QPixmap>
 
 class FmMainWindow;
 class HbView;
@@ -34,7 +35,7 @@
 
 /*
  * this class is used to record relationship between dialog and drive name 
- * FmViewManager will auto-close dialog which releated drive is not available again.
+ * FmViewManager will auto-close dialog which related drive is not available again.
  * for example. set name to MMC will pop a dialog, if add the dialog to FmViewManager::addDlgCloseUnit 
  * then after eject MMC, the dialog will be auto-closed by FmViewManager::checkDlgCloseUnit()
  */
@@ -75,8 +76,8 @@
 	void createBackupView();
 	void createRestoreView();
     void createDeleteBackupView();
-
-	// add a close unit. this is used to auto-close dialog which releated drive is not available again.
+    void saveActivity();    
+	// add a close unit. this is used to auto-close dialog which related drive is not available again.
 	void addDlgCloseUnit( FmDlgCloseUnit* unit )
 	{
 		FM_LOG( "FmViewManager::addDlgCloseUnit_" + unit->associatedDrives() );
@@ -110,6 +111,8 @@
     // so this is the central controller function
     void on_operationService_notifyFinish( FmOperationBase *operationBase );
     
+    void onAboutToChangeView(HbView * oldView, HbView *newView);
+    
 signals:
     // emit when drive space is changed by some operation inside filemanager.
     void driveSpaceChanged();
@@ -124,7 +127,7 @@
     // when drive is ejected, this function will be called and exam dialogs in mDlgCloseUnitList
     // it will colse dialogs if related drive is not available
 	void checkDlgCloseUnit();
-    
+	    
 private:
      static FmViewManager *mViewManager;
 
@@ -141,6 +144,8 @@
     // used to record some dialogs that related to drive
     // the dialog should be closed in checkDlgCloseUnit if drive is not available 
 	QList<FmDlgCloseUnit*> mDlgCloseUnitList;
+	
+	QPixmap mScreenShot;
 };
 
 
--- a/filemanager/src/filemanager/src/listviewitems.cpp	Wed Aug 18 09:39:39 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,143 +0,0 @@
-/*
-* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of "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:
-*     Zhiqiang Yang <zhiqiang.yang@nokia.com>
-*     Steven Yao <steven.yao@nokia.com>
-* 
-* Description:
-*     The source file of the disk list view item
-*
-*/
-#include "listviewitems.h"
-#include "fmutils.h"
-
-#include <QGraphicsLinearLayout>
-
-#include <hblabel.h>
-#include <hbcheckbox.h>
-#include <hbpushbutton.h>
-#include <hbabstractitemview.h>
-
-DiskListViewItem::DiskListViewItem( QGraphicsItem *parent )
-    : HbListViewItem( parent ),
-      mIconLabel( 0 ),
-      mDiskNameLabel( 0 ),
-      mFirstLabel( 0 ),
-      mSecondLabel( 0 ),
-      mCheckBox( 0 ),
-      hLayout( 0 )
-
-{
-    //init();
-}
-
-DiskListViewItem::~DiskListViewItem()
-{
-}
-
-void DiskListViewItem::polish(HbStyleParameters& params)
-{
-    Q_UNUSED(params);
-}
-
-bool DiskListViewItem::canSetModelIndex( const QModelIndex &index ) const
-{
-    Q_UNUSED( index );
-	return true;
-}
-
-
-HbAbstractViewItem *DiskListViewItem::createItem()
-{
-	return new DiskListViewItem( *this );
-}
-
-void DiskListViewItem::updateChildItems()
-{
-    //HbListViewItem::updateChildItems();
-    if( !hLayout ) {
-        init();
-    }
-	QVariant variant = modelIndex().data( Qt::DecorationRole );
-	QIcon icon = qvariant_cast<QIcon>( variant );
-    // FmFileIconProvider in FmDriveModel already handle null icon issue
-    QString displayString = modelIndex().data( Qt::DisplayRole ).toString();
-	QString diskName = modelIndex().data( Qt::UserRole ).toString();
-
-    diskName = FmUtils::fillPathWithSplash( diskName );
-
-	mIconLabel->setIcon( HbIcon( icon ) );
-	
-	FmDriverInfo driverInfo = FmUtils::queryDriverInfo( diskName );
-
-    mDiskNameLabel->setPlainText( displayString );
-	if( driverInfo.driveState() & FmDriverInfo::EDriveAvailable ) {
-		mFirstLabel->setPlainText( hbTrId ( "Size: " ) + FmUtils::formatStorageSize( driverInfo.size() ) );
-		mSecondLabel->setPlainText( hbTrId ( "Free: " ) + FmUtils::formatStorageSize( driverInfo.freeSize() ) );
-	} else if( driverInfo.driveState() & FmDriverInfo::EDriveLocked ) {
-		mFirstLabel->setPlainText( hbTrId ( "Locked" ) );
-		mSecondLabel->setPlainText( QString(" ") );
-	} else if( driverInfo.driveState() & FmDriverInfo::EDriveCorrupted ) {
-		mFirstLabel->setPlainText( hbTrId ( "Corrupted" ) );
-		mSecondLabel->setPlainText( QString(" ") );
-	} else if( driverInfo.driveState() & FmDriverInfo::EDriveNotPresent ) {
-		mFirstLabel->setPlainText( hbTrId ( "Not Ready" ) );
-		mSecondLabel->setPlainText( QString(" ") );
-	}
-
-//    mCheckBox->setCheckState( checkState() );
-}
-
-void DiskListViewItem::setCheckedState( int state )
-{
-	HbAbstractViewItem::setCheckState( static_cast<Qt::CheckState>(state) );
-}
-
-void DiskListViewItem::init()
-{
-    hLayout = new QGraphicsLinearLayout();
-
-	hLayout->setOrientation( Qt::Horizontal );
-	hLayout->addItem(layout());
-	
-	mIconLabel = new HbLabel();
-	mIconLabel->setMinimumWidth(32);
-	hLayout->addItem( mIconLabel );
-	hLayout->setAlignment( mIconLabel, Qt::AlignTop );
-	hLayout->setStretchFactor( mIconLabel, 1 );
-
-	QGraphicsLinearLayout *vLayout = new QGraphicsLinearLayout();
-	vLayout->setOrientation( Qt::Vertical );
-
-	mDiskNameLabel = new HbLabel();
-	mDiskNameLabel->setFontSpec( HbFontSpec( HbFontSpec::Primary ) );
-	vLayout->addItem( mDiskNameLabel );
-	vLayout->setAlignment( mDiskNameLabel, Qt::AlignLeft );
-
-	mFirstLabel = new HbLabel();
-	mFirstLabel->setFontSpec( HbFontSpec( HbFontSpec::Secondary ) );
-	vLayout->addItem( mFirstLabel );
-	vLayout->setAlignment( mFirstLabel, Qt::AlignLeft );
-
-	mSecondLabel = new HbLabel();
-	mSecondLabel->setFontSpec( HbFontSpec( HbFontSpec::Secondary ) );
-	vLayout->addItem( mSecondLabel );
-	vLayout->setAlignment( mSecondLabel, Qt::AlignLeft );
-
-	HbWidget *labelsWidget = new HbWidget();
-	labelsWidget->setLayout(vLayout);
-
-	hLayout->addItem( labelsWidget );
-	hLayout->setStretchFactor( labelsWidget, 5 );
-
-	setLayout( hLayout );
-}
--- a/filemanager/src/filemanager/src/listviewitems.h	Wed Aug 18 09:39:39 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,85 +0,0 @@
-/*
-* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of "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:
-*     Zhiqiang Yang <zhiqiang.yang@nokia.com>
-* 
-* Description:
-*     The header file of the disk list view item
-*
-*/
-
-#ifndef LISTVIEWITEMS_H
-#define LISTVIEWITEMS_H
-
-#include "fmcommon.h"
-
-#include <hblistviewitem.h>
-
-class HbCheckBox;
-class HbLabel;
-class QGraphicsLinearLayout;
-
-class DiskListViewItem : public HbListViewItem
-{
-    Q_OBJECT
-
-public:
-    DiskListViewItem( QGraphicsItem *parent = 0 );
-    ~DiskListViewItem();
-
-    virtual bool canSetModelIndex( const QModelIndex &index ) const;
-    virtual HbAbstractViewItem *createItem();
-    virtual void updateChildItems();
-private slots:
-	void setCheckedState( int state );
-
-private:
-    virtual void polish(HbStyleParameters& params);
-
-private:
-    void init();
-
-    HbLabel *mIconLabel;
-    HbLabel *mDiskNameLabel;
-    HbLabel *mFirstLabel;
-    HbLabel *mSecondLabel;
-    HbCheckBox *mCheckBox;
-    QGraphicsLinearLayout *hLayout;
-};
-
-/* not used
-class FileListViewItem : public HbListViewItem
-{
-	Q_OBJECT
-
-public:
-    FileListViewItem( QGraphicsItem *parent = 0 );
-    ~FileListViewItem();
-
-    virtual bool canSetModelIndex( const QModelIndex &index ) const;
-    virtual HbAbstractViewItem *createItem();
-    virtual void updateChildItems();
-
-    virtual void polish(HbStyleParameters& params);
-private slots:
-	void setCheckedState( int state );
-
-private:
-    void init();
-
-    HbLabel *mIconLabel;
-    HbLabel *mNameLabel;
-    HbCheckBox *mCheckBox;
-};
-*/
-
-#endif //LISTVIEWITEMS_H
--- a/filemanager/src/filemanager/src/main.cpp	Wed Aug 18 09:39:39 2010 +0300
+++ b/filemanager/src/filemanager/src/main.cpp	Thu Sep 02 20:16:57 2010 +0300
@@ -23,23 +23,23 @@
 #include "fmmainwindow.h"
 
 #include <hbapplication.h>
-
+#include <hbstyleloader.h>
+#include <hbtranslator.h>
 #include <QTranslator>
 #include <QLocale>
 
 int main( int argc, char *argv[] )
 {
     FM_LOG( "main start" );
-    HbApplication app( argc, argv );
-
-    QTranslator translator;
-    QString lang = QLocale::system().name(); 
-    QString path = "z:/resource/qt/translations/"; 
-    translator.load( path + "filemanager_" + lang );
-    app.installTranslator(&translator);
-
+    HbApplication app( argc, argv );  
+    
+    HbTranslator translator("filemanager");
+    translator.loadCommon();    
     app.setApplicationName( hbTrId("txt_fmgr_title_file_manager") );
     
+    HbStyleLoader::registerFilePath(":/resources/hblistviewitem.css");    
+    HbStyleLoader::registerFilePath(":/resources/hblistviewitem.widgetml");                                                
+    
     FM_LOG( "main_createMainwindow start" );
     FmMainWindow mw;
     FM_LOG( "main_createMainwindow end" );
--- a/filemanager/src/filemanager/src/operationservice/fmoperationbase.cpp	Wed Aug 18 09:39:39 2010 +0300
+++ b/filemanager/src/filemanager/src/operationservice/fmoperationbase.cpp	Thu Sep 02 20:16:57 2010 +0300
@@ -107,9 +107,12 @@
 /*
   Constructs a backup operation with
   \a parent parent
+  \a targetDrive backup target drive
+  backup \a content is mask for contents want to backup. Refer to mContent in FmBackupSettings
 */
-FmOperationBackup::FmOperationBackup( QObject *parent )
-    : FmOperationBase( parent, FmOperationService::EOperationTypeBackup )
+FmOperationBackup::FmOperationBackup( QObject *parent, const QString &targetDrive, quint32 content )
+    : FmOperationBase( parent, FmOperationService::EOperationTypeBackup ),
+      mTargetDrive( targetDrive ), mContent( content )
 {
 }
 
@@ -122,6 +125,22 @@
 }
 
 /*
+  Get target backup drive
+*/
+QString FmOperationBackup::targetDrive() const 
+{
+    return mTargetDrive;
+}
+
+/*
+  Get backup content mask. Refer to mContent in FmBackupSettings
+*/
+quint32 FmOperationBackup::content() const
+{
+    return mContent;
+}
+
+/*
   Constructs a restore operation with
   \a parent parent
   \a selection the selected backup items
@@ -141,7 +160,7 @@
 /*
   Returns the backup items
 */
-quint64 FmOperationRestore::selection()
+quint64 FmOperationRestore::selection() const
 {
     return mSelection;
 }
--- a/filemanager/src/filemanager/src/operationservice/fmoperationbase.h	Wed Aug 18 09:39:39 2010 +0300
+++ b/filemanager/src/filemanager/src/operationservice/fmoperationbase.h	Thu Sep 02 20:16:57 2010 +0300
@@ -52,18 +52,29 @@
 
 class FmOperationBackup : public FmOperationBase
 {
+Q_OBJECT
 public:
-    explicit FmOperationBackup( QObject *parent );
+    explicit FmOperationBackup( QObject *parent, const QString &targetDrive, quint32 content );
     virtual ~FmOperationBackup();
+    
+    QString targetDrive() const;
+    quint32 content() const ;
+private:
+    // used to save backup target drive
+    QString mTargetDrive;
+    
+    // used to save FmBackupSettings::content()
+    quint32 mContent;
 };
 
 class FmOperationRestore : public FmOperationBase
 {
+Q_OBJECT
 public:
     explicit FmOperationRestore( QObject *parent, quint64 selection );
     virtual ~FmOperationRestore();
 
-    quint64 selection();
+    quint64 selection() const;
 private:
     quint64                 mSelection;
 };
--- a/filemanager/src/filemanager/src/operationservice/fmoperationcopyormove.cpp	Wed Aug 18 09:39:39 2010 +0300
+++ b/filemanager/src/filemanager/src/operationservice/fmoperationcopyormove.cpp	Thu Sep 02 20:16:57 2010 +0300
@@ -100,12 +100,11 @@
     mCopiedOrMovedSize  = 0;
     mCurrentStep = 0;
 
-    if( mSourceList.empty() ) {
+    if ( mSourceList.empty() ) {
         emit notifyError( FmErrWrongParam, mErrString );    
         return ;
     }
-
-    emit notifyPreparing( true );
+	emit notifyPreparing( true );
 
     int numofFolders = 0;
     int numofFiles      = 0;
@@ -115,8 +114,11 @@
     if( ret != FmErrNone ) {
         emit notifyError( ret, mErrString );
         return;        
-    }
-
+    }    
+    if ( !targetHasEnoughSpace() ) {
+        emit notifyError( FmErrDiskFull, mErrString );
+        return;
+        }    
     emit notifyStart( true, mTotalSteps );
 
     foreach( const QString& source, mSourceList ) {
@@ -210,6 +212,13 @@
     int ret = FmErrNone;
     
     if ( fi.isFile() ) {
+        if ( FmUtils::getDriveLetterFromPath( source ) == 
+                FmUtils::getDriveLetterFromPath( targetPath ) && 
+                operationType() == FmOperationService::EOperationTypeMove ) 
+            {
+            return FmUtils::moveInsideDrive( source, newName );
+            
+            }
         quint64 fileSize = fi.size();
         ret = copyOneFile( source, newName );
         if (ret != FmErrNone) {
@@ -364,7 +373,7 @@
 }
 
 /*
- * Copys one file from \a srcFile to \a desFile
+ * Copies one file from \a srcFile to \a desFile
  */
 int FmOperationCopyOrMove::copyOneFile( const QString &srcFile, const QString &desFile )
 {
@@ -424,3 +433,14 @@
     }
 }
 
+bool FmOperationCopyOrMove::targetHasEnoughSpace()
+{
+    QString sourceDrive = FmUtils::getDriveLetterFromPath( mSourceList.front() );
+    QString targetDrive = FmUtils::getDriveLetterFromPath( mTargetPath );
+    if ( sourceDrive == targetDrive &&
+            operationType() == FmOperationService::EOperationTypeMove ) {
+        return true;
+    } else {
+        return FmUtils::hasEnoughSpace( targetDrive, mTotalSize );
+    }
+}
--- a/filemanager/src/filemanager/src/operationservice/fmoperationcopyormove.h	Wed Aug 18 09:39:39 2010 +0300
+++ b/filemanager/src/filemanager/src/operationservice/fmoperationcopyormove.h	Thu Sep 02 20:16:57 2010 +0300
@@ -46,6 +46,7 @@
     void increaseProgress( quint64 size );
     void queryForRename( const QString &srcFile, QString *destFile );
     int copyOneFile( const QString &srcFile, const QString &desFile );
+    bool targetHasEnoughSpace();
 
 private:
     FmOperationService *mOperationService;
--- a/filemanager/src/filemanager/src/operationservice/fmoperationformat_win.cpp	Wed Aug 18 09:39:39 2010 +0300
+++ b/filemanager/src/filemanager/src/operationservice/fmoperationformat_win.cpp	Thu Sep 02 20:16:57 2010 +0300
@@ -54,13 +54,13 @@
  * Starts to format.
  * \a isStopped not used
  */
-void FmOperationFormat::start( volatile bool */*isStopped*/ );
+void FmOperationFormat::start( volatile bool */*isStopped*/ )
 { 
     QString logString = "FmOperationFormat::start";
     FM_LOG( logString );
     
     if( mDriverName.isEmpty() ) {
-        emit notifyError( FmErrWrongParam );
+        emit notifyError( FmErrWrongParam, QString() );
         return;
     }
     int totalCount( 100 );
--- a/filemanager/src/filemanager/src/operationservice/fmoperationresultprocesser.cpp	Wed Aug 18 09:39:39 2010 +0300
+++ b/filemanager/src/filemanager/src/operationservice/fmoperationresultprocesser.cpp	Thu Sep 02 20:16:57 2010 +0300
@@ -18,6 +18,9 @@
 #include "fmoperationbase.h"
 #include "fmoperationservice.h"
 #include "fmoperationformat.h"
+#include "fmbkupengine.h"
+#include "fmbackupsettings.h"
+#include "fmbackuprestorehandler.h"
 #include "fmoperationviewdetails.h"
 #include "fmviewdetailsdialog.h"
 #include "fmdlgutils.h"
@@ -314,25 +317,63 @@
     {
         case FmErrCancel:
             cancelProgress();
-            FmDlgUtils::information( QString( hbTrId("Operation Canceled!") ) );
+            // Do not pop up general cancel note as it is not needed( according to TB9.2 ).
+            // If it should be added later, please do not use blocking note. 
+            // Blocking note will cause second backup operaion freeze after cancel previous backup operation
+            // as QEventLoop::exec will cause some problem when used for blocking dialog.
+			// HbDialog has already removed exec function which is implemented with QEventLoop::exec.
+			// If need use QEventLoop::exec to block code execute sequence, It should be invoked in a Qt::QueuedConnection slot.
             return;
         case FmErrAlreadyStarted:
             FmDlgUtils::information( QString( hbTrId("Operation already started!")) );
             return;
         case FmErrLocked:
-            FmDlgUtils::information( QString( hbTrId("Operation failed because drive is locked!")) );
-            return;
+            {
+                FmOperationBackup *operationBackup = qobject_cast<FmOperationBackup*>(operationBase);
+                if( operationBackup ) {
+                    // special error note for backup
+                    QString targetDrive( operationBackup->targetDrive() );
+                    QString defaultDriveVolume( FmUtils::getDefaultVolumeName( targetDrive ) );
+                    QString driveString( defaultDriveVolume.isEmpty()? targetDrive:defaultDriveVolume );
+                    FmDlgUtils::information( QString( hbTrId("txt_fmgr_info_backup_locked") ).arg( driveString ) );
+                } else {
+                    FmDlgUtils::information( QString( hbTrId("Operation failed because drive is locked!")) );
+                }
+                return;
+            }
         case FmErrPathNotFound:
             FmDlgUtils::information( QString( hbTrId("Operation failed because can not find target path or drive is not available!") ) );
             return;
         case FmErrCorrupt:
-            FmDlgUtils::information( QString( hbTrId("Operation failed because target media is corrupted!") ) );
-            return;
+            {
+                FmOperationBackup *operationBackup = qobject_cast<FmOperationBackup*>(operationBase);
+                if( operationBackup ) {
+                    // special error note for backup
+                    QString targetDrive( operationBackup->targetDrive() );
+                    QString defaultDriveVolume( FmUtils::getDefaultVolumeName( targetDrive ) );
+                    QString driveString( defaultDriveVolume.isEmpty()? targetDrive:defaultDriveVolume );
+                    FmDlgUtils::information( QString( hbTrId("txt_fmgr_info_backup_corrupted") ).arg( driveString ) );
+                } else {
+                    FmDlgUtils::information( QString( hbTrId("Operation failed because target media is corrupted!") ) );
+                }
+                return;
+            }
         case FmErrNotReady: // Caused when MMC & OTG is not inserted when start backup
-            FmDlgUtils::information( QString( hbTrId("Operation failed because device is not ready!") ) );
-            return;
-        case FmErrDisMounted: // Caused by eject MMC when preparing backup
-            FmDlgUtils::information( QString( hbTrId("Operation failed because device has been removed!") ) );
+            {
+                FmOperationBackup *operationBackup = qobject_cast<FmOperationBackup*>(operationBase);
+                if( operationBackup ) {
+                    // special error note for backup
+                    QString targetDrive( operationBackup->targetDrive() );
+                    QString defaultDriveVolume( FmUtils::getDefaultVolumeName( targetDrive ) );
+                    QString driveString( defaultDriveVolume.isEmpty()? targetDrive:defaultDriveVolume );
+                    FmDlgUtils::information( QString( hbTrId("txt_fmgr_info_backup_unavailable") ).arg( driveString ) );
+                } else {
+                    FmDlgUtils::information( QString( hbTrId("Operation failed because device is not ready!") ) );
+                }
+                return;
+            }
+        case FmErrDisMounted: // Caused by eject MMC when preparing backup, will be localized later
+            FmDlgUtils::information( QString( hbTrId("Operation failed because backup target drive has been removed!") ) );
             return;
         case FmErrDiskFull:
             FmDlgUtils::information( QString( hbTrId("Not enough space. Operation cancelled!")) );
@@ -414,6 +455,7 @@
 //        mNote->setProgressDialogType( HbProgressDialog::WaitNote );
 //    }
     mNote->setText( title );
+    //KRAZY: ignore krazy warning because QAction must be used.
     QList<QAction *> actionList = mNote->actions();
     if (actionList.size() > 0) {        
         QAction *cancelAction = actionList.at(0);
@@ -453,6 +495,7 @@
     mNote->setMaximum( 65535 );
     mNote->setProgressValue( 0 );
     mNote->setText( title );
+    //KRAZY: ignore krazy warning because QAction must be used.
     QList<QAction *> actionList = mNote->actions();
     if (actionList.size() > 0) {        
         QAction *cancelAction = actionList.at(0);
@@ -493,6 +536,7 @@
     mNote->setMaximum( maxValue );
 
     mNote->setProgressValue( 0 );
+    //KRAZY: ignore krazy warning because QAction must be used.
     QList<QAction *> actionList = mNote->actions();
     if (actionList.size() > 0) {        
         QAction *cancelAction = actionList.at(0);
--- a/filemanager/src/filemanager/src/operationservice/fmoperationservice.cpp	Wed Aug 18 09:39:39 2010 +0300
+++ b/filemanager/src/filemanager/src/operationservice/fmoperationservice.cpp	Thu Sep 02 20:16:57 2010 +0300
@@ -20,6 +20,7 @@
 #include "fmoperationthread.h"
 #include "fmbackupconfigloader.h"
 #include "fmbkupengine.h"
+#include "fmbackupsettings.h"
 #include "fmviewdetailsdialog.h"
 #include "fmoperationresultprocesser.h"
 #include "fmoperationcopyormove.h"
@@ -65,13 +66,10 @@
  * Constructs one operation Service with \a parent.
  */
 FmOperationService::FmOperationService( QObject *parent ) : QObject( parent ),
-        mCurrentOperation( 0 )
+        mCurrentOperation( 0 ), mBackupRestoreHandler( 0 )
 {
     mThread = new FmOperationThread( this );
     mThread->setObjectName( "operationThread" );
-    mBackupRestoreHandler = new FmBackupRestoreHandler( this );
-    mBackupRestoreHandler->setObjectName( "backupRestore" ) ;
-
     mOperationResultProcesser = new FmOperationResultProcesser( this );
     
     QMetaObject::connectSlotsByName( this );
@@ -83,7 +81,9 @@
 FmOperationService::~FmOperationService()
 {
     delete mThread;    
+    mThread = 0;
     delete mBackupRestoreHandler;
+    mBackupRestoreHandler = 0;
 }
 
 /*
@@ -95,7 +95,7 @@
 }
 
 /*
- * Copys the file or foler \a targetPath asynchronously. 
+ * Copies the file or foler \a targetPath asynchronously. 
  */
 int FmOperationService::asyncCopy( const QStringList &sourceList, const QString &targetPath )
 {    
@@ -204,7 +204,11 @@
         return FmErrAlreadyStarted;
     Q_ASSERT( !mCurrentOperation );
 
-    FmOperationBackup *operationBackup = new FmOperationBackup( mBackupRestoreHandler );
+    // BackupSettingsL will not leave, coding convention will be improvied in another task.
+    QString targetDrive( backupRestoreHandler()->bkupEngine()->BackupSettingsL()->availableTargetDrive() );
+    quint32 content( backupRestoreHandler()->bkupEngine()->BackupSettingsL()->content() );
+    FmOperationBackup *operationBackup = 
+            new FmOperationBackup( backupRestoreHandler(), targetDrive, content );
     mCurrentOperation = operationBackup;
     int ret = backupRestoreHandler()->startBackup( operationBackup );
     if( ret ){
@@ -242,7 +246,7 @@
  */
 int FmOperationService::syncDeleteBackup( quint64 selection )
 {
-    return mBackupRestoreHandler->deleteBackup( selection );
+    return backupRestoreHandler()->deleteBackup( selection );
 }
 
 /*
@@ -325,7 +329,8 @@
 FmBackupRestoreHandler *FmOperationService::backupRestoreHandler()
 {
     if( !mBackupRestoreHandler ) {
-        mBackupRestoreHandler = new FmBackupRestoreHandler( this );
+        mBackupRestoreHandler = new FmBackupRestoreHandler( this );        
+        mBackupRestoreHandler->setObjectName( "backupRestore" ) ;
         QMetaObject::connectSlotsByName( this );
     }
     return mBackupRestoreHandler;
--- a/filemanager/src/fmfiledialog/fmfiledialog.pro	Wed Aug 18 09:39:39 2010 +0300
+++ b/filemanager/src/fmfiledialog/fmfiledialog.pro	Thu Sep 02 20:16:57 2010 +0300
@@ -28,8 +28,8 @@
             -lshareui \
             -lefsrv \
             -lapgrfx \
-	    -lcone \
-            -ldirectorylocalizer
+            -lcone \
+            -lsysutil
             
     TARGET.UID3 = 0x2002BCC3
 
--- a/filemanager/src/fmfiledialog/src/fmfilewidget.cpp	Wed Aug 18 09:39:39 2010 +0300
+++ b/filemanager/src/fmfiledialog/src/fmfilewidget.cpp	Thu Sep 02 20:16:57 2010 +0300
@@ -96,7 +96,7 @@
 {
     FM_LOG("FmFileWidget::on_list_activated start" );
     if( mCurrentModel == mDriveModel ) {
-    //If currenty model is DriveModel, open drive and set path
+    //If current model is DriveModel, open drive and set path
         QString driveName = mDriveModel->driveName( mActivatedModelIndex );
         QString checkedPath = FmUtils::checkDriveToFolderFilter( driveName );
         if( checkedPath.isEmpty() ) {
@@ -113,7 +113,7 @@
         FM_LOG("FmFileWidget::on_list_activated finish emit pathChanged" );
     }
     else if( mCurrentModel == mFileSystemModel ) {
-    //If currenty model is FileSystemModel, open path or emit file activate signal.
+    //If current model is FileSystemModel, open path or emit file activate signal.
         if ( mFileSystemModel->isDir( mActivatedModelIndex ) ) {
             FM_LOG("FmFileWidget::on_list_activated start changeRootIndex" );
             changeRootIndex( mActivatedModelIndex );
@@ -221,7 +221,7 @@
     QString path( FmUtils::checkFolderToDriveFilter( currentPath().absoluteFilePath() ) );
     QFileInfo fileInfo( path );
     QString cdUpPath;
-    // path length>3 means currenty path is a sub folder, then get up level path and navigate to it
+    // path length>3 means current path is a sub folder, then get up level path and navigate to it
     // Otherwise means current path is a top level drive path, Should navigate to drive view. So setRootPath with empty path string.
     if( path.length() > 3 ) {
         cdUpPath = fileInfo.dir().absolutePath();
--- a/filemanager/src/inc/commonutils.pri	Wed Aug 18 09:39:39 2010 +0300
+++ b/filemanager/src/inc/commonutils.pri	Thu Sep 02 20:16:57 2010 +0300
@@ -23,7 +23,8 @@
 INTERNAL_SOURCES += $$PWD/fmdrivemodel.cpp \
                     $$PWD/fmfileiconprovider.cpp \
                     $$PWD/fmdrivewatcher/fmdrivewatcher.cpp \
-                    $$PWD/fmfiletyperecognizer.cpp
+                    $$PWD/fmfiletyperecognizer.cpp \
+                    $$PWD/fmutils.cpp
 
 symbian {
     INTERNAL_HEADERS += $$PWD/fms60utils.h \
--- a/filemanager/src/inc/fmcommon.h	Wed Aug 18 09:39:39 2010 +0300
+++ b/filemanager/src/inc/fmcommon.h	Thu Sep 02 20:16:57 2010 +0300
@@ -22,26 +22,11 @@
 // MACRO for enable actions for change orientation
 // #define FM_CHANGE_ORIENT_ENABLE
 
-// MACRO for launch find view quickly from driver view and search "b" in "c:\ruby"
-//#define _DEBUG_SPEED_FINDVIEW_
-
-// #define _DEBUG_ENABLE_FORMATMENU_
-
+// MACRO for enable debug log
+// #define _DEBUG_LOG_ENABLE_
 
-// MARCO for hide d, z, folder except C:\data in windows for debug
-//#define _DEBUG_HIDE_VIEWFOLDER_WINDOWS_
-
-//#define _DEBUG_LOG_ENABLE_
-
-//used to test drive hide which drive could be listed but not available
-// #define _DEBUG_DISABLE_DRIVE_D_TEST_DRIVEHIDE_
-
-//used to test locked drive
-// #define _DEBUG_LOCKED_DRIVE_Z
 
 #include "fmlogger.h"
 #include "fmdefine.h"
 
-
-
 #endif
--- a/filemanager/src/inc/fmdefine.h	Wed Aug 18 09:39:39 2010 +0300
+++ b/filemanager/src/inc/fmdefine.h	Thu Sep 02 20:16:57 2010 +0300
@@ -77,13 +77,13 @@
 // used to match un-empty string, and is not totally empty characters.
 #define Regex_ValidUnEmpty QString( "^.*[^\\s].*$" )
 
-// this is regexp for vaild file/folder name: no \/:*?"<>| and is not totally empty characters.
+// this is regexp for valid file/folder name: no \/:*?"<>| and is not totally empty characters.
 // file name can not end with "." , but it is not include in this RegExp. It should be checked in Regex_ValidNotEndWithDot
 // this expression is composed by two expressions:
 // ^.*[^\\s].*$  used to match un-empty string and is not totally empty characters.
 // [^\\\\/:*?\"<>|] used to math valid file/folder name
 // merge the two regex together:
-// vaild file/folder name and is not totally empty.
+// valid file/folder name and is not totally empty.
 #define Regex_ValidFileFolderName QString( "^[^\\\\/:*?\"<>|]*[^\\\\/:*?\"<>|\\s][^\\\\/:*?\"<>|]*$" )
 
 // is not end with dot( trim blank characters in the end first )
--- a/filemanager/src/inc/fmdrivemodel.cpp	Wed Aug 18 09:39:39 2010 +0300
+++ b/filemanager/src/inc/fmdrivemodel.cpp	Thu Sep 02 20:16:57 2010 +0300
@@ -84,10 +84,7 @@
 
     if (role == Qt::DisplayRole ) {
        return displayString( index );
-    } else if (role == Qt::UserRole ) {
-       return driveName( index );
-    }
-
+    } 
     if (index.column() == 0) {
         if (role == Qt::DecorationRole ) {
             QString path = driveName( index );
@@ -139,17 +136,39 @@
     return data;
 }
 
-QString FmDriveModel::displayString( const QModelIndex &index ) const
+QVariant FmDriveModel::displayString( const QModelIndex &index ) const
 {
-    QString data;
+    QStringList data;
     if (index.row() >= 0 && index.row() < mDriveList.size()) {
         int row = index.row();
         QString diskName = mDriveList[ row ];
 
         if( mOptions & FillWithVolume ) {
-            data = FmUtils::fillDriveVolume( diskName, mOptions & FillWithDefaultVolume );
+            data << FmUtils::fillDriveVolume( diskName, mOptions & FillWithDefaultVolume );
         } else {
-            data = FmUtils::removePathSplash( diskName );
+            data << FmUtils::removePathSplash( diskName );
+        }
+        diskName = FmUtils::fillPathWithSplash( diskName );
+        FmDriverInfo driverInfo = FmUtils::queryDriverInfo( diskName );
+        if ( mOptions & FillWithTotalSize ) {                    
+            if( driverInfo.driveState() & FmDriverInfo::EDriveAvailable ) {
+                data << QString( hbTrId ( "Size: " ) + FmUtils::formatStorageSize( driverInfo.size() ) );                
+            } else if( driverInfo.driveState() & FmDriverInfo::EDriveLocked ) {
+                data << QString( hbTrId ( "Locked" ) );                
+            } else if( driverInfo.driveState() & FmDriverInfo::EDriveCorrupted ) {
+                data << QString( hbTrId ( "Corrupted" ) );                
+            } else if( driverInfo.driveState() & FmDriverInfo::EDriveNotPresent ) {
+                data << QString( hbTrId ( "Not Ready" ) );                
+            }            
+        }
+        if ( mOptions & FillWithFreeSize ) {        
+            if( driverInfo.driveState() & FmDriverInfo::EDriveAvailable ) {                
+                data << QString( hbTrId ( "Free: " ) + FmUtils::formatStorageSize( driverInfo.freeSize() ) );
+            } else if( ( driverInfo.driveState() & FmDriverInfo::EDriveLocked ) ||
+                    ( driverInfo.driveState() & FmDriverInfo::EDriveCorrupted ) ||
+                    ( driverInfo.driveState() & FmDriverInfo::EDriveNotPresent )) {                
+                data << QString( QString(" ") );
+            }            
         }
     }
     return data;
--- a/filemanager/src/inc/fmdrivemodel.h	Wed Aug 18 09:39:39 2010 +0300
+++ b/filemanager/src/inc/fmdrivemodel.h	Thu Sep 02 20:16:57 2010 +0300
@@ -51,9 +51,11 @@
 public:
     enum Option
     {
-        FillWithVolume        = 0x00000001, // add volume behind disname
-        FillWithDefaultVolume = 0x00000002, // add default diskname while enable FillWithVolume and volume is empty
-        HideUnAvailableDrive  = 0x00000004  // for example: drive F when no MMC card inserted.
+        FillWithVolume        = 0x00000001,  // add volume behind disname
+        FillWithDefaultVolume = 0x00000002,  // add default diskname while enable FillWithVolume and volume is empty
+        HideUnAvailableDrive  = 0x00000004,  // for example: drive F when no MMC card inserted.
+        FillWithTotalSize     = 0x00000008,  // show the drive's total size.
+        FillWithFreeSize      = 0x00000010   //show the drive's free size.
     };
     Q_DECLARE_FLAGS(Options, Option)
 
@@ -68,7 +70,7 @@
     QVariant headerData( int section, Qt::Orientation orientation, int role = Qt::DisplayRole ) const;
     bool indexValid( const QModelIndex &index ) const;
     QString driveName( const QModelIndex &index ) const;
-    QString displayString( const QModelIndex &index ) const;
+    QVariant displayString( const QModelIndex &index ) const;
     
 private:
     QStringList         mFindResult;
--- a/filemanager/src/inc/fmdrivewatcher/private/symbian/fmdriveevent.cpp	Wed Aug 18 09:39:39 2010 +0300
+++ b/filemanager/src/inc/fmdrivewatcher/private/symbian/fmdriveevent.cpp	Thu Sep 02 20:16:57 2010 +0300
@@ -18,8 +18,8 @@
 
 
 // INCLUDE FILES
+#include "fmdriveevent.h"
 #include <e32std.h>
-#include "fmdriveevent.h"
 #include "fmcommon.h"
 
 #include <aknnotewrappers.h> 
--- a/filemanager/src/inc/fmfileiconprovider.cpp	Wed Aug 18 09:39:39 2010 +0300
+++ b/filemanager/src/inc/fmfileiconprovider.cpp	Thu Sep 02 20:16:57 2010 +0300
@@ -38,7 +38,7 @@
 #define usbMemoryIcon   "qtg_large_usb_memory"
 
 //TODO: UI_Update: mmcl locked icon have not provided in icon spec
-// Just use orignal custom-defined icon
+// Just use original custom-defined icon
 #define mmcLockedIcon   ":image/qgn_prop_mmc_locked.svg"
 
 
@@ -95,10 +95,10 @@
                 case FmDriverInfo::EDriveTypePhoneMemory:
                     retIcon = HbIcon( phoneMemoryIcon ).qicon();
                     break;
-                default:
-                    Q_ASSERT_X( false, "FmFileIconProvider::icon", "please handle drive type");
+                case FmDriverInfo::EDriveTypeNotExist: // drive not exist, let QFileIconProvider to judge icon
+                default:  // filemanger do not provide icon for other drive types, let QFileIconProvider to judge icon
                     break;
-                }
+               }
             break;
             }
         case FmFileTypeRecognizer::FileTypeFolder:
@@ -167,8 +167,6 @@
         }
     
     // if cannot get icon, return icon from QFileIconProvider
-    // this will be mostly used in win32 platform,
-    // because path for HbIcon only existed in hb theme of symbian 
     if( retIcon.isNull() ) {
         retIcon = QFileIconProvider::icon( info );
     }
--- a/filemanager/src/inc/fmfiletyperecognizer.h	Wed Aug 18 09:39:39 2010 +0300
+++ b/filemanager/src/inc/fmfiletyperecognizer.h	Thu Sep 02 20:16:57 2010 +0300
@@ -16,8 +16,8 @@
  *      The header file of the file type recognizer
  */
 
-#ifndef FMFILERECOGNIZER_H
-#define FMFILERECOGNIZER_H
+#ifndef FMFILETYPERECOGNIZER_H
+#define FMFILETYPERECOGNIZER_H
 
 #include "fmcommon.h"
 #include <QString>
@@ -63,5 +63,5 @@
     QMap<QString, FileType>     mFileExtensionMap;
 };
 
-#endif /* FMDRIVEDETAILSTYPE_H */
+#endif /* FMFILETYPERECOGNIZER_H */
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/filemanager/src/inc/fmutils.cpp	Thu Sep 02 20:16:57 2010 +0300
@@ -0,0 +1,412 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "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:
+*     Zhiqiang Yang <zhiqiang.yang@nokia.com>
+* 
+* Description:
+*     The source file of the file manager utilities
+*/
+
+#include "fmutils.h"
+
+#include <QDir>
+#include <QFileInfo>
+
+#include <hbglobal.h>
+
+/*!
+    Used to get drive type for convenience.
+*/
+FmDriverInfo::DriveType FmDriverInfo::driveType()
+{
+    FmDriverInfo::DriveType driveType;
+    if( mDriveState & FmDriverInfo::EDriveRemovable ) {
+        // if drive is removable, it may be mass, usb, or remote drive
+        if( mDriveState & FmDriverInfo::EDriveMassStorage ) {
+            driveType = FmDriverInfo::EDriveTypeMassStorage;
+        } else if( mDriveState & FmDriverInfo::EDriveUsbMemory ) {
+            driveType = FmDriverInfo::EDriveTypeUsbMemory;
+        } else if( mDriveState & FmDriverInfo::EDriveRemote ){
+            driveType = FmDriverInfo::EDriveTypeRemote;
+        } else {
+            driveType = FmDriverInfo::EDriveTypeMemoryCard;
+        }
+    } else if( mDriveState & FmDriverInfo::EDriveRom ) {
+        driveType = FmDriverInfo::EDriveTypeRom;
+    } else if( mDriveState & FmDriverInfo::EDriveRam ) {
+        driveType = FmDriverInfo::EDriveTypeRam;
+    } else {
+        // if drive type is not recognized in previous condition,
+        // it should be an un-existed drive or phone memory
+        if( mDriveState & EDriveNotPresent ){
+            // if come here, means 2 conditions:
+            //  1 this drive is not exist( FmUtils::queryDriverInfo will give EDriveNotPresent to mDriveState )
+            //  2 un-mounted removable drive
+            // removable drive filted in previous condifiton. So, give EDriveTypeNotExist 
+            driveType = FmDriverInfo::EDriveTypeNotExist;
+        } else {
+            // drive is existed, only remain the type of EDriveTypePhoneMemory
+            driveType = FmDriverInfo::EDriveTypePhoneMemory;
+        }
+    }
+    
+    return driveType;
+}
+
+/*!
+    return drive name for \a path
+*/
+QString FmUtils::getDriveNameFromPath( const QString &path )
+{
+    // fillPathWithSplash make sure path length will be at least 3 if it is not empty.
+    QString checkedPath( fillPathWithSplash( path ) );
+    if( checkedPath.length() < 3 ) {
+        return QString();
+    }
+    return checkedPath.left( 3 );
+}
+
+/*!
+    return drive letter for \a path
+*/
+QString FmUtils::getDriveLetterFromPath( const QString &path )
+{
+	if( path.length() <2 ) {
+        return QString();
+    }
+    return path.left( 1 );
+}
+
+/*!
+    return formatted string for size.
+*/
+QString FmUtils::formatStorageSize( quint64 size )
+{
+	if ( size < 1000 ) {
+		return QString::number( size ) + " B";
+	} else if ( size < 1000 * 1000 ) {
+		return QString::number( size / 1024.0, 'f', 2 ) + " KB";
+	} else if ( size < 1000 * 1000 * 1000 ) {
+		return QString::number( size / (1024.0 * 1024.0), 'f', 1 ) + " MB";
+	} else {
+	    return QString::number( size / ( 1024.0 * 1024.0 * 1024.0 ), 'f', 1 ) + " GB";	    
+	}
+}
+
+/*!
+    Judge if a path is drive path, not a folder or a file.
+    For example, true for C:\ while false for C:\data
+*/
+bool FmUtils::isDrive( const QString &path )
+{
+   bool ret( false );
+   if( path.length() <= 3 && path.length() >=2 ) {
+       ret = true;
+   }
+   
+   return ret;   
+}
+
+/*!
+    All "/" and "\" in \a path will be changed to QDir::separator
+    \sa fillPathWithSplash, fillPathWithSplash will append QDir::separator in the end
+*/
+QString FmUtils::formatPath( const QString &path  )
+{
+    QString formatPath;
+    if( path.isEmpty() ) {
+        return formatPath;
+    }
+    
+    foreach( const QChar &ch, path ) {
+        if( ch == QChar('\\') || ch == QChar('/') ) {
+            formatPath.append( QDir::separator() );
+        } else {
+            formatPath.append( ch );
+        }
+    }
+
+    return formatPath;
+}
+
+/*!
+    Fill splash in the end of \a filePath. And all "/" and "\" will be changed to QDir::separator
+    Please do not call this function if path is a file.
+    Use \a formatPath instead, \a formatPath will not append QDir::separator in the end.
+    \sa formatPath only changed "/" and "\" to QDir::separator
+*/
+QString FmUtils::fillPathWithSplash( const QString &filePath )
+{
+    QString newFilePath;
+    if( filePath.isEmpty() ) {
+        return newFilePath;
+    }
+
+    newFilePath = formatPath( filePath );
+    
+    if( newFilePath.right( 1 )!= QDir::separator() ){
+        newFilePath.append( QDir::separator() );
+    }
+    return newFilePath;
+}
+
+/*!
+    Remove splash in the end of \a filePath.
+*/
+QString FmUtils::removePathSplash( const QString &filePath )
+{
+    QString newFilePath( filePath );
+    if( filePath.right( 1 ) == QChar( '/' ) || filePath.right(1) == QString( "\\" ) ) {
+        newFilePath = filePath.left( filePath.length() - 1 );
+    }
+    return newFilePath;
+}
+
+/*!
+    fill \a driveList of drives can be shown in driveListView
+*/
+void FmUtils::getDriveList( QStringList &driveList, bool isHideUnAvailableDrive )
+{
+    if( isHideUnAvailableDrive ) {
+        FM_LOG( QString( "getDriveList HideUnAvailableDrive_true" ) );
+    } else {
+        FM_LOG( QString( "getDriveList HideUnAvailableDrive_false" ) );
+    }
+    QFileInfoList infoList = QDir::drives();
+
+    foreach( const QFileInfo &fileInfo, infoList ) {
+        QString driveName = fileInfo.absolutePath();
+        if( checkDriveAccessFilter( driveName ) ) {
+            if( !isHideUnAvailableDrive ) {
+                driveList.append( driveName );
+            }
+            else if ( isDriveAvailable( driveName ) ) {
+                driveList.append( driveName );
+            }
+        }
+    }
+    return;
+}
+
+/*!
+    return the combined string of drive name and volume( e.g. C: Phone memory for C drive)
+    \a driveName the drive name.
+    If set \a isFillWithDefaultVolume true, fill result with default volume if drive volume is empty.
+*/
+QString FmUtils::fillDriveVolume( QString driveName, bool isFillWithDefaultVolume )
+{
+    QString ret;
+    if( driveName.isEmpty() ) {
+        return ret;
+    }
+    QString tempDriveName = fillPathWithSplash( driveName );
+
+    QString checkedDriveName( removePathSplash( driveName ) );
+    
+    FmDriverInfo driverInfo = FmUtils::queryDriverInfo( tempDriveName );
+    QString volumeName = driverInfo.volumeName();
+    
+    if( volumeName.isEmpty() && isFillWithDefaultVolume ){
+        switch ( driverInfo.driveType() )
+            {
+            case FmDriverInfo::EDriveTypeMassStorage:
+                ret = hbTrId( "txt_fmgr_dblist_1_mass_storage" ).arg( checkedDriveName );
+                break;
+            case FmDriverInfo::EDriveTypeUsbMemory:
+                ret = hbTrId( "txt_fmgr_dblist_1_usb_memory" ).arg( checkedDriveName );
+                break;
+            case FmDriverInfo::EDriveTypeMemoryCard:
+                ret = hbTrId( "txt_fmgr_dblist_1_memory_card" ).arg( checkedDriveName );
+                break;
+            case FmDriverInfo::EDriveTypePhoneMemory:
+                ret = hbTrId( "txt_fmgr_dblist_1_device_memory" ).arg( checkedDriveName );
+                break;
+            case FmDriverInfo::EDriveTypeNotExist:// no such drive
+            default:// do not need get volume for other drive types, e.g. Ram, Rom
+                break;
+            }    
+    }
+    
+    if( ret.isEmpty() ) {
+        // ret is not got. fill ret as default method
+        // txt_fmgr_dblist_1_2 is not correct, can not use.
+        ret = hbTrId( "%1 %2" ).arg( checkedDriveName ).arg( volumeName );
+    }
+    return ret;
+}
+
+/*!
+    return the default volume for drive
+    \a driveName the drive.
+    \sa getVolumeNameWithDefaultNameIfNull
+*/
+QString FmUtils::getDefaultVolumeName( const QString &driveName )
+{
+    QString defaultVolumeName;
+    FmDriverInfo driverInfo = FmUtils::queryDriverInfo( driveName );
+          
+    switch ( driverInfo.driveType() )
+        {
+        case FmDriverInfo::EDriveTypeMassStorage:
+            defaultVolumeName = hbTrId("Mass storage"); 
+            break;
+        case FmDriverInfo::EDriveTypeUsbMemory:
+            defaultVolumeName = hbTrId("USB memory"); 
+            break;
+        case FmDriverInfo::EDriveTypeMemoryCard:
+            defaultVolumeName = hbTrId("Memory card");
+            break;
+        case FmDriverInfo::EDriveTypePhoneMemory:
+            defaultVolumeName = hbTrId("Device memory");
+            break;
+        case FmDriverInfo::EDriveTypeNotExist:// no such drive, break and return empty string
+        default:// do not have default volume for other drive types, e.g. Ram, Rom
+            break;
+        }   
+    return defaultVolumeName;
+}
+
+/*!
+    get the volume name of the drive, if it is null, then return the default name.
+    \a driveName the drive letter.
+    \a defaultName whether it is the default name.
+    return the volume name.
+*/
+QString FmUtils::getVolumeNameWithDefaultNameIfNull( const QString &driveName, bool &defaultName )
+{
+    // do not re-use FmUtils::getDefaultVolumeName to save one time for call FmUtils::queryDriverInfo
+    FmDriverInfo driverInfo = FmUtils::queryDriverInfo( driveName );
+          
+    QString volumeName = driverInfo.volumeName();    
+    //save the volume status, whether it is default name
+    defaultName = false;
+    //volume name may be null if not set, it will be set at least for one time in the following while cycling.
+    if ( volumeName.isEmpty() ) {
+        switch ( driverInfo.driveType() )
+            {
+            case FmDriverInfo::EDriveTypeMassStorage:
+                volumeName = hbTrId("Mass storage"); 
+                break;
+            case FmDriverInfo::EDriveTypeUsbMemory:
+                volumeName = hbTrId("USB memory"); 
+                break;
+            case FmDriverInfo::EDriveTypeMemoryCard:
+                volumeName = hbTrId("Memory card");
+                break;
+            case FmDriverInfo::EDriveTypePhoneMemory:
+                volumeName = hbTrId("Device memory");
+                break;
+            case FmDriverInfo::EDriveTypeNotExist:// no such drive
+            default:// do not need get volume for other drive types, e.g. Ram, Rom
+                break;
+            }   
+        if( !volumeName.isEmpty() ) {
+             defaultName = true;
+        }
+    }
+    return volumeName;
+}
+
+/*!
+    Check if two path are the same.
+*/
+bool FmUtils::isPathEqual( const QString &pathFst, const QString &pathLast )
+{
+    QString fst( fillPathWithSplash( pathFst ) );
+    QString last( fillPathWithSplash( pathLast ) );
+    if( fst.compare( last, Qt::CaseInsensitive ) == 0 ) {
+        return true;
+    }
+    return false;
+}
+
+/*!
+    Check if a name is illegal for folder/file naming rule.
+*/
+bool FmUtils::checkFolderFileName( const QString& name )
+{
+    // trim space firest, because there may be some spaces after "." ,  it is also not valid
+    QString trimmedName( name.trimmed() );
+	if( trimmedName.isEmpty() ) {
+		return false;
+	}
+    if( trimmedName.endsWith( QChar('.'),  Qt::CaseInsensitive ) ) {
+        return false;
+    }
+    if( trimmedName.contains( QChar('\\'), Qt::CaseInsensitive ) ||
+        trimmedName.contains( QChar('/'),  Qt::CaseInsensitive ) ||
+        trimmedName.contains( QChar(':'),  Qt::CaseInsensitive ) ||
+        trimmedName.contains( QChar('*'),  Qt::CaseInsensitive ) ||
+        trimmedName.contains( QChar('?'),  Qt::CaseInsensitive ) ||
+        trimmedName.contains( QChar('\"'), Qt::CaseInsensitive ) ||
+        trimmedName.contains( QChar('<'),  Qt::CaseInsensitive ) ||
+        trimmedName.contains( QChar('>'),  Qt::CaseInsensitive ) ||
+        trimmedName.contains( QChar('|'),  Qt::CaseInsensitive ) ){
+        return false;
+    }
+    // use original name to exam max size of file name
+    if( name.length() > getMaxFileNameLength() ) {
+        return false;
+    }
+    return true;
+}
+
+/*!
+    check file or folder path is illegal or not.
+    \a fileName file/folder name, used to check illegal characters
+    \a path file/folder path, used to check if path is available to use.
+    \a errString if return false, errString will be set for error note.
+    return true for not illegal and false for illegal path.
+*/
+bool FmUtils::checkNewFolderOrFile( const QString &fileName, const QString &path, QString &errString )
+{
+    // first check if fileName is valid, then check if path length is valid, and check if file/foler is existed at last
+    QFileInfo fileInfo( path );
+    bool ret( true );   
+    if (!FmUtils::checkFolderFileName( fileName ) ) {
+        errString = hbTrId( "Invalid file or folder name!" );
+        ret = false;
+    } else if( !FmUtils::checkMaxPathLength( path ) ) {
+        errString = hbTrId( "the path you specified is too long!" );
+        ret = false;
+    } else if (fileInfo.exists()) {
+        errString = hbTrId( "%1 already exist!" ).arg( fileInfo.fileName() );
+        ret = false;
+    }
+    return ret;
+}
+
+/*!
+    Check if \a dest is sub level path of \a src
+    Used to check True/False when copy a folder to itself or its subfolder
+    For example, c:\data\test is sub path of c:\data.
+    But c:\data123\test is not sub path of c:\data.
+    So after got right part of path, the first char must be \ or /
+*/
+bool FmUtils::isSubLevelPath( const QString &src, const QString &dest )
+{
+    FM_LOG("FmUtils::isSubFolder: src=" + src + " dest=" + dest);
+    QString checkedSrc( FmUtils::fillPathWithSplash( src ) );
+    QString checkedDest( FmUtils::fillPathWithSplash( dest ) );
+    
+    if( checkedDest.contains( checkedSrc, Qt::CaseInsensitive) &&
+            checkedDest.length() > checkedSrc.length() ) {
+        // for example c:\data\ vs c:\data\123\ 
+        FM_LOG("FmUtils::isSubFolder: true");
+        return true;
+    }
+    // for example c:\data\ vs c:\data\ 
+    // for example c:\data\ vs c:\data123\ 
+
+    FM_LOG("FmUtils::isSubFolder: false");
+    return false;
+}
--- a/filemanager/src/inc/fmutils.h	Wed Aug 18 09:39:39 2010 +0300
+++ b/filemanager/src/inc/fmutils.h	Thu Sep 02 20:16:57 2010 +0300
@@ -23,6 +23,10 @@
 
 #include <QString>
 
+/*!
+    \class FmDriverInfo
+    \brief The class FmDriverInfo provide drive info data
+ */
 class FmDriverInfo
 {
 public:
@@ -58,6 +62,7 @@
     */
     enum DriveType
     {
+        EDriveTypeNotExist = -1, // specified drive is not existed in device
         EDriveTypeRom,
         EDriveTypeRam,
         EDriveTypePhoneMemory,
@@ -85,13 +90,36 @@
         this->mDriveState = rhs.mDriveState;
         return *this;
     }
-
+    
+    /*!
+        Total size for drive
+    */
     quint64 size() const { return mSize; }
+    
+    /*!
+        Free size for drive
+    */
     quint64 freeSize() const { return mFreeSize; }
+    
+    /*!
+        path for drive
+    */
     QString name() const { return mName; }
+    
+    /*!
+        volume for drive
+    */
     QString volumeName() const { return mVolumeName; }
+    
+    /*!
+        status for drive
+    */
     DriveState driveState() const { return mDriveState; }
-    FmDriverInfo::DriveType driveType();
+    
+    /*!
+        drive type
+    */
+    DriveType driveType();
     
 private:
     quint64 mSize;
@@ -103,70 +131,80 @@
 };
 Q_DECLARE_OPERATORS_FOR_FLAGS( FmDriverInfo::DriveState )
 
+/*!
+    \class FmUtils
+    \brief The class FmUtils provide util functions
+    This class is implemented by three parts:
+    fmutils.cpp for Qt Based functions
+    fmutils_s60.cpp is symbian implement version for platform based functions
+    fmutils_win.cpp is win32 implement version for platform based functions( a simple wrapper )
+ */
 class FmUtils
 {
 public:
-    static QString getDriveNameFromPath( const QString &path );
-	static QString getDriveLetterFromPath( const QString &path );
+    //////////////////////////////////////////////////////////////////
+    // <QtBasedFunctions>
+    static QString  getDriveNameFromPath( const QString &path );
+    static QString  getDriveLetterFromPath( const QString &path );
+    static QString  formatStorageSize( quint64 size );
+    static bool     isDrive( const QString &path );
+    static QString  formatPath( const QString &path  );
+    static QString  fillPathWithSplash( const QString &filePath );
+    static QString  removePathSplash( const QString &filePath );
+    static void     getDriveList( QStringList &driveList, bool isHideUnAvailableDrive );
+    static QString  fillDriveVolume( QString driveName, bool isFillWithDefaultVolume );
+    static QString  getDefaultVolumeName( const QString &driveName );
+    static QString  getVolumeNameWithDefaultNameIfNull( const QString &diskName, bool &defaultName );
+    static bool     isPathEqual( const QString &pathFst, const QString &pathLast );
+    static bool     checkFolderFileName( const QString& name );
+    static bool     checkNewFolderOrFile( const QString& fileName, const QString &path, QString &errString );
+    static bool     isSubLevelPath( const QString &src, const QString &dest );
+    // </QtBasedFunctions>
+    //////////////////////////////////////////////////////////////////
+    
+    
+    //////////////////////////////////////////////////////////////////
+    // <platformBasedFunctions>
     static FmDriverInfo queryDriverInfo( const QString &driverName );
-    static QString formatStorageSize( quint64 size );
-    static int removeDrivePwd( const QString &driverName, const QString &Pwd );
-    static int unlockDrive( const QString &driverName, const QString &Pwd );
-    static int checkDrivePwd( const QString &driverName, const QString &pwd);
-    static int setDrivePwd( const QString &driverName, const QString &oldPwd, const QString &newPwd);
-    static void emptyPwd( QString &pwd );
-    static int renameDrive( const QString &driverName, const QString &newVolumeName);
-    static int ejectDrive( const QString &driverName );
-    static QString getFileType( const QString &filePath  );
-    static quint64 getDriveDetailsResult( const QString &folderPath, const QString &extension );
-    static bool isDriveC( const QString &driverName );
-    static bool isDrive( const QString &path );
-	static void createDefaultFolders( const QString &driverName );
-    static QString fillPathWithSplash( const QString &filePath );
-    static QString removePathSplash( const QString &filePath );
-    static QString formatPath( const QString &path  );
-    static bool checkDriveAccessFilter( const QString &driveName );
-    static QString checkDriveToFolderFilter( const QString &path );
-    static QString checkFolderToDriveFilter( const QString &path );
-    static int isPathAccessabel( const QString &path );
-    static bool isDriveAvailable( const QString &path );
-    static bool isPathEqual( const QString &pathFst, const QString &pathLast );
-
-    /// fill driveList of drives can be shown in driveListView
-    static void getDriveList( QStringList &driveList, bool isHideUnAvailableDrive );
-    static QString fillDriveVolume( QString driveName, bool isFillWithDefaultVolume );
-
-    static int launchFile( const QString &filePath );
-    static void sendFiles( QStringList &filePathList );
-    static QString getBurConfigPath( QString appPath );
-    static bool isDefaultFolder( const QString &folderPath  );
-    static QString Localize( const QString &path );
+    
+    // password related functions
+    static int      removeDrivePwd( const QString &driverName, const QString &Pwd );
+    static int      unlockDrive( const QString &driverName, const QString &Pwd );
+    static int      checkDrivePwd( const QString &driverName, const QString &pwd);
+    static int      setDrivePwd( const QString &driverName, const QString &oldPwd, const QString &newPwd);
+    static void     emptyPwd( QString &pwd );
+    
+    // external drive related functions
+    static int      renameDrive( const QString &driverName, const QString &newVolumeName);
+    static int      ejectDrive( const QString &driverName );
+    
+    // drive security related functions
+    static bool     checkDriveAccessFilter( const QString &driveName );
+    static QString  checkDriveToFolderFilter( const QString &path );
+    static QString  checkFolderToDriveFilter( const QString &path );
+    static int      isPathAccessabel( const QString &path );
+    static bool     isDriveAvailable( const QString &path );
     
-    static int getMaxFileNameLength();
-    static bool checkMaxPathLength( const QString& path );
-    static bool checkFolderFileName( const QString& name );
-    
-    /**
-     * check file or folder path is illegal or not.
-     *
-	 * @param  fileName file/folder name, used to check illegal characters
-     * @param  path file/folder path, used to check if path is available to use.
-     * @param  errString if return false, errString will be set for error note.
-     * @return true for not illegal and false for illegal path.
-     */
-    static bool checkNewFolderOrFile( const QString& fileName, const QString &path, QString &errString );
-    
-    /*
-     * get the volume name of the disk, if it is null, then return the default name.
-     * @param diskName the driver letter.
-     * @param defaultName whether it is the default name.
-     * @return the volume name.
-     */
-    static QString getVolumeNameWithDefaultNameIfNull( const QString &diskName, bool &defaultName );
-
-    static bool isSubLevelPath( const QString &src, const QString &dest );
-
-	static int setFileAttributes( const QString &srcFile, const QString &desFile ); 
+    // system default folder related functions
+    static bool     isDefaultFolder( const QString &folderPath  );
+    static void     createDefaultFolders( const QString &driverName );
+    static QString  localize( const QString &path );
+        
+    // copy move related functions
+    static int      setFileAttributes( const QString &srcFile, const QString &desFile );
+    static bool     hasEnoughSpace( const QString &targetDrive, qint64 size );
+    static int      moveInsideDrive( const QString &source, const QString &target );
+	
+    // other fucntions
+    static int      launchFile( const QString &filePath );
+    static void     sendFiles( QStringList &filePathList );
+    static QString  getBurConfigPath( QString appPath );
+    static QString  getFileType( const QString &filePath  );
+    static bool     isDriveC( const QString &driverName );
+    static int      getMaxFileNameLength();
+    static bool     checkMaxPathLength( const QString& path );
+    // </platformBasedFunctions>
+    //////////////////////////////////////////////////////////////////
 };
 
 #endif
--- a/filemanager/src/inc/fmutils_s60.cpp	Wed Aug 18 09:39:39 2010 +0300
+++ b/filemanager/src/inc/fmutils_s60.cpp	Thu Sep 02 20:16:57 2010 +0300
@@ -13,99 +13,57 @@
 *     Zhiqiang Yang <zhiqiang.yang@nokia.com>
 * 
 * Description:
-*     The source file of the file manager utilities
+*     The source file of the file manager utilities on Symbian
 */
 
 
 #include "fmutils.h"
+#include "fmcommon.h"
 #include "fms60utils.h"
-#include "fmcommon.h"
 
-#include <QRegExp>
-
+#include <apgcli.h>
+#include <sysutil.h>
+#include <f32file.h>
 #include <coemain.h>
+#include <pathinfo.h>
 #include <driveinfo.h>
 #include <e32property.h>
 #include <coreapplicationuisdomainpskeys.h>
-#include <f32file.h>
-#include <apgcli.h>
-#include <pathinfo.h>
-#include <CDirectoryLocalizer.h>
-#include <XQConversions>
-#include <QStringList>
-#include <QFileInfoList>
+
 #include <QDir>
 #include <QFile>
-#include <QIODevice>
+#include <QRegExp>
+#include <QStringList>
+#include <QFileInfoList>
+
+#include <xqappmgr.h>
 #include <XQConversions>
-#include <hbglobal.h>
-
 #include <xqaiwrequest.h>
-#include <xqappmgr.h>
 
 #include <shareui.h>
+#include <hbglobal.h>
+#include <hbdirectorynamelocalizer.h>
 
 #define BURCONFIGFILE  "z:/private/2002BCC0/burconfig.xml"
 
-
 /*!
-    Used to get drive type for convenience.
+    query drive info and status for \a driveName
+    return \a FmDriverInfo
 */
-FmDriverInfo::DriveType FmDriverInfo::driveType()
+FmDriverInfo FmUtils::queryDriverInfo( const QString &driveName )
 {
-    FmDriverInfo::DriveType driveType;
-    if( mDriveState & FmDriverInfo::EDriveRemovable ) {
-        if( mDriveState & FmDriverInfo::EDriveMassStorage ) {
-            driveType = FmDriverInfo::EDriveTypeMassStorage;
-        } else if( mDriveState & FmDriverInfo::EDriveUsbMemory ) {
-            driveType = FmDriverInfo::EDriveTypeUsbMemory;
-        } else if( mDriveState & FmDriverInfo::EDriveRemote ){
-            driveType = FmDriverInfo::EDriveTypeRemote;
-        } else {
-            driveType = FmDriverInfo::EDriveTypeMemoryCard;
-        }
-    } else if( mDriveState & FmDriverInfo::EDriveRom ) {
-        driveType = FmDriverInfo::EDriveTypeRom;
-    } else if( mDriveState & FmDriverInfo::EDriveRam ) {
-        driveType = FmDriverInfo::EDriveTypeRam;
-    } else {
-        driveType = FmDriverInfo::EDriveTypePhoneMemory;
-    }
-    
-    return driveType;
-}
-
-QString FmUtils::getDriveNameFromPath( const QString &path )
-{
-    // fillPathWithSplash make sure path length will be at least 3 if it is not empty.
-    QString checkedPath( fillPathWithSplash( path ) );
-    if( checkedPath.length() < 3 ) {
-        return QString();
-    }
-    return checkedPath.left( 3 );
-}
-
-QString FmUtils::getDriveLetterFromPath( const QString &path )
-{
-	if( path.length() <2 ) {
-        return QString();
-    }
-    return path.left( 1 );
-}
-
-FmDriverInfo FmUtils::queryDriverInfo( const QString &driverName )
-{
-    if( driverName.isEmpty() ) {
-        return FmDriverInfo( 0, 0, driverName, QString(), FmDriverInfo::EDriveNotPresent );
+    if( driveName.isEmpty() ) {
+        return FmDriverInfo( 0, 0, driveName, QString(), FmDriverInfo::EDriveNotPresent );
     }
     CCoeEnv *env = CCoeEnv::Static();
     RFs& fs = env->FsSession();
 
     TVolumeInfo volumeInfo;
     TInt drive = 0;
-    drive = driverName[0].toUpper().toAscii() - 'A' + EDriveA;
+    drive = driveName[0].toUpper().toAscii() - 'A' + EDriveA;
 
     quint32 state( 0 );
+    
     int volumeInfoErr( KErrNone );
     int driveInfoErr( KErrNone );
     int errorCode( KErrNone );
@@ -133,7 +91,6 @@
             if ( ( drvStatus & DriveInfo::EDriveInternal ) &&
                  ( drvStatus & DriveInfo::EDriveExternallyMountable ) ){
                 // Handle mass storage bits here
-        
                 state |= FmDriverInfo::EDriveMassStorage | FmDriverInfo::EDriveRemovable;
             }
         
@@ -224,34 +181,25 @@
         state |= FmDriverInfo::EDriveNotPresent;
         break;
     }
-    QString logString ( "FmUtils::queryDriverInfo_" + driverName + 
+    QString logString ( "FmUtils::queryDriverInfo_" + driveName + 
             "_volumeInfoErr:" + QString::number( volumeInfoErr ) +
             "_driveInfoErr:" + QString::number( driveInfoErr ) +
             "_errorCode:" + QString::number( errorCode ) + 
             "_driveSatus:" + QString::number( state ) );
     FM_LOG( logString );
-    return FmDriverInfo( volumeInfo.iSize, volumeInfo.iFree, driverName, volumeName, state );
+    return FmDriverInfo( volumeInfo.iSize, volumeInfo.iFree, driveName, volumeName, state );
 }
 
-QString FmUtils::formatStorageSize( quint64 size )
+/*!
+    remove drive password for \a driveName
+    \a Pwd is original password.
+*/
+int FmUtils::removeDrivePwd( const QString &driveName,  const QString &Pwd )
 {
-	if ( size < 1000 ) {
-		return QString::number( size ) + " B";
-	} else if ( size < 1000 * 1000 ) {
-		return QString::number( size / 1024.0, 'f', 2 ) + " KB";
-	} else if ( size < 1000 * 1000 * 1000 ) {
-		return QString::number( size / (1024.0 * 1024.0), 'f', 1 ) + " MB";
-	} else {
-	    return QString::number( size / ( 1024.0 * 1024.0 * 1024.0 ), 'f', 1 ) + " GB";	    
-	}
-}
-
-int FmUtils::removeDrivePwd( const QString &driverName,  const QString &Pwd )
-{
-    if( driverName.isEmpty() || Pwd.length() > FmMaxLengthofDrivePassword ) {
+    if( driveName.isEmpty() || Pwd.length() > FmMaxLengthofDrivePassword ) {
         return FmErrWrongParam;
     }
-    QString logString = "Drive name:" + driverName;
+    QString logString = "Drive name:" + driveName;
     FM_LOG( logString );
     logString = "Password:" + Pwd;
     FM_LOG( logString );
@@ -261,7 +209,7 @@
 
     TInt drive = 0;
 
-    drive = driverName[0].toUpper().toAscii() - 'A' + EDriveA;
+    drive = driveName[0].toUpper().toAscii() - 'A' + EDriveA;
 
     HBufC* password16 = XQConversions::qStringToS60Desc( Pwd );
     TMediaPassword password;   
@@ -289,12 +237,15 @@
     }
 }
 
-int FmUtils::unlockDrive( const QString &driverName,  const QString &Pwd )
+/*!
+    Unlock drive \a driveName with provided password \a Pwd
+*/
+int FmUtils::unlockDrive( const QString &driveName,  const QString &Pwd )
 {
-    if( driverName.isEmpty() || Pwd.length() > FmMaxLengthofDrivePassword ) {
+    if( driveName.isEmpty() || Pwd.length() > FmMaxLengthofDrivePassword ) {
         return FmErrWrongParam;
     }
-    QString logString = "Drive name:" + driverName;
+    QString logString = "Drive name:" + driveName;
     FM_LOG( logString );
     logString = "Password:" + Pwd;
     FM_LOG( logString );
@@ -303,7 +254,7 @@
 	RFs& fs = env->FsSession();
 
     TInt drive = 0;
-	drive = driverName[0].toUpper().toAscii() - 'A' + EDriveA;
+	drive = driveName[0].toUpper().toAscii() - 'A' + EDriveA;
     
     HBufC* password16 = XQConversions::qStringToS60Desc( Pwd );
     TMediaPassword password;   
@@ -336,25 +287,31 @@
     }
 }
 
-int FmUtils::checkDrivePwd( const QString &driverName, const QString &pwd )
+/*!
+    Check if \a pwd is the right password for drive \a driveName
+*/
+int FmUtils::checkDrivePwd( const QString &driveName, const QString &pwd )
 {
-    if( driverName.isEmpty() || pwd.length() > FmMaxLengthofDrivePassword ) {
+    if( driveName.isEmpty() || pwd.length() > FmMaxLengthofDrivePassword ) {
         return FmErrWrongParam;
     }
-    QString logString = "checkDrivePwd Drive name:" + driverName;
+    QString logString = "checkDrivePwd Drive name:" + driveName;
     logString += " password:" + pwd;
     FM_LOG( logString );
 
-    return setDrivePwd( driverName, pwd, pwd );
+    return setDrivePwd( driveName, pwd, pwd );
 }
 
-int FmUtils::setDrivePwd( const QString &driverName, const QString &oldPwd, const QString &newPwd)
+/*!
+    Set new password \a newPwd for drive \a driveName. \a oldPwd is old password
+*/
+int FmUtils::setDrivePwd( const QString &driveName, const QString &oldPwd, const QString &newPwd)
 {
-    if( driverName.isEmpty() || 
+    if( driveName.isEmpty() || 
         oldPwd.length() > FmMaxLengthofDrivePassword || newPwd.length() > FmMaxLengthofDrivePassword  ) {
         return FmErrWrongParam;
     }
-    QString logString = "setDrivePwd Drive name:" + driverName ;
+    QString logString = "setDrivePwd Drive name:" + driveName ;
     logString += " Old password:" + oldPwd;
     logString += " New password:" + newPwd;
     FM_LOG( logString );
@@ -363,7 +320,7 @@
 	RFs& fs = env->FsSession();
 
     TInt drive = 0;
-	drive = driverName[0].toUpper().toAscii() - 'A' + EDriveA;
+	drive = driveName[0].toUpper().toAscii() - 'A' + EDriveA;
 	
     HBufC* newPassword16 = XQConversions::qStringToS60Desc( newPwd);
     HBufC* oldPassword16 = XQConversions::qStringToS60Desc( oldPwd );
@@ -397,6 +354,9 @@
     }
 }
 
+/*!
+    Set \a pwd as empty password
+*/
 void FmUtils::emptyPwd( QString &pwd )
 {
     TBuf< FmMaxLengthofDrivePassword > nullPwd;
@@ -405,9 +365,12 @@
     pwd = XQConversions::s60DescToQString( nullPwd );
 }
 
-int FmUtils::renameDrive( const QString &driverName, const QString &newVolumeName)
+/*!
+    Set drive volume for drive \a driveName
+*/
+int FmUtils::renameDrive( const QString &driveName, const QString &newVolumeName)
 {
-    if( driverName.isEmpty() ) {
+    if( driveName.isEmpty() ) {
         return FmErrWrongParam;
     }
     foreach( const QChar &ch, newVolumeName )
@@ -425,7 +388,7 @@
 	RFs& fs = env->FsSession();
 
     TInt drive = 0;
-	drive = driverName[0].toUpper().toAscii() - 'A' + EDriveA;
+	drive = driveName[0].toUpper().toAscii() - 'A' + EDriveA;
 
     TPtr newName ( ( XQConversions::qStringToS60Desc( newVolumeName ) )->Des() );
 
@@ -445,16 +408,19 @@
     }
 }
 
-int FmUtils::ejectDrive( const QString &driverName )
+/*!
+    Eject drive \a driveName
+*/
+int FmUtils::ejectDrive( const QString &driveName )
 {
-    if( driverName.isEmpty() ) {
+    if( driveName.isEmpty() ) {
         return FmErrWrongParam;
     }
     QString logString = "FmUtils::ejectDrive start";
     FM_LOG( logString );
 
     TInt drive = 0;
-	drive = driverName[0].toUpper().toAscii() - 'A' + EDriveA;
+	drive = driveName[0].toUpper().toAscii() - 'A' + EDriveA;
 
     const int KDriveShift = 16;
 
@@ -467,119 +433,166 @@
     return FmErrNone;
 }
 
-QString FmUtils::getFileType( const QString &filePath  )
+/*!
+    Check if drive \a driveName is accessable for user
+*/
+bool FmUtils::checkDriveAccessFilter( const QString &driveName )
+{
+    if( driveName.isEmpty() ) {
+        return false;
+    }
+    FmDriverInfo driveInfo = queryDriverInfo( driveName );
+    if( ( driveInfo.driveState()& FmDriverInfo::EDriveRam ) ||
+        ( driveInfo.driveState()& FmDriverInfo::EDriveRom ) ) {
+        return false;
+    }
+    return true;
+}
+
+/*!
+    This function should be called to adjust path if user goto a drive.
+    data folder will be append to C:\ becuase user could only view C:\data instead C:\ 
+*/
+QString FmUtils::checkDriveToFolderFilter( const QString &path )
 {
-    RApaLsSession apaSession;
-    TDataType dataType;
-    TUid appUid;
-    
-    TBuf<128> mimeTypeBuf;
-        
-    int err = apaSession.Connect();
+    QString checkedPath = fillPathWithSplash( path );
+    if( checkedPath.compare( Drive_C, Qt::CaseInsensitive ) == 0 ) {
+        checkedPath += QString( "data" ) + QDir::separator();
+        return checkedPath;
+    }
+    return path;
+
+}
+
+/*!
+    This function should be called to adjust path if user back to up level path.
+    If user is at C:\data then path level should be returned as C:\
+    Becuase C:\data is root path for C drive 
+*/
+QString FmUtils::checkFolderToDriveFilter( const QString &path )
+{
+    QString logString;
+    logString = QString( "checkFolderToDriveFilter: " ) + path;
+    FM_LOG( logString );
+    QString checkedPath = fillPathWithSplash( path );
+
+    logString = QString( "checkFolderToDriveFilter_fillPathWithSplash: " ) + checkedPath;
+    FM_LOG( logString );
     
-    if ( err == KErrNone ){   
-        err = apaSession.AppForDocument( XQConversions::qStringToS60Desc( filePath )->Des(), 
-                                         appUid, dataType );
-        
-        if( err == KErrNone ){
-            mimeTypeBuf.Copy(dataType.Des8());
-        }  
+    if( checkedPath.compare( Folder_C_Data, Qt::CaseInsensitive ) == 0 ) {
+        FM_LOG( QString( " change from c:/data/ to C:/" ) );
+        return Drive_C;
     }
-    
-    apaSession.Close();
-    return XQConversions::s60DescToQString( mimeTypeBuf );
+    return path;
+
 }
 
-quint64 FmUtils::getDriveDetailsResult( const QString &folderPath, const QString &extension )
+/*!
+    Check if \a path is accessable for user
+*/
+int FmUtils::isPathAccessabel( const QString &path )
 {
-    int err;
-    
-    RFs fs;
-    err = fs.Connect();
-    
-    QString string( fillPathWithSplash( folderPath ) );
+    // Used to check if path is accessable, very important feature
+    // and will return filemanager error.
+    FM_LOG( QString( "isPathAccessabel:" ) + path );
+    if( path.isEmpty() ) {
+        return FmErrPathNotExist;
+    }
 
-    TPtrC desFolderPath( XQConversions::qStringToS60Desc( string )->Des() );
-    TPtrC ptrExtension( XQConversions::qStringToS60Desc( extension )->Des() );
-    
-    CDir* results = 0;
-    TParse parse;
-    
-    quint64 size = 0;
-    
-    const TInt pathlength = ptrExtension.Length() + desFolderPath.Length();
-    
-    if ( pathlength > KMaxFileName ){
-        err = KErrNotFound;   
+    // used to filter locked/ejected/corrupted drive
+    // check if drive is available, no matter if it is a drive, a folder, or a file.
+    if( !isDriveAvailable( path ) ) {
+        FM_LOG( QString( "isPathAccessabel false: path is drive and not available" ) );
+        return FmErrDriveNotAvailable;
     }
-    else{
-        err = fs.Parse( ptrExtension, desFolderPath, parse );
-        err = fs.GetDir( parse.FullName(), KEntryAttMaskSupported|KEntryAttAllowUid, 
-            ESortNone, results );
-        
-        TDesC des = parse.FullName();
-        
-        if (err == KErrNotFound)
-            {
-            return 0;
-            }
-    }
-    
-    if ( results ){
-        CleanupStack::PushL(results);
+
+    QFileInfo fileInfo( path );
 
-        // Go through all files in the list and tell subclass
-        TFileName file;
-        const TInt count = results->Count();
-        for( TInt i=0; i<count; ++i ){
-            const TEntry& entry = (*results)[i];
-            file = desFolderPath;
-            file += entry.iName;
-            size += entry.iSize;          
-        }
-        CleanupStack::PopAndDestroy(results);
+    if( fileInfo.absoluteFilePath().contains( Drive_C, Qt::CaseInsensitive ) &&
+        !fileInfo.absoluteFilePath().contains( Folder_C_Data, Qt::CaseInsensitive ) ) {
+        FM_LOG( QString( "isPathAccessabel false: path contain C and not in data folder" ) );
+        return FmErrPathDenied;
     }
-    
-    fs.Close();
-    
-    return size;  
+    if( !checkDriveAccessFilter( FmUtils::getDriveNameFromPath( fileInfo.absoluteFilePath() ) ) ){
+        return FmErrDriveDenied;
+    }
+    if( !fileInfo.exists() ) {
+        FM_LOG( QString( "isPathAccessabel false: path not exist" ) );
+        return FmErrPathNotExist;
+    }
+    FM_LOG( QString( "isPathAccessabel FmErrNone" ) );
+    return FmErrNone;
 }
 
-bool FmUtils::isDriveC( const QString &driverName )
+/*!
+    Check if drive related to \a path is available.
+    This function should not check if path is available. Only responsible for checking drive  
+    When MMC is not inserted, also return false
+*/
+bool FmUtils::isDriveAvailable( const QString &path )
 {
-    if( driverName.isEmpty() ) {
-        return false;
-    }
-    TInt drive = 0;
-    drive = driverName[0].toUpper().toAscii() - 'A' + EDriveA;
-    if( drive == EDriveC ){
-        return true;
-    }
-    else{
+    FM_LOG( QString( "isDriveAvailable:" ) + path );
+    if( path.isEmpty() ) {
         return false;
     }
-   
+    FmDriverInfo::DriveState driveState = queryDriverInfo( path ).driveState();
+    if( ( driveState & FmDriverInfo::EDriveAvailable ) ) {
+        FM_LOG( QString( "isDriveAvailable true" ) );
+        return true;
+    }
+    FM_LOG( QString( "isDriveAvailable false" ) );
+    return false;
 }
 
-bool FmUtils::isDrive( const QString &path )
+/*!
+    Check if \a folderPath is default folder for system
+*/
+bool FmUtils::isDefaultFolder( const QString &folderPath  )
 {
-   bool ret( false );
-   if( path.length() <= 3 && path.length() >=2 ) {
-       ret = true;
-   }
-   
-   return ret;   
+    HBufC *path = XQConversions::qStringToS60Desc( folderPath );
+    TPtrC desFolderPath( path->Des() );
+    
+    bool ret( true );
+    TInt pathType( PathInfo::PathType( desFolderPath ) );
+    switch( pathType ){
+       case PathInfo::ENotSystemPath:{
+           QString locString( localize( folderPath ) );
+            if ( locString.isEmpty() ){
+                ret = false;
+                break;
+            }
+            ret = true;
+            break;
+            }
+        case PathInfo::EPhoneMemoryRootPath: // FALL THROUGH
+        case PathInfo::EMemoryCardRootPath: // FALL THROUGH
+        case PathInfo::ERomRootPath:{
+            ret = false;
+            break;
+        }
+        // Accept other folders
+        default:{
+            ret = true;
+            break;
+        }
+    }
+    delete path;
+    return ret;
 }
 
-void FmUtils::createDefaultFolders( const QString &driverName )
+/*!
+    Create system default folders for drive \a driveName.
+    Default folders should be created after format a drive.
+*/
+void FmUtils::createDefaultFolders( const QString &driveName )
 {
-    if( driverName.isEmpty() ) {
+    if( driveName.isEmpty() ) {
         return;
     }
     int err;
     
     TInt drive = 0;
-    drive = driverName[0].toUpper().toAscii() - 'A' + EDriveA;
+    drive = driveName[0].toUpper().toAscii() - 'A' + EDriveA;
     
     RFs fs;
     err = fs.Connect();
@@ -643,440 +656,17 @@
 }
 
 /*!
-    fill splash in the end of \a filePath if the path is not a file
-    All "/" and "\" will be changed to QDir::separator
-    \sa formatPath only changed "/" and "\" to QDir::separator
+    In Symbian system, default folders will be localized.
+    So localize is used to check if a path is a default folder
+    \sa isDefaultFolder
 */
-QString FmUtils::fillPathWithSplash( const QString &filePath )
-{
-	QString newFilePath;
-    if( filePath.isEmpty() ) {
-        return newFilePath;
-    }
-
-    newFilePath = formatPath( filePath );
-    
-    if( newFilePath.right( 1 )!= QDir::separator() ){
-        newFilePath.append( QDir::separator() );
-    }
-    return newFilePath;
-}
-
-QString FmUtils::removePathSplash( const QString &filePath )
-{
-    QString newFilePath( filePath );
-    if( filePath.right( 1 ) == QChar( '/' ) || filePath.right(1) == QString( "\\" ) ) {
-        newFilePath = filePath.left( filePath.length() - 1 );
-    }
-    return newFilePath;
-}
-
-// filter un-accessable drive
-bool FmUtils::checkDriveAccessFilter( const QString &driveName )
-{
-    if( driveName.isEmpty() ) {
-        return false;
-    }
-    FmDriverInfo driveInfo = queryDriverInfo( driveName );
-    if( ( driveInfo.driveState()& FmDriverInfo::EDriveRam ) ||
-        ( driveInfo.driveState()& FmDriverInfo::EDriveRom ) ) {
-        return false;
-    }
-    return true;
-}
-
-QString FmUtils::checkDriveToFolderFilter( const QString &path )
-{
-    /*
-    QFileInfo fileInfo( path );
-    if( !fileInfo.exists() ) {
-            return QString();
-        }
-    */
-    QString checkedPath = fillPathWithSplash( path );
-    if( checkedPath.compare( Drive_C, Qt::CaseInsensitive ) == 0 ) {
-        checkedPath += QString( "data" ) + QDir::separator();
-        return checkedPath;
-    }
-    return path;
-
-}
-
-QString FmUtils::checkFolderToDriveFilter( const QString &path )
-{
-    QString logString;
-    logString = QString( "checkFolderToDriveFilter: " ) + path;
-    FM_LOG( logString );
-    QString checkedPath = fillPathWithSplash( path );
-
-    logString = QString( "checkFolderToDriveFilter_fillPathWithSplash: " ) + checkedPath;
-    FM_LOG( logString );
-    
-    if( checkedPath.compare( Folder_C_Data, Qt::CaseInsensitive ) == 0 ) {
-        FM_LOG( QString( " change from c:/data/ to C:/" ) );
-        return Drive_C;
-    }
-    return path;
-
-}
-
-int FmUtils::isPathAccessabel( const QString &path )
-{
-    // Used to check if path is accessable, very important feature
-    // and will return filemanager error.
-    FM_LOG( QString( "isPathAccessabel:" ) + path );
-    if( path.isEmpty() ) {
-        return FmErrPathNotExist;
-    }
-
-    // used to filter locked/ejected/corrupted drive
-    // check if drive is available, no matter if it is a drive, a folder, or a file.
-    if( !isDriveAvailable( path ) ) {
-        FM_LOG( QString( "isPathAccessabel false: path is drive and not available" ) );
-        return FmErrDriveNotAvailable;
-    }
-
-    QFileInfo fileInfo( path );
-    if( fileInfo.absoluteFilePath().contains( Drive_C, Qt::CaseInsensitive ) &&
-        !fileInfo.absoluteFilePath().contains( Folder_C_Data, Qt::CaseInsensitive ) ) {
-        FM_LOG( QString( "isPathAccessabel false: path contain C and not in data folder" ) );
-        return FmErrPathDenied;
-    }
-    if( !checkDriveAccessFilter( FmUtils::getDriveNameFromPath( fileInfo.absoluteFilePath() ) ) ){
-        return FmErrDriveDenied;
-    }
-    if( !fileInfo.exists() ) {
-        FM_LOG( QString( "isPathAccessabel false: path not exist" ) );
-        return FmErrPathNotExist;
-    }
-    FM_LOG( QString( "isPathAccessabel FmErrNone" ) );
-    return FmErrNone;
-}
-
-// only used to check drive, when MMC is not inserted, also return false
-bool FmUtils::isDriveAvailable( const QString &path )
-{
-    FM_LOG( QString( "isDriveAvailable:" ) + path );
-    if( path.isEmpty() ) {
-        return false;
-    }
-    FmDriverInfo::DriveState driveState = queryDriverInfo( path ).driveState();
-    if( ( driveState & FmDriverInfo::EDriveAvailable ) ) {
-        FM_LOG( QString( "isDriveAvailable true" ) );
-        return true;
-    }
-    FM_LOG( QString( "isDriveAvailable false" ) );
-    return false;
-}
-
-void FmUtils::getDriveList( QStringList &driveList, bool isHideUnAvailableDrive )
-{
-    if( isHideUnAvailableDrive ) {
-        FM_LOG( QString( "getDriveList HideUnAvailableDrive_true" ) );
-    } else {
-        FM_LOG( QString( "getDriveList HideUnAvailableDrive_false" ) );
-    }
-    QFileInfoList infoList = QDir::drives();
-
-    foreach( QFileInfo fileInfo, infoList ) {
-        QString driveName = fileInfo.absolutePath();
-        if( checkDriveAccessFilter( driveName ) ) {
-            if( !isHideUnAvailableDrive ) {
-                driveList.append( driveName );
-            }
-            else if ( isDriveAvailable( driveName ) ) {
-                driveList.append( driveName );
-            }
-        }
-    }
-    return;
-}
-
-/*!
-    fill volume name for \a driveName, with drive letter at the front, for example, C: Phone memory
-    if \a isFillWithDefaultVolume is true, default volume is provided for non-volume drive.
-*/
-QString FmUtils::fillDriveVolume( QString driveName, bool isFillWithDefaultVolume )
-{
-    QString ret;
-    if( driveName.isEmpty() ) {
-        return ret;
-    }
-    QString tempDriveName = fillPathWithSplash( driveName );
-
-    QString checkedDriveName( removePathSplash( driveName ) );
-    
-    FmDriverInfo driverInfo = FmUtils::queryDriverInfo( tempDriveName );
-    QString volumeName = driverInfo.volumeName();
-    
-    if( volumeName.isEmpty() && isFillWithDefaultVolume ){
-        switch ( driverInfo.driveType() )
-            {
-            case FmDriverInfo::EDriveTypeMassStorage:
-                ret = hbTrId( "txt_fmgr_dblist_1_mass_storage" ).arg( checkedDriveName );
-                break;
-            case FmDriverInfo::EDriveTypeUsbMemory:
-                ret = hbTrId( "txt_fmgr_dblist_1_usb_memory" ).arg( checkedDriveName );
-                break;
-            case FmDriverInfo::EDriveTypeMemoryCard:
-                ret = hbTrId( "txt_fmgr_dblist_1_memory_card" ).arg( checkedDriveName );
-                break;
-            case FmDriverInfo::EDriveTypePhoneMemory:
-                ret = hbTrId( "txt_fmgr_dblist_1_device_memory" ).arg( checkedDriveName );
-                break;
-            default:
-                Q_ASSERT_X( false, "FmUtils::fillDriveVolume", "please handle drive type");
-                break;
-            }    
-    }
-    
-    if( ret.isEmpty() ) {
-        // ret is not got. fill ret as default method
-        // txt_fmgr_dblist_1_2 is not correct, can not use.
-        ret = hbTrId( "%1 %2" ).arg( checkedDriveName ).arg( volumeName );
-    }
-    return ret;
-}
-
-
-/*!
-    return volume name for \a driveName. without drive letter at the front.
-    \a defaultName is set true if default volume name is return for volume name
-*/
-QString FmUtils::getVolumeNameWithDefaultNameIfNull( const QString &diskName, bool &defaultName )
+QString FmUtils::localize( const QString &path )
 {
-    FmDriverInfo driverInfo = FmUtils::queryDriverInfo( diskName );
-          
-    QString volumeName = driverInfo.volumeName();    
-    //save the volume status, whether it is default name
-    defaultName = false;
-    //volume name may be null if not set, it will be set at least for one time in the following while cycling.
-    if ( volumeName.isEmpty() ) {
-        defaultName = true;
-        switch ( driverInfo.driveType() )
-            {
-            case FmDriverInfo::EDriveTypeMassStorage:
-                volumeName = hbTrId("Mass storage"); 
-                break;
-            case FmDriverInfo::EDriveTypeUsbMemory:
-                volumeName = hbTrId("USB memory"); 
-                break;
-            case FmDriverInfo::EDriveTypeMemoryCard:
-                volumeName = hbTrId("Memory card");
-                break;
-            case FmDriverInfo::EDriveTypePhoneMemory:
-                volumeName = hbTrId("Device memory");
-                break;
-            default:
-                Q_ASSERT_X( false, "FmUtils::getVolumeNameWithDefaultNameIfNull", "please handle drive type" );
-                break;
-            }   
-    }
-    return volumeName;
-}
-
-int FmUtils::launchFile( const QString &filePath )
-{
-    QFile file( filePath );
-    if( !file.exists() ) {
-        return false;
-    }
-        
-    XQApplicationManager mAiwMgr;
-    XQAiwRequest *request = mAiwMgr.create(file);
-    if ( request == 0 ) {
-        // No handlers for the URI
-        return FmErrUnKnown;
-    }
-    
-    // Set function parameters
-    QList<QVariant> args;
-    args << file.fileName();
-    request->setArguments(args);
-    
-    // Send the request
-    bool res = request->send();
-    if  (!res) 
-    {
-       // Request failed. 
-      int error = request->lastError();
-      
-      delete request;
-      return FmErrUnKnown;
-    }
-    
-    delete request;
-    return FmErrNone;
-}
-
-void FmUtils::sendFiles( QStringList &filePathList )
-{
-    ShareUi shareui;
-    shareui.send( filePathList, false );
-}
-
-QString FmUtils::getBurConfigPath( QString appPath )
-{
-    Q_UNUSED( appPath );
-    QString path( BURCONFIGFILE );
-    return path;
-}
-
-bool FmUtils::isPathEqual( const QString &pathFst, const QString &pathLast )
-{
-    QString fst( fillPathWithSplash( pathFst ) );
-    QString last( fillPathWithSplash( pathLast ) );
-    if( fst.compare( last, Qt::CaseInsensitive ) == 0 ) {
-        return true;
-    }
-    return false;
-}
-
-bool FmUtils::isDefaultFolder( const QString &folderPath  )
-{
-    TPtrC desFolderPath( XQConversions::qStringToS60Desc( folderPath )->Des() );
+    // HbDirectoryNameLocalizer can not recognize path with \ in the end
+    QString locPath( removePathSplash( path ) );
     
-    TInt pathType( PathInfo::PathType( desFolderPath ) );
-    switch( pathType ){
-       case PathInfo::ENotSystemPath:{
-           QString locString( Localize( folderPath ) );
-            if ( locString.isEmpty() ){
-                return false;
-            }
-            return true;
-            }
-        case PathInfo::EPhoneMemoryRootPath: // FALL THROUGH
-        case PathInfo::EMemoryCardRootPath: // FALL THROUGH
-        case PathInfo::ERomRootPath:{
-            return false;
-        }
-        // Accept other folders
-        default:{
-            return true;
-        }
-    }
-}
-
-QString FmUtils::Localize( const QString &path )
-{
-    QString locPath = fillPathWithSplash( path );
-
-    TPtrC desPath( XQConversions::qStringToS60Desc( locPath )->Des() );
-    CDirectoryLocalizer *localizer = CDirectoryLocalizer::NewL();
-
-    localizer->SetFullPath( desPath );
-    if( localizer->IsLocalized() ){   
-        return XQConversions::s60DescToQString( localizer->LocalizedName() );
-    }
-    
-    return QString();
-}
-
-/*!
-    All "/" and "\" in \a path will be changed to QDir::separator
-    \sa fillPathWithSplash, fillPathWithSplash will append QDir::separator in the end if path is no a file
-*/
-QString FmUtils::formatPath( const QString &path  )
-{
-    QString formatPath;
-    if( path.isEmpty() ) {
-        return formatPath;
-    }
-    
-	foreach( QChar ch, path ) {
-		if( ch == QChar('\\') || ch == QChar('/') ) {
-			formatPath.append( QDir::separator() );
-		} else {
-			formatPath.append( ch );
-		}
-    }
-
-    return formatPath;
-}
-
-int FmUtils::getMaxFileNameLength()
-{
-    return KMaxFileName;
-}
-
-bool FmUtils::checkMaxPathLength( const QString& path )
-{
-    if( path.length() > KMaxPath ) {
-        return false;
-    }
-    return true;
-}
-
-bool FmUtils::checkFolderFileName( const QString& name )
-{
-    // trim space firest, because there may be some spaces after "." ,  it is also not valid
-    QString trimmedName( name.trimmed() );
-	if( trimmedName.isEmpty() ) {
-		return false;
-	}
-    if( trimmedName.endsWith( QChar('.'),  Qt::CaseInsensitive ) ) {
-        return false;
-    }
-    if( trimmedName.contains( QChar('\\'), Qt::CaseInsensitive ) ||
-        trimmedName.contains( QChar('/'),  Qt::CaseInsensitive ) ||
-        trimmedName.contains( QChar(':'),  Qt::CaseInsensitive ) ||
-        trimmedName.contains( QChar('*'),  Qt::CaseInsensitive ) ||
-        trimmedName.contains( QChar('?'),  Qt::CaseInsensitive ) ||
-        trimmedName.contains( QChar('\"'), Qt::CaseInsensitive ) ||
-        trimmedName.contains( QChar('<'),  Qt::CaseInsensitive ) ||
-        trimmedName.contains( QChar('>'),  Qt::CaseInsensitive ) ||
-        trimmedName.contains( QChar('|'),  Qt::CaseInsensitive ) ){
-        return false;
-    }
-    // use orignal name to exam max size of file name
-    if( name.length() > KMaxFileName ) {
-        return false;
-    }
-    return true;
-}
-
-bool FmUtils::checkNewFolderOrFile( const QString &fileName, const QString &path, QString &errString )
-{
-    // first check if fileName is valid, then check if path length is valid, and check if file/foler is existed at last
-    QFileInfo fileInfo( path );
-    bool ret( true );   
-    if (!FmUtils::checkFolderFileName( fileName ) ) {
-        errString = hbTrId( "Invalid file or folder name!" );
-        ret = false;
-    } else if( !FmUtils::checkMaxPathLength( path ) ) {
-        errString = hbTrId( "the path you specified is too long!" );
-        ret = false;
-    } else if (fileInfo.exists()) {
-        errString = hbTrId( "%1 already exist!" ).arg( fileInfo.fileName() );
-        ret = false;
-    }
-    return ret;
-}
-
-/*!
-    Check if \a dest is sub level path of \a src
-    Used to check True/False when copy a folder to itself or its subfolder
-    For example, c:\data\test is sub path of c:\data.
-    But c:\data123\test is not sub path of c:\data.
-    So after got right part of path, the first char must be \ or /
-*/
-bool FmUtils::isSubLevelPath( const QString &src, const QString &dest )
-{
-    FM_LOG("FmUtils::isSubFolder: src=" + src + " dest=" + dest);
-    QString checkedSrc( FmUtils::fillPathWithSplash( src ) );
-    QString checkedDest( FmUtils::fillPathWithSplash( dest ) );
-    
-    if( checkedDest.contains( checkedSrc, Qt::CaseInsensitive) &&
-            checkedDest.length() > checkedSrc.length() ) {
-        // for example c:\data\ vs c:\data\123\ 
-        FM_LOG("FmUtils::isSubFolder: true");
-        return true;
-    }
-    // for example c:\data\ vs c:\data\ 
-    // for example c:\data\ vs c:\data123\ 
-
-    FM_LOG("FmUtils::isSubFolder: false");
-    return false;
+    HbDirectoryNameLocalizer localizer;
+    return localizer.translate( locPath );
 }
 
 /*!
@@ -1111,3 +701,159 @@
     CleanupStack::PopAndDestroy(); // fsSession
     return err;
 }
+
+/*!
+    judge whether there is enough space on \a targetDrive for \a size.
+    return true if has, false if not.
+*/
+bool FmUtils::hasEnoughSpace( const QString &targetDrive, qint64 size )
+{
+    RFs fsSession;
+    QT_TRAP_THROWING( fsSession.Connect() ); 
+    CleanupClosePushL( fsSession );
+    TInt dstDrv(0);
+    HBufC* hbuf = XQConversions::qStringToS60Desc( targetDrive );
+    QT_TRAP_THROWING( RFs::CharToDrive( hbuf->operator [](0), dstDrv ) );
+    bool ret = !SysUtil::DiskSpaceBelowCriticalLevelL( &fsSession,  size , dstDrv );
+    CleanupStack::PopAndDestroy(); // fsSession
+    return ret;
+    
+}
+
+/*!
+    move one file insice the same drive, from \a source to \a target.
+    return KErrNone if successful, otherwise one of the other system-wide error codes.
+*/
+int FmUtils::moveInsideDrive( const QString &source, const QString &target )
+{
+    RFs fsSession;
+    QT_TRAP_THROWING( fsSession.Connect() ); 
+    CleanupClosePushL( fsSession );
+    HBufC* oldName = XQConversions::qStringToS60Desc( source );
+    HBufC* newName = XQConversions::qStringToS60Desc( target );
+    int ret = fsSession.Rename( *oldName, *newName );
+    CleanupStack::PopAndDestroy(); // fsSession
+    return ret;    
+}
+
+/*!
+   Launch a file with associated application.
+*/
+int FmUtils::launchFile( const QString &filePath )
+
+{
+    QFile file( filePath );
+    if( !file.exists() ) {
+        return false;
+    }
+        
+    XQApplicationManager mAiwMgr;
+    XQAiwRequest *request = mAiwMgr.create(file);
+    if ( request == 0 ) {
+        // No handlers for the URI
+        return FmErrUnKnown;
+    }
+    
+    // Set function parameters
+    QList<QVariant> args;
+    args << file.fileName();
+    request->setArguments(args);
+    
+    // Send the request
+    bool res = request->send();
+    if  (!res) 
+    {
+       // Request failed. 
+      int error = request->lastError();
+      
+      delete request;
+      return FmErrUnKnown;
+    }
+    
+    delete request;
+    return FmErrNone;
+}
+
+/*!
+    Send files( \a filePathList ) with share ui.
+*/
+void FmUtils::sendFiles( QStringList &filePathList )
+{
+    ShareUi shareui;
+    shareui.send( filePathList, false );
+}
+
+/*!
+    return path for backup restore config file.
+    Currently \a appPath is not used.
+*/
+QString FmUtils::getBurConfigPath( QString appPath )
+{
+    Q_UNUSED( appPath );
+    QString path( BURCONFIGFILE );
+    return path;
+}
+
+/*!
+    return MetaData string for \a filePath
+*/
+QString FmUtils::getFileType( const QString &filePath  )
+{
+    RApaLsSession apaSession;
+    TDataType dataType;
+    TUid appUid;
+    
+    TBuf<128> mimeTypeBuf;
+        
+    int err = apaSession.Connect();
+    
+    if ( err == KErrNone ){   
+        err = apaSession.AppForDocument( XQConversions::qStringToS60Desc( filePath )->Des(), 
+                                         appUid, dataType );
+        
+        if( err == KErrNone ){
+            mimeTypeBuf.Copy(dataType.Des8());
+        }  
+    }
+    
+    apaSession.Close();
+    return XQConversions::s60DescToQString( mimeTypeBuf );
+}
+
+/*!
+    Check if drive \a driveName is drive C
+*/
+bool FmUtils::isDriveC( const QString &driveName )
+{
+    if( driveName.isEmpty() ) {
+        return false;
+    }
+    TInt drive = 0;
+    drive = driveName[0].toUpper().toAscii() - 'A' + EDriveA;
+    if( drive == EDriveC ){
+        return true;
+    }
+    else{
+        return false;
+    }
+   
+}
+
+/*!
+    return max file name length
+*/
+int FmUtils::getMaxFileNameLength()
+{
+    return KMaxFileName;
+}
+
+/*!
+    Check if length of \a path is exceed max path length. 
+*/
+bool FmUtils::checkMaxPathLength( const QString& path )
+{
+    if( path.length() > KMaxPath ) {
+        return false;
+    }
+    return true;
+}
--- a/filemanager/src/inc/fmutils_win.cpp	Wed Aug 18 09:39:39 2010 +0300
+++ b/filemanager/src/inc/fmutils_win.cpp	Thu Sep 02 20:16:57 2010 +0300
@@ -16,14 +16,15 @@
 *     The source file of the file manager utilities on windows
 */
 
+#include "fmutils.h"
+
 #include <windows.h>
 
-#include "fmutils.h"
 #include <QDir>
+#include <QUrl>
+#include <QVariant>
 #include <QFileInfo>
 #include <QDesktopServices>
-#include <QUrl>
-#include <QVariant>
 
 #include <hbglobal.h>
 
@@ -31,39 +32,23 @@
 const int KMaxFileName=0x100;
 const int KMaxPath=0x100;
 
-QString FmUtils::getDriveNameFromPath( const QString &path )
-{
-    if( path.length() <3 ) {
-        return QString();
-    }
-    return path.left( 3 );
-}
-
-QString FmUtils::getDriveLetterFromPath( const QString &path )
-{
-	if( path.length() <3 ) {
-        return QString();
-    }
-    return path.left( 1 );
-}
-
-FmDriverInfo FmUtils::queryDriverInfo( const QString &driverName )
+FmDriverInfo FmUtils::queryDriverInfo( const QString &driveName )
 {
     quint64 size = 0;
     quint64 freeSize = 0;
-    QString driver = driverName;
+    QString drive = driveName;
     
-    driver.replace( '/', "\\" );
-    if ( driver.right(1) != "\\" ) {
-        driver.append( "\\" );
+    drive.replace( '/', "\\" );
+    if ( drive.right(1) != "\\" ) {
+        drive.append( "\\" );
     }
-    GetDiskFreeSpaceEx( (LPCWSTR)driver.constData(),
+    GetDiskFreeSpaceEx( (LPCWSTR)drive.constData(),
                         (PULARGE_INTEGER)&freeSize,
                         (PULARGE_INTEGER)&size,
                         0 );
 
     TCHAR volumeName[MAX_PATH + 1] = { 0 };
-    GetVolumeInformation( (LPCWSTR)driver.constData(),
+    GetVolumeInformation( (LPCWSTR)drive.constData(),
                           &volumeName[0],
                           MAX_PATH + 1,
                           0,
@@ -73,87 +58,42 @@
                           0 );
 
     quint32 state( 0 );
-    quint32 drvStatus = GetDriveType( (LPCWSTR)driver.constData() );
+    quint32 drvStatus = GetDriveType( (LPCWSTR)drive.constData() );
     if ( drvStatus == DRIVE_REMOVABLE  ) {
         state |= FmDriverInfo::EDriveRemovable;
     }
-#ifdef _DEBUG_DISABLE_DRIVE_D_TEST_DRIVEHIDE_
-	if ( driverName.contains( Drive_D, Qt::CaseInsensitive )  ) {
-		state |= FmDriverInfo::EDriveNotPresent;
-    }
-#endif
 
-#ifdef _DEBUG_LOCKED_DRIVE_Z
-	if ( driverName.contains( Drive_Z, Qt::CaseInsensitive )  ) {
-		state |= FmDriverInfo::EDriveLocked;
-    }
-#endif
 	if( !(state&FmDriverInfo::EDriveNotPresent) && !(state&FmDriverInfo::EDriveLocked) &&
 		!(state&FmDriverInfo::EDriveCorrupted) ) {
 		state |= FmDriverInfo::EDriveAvailable;
 	}
-    return FmDriverInfo( size, freeSize, driverName, QString::fromWCharArray( &volumeName[0] ), state );
-}
-
-QString FmUtils::formatStorageSize( quint64 size )
-{
-	if ( size < 1000 ) {
-		return QString::number( size ) + " B";
-	} else if ( size < 1000 * 1000 ) {
-		return QString::number( size / 1024.0, 'f', 2 ) + " KB";
-	} else if ( size < 1000 * 1000 * 1000 ) {
-		return QString::number( size / (1024.0 * 1024.0), 'f', 1 ) + " MB";
-	} else {
-	    return QString::number( size / ( 1024.0 * 1024.0 * 1024.0 ), 'f', 1 ) + " GB";	    
-	}
+    return FmDriverInfo( size, freeSize, driveName, QString::fromWCharArray( &volumeName[0] ), state );
 }
 
-/*
-quint32 FmUtils::getDriverState( const QString &driverName )
+int FmUtils::removeDrivePwd( const QString &driveName,  const QString &Pwd )
 {
-    quint32 state( 0 );
-
-    QString driver = driverName;
-    
-    driver.replace( '/', "\\" );
-    if ( driver.right(1) != "\\" ) {
-        driver.append( "\\" );
-    }
-
-    quint32 drvStatus = GetDriveType( (LPCWSTR)driver.constData() );
-
-    if ( drvStatus == DRIVE_REMOVABLE  ) {
-        state |= FmDriverInfo::EDriveRemovable;
-    }
-
-    return state;
-
-}
-*/
-int FmUtils::removeDrivePwd( const QString &driverName,  const QString &Pwd )
-{
-    Q_UNUSED( driverName );
+    Q_UNUSED( driveName );
     Q_UNUSED( Pwd );
     return 0;
 }
 
-int FmUtils::unlockDrive( const QString &driverName,  const QString &Pwd )
+int FmUtils::unlockDrive( const QString &driveName,  const QString &Pwd )
 {
-    Q_UNUSED( driverName );
+    Q_UNUSED( driveName );
     Q_UNUSED( Pwd );
     return 0;
 }
 
-int FmUtils::checkDrivePwd( const QString &driverName, const QString &pwd)
+int FmUtils::checkDrivePwd( const QString &driveName, const QString &pwd)
 {
-    Q_UNUSED( driverName );
+    Q_UNUSED( driveName );
     Q_UNUSED( pwd );
     return 0;
 }
 
-int FmUtils::setDrivePwd( const QString &driverName, const QString &oldPwd, const QString &newPwd)
+int FmUtils::setDrivePwd( const QString &driveName, const QString &oldPwd, const QString &newPwd)
 {
-    Q_UNUSED( driverName );
+    Q_UNUSED( driveName );
     Q_UNUSED( oldPwd );
     Q_UNUSED( newPwd );
     return 0;
@@ -164,9 +104,9 @@
     Q_UNUSED( pwd );
 }
 
-int FmUtils::renameDrive( const QString &driverName, const QString &newVolumeName)
+int FmUtils::renameDrive( const QString &driveName, const QString &newVolumeName)
 {
-    Q_UNUSED( driverName );
+    Q_UNUSED( driveName );
     foreach( const QChar &ch, newVolumeName )
     {
         // If not alphadigit or space, return error
@@ -178,221 +118,85 @@
     return 0;
 }
 
-int FmUtils::ejectDrive( const QString &driverName )
-{
-    Q_UNUSED( driverName );
-	return FmErrNone; 
-}
-
-QString FmUtils::getFileType( const QString &filePath  )
-{
-    Q_UNUSED( filePath );
-    return QString( "" );
-}
-
-quint64 FmUtils::getDriveDetailsResult( const QString &folderPath, const QString &extension )
-{
-    Q_UNUSED( folderPath );
-    Q_UNUSED( extension );
-    return 0;
-}
-
-bool FmUtils::isDriveC( const QString &driverName )
-{
-	if( driverName.contains(Drive_C,Qt::CaseInsensitive) ){
-        return true;
-    }
-    else{
-        return false;
-    }
-}
-
-bool FmUtils::isDrive( const QString &path )
+int FmUtils::ejectDrive( const QString &driveName )
 {
-   bool ret( false );
-   if( path.length() <= 3 && path.length() >=2 ) {
-       ret = true;
-   }
-   
-   return ret;   
-}
-
-void FmUtils::createDefaultFolders( const QString &driverName )
-{
-    Q_UNUSED( driverName );
-}
-
-/*!
-    fill splash in the end of \a filePath if the path is not a file
-    All "/" and "\" will be changed to QDir::separator
-    \sa formatPath only changed "/" and "\" to QDir::separator
-*/
-QString FmUtils::fillPathWithSplash( const QString &filePath )
-{
-    QString newFilePath;
-    if( filePath.isEmpty() ) {
-        return newFilePath;
-    }
-
-    newFilePath = formatPath( filePath );
-    
-    if( newFilePath.right( 1 )!= QDir::separator() ){
-        newFilePath.append( QDir::separator() );
-    }
-    return newFilePath;
-}
-
-QString FmUtils::removePathSplash( const QString &filePath )
-{
-    QString newFilePath( filePath );
-    if( filePath.right( 1 ) == QChar( '/' ) || filePath.right(1) == QString( "\\" ) ) {
-        newFilePath = filePath.left( filePath.length() - 1 );
-    }
-    return newFilePath;
+    Q_UNUSED( driveName );
+	return FmErrNone; 
 }
 
 bool FmUtils::checkDriveAccessFilter( const QString &driveName )
 {
-#ifdef _DEBUG_HIDE_VIEWFOLDER_WINDOWS_
-    if( driveName.contains( Drive_D, Qt::CaseInsensitive ) || driveName.contains( Drive_Z, Qt::CaseInsensitive ) ) {
-        return false;
-    }
-#endif
+    Q_UNUSED( driveName );
     return true;
 }
 
 QString FmUtils::checkDriveToFolderFilter( const QString &path )
 {
-    QFileInfo fileInfo( path );
-    if( !fileInfo.exists() ) {
-            return QString();
-        }
-
-#ifdef _DEBUG_HIDE_VIEWFOLDER_WINDOWS_
-    QString checkedPath = fillPathWithSplash( path );
-    if( checkedPath.compare( QString( "C:/"), Qt::CaseInsensitive ) == 0 ) {
-        checkedPath += QString( "data/" );
-        QFileInfo fileInfo( checkedPath );
-        if( !fileInfo.exists() ) {
-            return QString();
-        }
-        return checkedPath;
-    }
-#endif
+    Q_UNUSED( path );
     return path;
 
 }
 
 QString FmUtils::checkFolderToDriveFilter( const QString &path )
 {
-#ifdef _DEBUG_HIDE_VIEWFOLDER_WINDOWS_
-    QString logString;
-    logString = QString( "checkFolderToDriveFilter: " ) + path;
-    FM_LOG( logString );
-    QString checkedPath = fillPathWithSplash( path );
-
-    logString = QString( "checkFolderToDriveFilter_fillPathWithSplash: " ) + checkedPath;
-    FM_LOG( logString );
-    
-    if( checkedPath.compare( QString( "C:/data/"), Qt::CaseInsensitive ) == 0 ) {
-        FM_LOG( QString( " change from c:/data/ to C:/" ) );
-        return QString( "C:/" );
-    }
-#endif
+    Q_UNUSED( path );
     return path;
 
 }
 
 int FmUtils::isPathAccessabel( const QString &path )
 {
-    if(!isDriveAvailable( path ) ) { //used to filter locked drive
-        return FmErrDriveNotAvailable;
-    }
-
-    QFileInfo fileInfo( path );
-
-#ifdef _DEBUG_HIDE_VIEWFOLDER_WINDOWS_
-    if( fileInfo.absoluteFilePath().contains( QString( Drive_C ), Qt::CaseInsensitive ) &&
-        !fileInfo.absoluteFilePath().contains( QString( Folder_C_Data ), Qt::CaseInsensitive ) ) {
-        return false;
-    }
-    if( fileInfo.absoluteFilePath().contains( QString( Drive_D ), Qt::CaseInsensitive ) ) {
-        return false;
-    }
-    if( fileInfo.absoluteFilePath().contains( QString( Drive_Z ), Qt::CaseInsensitive ) ) {
-        return false;
-    }
-#endif
-    if( !fileInfo.exists() ) {
-        return FmErrPathNotExist;
-    }
+    Q_UNUSED( path );
     return FmErrNone;
 }
 
 bool FmUtils::isDriveAvailable( const QString &path )
 {
-#ifdef _DEBUG_DISABLE_DRIVE_D_TEST_DRIVEHIDE_
-	if(path.contains(Drive_D, Qt::CaseInsensitive))
-		return false;
-#endif
-#ifdef _DEBUG_LOCKED_DRIVE_Z
-	if(path.contains(Drive_Z, Qt::CaseInsensitive))
-		return false;
-#endif
+    Q_UNUSED( path );
 	return true;
 }
 
-void FmUtils::getDriveList( QStringList &driveList, bool isHideUnAvailableDrive )
+bool FmUtils::isDefaultFolder( const QString &folderPath  )
 {
-    QFileInfoList infoList = QDir::drives();
+    Q_UNUSED( folderPath );
+    return false;
+}
 
-    foreach( QFileInfo fileInfo, infoList ) {
-        QString driveName = fileInfo.absolutePath();
-        if( checkDriveAccessFilter( driveName ) ) {
-            if( !isHideUnAvailableDrive ) {
-                driveList.append( driveName );
-            }
-            else if ( isDriveAvailable( driveName ) ) {
-                driveList.append( driveName );
-            }
-        }
-    }
-    return;
+void FmUtils::createDefaultFolders( const QString &driveName )
+{
+    Q_UNUSED( driveName );
+}
+
+/*!
+    set the \a desFile attributes as the same with \a srcFile
+*/
+int FmUtils::setFileAttributes( const QString &srcFile, const QString &desFile )
+{
+    Q_UNUSED( srcFile );
+    Q_UNUSED( desFile );
+    return FmErrNone;
 }
 
-QString FmUtils::fillDriveVolume( QString driveName, bool isFillWithDefaultVolume )
+/*!
+    judge whether there is enough space on \a targetDrive for \a size.
+    return true if has, false if not.
+*/
+bool FmUtils::hasEnoughSpace( const QString &targetDrive, qint64 size )
 {
-    QString ret;
-    QString tempDriveName = fillPathWithSplash( driveName );
-
-    QString checkedDriveName( removePathSplash( driveName ) );
-    
-    FmDriverInfo driverInfo = FmUtils::queryDriverInfo( tempDriveName );
-    QString volumeName = driverInfo.volumeName();
+    Q_UNUSED( targetDrive );
+    Q_UNUSED( size );
+    return true;
+}
 
-    if( volumeName.isEmpty() && isFillWithDefaultVolume ){
-    FmDriverInfo::DriveState driveState = queryDriverInfo( tempDriveName ).driveState();
-        if( driveState & FmDriverInfo::EDriveAvailable ){
-            if( driveState & FmDriverInfo::EDriveRemovable ) {
-                if( driveState & FmDriverInfo::EDriveMassStorage ) {
-                    // Mass Storage
-                    ret = hbTrId( "txt_fmgr_dblist_1_mass_storage" ).arg( checkedDriveName );  
-                } else if( driveState & FmDriverInfo::EDriveUsbMemory ) {
-                    // USB Memory
-                    ret = hbTrId( "txt_fmgr_dblist_1_usb_memory" ).arg( checkedDriveName );
-                } else{
-                    // Memory Card
-                    ret = hbTrId( "txt_fmgr_dblist_1_memory_card" ).arg( checkedDriveName );
-                }
-            } else{
-				// phone memory
-				ret = hbTrId( "txt_fmgr_dblist_1_device_memory" ).arg( checkedDriveName );
-            }
-        }
-    } else {
-        ret = hbTrId( "txt_fmgr_dblist_1_2" ).arg( checkedDriveName ).arg( volumeName );
-    }
-    return ret;
+/*!
+    move one file insice the same drive, from \a source to \a target.
+    return KErrNone if successful, otherwise one of the other system-wide error codes.
+*/
+int FmUtils::moveInsideDrive( const QString &source, const QString &target )
+{
+    Q_UNUSED( source );
+    Q_UNUSED( target );
+    return FmErrNone;
 }
 
 int FmUtils::launchFile( const QString &filePath )
@@ -406,7 +210,7 @@
 
 void FmUtils::sendFiles( QStringList &filePathList )
 {
-
+    Q_UNUSED( filePathList );
 }
 
 QString FmUtils::getBurConfigPath( QString appPath )
@@ -419,139 +223,31 @@
     return path;
 }
 
-bool FmUtils::isPathEqual( const QString &pathFst, const QString &pathLast )
+QString FmUtils::getFileType( const QString &filePath  )
 {
-    QString fst( fillPathWithSplash( pathFst ) );
-    QString last( fillPathWithSplash( pathLast ) );
-    if( fst.compare( last, Qt::CaseInsensitive ) == 0 ) {
-        return true;
-    }
-    return false;
-}
-
-bool FmUtils::isDefaultFolder( const QString &folderPath  )
-{
-    Q_UNUSED( folderPath );
-    return false;
+    Q_UNUSED( filePath );
+    return QString( "" );
 }
 
-/*!
-    All "/" and "\" in \a path will be changed to QDir::separator
-    \sa fillPathWithSplash, fillPathWithSplash will append QDir::separator in the end if path is no a file
-*/
-QString FmUtils::formatPath( const QString &path  )
+bool FmUtils::isDriveC( const QString &driveName )
 {
-    QString formatPath;
-    if( path.isEmpty() ) {
-        return formatPath;
+	if( driveName.contains(Drive_C,Qt::CaseInsensitive) ){
+        return true;
     }
-    
-    foreach( QChar ch, path ) {
-        if( ch == QChar('\\') || ch == QChar('/') ) {
-            formatPath.append( QDir::separator() );
-        } else {
-            formatPath.append( ch );
-        }
+    else{
+        return false;
     }
-
-    return formatPath;
 }
 
 int FmUtils::getMaxFileNameLength()
 {
-	return KMaxFileName;
+    return KMaxFileName;
 }
 
 bool FmUtils::checkMaxPathLength( const QString& path )
 {
-	if( path.length() > KMaxPath ) {
-		return false;
-	}
-	return true;
-}
-
-bool FmUtils::checkFolderFileName( const QString& name )
-{
-    // trim space firest, because there may be some spaces after "." ,  it is also not valid
-    // or there may only have spaces in name
-    QString trimmedName( name.trimmed() );
-	if( trimmedName.isEmpty() ) {
-		return false;
-	}
-    if( trimmedName.endsWith( QChar('.'),  Qt::CaseInsensitive ) ) {
-        return false;
-    }
-    if( trimmedName.contains( QChar('\\'), Qt::CaseInsensitive ) ||
-        trimmedName.contains( QChar('/'),  Qt::CaseInsensitive ) ||
-        trimmedName.contains( QChar(':'),  Qt::CaseInsensitive ) ||
-        trimmedName.contains( QChar('*'),  Qt::CaseInsensitive ) ||
-        trimmedName.contains( QChar('?'),  Qt::CaseInsensitive ) ||
-        trimmedName.contains( QChar('\"'), Qt::CaseInsensitive ) ||
-        trimmedName.contains( QChar('<'),  Qt::CaseInsensitive ) ||
-        trimmedName.contains( QChar('>'),  Qt::CaseInsensitive ) ||
-        trimmedName.contains( QChar('|'),  Qt::CaseInsensitive ) ){
-        return false;
-    }
-    // use orignal name to exam max size of file name
-    if( name.length() > KMaxFileName ) {
+    if( path.length() > KMaxPath ) {
         return false;
     }
     return true;
 }
-
-bool FmUtils::checkNewFolderOrFile( const QString &fileName, const QString &path, QString &errString )
-{
-    // first check if fileName is valid, then check if path length is valid, and check if file/foler is existed at last
-    QFileInfo fileInfo( path );
-    bool ret( true );   
-    if (!FmUtils::checkFolderFileName( fileName ) ) {
-        errString = hbTrId( "Invalid file or folder name, try again!" );
-        ret = false;
-    } else if( !FmUtils::checkMaxPathLength( path ) ) {
-        errString = hbTrId( "the path you specified is too long, try again!" );
-        ret = false;
-    } else if (fileInfo.exists()) {
-        errString = hbTrId( "%1 already exist!" ).arg( fileInfo.fileName() );
-        ret = false;
-    }
-    return ret;
-}
-
-QString FmUtils::getVolumeNameWithDefaultNameIfNull( const QString &diskName, bool &defaultName )
-{
-    FmDriverInfo driverInfo = FmUtils::queryDriverInfo( diskName );
-
-    // do not add default volume for win32 version as this is only the dummy implememnt for debug on windows
-    return driverInfo.volumeName();
-}
-
-/*!
-    Check if \a dest is sub level path of \a src
-    Used to check True/False when copy a folder to itself or its subfolder
-    For example, c:\data\test is sub path of c:\data.
-    But c:\data123\test is not sub path of c:\data.
-    So after got right part of path, the first char must be \ or /
-*/
-bool FmUtils::isSubLevelPath( const QString &src, const QString &dest )
-{
-    FM_LOG("FmUtils::isSubFolder: src=" + src + " dest=" + dest);
-    QString checkedSrc( FmUtils::fillPathWithSplash( src ) );
-    QString checkedDest( FmUtils::fillPathWithSplash( dest ) );
-    
-    if( checkedDest.contains( checkedSrc, Qt::CaseInsensitive) &&
-            checkedDest.length() > checkedSrc.length() ) {
-        // for example c:\data\ vs c:\data\123\ 
-        FM_LOG("FmUtils::isSubFolder: true");
-        return true;
-    }
-    // for example c:\data\ vs c:\data\ 
-    // for example c:\data\ vs c:\data123\ 
-
-    FM_LOG("FmUtils::isSubFolder: false");
-    return false;
-}
-
-int FmUtils::setFileAttributes( const QString &srcFile, const QString &desFile )
-{
-    return FmErrNone;
-}