Carlos Jose Mazieri has proposed merging 
lp:~carlos-mazieri/ubuntu-filemanager-app/samba-actions-08 into 
lp:ubuntu-filemanager-app with 
lp:~carlos-mazieri/ubuntu-filemanager-app/samba-actions-07 as a prerequisite.

Commit message:
Object LocationItemDirIterator is created by Location classes, it will replace 
Qt Object QDirIterator in Actions.

Requested reviews:
  Ubuntu File Manager Developers (ubuntu-filemanager-dev)

For more details, see:
https://code.launchpad.net/~carlos-mazieri/ubuntu-filemanager-app/samba-actions-08/+merge/265199

Location class improved: 

  * Created Location::urlBelongsToLocation() to be used in 
LocationsFactory::parse()
    It avoids big changes in the  LocationsFactory when adding new protocols to 
File Manager
  * Added creation of LocationItemDirIterator object which is similar to Qt 
QDirIterator object
-- 
Your team Ubuntu File Manager Developers is requested to review the proposed 
merge of lp:~carlos-mazieri/ubuntu-filemanager-app/samba-actions-08 into 
lp:ubuntu-filemanager-app.
=== modified file 'src/plugin/folderlistmodel/CMakeLists.txt'
--- src/plugin/folderlistmodel/CMakeLists.txt	2015-06-20 15:15:44 +0000
+++ src/plugin/folderlistmodel/CMakeLists.txt	2015-07-18 22:03:45 +0000
@@ -51,6 +51,8 @@
     urliteminfo.h
     disk/disklocation.cpp
     disk/disklocation.h
+    disk/disklocationitemdiriterator.cpp
+    disk/disklocationitemdiriterator.h
     trash/qtrashdir.cpp
     trash/qtrashdir.h   
     trash/qtrashutilinfo.cpp

=== modified file 'src/plugin/folderlistmodel/disk/disklocation.cpp'
--- src/plugin/folderlistmodel/disk/disklocation.cpp	2015-03-01 15:32:42 +0000
+++ src/plugin/folderlistmodel/disk/disklocation.cpp	2015-07-18 22:03:45 +0000
@@ -20,9 +20,16 @@
  */
 
 #include "disklocation.h"
+#include "disklocationitemdiriterator.h"
 #include "iorequest.h"
 #include "ioworkerthread.h"
 #include "externalfswatcher.h"
+#include "locationurl.h"
+
+
+#if defined(Q_OS_UNIX)
+#include <sys/statvfs.h>
+#endif
 
 #include <QDebug>
 
@@ -168,3 +175,37 @@
     return new DirListWorker(urlPath,filter,isRecursive);
 }
 
+
+QString DiskLocation::urlBelongsToLocation(const QString &urlPath, int indexOfColonAndSlashe)
+{
+    QString ret;
+    if (urlPath.startsWith(LocationUrl::DiskRootURL.midRef(0,5)))
+    {
+        ret  = QDir::rootPath() + DirItemInfo::removeExtraSlashes(urlPath, indexOfColonAndSlashe+1);
+    }
+    return ret;
+}
+
+
+LocationItemDirIterator *
+DiskLocation::newDirIterator(const QString &path,
+                             QDir::Filters filters,
+                             QDirIterator::IteratorFlags flags)
+{
+    return  new DiskLocationItemDirIterator(path, filters, flags);
+}
+
+
+bool DiskLocation::isThereDiskSpace(const QString &pathname, qint64 requiredSize)
+{
+    bool ret = true;
+#if defined(Q_OS_UNIX)
+    struct statvfs  vfs;
+    if ( ::statvfs( QFile::encodeName(pathname).constData(), &vfs) == 0 )
+    {
+        qint64 free =  vfs.f_bsize * vfs.f_bfree;
+        ret = free > requiredSize;
+    }
+#endif
+   return ret;
+}

=== modified file 'src/plugin/folderlistmodel/disk/disklocation.h'
--- src/plugin/folderlistmodel/disk/disklocation.h	2015-03-01 15:32:42 +0000
+++ src/plugin/folderlistmodel/disk/disklocation.h	2015-07-18 22:03:45 +0000
@@ -63,6 +63,11 @@
     virtual DirListWorker * newListWorker(const QString &urlPath,
                                           QDir::Filter filter,
                                           const bool isRecursive);
