merged: trunk r35547 - fixed: Ticket #10745 - Item stays highlighted after play finis...
[xbmc:xbmc-antiquated.git] / xbmc / GUIWindowFileManager.cpp
1 /*
2  *      Copyright (C) 2005-2008 Team XBMC
3  *      http://www.xbmc.org
4  *
5  *  This Program is free software; you can redistribute it and/or modify
6  *  it under the terms of the GNU General Public License as published by
7  *  the Free Software Foundation; either version 2, or (at your option)
8  *  any later version.
9  *
10  *  This Program is distributed in the hope that it will be useful,
11  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  *  GNU General Public License for more details.
14  *
15  *  You should have received a copy of the GNU General Public License
16  *  along with XBMC; see the file COPYING.  If not, write to
17  *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
18  *  http://www.gnu.org/copyleft/gpl.html
19  *
20  */
21
22 #if (defined HAVE_CONFIG_H) && (!defined WIN32)
23   #include "config.h"
24 #endif
25 #include "system.h"
26 #include "GUIWindowFileManager.h"
27 #include "Application.h"
28 #include "Util.h"
29 #include "FileSystem/Directory.h"
30 #include "FileSystem/ZipManager.h"
31 #include "FileSystem/FactoryFileDirectory.h"
32 #include "FileSystem/MultiPathDirectory.h"
33 #include "FileSystem/SpecialProtocol.h"
34 #include "Picture.h"
35 #include "GUIDialogContextMenu.h"
36 #include "GUIListContainer.h"
37 #include "GUIDialogMediaSource.h"
38 #include "GUIPassword.h"
39 #include "GUIUserMessages.h"
40 #ifdef HAS_PYTHON
41 #include "lib/libPython/XBPython.h"
42 #endif
43 #include "GUIWindowSlideShow.h"
44 #include "PlayListFactory.h"
45 #include "utils/Network.h"
46 #include "GUIWindowManager.h"
47 #include "GUIDialogOK.h"
48 #include "GUIDialogYesNo.h"
49 #include "GUIDialogKeyboard.h"
50 #include "GUIDialogProgress.h"
51 #ifdef HAS_FILESYSTEM_RAR
52 #include "FileSystem/RarManager.h"
53 #endif
54 #include "Favourites.h"
55 #include "PlayList.h"
56 #include "utils/AsyncFileCopy.h"
57 #include "MediaManager.h"
58 #include "Settings.h"
59 #include "AdvancedSettings.h"
60 #include "GUISettings.h"
61 #include "MouseStat.h"
62 #include "LocalizeStrings.h"
63 #include "StringUtils.h"
64 #include "utils/log.h"
65
66 #include "JobManager.h"
67 #include "FileOperationJob.h"
68 #include "FileUtils.h"
69
70 using namespace std;
71 using namespace XFILE;
72 using namespace PLAYLIST;
73
74 #define ACTION_COPY                     1
75 #define ACTION_MOVE                     2
76 #define ACTION_DELETE                   3
77 #define ACTION_CREATEFOLDER             4
78 #define ACTION_DELETEFOLDER             5
79
80 #define CONTROL_BTNVIEWASICONS          2
81 #define CONTROL_BTNSORTBY               3
82 #define CONTROL_BTNSORTASC              4
83 #define CONTROL_BTNNEWFOLDER            6
84 #define CONTROL_BTNSELECTALL            7
85 #define CONTROL_BTNCOPY                10
86 #define CONTROL_BTNMOVE                11
87 #define CONTROL_BTNDELETE               8
88 #define CONTROL_BTNRENAME               9
89
90 #define CONTROL_NUMFILES_LEFT          12
91 #define CONTROL_NUMFILES_RIGHT         13
92
93 #define CONTROL_LEFT_LIST              20
94 #define CONTROL_RIGHT_LIST             21
95
96 #define CONTROL_CURRENTDIRLABEL_LEFT  101
97 #define CONTROL_CURRENTDIRLABEL_RIGHT 102
98
99 CGUIWindowFileManager::CGUIWindowFileManager(void)
100     : CGUIWindow(WINDOW_FILES, "FileManager.xml")
101 {
102   m_dlgProgress = NULL;
103   m_Directory[0] = new CFileItem;
104   m_Directory[1] = new CFileItem;
105   m_vecItems[0] = new CFileItemList;
106   m_vecItems[1] = new CFileItemList;
107   m_Directory[0]->m_strPath = "?";
108   m_Directory[1]->m_strPath = "?";
109   m_Directory[0]->m_bIsFolder = true;
110   m_Directory[1]->m_bIsFolder = true;
111   bCheckShareConnectivity = true;
112 }
113
114 CGUIWindowFileManager::~CGUIWindowFileManager(void)
115 {
116   delete m_Directory[0];
117   delete m_Directory[1];
118   delete m_vecItems[0];
119   delete m_vecItems[1];
120 }
121
122 bool CGUIWindowFileManager::OnAction(const CAction &action)
123 {
124   int list = GetFocusedList();
125   if (list >= 0 && list <= 1)
126   {
127     int item;
128
129     // the non-contextual menu can be called at any time
130     if (action.GetID() == ACTION_CONTEXT_MENU && m_vecItems[list]->Size() == 0)
131     {
132       OnPopupMenu(list,-1, false);
133       return true;
134     }
135     if (action.GetID() == ACTION_DELETE_ITEM)
136     {
137       if (CanDelete(list))
138       {
139         bool bDeselect = SelectItem(list, item);
140         OnDelete(list);
141         if (bDeselect) m_vecItems[list]->Get(item)->Select(false);
142       }
143       return true;
144     }
145     if (action.GetID() == ACTION_COPY_ITEM)
146     {
147       if (CanCopy(list))
148       {
149         bool bDeselect = SelectItem(list, item);
150         OnCopy(list);
151         if (bDeselect) m_vecItems[list]->Get(item)->Select(false);
152       }
153       return true;
154     }
155     if (action.GetID() == ACTION_MOVE_ITEM)
156     {
157       if (CanMove(list))
158       {
159         bool bDeselect = SelectItem(list, item);
160         OnMove(list);
161         if (bDeselect) m_vecItems[list]->Get(item)->Select(false);
162       }
163       return true;
164     }
165     if (action.GetID() == ACTION_RENAME_ITEM)
166     {
167       if (CanRename(list))
168       {
169         bool bDeselect = SelectItem(list, item);
170         OnRename(list);
171         if (bDeselect) m_vecItems[list]->Get(item)->Select(false);
172       }
173       return true;
174     }
175     if (action.GetID() == ACTION_PARENT_DIR)
176     {
177       if (m_vecItems[list]->IsVirtualDirectoryRoot())
178         g_windowManager.PreviousWindow();
179       else
180         GoParentFolder(list);
181       return true;
182     }
183     if (action.GetID() == ACTION_PLAYER_PLAY)
184     {
185 #ifdef HAS_DVD_DRIVE
186       if (m_vecItems[list]->Get(GetSelectedItem(list))->IsDVD())
187         return MEDIA_DETECT::CAutorun::PlayDisc();
188 #endif
189     }
190   }
191   if (action.GetID() == ACTION_PREVIOUS_MENU)
192   {
193     g_windowManager.PreviousWindow();
194     return true;
195   }
196   return CGUIWindow::OnAction(action);
197 }
198
199 bool CGUIWindowFileManager::OnMessage(CGUIMessage& message)
200 {
201   switch ( message.GetMessage() )
202   {
203   case GUI_MSG_NOTIFY_ALL:
204     { // Message is received even if window is inactive
205       if (message.GetParam1() == GUI_MSG_WINDOW_RESET)
206       {
207         m_Directory[0]->m_strPath = "?";
208         m_Directory[1]->m_strPath = "?";
209         m_Directory[0]->m_bIsFolder = true;
210         m_Directory[1]->m_bIsFolder = true;
211         return true;
212       }
213
214       //  handle removable media
215       if (message.GetParam1() == GUI_MSG_REMOVED_MEDIA)
216       {
217         for (int i = 0; i < 2; i++)
218         {
219           if (m_Directory[i]->IsVirtualDirectoryRoot() && IsActive())
220           {
221             int iItem = GetSelectedItem(i);
222             Update(i, m_Directory[i]->m_strPath);
223             CONTROL_SELECT_ITEM(CONTROL_LEFT_LIST + i, iItem);
224           }
225           else if (m_Directory[i]->IsRemovable() && !m_rootDir.IsInSource(m_Directory[i]->m_strPath))
226           { //
227             if (IsActive())
228               Update(i, "");
229             else
230               m_Directory[i]->m_strPath="";
231           }
232         }
233         return true;
234       }
235       else if (message.GetParam1()==GUI_MSG_UPDATE_SOURCES)
236       { // State of the sources changed, so update our view
237         for (int i = 0; i < 2; i++)
238         {
239           if (m_Directory[i]->IsVirtualDirectoryRoot() && IsActive())
240           {
241             int iItem = GetSelectedItem(i);
242             Update(i, m_Directory[i]->m_strPath);
243             CONTROL_SELECT_ITEM(CONTROL_LEFT_LIST + i, iItem);
244           }
245         }
246         return true;
247       }
248     }
249     break;
250   case GUI_MSG_PLAYBACK_STARTED:
251   case GUI_MSG_PLAYBACK_ENDED:
252   case GUI_MSG_PLAYBACK_STOPPED:
253   case GUI_MSG_PLAYLIST_CHANGED:
254   case GUI_MSG_PLAYLISTPLAYER_STOPPED:
255   case GUI_MSG_PLAYLISTPLAYER_STARTED:
256   case GUI_MSG_PLAYLISTPLAYER_CHANGED:
257     { // send a notify all to all controls on this window
258       CGUIMessage msg(GUI_MSG_NOTIFY_ALL, GetID(), 0, GUI_MSG_REFRESH_LIST);
259       OnMessage(msg);
260       break;
261     }
262   case GUI_MSG_WINDOW_DEINIT:
263     {
264       CGUIWindow::OnMessage(message);
265       ClearFileItems(0);
266       ClearFileItems(1);
267       return true;
268     }
269     break;
270
271   case GUI_MSG_WINDOW_INIT:
272     {
273       SetInitialPath(message.GetStringParam());
274       message.SetStringParam("");
275
276       return CGUIWindow::OnMessage(message);
277     }
278     break;
279   case GUI_MSG_CLICKED:
280     {
281       int iControl = message.GetSenderId();
282
283       if (iControl == CONTROL_LEFT_LIST || iControl == CONTROL_RIGHT_LIST)  // list/thumb control
284       {
285         // get selected item
286         int list = iControl - CONTROL_LEFT_LIST;
287         int iItem = GetSelectedItem(list);
288         int iAction = message.GetParam1();
289
290         // iItem is checked for validity inside these routines
291         if (iAction == ACTION_HIGHLIGHT_ITEM || iAction == ACTION_MOUSE_LEFT_CLICK)
292         {
293           OnMark(list, iItem);
294           if (!g_Mouse.IsActive())
295           {
296             //move to next item
297             CGUIMessage msg(GUI_MSG_ITEM_SELECT, GetID(), iControl, iItem + 1);
298             g_windowManager.SendMessage(msg);
299           }
300         }
301         else if (iAction == ACTION_SELECT_ITEM || iAction == ACTION_MOUSE_DOUBLE_CLICK)
302         {
303           OnClick(list, iItem);
304         }
305         else if (iAction == ACTION_CONTEXT_MENU || iAction == ACTION_MOUSE_RIGHT_CLICK)
306         {
307           OnPopupMenu(list, iItem);
308         }
309       }
310     }
311     break;
312   }
313   return CGUIWindow::OnMessage(message);
314 }
315
316 void CGUIWindowFileManager::OnSort(int iList)
317 {
318   // always sort the list by label in ascending order
319   for (int i = 0; i < m_vecItems[iList]->Size(); i++)
320   {
321     CFileItemPtr pItem = m_vecItems[iList]->Get(i);
322     if (pItem->m_bIsFolder && (!pItem->m_dwSize || pItem->m_strPath.Equals("add")))
323       pItem->SetLabel2("");
324     else
325       pItem->SetFileSizeLabel();
326
327     // Set free space on disc
328     if (pItem->m_bIsShareOrDrive)
329     {
330       if (pItem->IsHD())
331       {
332         ULARGE_INTEGER ulBytesFree;
333         if (GetDiskFreeSpaceEx(pItem->m_strPath.c_str(), &ulBytesFree, NULL, NULL))
334         {
335           pItem->m_dwSize = ulBytesFree.QuadPart;
336           pItem->SetFileSizeLabel();
337         }
338       }
339       else if (pItem->IsDVD() && g_mediaManager.IsDiscInDrive())
340       {
341         ULARGE_INTEGER ulBytesTotal;
342         if (GetDiskFreeSpaceEx(pItem->m_strPath.c_str(), NULL, &ulBytesTotal, NULL))
343         {
344           pItem->m_dwSize = ulBytesTotal.QuadPart;
345           pItem->SetFileSizeLabel();
346         }
347       }
348     } // if (pItem->m_bIsShareOrDrive)
349
350   }
351
352   m_vecItems[iList]->Sort(SORT_METHOD_LABEL, SORT_ORDER_ASC);
353 }
354
355 void CGUIWindowFileManager::ClearFileItems(int iList)
356 {
357   CGUIMessage msg(GUI_MSG_LABEL_RESET, GetID(), iList + CONTROL_LEFT_LIST);
358   g_windowManager.SendMessage(msg);
359
360   m_vecItems[iList]->Clear(); // will clean up everything
361 }
362
363 void CGUIWindowFileManager::UpdateButtons()
364 {
365
366   /*
367    // Update sorting control
368    bool bSortOrder=false;
369    if ( m_bViewSource )
370    {
371     if (m_strSourceDirectory.IsEmpty())
372      bSortOrder=g_settings.m_bMyFilesSourceRootSortOrder;
373     else
374      bSortOrder=g_settings.m_bMyFilesSourceSortOrder;
375    }
376    else
377    {
378     if (m_strDestDirectory.IsEmpty())
379      bSortOrder=g_settings.m_bMyFilesDestRootSortOrder;
380     else
381      bSortOrder=g_settings.m_bMyFilesDestSortOrder;
382    }
383
384    if (bSortOrder)
385     {
386       CGUIMessage msg(GUI_MSG_DESELECTED,GetID(), CONTROL_BTNSORTASC);
387       g_windowManager.SendMessage(msg);
388     }
389     else
390     {
391       CGUIMessage msg(GUI_MSG_SELECTED,GetID(), CONTROL_BTNSORTASC);
392       g_windowManager.SendMessage(msg);
393     }
394
395   */
396   // update our current directory labels
397   CStdString strDir = CURL(m_Directory[0]->m_strPath).GetWithoutUserDetails();
398   if (strDir.IsEmpty())
399   {
400     SET_CONTROL_LABEL(CONTROL_CURRENTDIRLABEL_LEFT,g_localizeStrings.Get(20108));
401   }
402   else
403   {
404     SET_CONTROL_LABEL(CONTROL_CURRENTDIRLABEL_LEFT, strDir);
405   }
406   strDir = CURL(m_Directory[1]->m_strPath).GetWithoutUserDetails();
407   if (strDir.IsEmpty())
408   {
409     SET_CONTROL_LABEL(CONTROL_CURRENTDIRLABEL_RIGHT,g_localizeStrings.Get(20108));
410   }
411   else
412   {
413     SET_CONTROL_LABEL(CONTROL_CURRENTDIRLABEL_RIGHT, strDir);
414   }
415
416   // update the number of items in each list
417   UpdateItemCounts();
418 }
419
420 void CGUIWindowFileManager::UpdateItemCounts()
421 {
422   for (int i = 0; i < 2; i++)
423   {
424     unsigned int selectedCount = 0;
425     unsigned int totalCount = 0;
426     int64_t selectedSize = 0;
427     int64_t totalSize = 0;
428     for (int j = 0; j < m_vecItems[i]->Size(); j++)
429     {
430       CFileItemPtr item = m_vecItems[i]->Get(j);
431       if (item->IsParentFolder()) continue;
432       if (item->IsSelected())
433       {
434         selectedCount++;
435         selectedSize += item->m_dwSize;
436       }
437       totalCount++;
438       totalSize += item->m_dwSize;
439     }
440     CStdString items;
441     if (selectedCount > 0)
442       items.Format("%i/%i %s (%s)", selectedCount, totalCount, g_localizeStrings.Get(127).c_str(), StringUtils::SizeToString(selectedSize).c_str());
443     else
444       items.Format("%i %s", totalCount, g_localizeStrings.Get(127).c_str());
445     SET_CONTROL_LABEL(CONTROL_NUMFILES_LEFT + i, items);
446   }
447 }
448
449 bool CGUIWindowFileManager::Update(int iList, const CStdString &strDirectory)
450 {
451   // get selected item
452   int iItem = GetSelectedItem(iList);
453   CStdString strSelectedItem = "";
454
455   if (iItem >= 0 && iItem < (int)m_vecItems[iList]->Size())
456   {
457     CFileItemPtr pItem = m_vecItems[iList]->Get(iItem);
458     if (!pItem->IsParentFolder())
459     {
460       GetDirectoryHistoryString(pItem.get(), strSelectedItem);
461       m_history[iList].SetSelectedItem(strSelectedItem, m_Directory[iList]->m_strPath);
462     }
463   }
464
465   CStdString strOldDirectory=m_Directory[iList]->m_strPath;
466   m_Directory[iList]->m_strPath = strDirectory;
467
468   CFileItemList items;
469   if (!GetDirectory(iList, m_Directory[iList]->m_strPath, items))
470   {
471     m_Directory[iList]->m_strPath = strOldDirectory;
472     return false;
473   }
474
475   m_history[iList].SetSelectedItem(strSelectedItem, strOldDirectory);
476
477   ClearFileItems(iList);
478
479   m_vecItems[iList]->Append(items);
480   m_vecItems[iList]->m_strPath = items.m_strPath;
481
482   CStdString strParentPath;
483   CUtil::GetParentPath(strDirectory, strParentPath);
484   if (strDirectory.IsEmpty() && (m_vecItems[iList]->Size() == 0 || g_guiSettings.GetBool("filelists.showaddsourcebuttons")))
485   { // add 'add source button'
486     CStdString strLabel = g_localizeStrings.Get(1026);
487     CFileItemPtr pItem(new CFileItem(strLabel));
488     pItem->m_strPath = "add";
489     pItem->SetIconImage("DefaultAddSource.png");
490     pItem->SetLabel(strLabel);
491     pItem->SetLabelPreformated(true);
492     m_vecItems[iList]->Add(pItem);
493   }
494   else if (items.IsEmpty() || g_guiSettings.GetBool("filelists.showparentdiritems"))
495   {
496     CFileItemPtr pItem(new CFileItem(".."));
497     pItem->m_strPath = (m_rootDir.IsSource(strDirectory) ? "" : strParentPath);
498     pItem->m_bIsFolder = true;
499     pItem->m_bIsShareOrDrive = false;
500     m_vecItems[iList]->AddFront(pItem, 0);
501   }
502
503   m_strParentPath[iList] = (m_rootDir.IsSource(strDirectory) ? "" : strParentPath);
504
505   if (strDirectory.IsEmpty())
506   {
507     CFileItemPtr pItem(new CFileItem("special://profile/", true));
508     pItem->SetLabel(g_localizeStrings.Get(20070));
509     pItem->SetThumbnailImage("DefaultFolder.png");
510     pItem->SetLabelPreformated(true);
511     m_vecItems[iList]->Add(pItem);
512   }
513
514   // if we have a .tbn file, use itself as the thumb
515   for (int i = 0; i < (int)m_vecItems[iList]->Size(); i++)
516   {
517     CFileItemPtr pItem = m_vecItems[iList]->Get(i);
518     CStdString strExtension;
519     CUtil::GetExtension(pItem->m_strPath, strExtension);
520     if (pItem->IsHD() && strExtension == ".tbn")
521     {
522       pItem->SetThumbnailImage(pItem->m_strPath);
523     }
524   }
525   m_vecItems[iList]->FillInDefaultIcons();
526
527   OnSort(iList);
528   UpdateButtons();
529
530   int item = 0;
531   strSelectedItem = m_history[iList].GetSelectedItem(m_Directory[iList]->m_strPath);
532   for (int i = 0; i < m_vecItems[iList]->Size(); ++i)
533   {
534     CFileItemPtr pItem = m_vecItems[iList]->Get(i);
535     CStdString strHistory;
536     GetDirectoryHistoryString(pItem.get(), strHistory);
537     if (strHistory == strSelectedItem)
538     {
539       item = i;
540       break;
541     }
542   }
543   UpdateControl(iList, item);
544   return true;
545 }
546
547
548 void CGUIWindowFileManager::OnClick(int iList, int iItem)
549 {
550   if ( iList < 0 || iList > 2) return ;
551   if ( iItem < 0 || iItem >= m_vecItems[iList]->Size() ) return ;
552
553   CFileItemPtr pItem = m_vecItems[iList]->Get(iItem);
554   if (pItem->m_strPath == "add" && pItem->GetLabel() == g_localizeStrings.Get(1026)) // 'add source button' in empty root
555   {
556     if (CGUIDialogMediaSource::ShowAndAddMediaSource("files"))
557     {
558       m_rootDir.SetSources(g_settings.m_fileSources);
559       Update(0,m_Directory[0]->m_strPath);
560       Update(1,m_Directory[1]->m_strPath);
561     }
562     return;
563   }
564
565   if (pItem->m_bIsFolder)
566   {
567     // save path + drive type because of the possible refresh
568     CStdString strPath = pItem->m_strPath;
569     int iDriveType = pItem->m_iDriveType;
570     if ( pItem->m_bIsShareOrDrive )
571     {
572       if ( !g_passwordManager.IsItemUnlocked( pItem.get(), "files" ) )
573       {
574         Refresh();
575         return ;
576       }
577
578       if ( !HaveDiscOrConnection( strPath, iDriveType ) )
579         return ;
580     }
581     if (!Update(iList, strPath))
582       ShowShareErrorMessage(pItem.get());
583   }
584   else if (pItem->IsZIP() || pItem->IsCBZ()) // mount zip archive
585   {
586     CStdString strArcivedPath;
587     CUtil::CreateArchivePath(strArcivedPath, "zip", pItem->m_strPath, "");
588     Update(iList, strArcivedPath);
589   }
590   else if (pItem->IsRAR() || pItem->IsCBR())
591   {
592     CStdString strArcivedPath;
593     CUtil::CreateArchivePath(strArcivedPath, "rar", pItem->m_strPath, "");
594     Update(iList, strArcivedPath);
595   }
596   else
597   {
598     OnStart(pItem.get());
599     return ;
600   }
601   // UpdateButtons();
602 }
603
604 // TODO 2.0: Can this be removed, or should we run without the "special" file directories while
605 // in filemanager view.
606 void CGUIWindowFileManager::OnStart(CFileItem *pItem)
607 {
608   // start playlists from file manager
609   if (pItem->IsPlayList())
610   {
611     CStdString strPlayList = pItem->m_strPath;
612     auto_ptr<CPlayList> pPlayList (CPlayListFactory::Create(strPlayList));
613     if (NULL != pPlayList.get())
614     {
615       if (!pPlayList->Load(strPlayList))
616       {
617         CGUIDialogOK::ShowAndGetInput(6, 0, 477, 0);
618         return;
619       }
620     }
621     g_application.ProcessAndStartPlaylist(strPlayList, *pPlayList, PLAYLIST_MUSIC);
622     return;
623   }
624   if (pItem->IsAudio() || pItem->IsVideo())
625   {
626     g_application.PlayFile(*pItem);
627     return ;
628   }
629 #ifdef HAS_PYTHON
630   if (pItem->IsPythonScript())
631   {
632     g_pythonParser.evalFile(pItem->m_strPath.c_str());
633     return ;
634   }
635 #endif
636   if (pItem->IsShortCut())
637     CUtil::RunShortcut(pItem->m_strPath);
638   if (pItem->IsPicture())
639   {
640     CGUIWindowSlideShow *pSlideShow = (CGUIWindowSlideShow *)g_windowManager.GetWindow(WINDOW_SLIDESHOW);
641     if (!pSlideShow)
642       return ;
643     if (g_application.IsPlayingVideo())
644       g_application.StopPlaying();
645
646     pSlideShow->Reset();
647     pSlideShow->Add(pItem);
648     pSlideShow->Select(pItem->m_strPath);
649
650     g_windowManager.ActivateWindow(WINDOW_SLIDESHOW);
651   }
652 }
653
654 bool CGUIWindowFileManager::HaveDiscOrConnection( CStdString& strPath, int iDriveType )
655 {
656   if ( iDriveType == CMediaSource::SOURCE_TYPE_DVD )
657   {
658     if ( !g_mediaManager.IsDiscInDrive() )
659     {
660       CGUIDialogOK::ShowAndGetInput(218, 219, 0, 0);
661       int iList = GetFocusedList();
662       int iItem = GetSelectedItem(iList);
663       Update(iList, "");
664       CONTROL_SELECT_ITEM(iList + CONTROL_LEFT_LIST, iItem);
665       return false;
666     }
667   }
668   else if ( iDriveType == CMediaSource::SOURCE_TYPE_REMOTE )
669   {
670     // TODO: Handle not connected to a remote share
671     if ( !g_application.getNetwork().IsConnected() )
672     {
673       CGUIDialogOK::ShowAndGetInput(220, 221, 0, 0);
674       return false;
675     }
676   }
677   else
678     return true;
679   return true;
680 }
681
682 void CGUIWindowFileManager::UpdateControl(int iList, int item)
683 {
684   CGUIMessage msg(GUI_MSG_LABEL_BIND, GetID(), iList + CONTROL_LEFT_LIST, item, 0, m_vecItems[iList]);
685   g_windowManager.SendMessage(msg);
686 }
687
688 void CGUIWindowFileManager::OnMark(int iList, int iItem)
689 {
690   CFileItemPtr pItem = m_vecItems[iList]->Get(iItem);
691
692   if (!pItem->m_bIsShareOrDrive)
693   {
694     if (!pItem->IsParentFolder())
695     {
696       // MARK file
697       pItem->Select(!pItem->IsSelected());
698     }
699   }
700
701   UpdateItemCounts();
702   // UpdateButtons();
703 }
704
705 void CGUIWindowFileManager::OnCopy(int iList)
706 {
707   if (!CGUIDialogYesNo::ShowAndGetInput(120, 123, 0, 0))
708     return;
709
710   ResetProgressBar();
711
712   m_errorHeading = 16201;
713   m_errorLine    = 16202;
714
715   CJobManager::GetInstance().AddJob(new CFileOperationJob(CFileOperationJob::ActionCopy, *m_vecItems[iList], m_Directory[1 - iList]->m_strPath), this);
716 }
717
718 void CGUIWindowFileManager::OnMove(int iList)
719 {
720   if (!CGUIDialogYesNo::ShowAndGetInput(121, 124, 0, 0))
721     return;
722
723   ResetProgressBar();
724
725   m_errorHeading = 16203;
726   m_errorLine    = 16204;
727
728   CJobManager::GetInstance().AddJob(new CFileOperationJob(CFileOperationJob::ActionMove, *m_vecItems[iList], m_Directory[1 - iList]->m_strPath), this);
729 }
730
731 void CGUIWindowFileManager::OnDelete(int iList)
732 {
733   if (!CGUIDialogYesNo::ShowAndGetInput(122, 125, 0, 0))
734     return;
735
736   ResetProgressBar(false);
737
738   m_errorHeading = 16205;
739   m_errorLine    = 16206;
740
741   CJobManager::GetInstance().AddJob(new CFileOperationJob(CFileOperationJob::ActionDelete, *m_vecItems[iList], m_Directory[iList]->m_strPath), this);
742 }
743
744 void CGUIWindowFileManager::OnRename(int iList)
745 {
746   CStdString strFile;
747   for (int i = 0; i < m_vecItems[iList]->Size();++i)
748   {
749     CFileItemPtr pItem = m_vecItems[iList]->Get(i);
750     if (pItem->IsSelected())
751     {
752       strFile = pItem->m_strPath;
753       break;
754     }
755   }
756
757   CFileUtils::RenameFile(strFile);
758
759   Refresh(iList);
760 }
761
762 void CGUIWindowFileManager::OnSelectAll(int iList)
763 {
764   for (int i = 0; i < m_vecItems[iList]->Size();++i)
765   {
766     CFileItemPtr pItem = m_vecItems[iList]->Get(i);
767     if (!pItem->IsParentFolder())
768     {
769       pItem->Select(true);
770     }
771   }
772 }
773
774 void CGUIWindowFileManager::OnNewFolder(int iList)
775 {
776   CStdString strNewFolder = "";
777   if (CGUIDialogKeyboard::ShowAndGetInput(strNewFolder, g_localizeStrings.Get(16014), false))
778   {
779     CStdString strNewPath = m_Directory[iList]->m_strPath;
780     CUtil::AddSlashAtEnd(strNewPath);
781     strNewPath += strNewFolder;
782     CDirectory::Create(strNewPath);
783     Refresh(iList);
784
785     //  select the new folder
786     for (int i=0; i<m_vecItems[iList]->Size(); ++i)
787     {
788       CFileItemPtr pItem=m_vecItems[iList]->Get(i);
789       CStdString strPath=pItem->m_strPath;
790       CUtil::RemoveSlashAtEnd(strPath);
791       if (strPath==strNewPath)
792       {
793         CONTROL_SELECT_ITEM(iList + CONTROL_LEFT_LIST, i);
794         break;
795       }
796     }
797   }
798 }
799
800 void CGUIWindowFileManager::Refresh(int iList)
801 {
802   int nSel = GetSelectedItem(iList);
803   // update the list views
804   Update(iList, m_Directory[iList]->m_strPath);
805
806   while (nSel > m_vecItems[iList]->Size())
807     nSel--;
808
809   CONTROL_SELECT_ITEM(iList + CONTROL_LEFT_LIST, nSel);
810 }
811
812
813 void CGUIWindowFileManager::Refresh()
814 {
815   int iList = GetFocusedList();
816   int nSel = GetSelectedItem(iList);
817   // update the list views
818   Update(0, m_Directory[0]->m_strPath);
819   Update(1, m_Directory[1]->m_strPath);
820
821   while (nSel > (int)m_vecItems[iList]->Size())
822     nSel--;
823
824   CONTROL_SELECT_ITEM(iList + CONTROL_LEFT_LIST, nSel);
825 }
826
827 int CGUIWindowFileManager::GetSelectedItem(int iControl)
828 {
829   if (iControl < 0 || iControl > 1) return -1;
830   CGUIListContainer *pControl = (CGUIListContainer *)GetControl(iControl + CONTROL_LEFT_LIST);
831   if (!pControl || !m_vecItems[iControl]->Size()) return -1;
832   return pControl->GetSelectedItem();
833 }
834
835 void CGUIWindowFileManager::GoParentFolder(int iList)
836 {
837   CURL url(m_Directory[iList]->m_strPath);
838   if ((url.GetProtocol() == "rar") || (url.GetProtocol() == "zip"))
839   {
840     // check for step-below, if, unmount rar
841     if (url.GetFileName().IsEmpty())
842       if (url.GetProtocol() == "zip")
843         g_ZipManager.release(m_Directory[iList]->m_strPath); // release resources
844   }
845
846   CStdString strPath(m_strParentPath[iList]), strOldPath(m_Directory[iList]->m_strPath);
847   Update(iList, strPath);
848 }
849
850 bool CGUIWindowFileManager::OnFileCallback(void* pContext, int ipercent, float avgSpeed)
851 {
852   if (m_dlgProgress)
853   {
854     m_dlgProgress->SetPercentage(ipercent);
855     CStdString speedString;
856     speedString.Format("%2.2f KB/s", avgSpeed / 1024);
857     m_dlgProgress->SetLine(0, speedString);
858     m_dlgProgress->Progress();
859     if (m_dlgProgress->IsCanceled()) return false;
860   }
861   return true;
862 }
863
864 /// \brief Build a directory history string
865 /// \param pItem Item to build the history string from
866 /// \param strHistoryString History string build as return value
867 void CGUIWindowFileManager::GetDirectoryHistoryString(const CFileItem* pItem, CStdString& strHistoryString)
868 {
869   if (pItem->m_bIsShareOrDrive)
870   {
871     // We are in the virtual directory
872
873     // History string of the DVD drive
874     // must be handel separately
875     if (pItem->m_iDriveType == CMediaSource::SOURCE_TYPE_DVD)
876     {
877       // Remove disc label from item label
878       // and use as history string, m_strPath
879       // can change for new discs
880       CStdString strLabel = pItem->GetLabel();
881       int nPosOpen = strLabel.Find('(');
882       int nPosClose = strLabel.ReverseFind(')');
883       if (nPosOpen > -1 && nPosClose > -1 && nPosClose > nPosOpen)
884       {
885         strLabel.Delete(nPosOpen + 1, (nPosClose) - (nPosOpen + 1));
886         strHistoryString = strLabel;
887       }
888       else
889         strHistoryString = strLabel;
890     }
891     else
892     {
893       // Other items in virtual directory
894       strHistoryString = pItem->GetLabel() + pItem->m_strPath;
895       CUtil::RemoveSlashAtEnd(strHistoryString);
896     }
897   }
898   else
899   {
900     // Normal directory items
901     strHistoryString = pItem->m_strPath;
902     CUtil::RemoveSlashAtEnd(strHistoryString);
903   }
904 }
905
906 bool CGUIWindowFileManager::GetDirectory(int iList, const CStdString &strDirectory, CFileItemList &items)
907 {
908   return m_rootDir.GetDirectory(strDirectory,items,false);
909 }
910
911 bool CGUIWindowFileManager::CanRename(int iList)
912 {
913   // TODO: Renaming of shares (requires writing to xboxmediacenter.xml)
914   // this might be able to be done via the webserver code stuff...
915   if (m_Directory[iList]->IsVirtualDirectoryRoot()) return false;
916   if (m_Directory[iList]->IsReadOnly()) return false;
917
918   return true;
919 }
920
921 bool CGUIWindowFileManager::CanCopy(int iList)
922 {
923   // can't copy if the destination is not writeable, or if the source is a share!
924   // TODO: Perhaps if the source is removeable media (DVD/CD etc.) we could
925   // put ripping/backup in here.
926   if (m_Directory[1 - iList]->IsVirtualDirectoryRoot()) return false;
927   if (m_Directory[iList]->IsVirtualDirectoryRoot()) return false;
928   if (m_Directory[1 -iList]->IsReadOnly()) return false;
929   return true;
930 }
931
932 bool CGUIWindowFileManager::CanMove(int iList)
933 {
934   // can't move if the destination is not writeable, or if the source is a share or not writeable!
935   if (m_Directory[0]->IsVirtualDirectoryRoot() || m_Directory[0]->IsReadOnly()) return false;
936   if (m_Directory[1]->IsVirtualDirectoryRoot() || m_Directory[1]->IsReadOnly()) return false;
937   return true;
938 }
939
940 bool CGUIWindowFileManager::CanDelete(int iList)
941 {
942   if (m_Directory[iList]->IsVirtualDirectoryRoot()) return false;
943   if (m_Directory[iList]->IsReadOnly()) return false;
944   return true;
945 }
946
947 bool CGUIWindowFileManager::CanNewFolder(int iList)
948 {
949   if (m_Directory[iList]->IsVirtualDirectoryRoot()) return false;
950   if (m_Directory[iList]->IsReadOnly()) return false;
951   return true;
952 }
953
954 int CGUIWindowFileManager::NumSelected(int iList)
955 {
956   int iSelectedItems = 0;
957   for (int iItem = 0; iItem < m_vecItems[iList]->Size(); ++iItem)
958   {
959     if (m_vecItems[iList]->Get(iItem)->IsSelected()) iSelectedItems++;
960   }
961   return iSelectedItems;
962 }
963
964 int CGUIWindowFileManager::GetFocusedList() const
965 {
966   return GetFocusedControlID() - CONTROL_LEFT_LIST;
967 }
968
969 void CGUIWindowFileManager::OnPopupMenu(int list, int item, bool bContextDriven /* = true */)
970 {
971   if (list < 0 || list > 2) return ;
972   bool bDeselect = SelectItem(list, item);
973   // calculate the position for our menu
974   float posX = 200;
975   float posY = 100;
976   const CGUIControl *pList = GetControl(CONTROL_LEFT_LIST + list);
977   if (pList)
978   {
979     posX = pList->GetXPosition() + pList->GetWidth() / 2;
980     posY = pList->GetYPosition() + pList->GetHeight() / 2;
981   }
982
983   CFileItemPtr pItem = m_vecItems[list]->Get(item);
984   if (!pItem.get())
985     return;
986
987   if (m_Directory[list]->IsVirtualDirectoryRoot())
988   {
989     if (item < 0)
990     { // TODO: We should add the option here for shares to be added if there aren't any
991       return ;
992     }
993
994     // and do the popup menu
995     if (CGUIDialogContextMenu::SourcesMenu("files", pItem, posX, posY))
996     {
997       m_rootDir.SetSources(g_settings.m_fileSources);
998       if (m_Directory[1 - list]->IsVirtualDirectoryRoot())
999         Refresh();
1000       else
1001         Refresh(list);
1002       return ;
1003     }
1004     pItem->Select(false);
1005     return ;
1006   }
1007   // popup the context menu
1008
1009   bool showEntry = false;
1010   if (item >= m_vecItems[list]->Size()) item = -1;
1011   if (item >= 0)
1012     showEntry=(!pItem->IsParentFolder() || (pItem->IsParentFolder() && m_vecItems[list]->GetSelectedCount()>0));
1013
1014   // determine available players
1015   VECPLAYERCORES vecCores;
1016   CPlayerCoreFactory::GetPlayers(*pItem, vecCores);
1017
1018   // add the needed buttons
1019   CContextButtons choices;
1020   if (item >= 0)
1021   {
1022     choices.Add(1, 188); // SelectAll
1023     if (!pItem->IsParentFolder())
1024       choices.Add(2, CFavourites::IsFavourite(pItem.get(), GetID()) ? 14077 : 14076); // Add/Remove Favourite
1025     if (vecCores.size() > 1)
1026       choices.Add(3, 15213); // Play Using...
1027     if (CanRename(list) && !pItem->IsParentFolder())
1028       choices.Add(4, 118); // Rename
1029     if (CanDelete(list) && showEntry)
1030       choices.Add(5, 117); // Delete
1031     if (CanCopy(list) && showEntry)
1032       choices.Add(6, 115); // Copy
1033     if (CanMove(list) && showEntry)
1034       choices.Add(7, 116); // Move
1035   }
1036   if (CanNewFolder(list))
1037     choices.Add(8, 20309); // New Folder
1038   if (item >= 0 && pItem->m_bIsFolder && !pItem->IsParentFolder())
1039     choices.Add(9, 13393); // Calculate Size
1040   choices.Add(10, 5);     // Settings
1041   choices.Add(11, 20128); // Go To Root
1042   choices.Add(12, 523);     // switch media
1043
1044   int btnid = CGUIDialogContextMenu::ShowAndGetChoice(choices);
1045   if (btnid == 1)
1046   {
1047     OnSelectAll(list);
1048     bDeselect=false;
1049   }
1050   if (btnid == 2)
1051   {
1052     CFavourites::AddOrRemove(pItem.get(), GetID());
1053     return;
1054   }
1055   if (btnid == 3)
1056   {
1057     VECPLAYERCORES vecCores;
1058     CPlayerCoreFactory::GetPlayers(*pItem, vecCores);
1059     g_application.m_eForcedNextPlayer = CPlayerCoreFactory::SelectPlayerDialog(vecCores);
1060     if (g_application.m_eForcedNextPlayer != EPC_NONE)
1061       OnStart(pItem.get());
1062   }
1063   if (btnid == 4)
1064     OnRename(list);
1065   if (btnid == 5)
1066     OnDelete(list);
1067   if (btnid == 6)
1068     OnCopy(list);
1069   if (btnid == 7)
1070     OnMove(list);
1071   if (btnid == 8)
1072     OnNewFolder(list);
1073   if (btnid == 9)
1074   {
1075     // setup the progress dialog, and show it
1076     CGUIDialogProgress *progress = (CGUIDialogProgress *)g_windowManager.GetWindow(WINDOW_DIALOG_PROGRESS);
1077     if (progress)
1078     {
1079       progress->SetHeading(13394);
1080       for (int i=0; i < 3; i++)
1081         progress->SetLine(i, "");
1082       progress->StartModal();
1083     }
1084
1085     //  Calculate folder size for each selected item
1086     for (int i=0; i<m_vecItems[list]->Size(); ++i)
1087     {
1088       CFileItemPtr pItem2=m_vecItems[list]->Get(i);
1089       if (pItem2->m_bIsFolder && pItem2->IsSelected())
1090       {
1091         int64_t folderSize = CalculateFolderSize(pItem2->m_strPath, progress);
1092         if (folderSize >= 0)
1093         {
1094           pItem2->m_dwSize = folderSize;
1095           if (folderSize == 0)
1096             pItem2->SetLabel2(StringUtils::SizeToString(folderSize));
1097           else
1098             pItem2->SetFileSizeLabel();
1099         }
1100       }
1101     }
1102     if (progress)
1103       progress->Close();
1104   }
1105   if (btnid == 10)
1106   {
1107     g_windowManager.ActivateWindow(WINDOW_SETTINGS_MENU);
1108     return;
1109   }
1110   if (btnid == 11)
1111   {
1112     Update(list,"");
1113     return;
1114   }
1115   if (btnid == 12)
1116   {
1117     CGUIDialogContextMenu::SwitchMedia("files", m_vecItems[list]->m_strPath);
1118     return;
1119   }
1120
1121   if (bDeselect && item >= 0 && item < m_vecItems[list]->Size())
1122   { // deselect item as we didn't do anything
1123     pItem->Select(false);
1124   }
1125 }
1126
1127 // Highlights the item in the list under the cursor
1128 // returns true if we should deselect the item, false otherwise
1129 bool CGUIWindowFileManager::SelectItem(int list, int &item)
1130 {
1131   // get the currently selected item in the list
1132   item = GetSelectedItem(list);
1133
1134   // select the item if we need to
1135   if (item > -1 && !NumSelected(list) && !m_vecItems[list]->Get(item)->IsParentFolder())
1136   {
1137     m_vecItems[list]->Get(item)->Select(true);
1138     return true;
1139   }
1140   return false;
1141 }
1142
1143 // recursively calculates the selected folder size
1144 int64_t CGUIWindowFileManager::CalculateFolderSize(const CStdString &strDirectory, CGUIDialogProgress *pProgress)
1145 {
1146   if (pProgress)
1147   { // update our progress control
1148     pProgress->Progress();
1149     pProgress->SetLine(1, strDirectory);
1150     if (pProgress->IsCanceled())
1151       return -1;
1152   }
1153   // start by calculating the size of the files in this folder...
1154   int64_t totalSize = 0;
1155   CFileItemList items;
1156   CVirtualDirectory rootDir;
1157   rootDir.SetSources(g_settings.m_fileSources);
1158   rootDir.GetDirectory(strDirectory, items, false);
1159   for (int i=0; i < items.Size(); i++)
1160   {
1161     if (items[i]->m_bIsFolder && !items[i]->IsParentFolder()) // folder
1162     {
1163       int64_t folderSize = CalculateFolderSize(items[i]->m_strPath, pProgress);
1164       if (folderSize < 0) return -1;
1165       totalSize += folderSize;
1166     }
1167     else // file
1168       totalSize += items[i]->m_dwSize;
1169   }
1170   return totalSize;
1171 }
1172
1173 void CGUIWindowFileManager::OnJobComplete(unsigned int jobID, bool success, CJob *job)
1174 {
1175   m_dlgProgress->SetLine(0, 1040);
1176   m_dlgProgress->SetLine(1, "");
1177   m_dlgProgress->SetLine(2, "");
1178   m_dlgProgress->SetPercentage(100);
1179   Refresh();
1180   m_dlgProgress->Close();
1181
1182   if(!success)
1183     CGUIDialogOK::ShowAndGetInput(m_errorHeading, m_errorLine, 16200, 0);
1184 }
1185
1186 void CGUIWindowFileManager::OnJobProgress(unsigned int jobID, unsigned int progress, unsigned int total, const CJob *job)
1187 {
1188   if (m_dlgProgress->IsCanceled())
1189   {
1190     CJobManager::GetInstance().CancelJob(jobID);
1191     m_dlgProgress->SetLine(0, 1040);
1192     m_dlgProgress->SetLine(1, "");
1193     m_dlgProgress->SetLine(2, "");
1194     Refresh();
1195     m_dlgProgress->Close();
1196   }
1197   else
1198   {
1199     CFileOperationJob *fileJob = (CFileOperationJob *)job;
1200
1201     m_dlgProgress->SetLine(0, fileJob->GetCurrentOperation());
1202     m_dlgProgress->SetLine(1, fileJob->GetCurrentFile());
1203     m_dlgProgress->SetLine(2, fileJob->GetAverageSpeed());
1204
1205     if (total > 0)
1206       m_dlgProgress->SetPercentage((int)((float)progress * 100.0f / (float)total));
1207   }
1208 }
1209
1210 void CGUIWindowFileManager::ShowShareErrorMessage(CFileItem* pItem)
1211 {
1212   if (pItem->m_bIsShareOrDrive)
1213   {
1214     int idMessageText=0;
1215     CURL url(pItem->m_strPath);
1216     const CStdString& strHostName=url.GetHostName();
1217
1218     if (pItem->m_iDriveType!=CMediaSource::SOURCE_TYPE_REMOTE) //  Local shares incl. dvd drive
1219       idMessageText=15300;
1220     else if (url.GetProtocol()=="xbms" && strHostName.IsEmpty()) //  xbms server discover
1221       idMessageText=15302;
1222     else if (url.GetProtocol()=="smb" && strHostName.IsEmpty()) //  smb workgroup
1223       idMessageText=15303;
1224     else  //  All other remote shares
1225       idMessageText=15301;
1226
1227     CGUIDialogOK::ShowAndGetInput(220, idMessageText, 0, 0);
1228   }
1229 }
1230
1231 void CGUIWindowFileManager::OnInitWindow()
1232 {
1233   m_dlgProgress = (CGUIDialogProgress*)g_windowManager.GetWindow(WINDOW_DIALOG_PROGRESS);
1234   if (m_dlgProgress) m_dlgProgress->SetHeading(126);
1235
1236   for (int i = 0; i < 2; i++)
1237   {
1238     Update(i, m_Directory[i]->m_strPath);
1239   }
1240   CGUIWindow::OnInitWindow();
1241
1242   if (!bCheckShareConnectivity)
1243   {
1244     bCheckShareConnectivity = true; //reset
1245     CFileItem pItem;
1246     pItem.m_strPath=strCheckSharePath;
1247     pItem.m_bIsShareOrDrive = true;
1248     if (CUtil::IsHD(strCheckSharePath))
1249       pItem.m_iDriveType=CMediaSource::SOURCE_TYPE_LOCAL;
1250     else //we asume that this is a remote share else we can set SOURCE_TYPE_UNKNOWN
1251       pItem.m_iDriveType=CMediaSource::SOURCE_TYPE_REMOTE;
1252     ShowShareErrorMessage(&pItem); //show the error message after window is loaded!
1253     Update(0,""); // reset view to root
1254   }
1255 }
1256
1257 void CGUIWindowFileManager::SetInitialPath(const CStdString &path)
1258 {
1259   // check for a passed destination path
1260   CStdString strDestination = path;
1261   m_rootDir.SetSources(*g_settings.GetSourcesFromType("files"));
1262   if (!strDestination.IsEmpty())
1263   {
1264     CLog::Log(LOGINFO, "Attempting to quickpath to: %s", strDestination.c_str());
1265   }
1266   // otherwise, is this the first time accessing this window?
1267   else if (m_Directory[0]->m_strPath == "?")
1268   {
1269     m_Directory[0]->m_strPath = strDestination = g_settings.m_defaultFileSource;
1270     CLog::Log(LOGINFO, "Attempting to default to: %s", strDestination.c_str());
1271   }
1272   // try to open the destination path
1273   if (!strDestination.IsEmpty())
1274   {
1275     // open root
1276     if (strDestination.Equals("$ROOT"))
1277     {
1278       m_Directory[0]->m_strPath = "";
1279       CLog::Log(LOGINFO, "  Success! Opening root listing.");
1280     }
1281     else
1282     {
1283       // default parameters if the jump fails
1284       m_Directory[0]->m_strPath = "";
1285
1286       bool bIsSourceName = false;
1287       VECSOURCES shares;
1288       m_rootDir.GetSources(shares);
1289       int iIndex = CUtil::GetMatchingSource(strDestination, shares, bIsSourceName);
1290       if (iIndex > -1)
1291       {
1292         // set current directory to matching share
1293         if (bIsSourceName && iIndex < (int)shares.size())
1294           m_Directory[0]->m_strPath = shares[iIndex].strPath;
1295         else
1296           m_Directory[0]->m_strPath = strDestination;
1297         CUtil::RemoveSlashAtEnd(m_Directory[0]->m_strPath);
1298         CLog::Log(LOGINFO, "  Success! Opened destination path: %s", strDestination.c_str());
1299
1300         // outside call: check the share for connectivity
1301         bCheckShareConnectivity = Update(0, m_Directory[0]->m_strPath);
1302         if(!bCheckShareConnectivity)
1303           strCheckSharePath = m_Directory[0]->m_strPath;
1304       }
1305       else
1306       {
1307         CLog::Log(LOGERROR, "  Failed! Destination parameter (%s) does not match a valid share!", strDestination.c_str());
1308       }
1309     }
1310   }
1311
1312   if (m_Directory[1]->m_strPath == "?") m_Directory[1]->m_strPath = "";
1313 }
1314
1315 void CGUIWindowFileManager::ResetProgressBar(bool showProgress /*= true */)
1316 {
1317   if (m_dlgProgress)
1318   {
1319     m_dlgProgress->SetHeading(126);
1320     m_dlgProgress->SetLine(0, 0);
1321     m_dlgProgress->SetLine(1, 0);
1322     m_dlgProgress->SetLine(2, 0);
1323     m_dlgProgress->SetPercentage(0);
1324     m_dlgProgress->StartModal();
1325     m_dlgProgress->ShowProgressBar(showProgress);
1326   }
1327 }
1328
1329 const CFileItem& CGUIWindowFileManager::CurrentDirectory(int indx) const
1330 {
1331   return *m_Directory[indx];
1332 }