+    virtual LocationItemDirIterator * newDirIterator(const QString & path,
+                                                     QDir::Filters filters,
+                                                     QDirIterator::IteratorFlags flags = QDirIterator::NoIteratorFlags);   
+    virtual bool        isThereDiskSpace(const QString& pathname, qint64 requiredSize);
+    virtual QString     urlBelongsToLocation(const QString& urlPath, int indexOfColonAndSlashe);
 
 protected:
     void    addExternalFsWorkerRequest(ExternalFileSystemChangesWorker *);

=== added file 'src/plugin/folderlistmodel/disk/disklocationitemdiriterator.cpp'
--- src/plugin/folderlistmodel/disk/disklocationitemdiriterator.cpp	1970-01-01 00:00:00 +0000
+++ src/plugin/folderlistmodel/disk/disklocationitemdiriterator.cpp	2015-07-18 22:03:45 +0000
@@ -0,0 +1,94 @@
+/**************************************************************************
+ *
+ * Copyright 2015 Canonical Ltd.
+ * Copyright 2015 Carlos J Mazieri <carlos.mazi...@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; version 3.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * File: disklocationitemdiriterator.cpp
+ * Date: 29/03/2015
+ */
+
+#include "disklocationitemdiriterator.h"
+
+#include <QDirIterator>
+
+DiskLocationItemDirIterator::DiskLocationItemDirIterator(const QString &path,
+                                                         const QStringList &nameFilters,
+                                                         QDir::Filters filters,
+                                                         QDirIterator::IteratorFlags flags)
+          : LocationItemDirIterator(path,nameFilters,filters,flags)
+          , m_qtDirIterator(new QDirIterator(path, nameFilters, filters, flags))
+{
+
+}
+
+DiskLocationItemDirIterator::DiskLocationItemDirIterator(const QString &path,
+                                                         QDir::Filters filters,
+                                                         QDirIterator::IteratorFlags flags)
+
+          : LocationItemDirIterator(path,filters,flags)
+          , m_qtDirIterator(new QDirIterator(path,filters, flags))
+{
+
+}
+
+DiskLocationItemDirIterator::DiskLocationItemDirIterator(const QString &path,
+                                                         QDirIterator::IteratorFlags flags)
+         : LocationItemDirIterator(path,flags)
+         , m_qtDirIterator(new QDirIterator(path, flags))
+{
+
+}
+
+DiskLocationItemDirIterator::~DiskLocationItemDirIterator()
+{
+    delete m_qtDirIterator;
+}
+
+
+DirItemInfo DiskLocationItemDirIterator::fileInfo() const
+{
+    DirItemInfo itemInfo (m_qtDirIterator->fileInfo());
+    return itemInfo;
+}
+
+
+QString DiskLocationItemDirIterator::fileName() const
+{
+    return m_qtDirIterator->fileName();
+}
+
+
+QString DiskLocationItemDirIterator::filePath() const
+{
+    return m_qtDirIterator->filePath();
+}
+
+
+bool DiskLocationItemDirIterator::hasNext() const
+{
+    return m_qtDirIterator->hasNext();
+}
+
+
+QString DiskLocationItemDirIterator::next()
+{
+    return m_qtDirIterator->next();
+}
+
+
+QString DiskLocationItemDirIterator::path() const
+{
+    return m_qtDirIterator->path();
+}

=== added file 'src/plugin/folderlistmodel/disk/disklocationitemdiriterator.h'
--- src/plugin/folderlistmodel/disk/disklocationitemdiriterator.h	1970-01-01 00:00:00 +0000
+++ src/plugin/folderlistmodel/disk/disklocationitemdiriterator.h	2015-07-18 22:03:45 +0000
@@ -0,0 +1,50 @@
+/**************************************************************************
+ *
+ * Copyright 2015 Canonical Ltd.
+ * Copyright 2015 Carlos J Mazieri <carlos.mazi...@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; version 3.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * File: disklocationitemdiriterator.h
+ * Date: 29/03/2015
+ */
+
+#ifndef DISKLOCATIONITEMDIRITERATOR_H
+#define DISKLOCATIONITEMDIRITERATOR_H
+
+#include "locationitemdiriterator.h"
+
+class QDirIterator;
+
+class DiskLocationItemDirIterator : public LocationItemDirIterator
+{
+public:
+    explicit DiskLocationItemDirIterator(QObject *parent = 0);
+    ~DiskLocationItemDirIterator();
+public:
+   virtual DirItemInfo	fileInfo() const;
+   virtual QString	    fileName() const;
+   virtual QString	    filePath() const;
+   virtual bool	        hasNext()  const;
+   virtual QString	    next()          ;
+   virtual QString	    path()     const;
+public:
+   DiskLocationItemDirIterator(const QString & path, QDirIterator::IteratorFlags flags = QDirIterator::NoIteratorFlags);
+   DiskLocationItemDirIterator(const QString & path, QDir::Filters filters, QDirIterator::IteratorFlags flags = QDirIterator::NoIteratorFlags);
+   DiskLocationItemDirIterator(const QString & path, const QStringList & nameFilters, QDir::Filters filters = QDir::NoFilter, QDirIterator::IteratorFlags flags = QDirIterator::NoIteratorFlags);
+private:
+    QDirIterator * m_qtDirIterator;
+
+};
+
+#endif // DISKLOCATIONITEMDIRITERATOR_H

=== modified file 'src/plugin/folderlistmodel/folderlistmodel.pri'
--- src/plugin/folderlistmodel/folderlistmodel.pri	2015-06-03 11:54:36 +0000
+++ src/plugin/folderlistmodel/folderlistmodel.pri	2015-07-18 22:03:45 +0000
@@ -14,7 +14,10 @@
            $$PWD/locationsfactory.cpp \                    
            $$PWD/locationurl.cpp \             
            $$PWD/locationitemdiriterator.cpp \
-           $$PWD/cleanurl.cpp
+           $$PWD/cleanurl.cpp \
+           $$PWD/disk/disklocationitemdiriterator.cpp \         
+
+
 
 HEADERS += $$PWD/dirmodel.h \
            $$PWD/iorequest.h \
@@ -33,7 +36,9 @@
            $$PWD/locationsfactory.h \                   
            $$PWD/locationurl.h \          
            $$PWD/locationitemdiriterator.h \
-           $$PWD/cleanurl.h
+           $$PWD/cleanurl.h \
+           $$PWD/disk/disklocationitemdiriterator.h \
+
 
 SOURCES +=  $$PWD/disk/disklocation.cpp
 HEADERS +=  $$PWD/disk/disklocation.h

=== modified file 'src/plugin/folderlistmodel/location.h'
--- src/plugin/folderlistmodel/location.h	2015-07-18 22:03:45 +0000
+++ src/plugin/folderlistmodel/location.h	2015-07-18 22:03:45 +0000
@@ -25,9 +25,12 @@
 #include "diriteminfo.h"
 
 #include <QObject>
+#include <QDirIterator>
 
 class IOWorkerThread;
 class DirListWorker;
+class LocationItemDirIterator;
+
 
 /*!
  * \brief The Location class represents any location (full path) where there are items to browse: directories, shares, from Disk and from Network.
@@ -109,6 +112,41 @@
      */
     virtual DirListWorker *  newListWorker(const QString &urlPath, QDir::Filter filter, const bool isRecursive) = 0;
 
+    /*!
+     * \brief newDirIterator() creates a LocationItemDirIterator object which is similar to Qt QDirIterator object
+     *
+     *         It will be used to create a recursive list of items in copy/cut/paste/remove Actions
+     *         It can used in DirListWorker as well
+     * \param path
+     * \param flags
+     * \return
+     */
+     virtual LocationItemDirIterator * newDirIterator(const QString & path,
+                                                     QDir::Filters filters,
+                                                     QDirIterator::IteratorFlags flags = QDirIterator::NoIteratorFlags)  = 0;
+
+
+    /*!
+      * \brief urlBelongsToLocation() Returns a good  url if the \a urlPath is valid URL that belongs to its location
+      *
+      *  If the URL or Path in \a urlPath is valid and belongs to its location
+      *
+      * \param urlPath                  The input URL that is going to be parsed
+      * \param indexOfColonAndSlashe    The index of ":/"
+      * \return                         The good URL (parsed with extra slashes removed)
+      *                                 or an empty string if \a urlPath does not belong to its location
+      *
+      *Example regarding samba where both "cifs://" and "smb://" urls are supported
+      * \code"
+      *    For a urlPath like: "cifs://localhost/share/"
+      *    The return will be: "smb://localhost/share"   -> "cifs" changed by "smb" and last slash removed
+      *
+      *    For a urlPath like: "trash:///"
+      *    The return will be: an empty string meaning that this URL is not related to Samba
+      *\endcode
+      */
+     virtual QString         urlBelongsToLocation(const QString& urlPath, int indexOfColonAndSlashe) = 0;
+
 public:
     /*!
      * \brief isThereDiskSpace()  Check if the filesystem has enough space to put a file with size \a requiredSize

=== modified file 'src/plugin/folderlistmodel/locationsfactory.cpp'
--- src/plugin/folderlistmodel/locationsfactory.cpp	2015-07-18 22:03:45 +0000
+++ src/plugin/folderlistmodel/locationsfactory.cpp	2015-07-18 22:03:45 +0000
@@ -80,29 +80,15 @@
     Location * location = 0;   
     if ( (index = uPath.indexOf(LocationUrl::UrlIndicator)) != -1 )
     {
-#if defined(Q_OS_WIN)
-#else
-#if defined(Q_OS_UNIX)
-        if (uPath.startsWith(LocationUrl::TrashRootURL.midRef(0,6)))
-        {
-            type = Location::TrashDisk;
-            m_tmpPath  = LocationUrl::TrashRootURL + DirItemInfo::removeExtraSlashes(uPath, index+1);
-        }
-        else
-#endif //Q_OS_UNIX
-#endif
-        if (uPath.startsWith(LocationUrl::DiskRootURL.midRef(0,5)))
-        {
-            type = Location::LocalDisk;
-            m_tmpPath  = QDir::rootPath() + DirItemInfo::removeExtraSlashes(uPath, index+1);
-        }
-        else
-        if ( uPath.startsWith(LocationUrl::SmbURL.midRef(0,4)) ||
-             uPath.startsWith(LocationUrl::CifsURL.midRef(0,5))
-           )
-        {
-                type = Location::NetSambaShare;
-                m_tmpPath  = LocationUrl::SmbURL + DirItemInfo::removeExtraSlashes(uPath, index+1);
+        int counter = m_locations.count();
+        while (counter--)
+        {
+            m_tmpPath = m_locations.at(counter)->urlBelongsToLocation(uPath, index);
+            if (!m_tmpPath.isEmpty())
+            {
+                type = m_locations.at(counter)->type();
+                break;
+            }
         }
     }
     else

=== modified file 'src/plugin/folderlistmodel/smb/qsambaclient/src/smbiteminfo.cpp'
--- src/plugin/folderlistmodel/smb/qsambaclient/src/smbiteminfo.cpp	2015-03-14 17:38:50 +0000
+++ src/plugin/folderlistmodel/smb/qsambaclient/src/smbiteminfo.cpp	2015-07-18 22:03:45 +0000
@@ -50,7 +50,9 @@
 void SmbItemInfo::setInfo(const QString& smb_path)
 {   
     SmbUtil *smb = const_cast<SmbUtil*> (m_smb);
+    //getStatInfo() is supposed to clear the struct stat unless the item does not exist
     struct stat st;
+    ::memset(&st, 0, sizeof(struct stat));
     int ret  = smb->getStatInfo(smb_path, &st);
     //lets start with true
     d_ptr->_exists  = d_ptr->_isReadable = true;

=== modified file 'src/plugin/folderlistmodel/smb/qsambaclient/src/smblocationdiriterator.cpp'
--- src/plugin/folderlistmodel/smb/qsambaclient/src/smblocationdiriterator.cpp	2015-05-20 16:18:07 +0000
+++ src/plugin/folderlistmodel/smb/qsambaclient/src/smblocationdiriterator.cpp	2015-07-18 22:03:45 +0000
@@ -60,7 +60,7 @@
        , INIT_ATTR(path, smb)
 {
     bool recursive = flags == QDirIterator::Subdirectories ? true : false;
-    m_urlItems = smbObj()->listContent(path, recursive);
+    m_urlItems = smbObj()->listContent(path, recursive, QDir::NoFilter);
 }
 
 

=== modified file 'src/plugin/folderlistmodel/smb/smblocation.cpp'
--- src/plugin/folderlistmodel/smb/smblocation.cpp	2015-03-14 18:20:15 +0000
+++ src/plugin/folderlistmodel/smb/smblocation.cpp	2015-07-18 22:03:45 +0000
@@ -23,8 +23,16 @@
 #include "smbutil.h"
 #include "smbiteminfo.h"
 #include "smblistworker.h"
+#include "smblocationdiriterator.h"
 #include "iorequest.h"
 #include "ioworkerthread.h"
+#include "locationurl.h"
+
+
+
+#if defined(Q_OS_UNIX)
+#include <sys/statvfs.h>
+#endif
 
 SmbLocation::SmbLocation(int type, QObject *parent)
      : Location(type, parent)
@@ -82,3 +90,41 @@
     return new SmbListWorker(urlPath,filter,isRecursive, m_info ? m_info->isHost() : false, m_smb);
 }
 
+
+QString SmbLocation::urlBelongsToLocation(const QString &urlPath, int indexOfColonAndSlashe)
+{
+    QString ret;
+    if ( urlPath.startsWith(LocationUrl::SmbURL.midRef(0,4)) ||
+         urlPath.startsWith(LocationUrl::CifsURL.midRef(0,5))
+       )
+    {
+        ret  = LocationUrl::SmbURL + DirItemInfo::removeExtraSlashes(urlPath, indexOfColonAndSlashe+1);
+    }
+    return ret;
+}
+
+
+LocationItemDirIterator *
+SmbLocation::newDirIterator(const QString &path,
+                            QDir::Filters filters,
+                            QDirIterator::IteratorFlags flags)
+{
+    return new SmbLocationDirIterator(path, filters, flags, m_smb);
+}
+
+
+bool SmbLocation::isThereDiskSpace(const QString &pathname, qint64 requiredSize)
+{
+    bool ret = false;
+#if defined(Q_OS_UNIX)
+    struct statvfs st;
+    if (m_smb->getStatvfsInfo(pathname, &st) == SmbUtil::StatDone)
+    {
+        qint64 free =  st.f_bsize * st.f_bfree;
+        ret = free > requiredSize;
+    }
+#else
+   ret =  true;
+#endif
+   return ret;
+}

=== modified file 'src/plugin/folderlistmodel/smb/smblocation.h'
--- src/plugin/folderlistmodel/smb/smblocation.h	2015-03-14 18:20:15 +0000
+++ src/plugin/folderlistmodel/smb/smblocation.h	2015-07-18 22:03:45 +0000
@@ -39,6 +39,11 @@
     virtual DirListWorker * newListWorker(const QString &urlPath,
                                           QDir::Filter filter,
                                           const bool isRecursive);
+     virtual LocationItemDirIterator * newDirIterator(const QString & path,
+                                                      QDir::Filters filters,
+                                                      QDirIterator::IteratorFlags flags = QDirIterator::NoIteratorFlags);
+    virtual bool        isThereDiskSpace(const QString& pathname, qint64 requiredSize);
+    virtual QString     urlBelongsToLocation(const QString& urlPath, int indexOfColonAndSlashe);
     virtual QString     currentAuthenticationUser();
     virtual QString     currentAuthenticationPassword();
 

=== modified file 'src/plugin/folderlistmodel/smb/smblocationauthentication.cpp'
--- src/plugin/folderlistmodel/smb/smblocationauthentication.cpp	2015-04-29 23:23:31 +0000
+++ src/plugin/folderlistmodel/smb/smblocationauthentication.cpp	2015-07-18 22:03:45 +0000
@@ -30,12 +30,10 @@
 # define DEBUG_AUTHENTICATION() /**/
 #endif
 
-namespace
-{
-   QByteArray  m_AuthUser[MAX_AUTH_INSTANCES];
-   QByteArray  m_AuthPass[MAX_AUTH_INSTANCES];
-   void *      m_instances[MAX_AUTH_INSTANCES];
-}
+
+static    QByteArray  m_AuthUser[MAX_AUTH_INSTANCES];
+static    QByteArray  m_AuthPass[MAX_AUTH_INSTANCES];
+static    void *      m_instances[MAX_AUTH_INSTANCES];
 
 SmbLocationAuthentication::SmbLocationAuthentication() : m_infoIndex(-1)
 {

-- 
Mailing list: https://launchpad.net/~ubuntu-touch-coreapps-reviewers
Post to     : ubuntu-touch-coreapps-reviewers@lists.launchpad.net
Unsubscribe : https://launchpad.net/~ubuntu-touch-coreapps-reviewers
More help   : https://help.launchpad.net/ListHelp

Reply via email to