Added dbus interface for regular qcma.
Added option to disable the systray: --no-systray.
This commit is contained in:
		@@ -1,6 +1,7 @@
 | 
				
			|||||||
qcma (0.3.0) unstable; urgency=low
 | 
					qcma (0.3.0) unstable; urgency=low
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  * Headless qcma version.
 | 
					  * Headless qcma version.
 | 
				
			||||||
 | 
					  * Added dbus controls to qcma (Linux only)
 | 
				
			||||||
  * Set the default video codec to h264 if metadata skip is enabled.
 | 
					  * Set the default video codec to h264 if metadata skip is enabled.
 | 
				
			||||||
  * Delay the progress dialog by one second so it doesn't show on quick scans.
 | 
					  * Delay the progress dialog by one second so it doesn't show on quick scans.
 | 
				
			||||||
  * Do not show the disconnect message if no connection is established.
 | 
					  * Do not show the disconnect message if no connection is established.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -25,4 +25,3 @@ system(qdbuscpp2xml -M -s src/cli/headlessmanager.h -o org.qcma.HeadlessManager.
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
# Create the helper class
 | 
					# Create the helper class
 | 
				
			||||||
DBUS_ADAPTORS = org.qcma.HeadlessManager.xml
 | 
					DBUS_ADAPTORS = org.qcma.HeadlessManager.xml
 | 
				
			||||||
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										11
									
								
								qcma_gui.pro
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								qcma_gui.pro
									
									
									
									
									
								
							@@ -65,3 +65,14 @@ unix:!macx {
 | 
				
			|||||||
        HEADERS += src/kdenotifier.h
 | 
					        HEADERS += src/kdenotifier.h
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					unix:!macx {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					QT += dbus
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Create the introspection XML
 | 
				
			||||||
 | 
					system(qdbuscpp2xml -M -s src/gui/mainwidget.h -o org.qcma.ClientManager.xml)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Create the helper class
 | 
				
			||||||
 | 
					DBUS_ADAPTORS = org.qcma.ClientManager.xml
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -45,6 +45,7 @@ void ClientManager::databaseUpdated(int count)
 | 
				
			|||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
        emit messageSent(tr("Database indexing aborted by user"));
 | 
					        emit messageSent(tr("Database indexing aborted by user"));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    emit updated(count);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void ClientManager::showPinDialog(QString name, int pin)
 | 
					void ClientManager::showPinDialog(QString name, int pin)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -50,15 +50,18 @@ private:
 | 
				
			|||||||
    QThread *wireless_thread;
 | 
					    QThread *wireless_thread;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
signals:
 | 
					signals:
 | 
				
			||||||
 | 
					    void updated(int);
 | 
				
			||||||
    void stopped();
 | 
					    void stopped();
 | 
				
			||||||
    void receivedPin(int);
 | 
					    void receivedPin(int);
 | 
				
			||||||
    void deviceDisconnected();
 | 
					    void deviceDisconnected();
 | 
				
			||||||
    void messageSent(QString);
 | 
					    void messageSent(QString);
 | 
				
			||||||
    void deviceConnected(QString);
 | 
					    void deviceConnected(QString);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public slots:
 | 
				
			||||||
 | 
					    void refreshDatabase();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
private slots:
 | 
					private slots:
 | 
				
			||||||
    void threadStopped();
 | 
					    void threadStopped();
 | 
				
			||||||
    void refreshDatabase();
 | 
					 | 
				
			||||||
    void databaseUpdated(int count);
 | 
					    void databaseUpdated(int count);
 | 
				
			||||||
    void showPinDialog(QString name, int pin);
 | 
					    void showPinDialog(QString name, int pin);
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -110,8 +110,10 @@ int main(int argc, char *argv[])
 | 
				
			|||||||
    //TODO: check if this is actually needed since we don't have a main window by default
 | 
					    //TODO: check if this is actually needed since we don't have a main window by default
 | 
				
			||||||
    QApplication::setQuitOnLastWindowClosed(false);
 | 
					    QApplication::setQuitOnLastWindowClosed(false);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    bool showSystray = app.arguments().contains("--no-systray");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    MainWidget widget;
 | 
					    MainWidget widget;
 | 
				
			||||||
    widget.prepareApplication();
 | 
					    widget.prepareApplication(showSystray);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // receive the message from another process
 | 
					    // receive the message from another process
 | 
				
			||||||
    QObject::connect(&app, SIGNAL(messageAvailable(QString)), &widget, SLOT(receiveMessage(QString)));
 | 
					    QObject::connect(&app, SIGNAL(messageAvailable(QString)), &widget, SLOT(receiveMessage(QString)));
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -21,6 +21,10 @@
 | 
				
			|||||||
#include "cmaclient.h"
 | 
					#include "cmaclient.h"
 | 
				
			||||||
#include "cmautils.h"
 | 
					#include "cmautils.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef Q_OS_LINUX
 | 
				
			||||||
 | 
					#include "clientmanager_adaptor.h"
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "qlistdb.h"
 | 
					#include "qlistdb.h"
 | 
				
			||||||
#include "sqlitedb.h"
 | 
					#include "sqlitedb.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -44,10 +48,32 @@ const QStringList MainWidget::path_list = QStringList() << "photoPath" << "music
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
bool sleptOnce = false;
 | 
					bool sleptOnce = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef Q_OS_LINUX
 | 
				
			||||||
 | 
					MainWidget::MainWidget(QWidget *parent) :
 | 
				
			||||||
 | 
					    QWidget(parent), db(NULL), configForm(NULL), managerForm(NULL), backupForm(NULL), dbus_conn(QDBusConnection::sessionBus())
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    new ClientManagerAdaptor(this);
 | 
				
			||||||
 | 
					    QDBusConnection dbus = QDBusConnection::sessionBus();
 | 
				
			||||||
 | 
					    // expose qcma over dbus so the database update can be triggered
 | 
				
			||||||
 | 
					    dbus.registerObject("/ClientManager", this);
 | 
				
			||||||
 | 
					    dbus.registerService("org.qcma.ClientManager");
 | 
				
			||||||
 | 
					#ifndef ENABLE_KDE_NOTIFIER
 | 
				
			||||||
 | 
					    trayIcon = NULL;
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					    notifierItem = NULL;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
MainWidget::MainWidget(QWidget *parent) :
 | 
					MainWidget::MainWidget(QWidget *parent) :
 | 
				
			||||||
    QWidget(parent), db(NULL), configForm(NULL), managerForm(NULL), backupForm(NULL)
 | 
					    QWidget(parent), db(NULL), configForm(NULL), managerForm(NULL), backupForm(NULL)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					#ifndef ENABLE_KDE_NOTIFIER
 | 
				
			||||||
 | 
					    trayIcon = NULL;
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					    notifierItem = NULL;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void MainWidget::checkSettings()
 | 
					void MainWidget::checkSettings()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -101,7 +127,7 @@ void MainWidget::deviceDisconnect()
 | 
				
			|||||||
    receiveMessage(tr("The device has been disconnected"));
 | 
					    receiveMessage(tr("The device has been disconnected"));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void MainWidget::deviceConnected(QString message)
 | 
					void MainWidget::deviceConnect(QString message)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#ifndef ENABLE_KDE_NOTIFIER
 | 
					#ifndef ENABLE_KDE_NOTIFIER
 | 
				
			||||||
#ifndef Q_OS_WIN32
 | 
					#ifndef Q_OS_WIN32
 | 
				
			||||||
@@ -117,7 +143,7 @@ void MainWidget::deviceConnected(QString message)
 | 
				
			|||||||
    receiveMessage(message);
 | 
					    receiveMessage(message);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void MainWidget::prepareApplication()
 | 
					void MainWidget::prepareApplication(bool showSystray)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    //TODO: delete database before exit
 | 
					    //TODO: delete database before exit
 | 
				
			||||||
    if(QSettings().value("useMemoryStorage", true).toBool()) {
 | 
					    if(QSettings().value("useMemoryStorage", true).toBool()) {
 | 
				
			||||||
@@ -130,7 +156,11 @@ void MainWidget::prepareApplication()
 | 
				
			|||||||
    backupForm = new BackupManagerForm(db, this);
 | 
					    backupForm = new BackupManagerForm(db, this);
 | 
				
			||||||
    managerForm = new ClientManager(db, this);
 | 
					    managerForm = new ClientManager(db, this);
 | 
				
			||||||
    connectSignals();
 | 
					    connectSignals();
 | 
				
			||||||
    createTrayIcon();
 | 
					
 | 
				
			||||||
 | 
					    if(showSystray) {
 | 
				
			||||||
 | 
					        createTrayIcon();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    checkSettings();
 | 
					    checkSettings();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -138,19 +168,22 @@ void MainWidget::connectSignals()
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
    connect(configForm, SIGNAL(finished(int)), this, SLOT(dialogResult(int)));
 | 
					    connect(configForm, SIGNAL(finished(int)), this, SLOT(dialogResult(int)));
 | 
				
			||||||
    connect(managerForm, SIGNAL(stopped()), qApp, SLOT(quit()));
 | 
					    connect(managerForm, SIGNAL(stopped()), qApp, SLOT(quit()));
 | 
				
			||||||
    connect(managerForm, SIGNAL(deviceConnected(QString)), this, SLOT(deviceConnected(QString)));
 | 
					    connect(managerForm, SIGNAL(deviceConnected(QString)), this, SIGNAL(deviceConnected(QString)));
 | 
				
			||||||
    connect(managerForm, SIGNAL(deviceDisconnected()), this, SLOT(deviceDisconnect()));
 | 
					    connect(managerForm, SIGNAL(deviceDisconnected()), this, SIGNAL(deviceDisconnected()));
 | 
				
			||||||
    connect(managerForm, SIGNAL(messageSent(QString)), this, SLOT(receiveMessage(QString)));
 | 
					    connect(managerForm, SIGNAL(messageSent(QString)), this, SIGNAL(messageReceived(QString)));
 | 
				
			||||||
 | 
					    connect(managerForm, SIGNAL(updated(int)), this, SIGNAL(databaseUpdated(int)));
 | 
				
			||||||
    //backupForm.db = managerForm.db;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void MainWidget::setTrayTooltip(QString message)
 | 
					void MainWidget::setTrayTooltip(QString message)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#ifndef ENABLE_KDE_NOTIFIER
 | 
					#ifndef ENABLE_KDE_NOTIFIER
 | 
				
			||||||
    trayIcon->setToolTip(message);
 | 
					    if(trayIcon) {
 | 
				
			||||||
 | 
					        trayIcon->setToolTip(message);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
    notifierItem->setToolTipSubTitle(message);
 | 
					    if(notifierItem) {
 | 
				
			||||||
 | 
					        notifierItem->setToolTipSubTitle(message);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -189,6 +222,16 @@ void MainWidget::showAboutQt()
 | 
				
			|||||||
    QMessageBox::aboutQt(this);
 | 
					    QMessageBox::aboutQt(this);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void MainWidget::openConfig()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    configForm->open();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void MainWidget::refreshDatabase()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    managerForm->refreshDatabase();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void MainWidget::createTrayIcon()
 | 
					void MainWidget::createTrayIcon()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    options = new QAction(tr("&Settings"), this);
 | 
					    options = new QAction(tr("&Settings"), this);
 | 
				
			||||||
@@ -198,9 +241,9 @@ void MainWidget::createTrayIcon()
 | 
				
			|||||||
    about_qt = new QAction(tr("Abou&t Qt"), this);
 | 
					    about_qt = new QAction(tr("Abou&t Qt"), this);
 | 
				
			||||||
    quit = new QAction(tr("&Quit"), this);
 | 
					    quit = new QAction(tr("&Quit"), this);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    connect(options, SIGNAL(triggered()), configForm, SLOT(open()));
 | 
					    connect(options, SIGNAL(triggered()), this, SLOT(openConfig()));
 | 
				
			||||||
    connect(backup, SIGNAL(triggered()), this, SLOT(openManager()));
 | 
					    connect(backup, SIGNAL(triggered()), this, SLOT(openManager()));
 | 
				
			||||||
    connect(reload, SIGNAL(triggered()), managerForm, SLOT(refreshDatabase()));
 | 
					    connect(reload, SIGNAL(triggered()), this, SLOT(refreshDatabase()));
 | 
				
			||||||
    connect(about, SIGNAL(triggered()), this, SLOT(showAboutDialog()));
 | 
					    connect(about, SIGNAL(triggered()), this, SLOT(showAboutDialog()));
 | 
				
			||||||
    connect(about_qt, SIGNAL(triggered()), this, SLOT(showAboutQt()));
 | 
					    connect(about_qt, SIGNAL(triggered()), this, SLOT(showAboutQt()));
 | 
				
			||||||
    connect(quit, SIGNAL(triggered()), this, SLOT(stopServer()));
 | 
					    connect(quit, SIGNAL(triggered()), this, SLOT(stopServer()));
 | 
				
			||||||
@@ -241,6 +284,10 @@ void MainWidget::createTrayIcon()
 | 
				
			|||||||
    notifierItem->setToolTipSubTitle(tr("Disconnected"));
 | 
					    notifierItem->setToolTipSubTitle(tr("Disconnected"));
 | 
				
			||||||
    notifierItem->setStandardActionsEnabled(false);
 | 
					    notifierItem->setStandardActionsEnabled(false);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    connect(managerForm, SIGNAL(deviceConnected(QString)), this, SLOT(deviceConnect(QString)));
 | 
				
			||||||
 | 
					    connect(managerForm, SIGNAL(deviceDisconnected()), this, SLOT(deviceDisconnect()));
 | 
				
			||||||
 | 
					    connect(managerForm, SIGNAL(messageSent(QString)), this, SLOT(receiveMessage(QString)));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void MainWidget::receiveMessage(QString message)
 | 
					void MainWidget::receiveMessage(QString message)
 | 
				
			||||||
@@ -265,7 +312,9 @@ void MainWidget::receiveMessage(QString message)
 | 
				
			|||||||
MainWidget::~MainWidget()
 | 
					MainWidget::~MainWidget()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#ifndef ENABLE_KDE_NOTIFIER
 | 
					#ifndef ENABLE_KDE_NOTIFIER
 | 
				
			||||||
    trayIcon->hide();
 | 
					    if(trayIcon) {
 | 
				
			||||||
 | 
					        trayIcon->hide();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
    delete db;
 | 
					    delete db;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -34,16 +34,22 @@
 | 
				
			|||||||
#include "kdenotifier.h"
 | 
					#include "kdenotifier.h"
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef Q_OS_LINUX
 | 
				
			||||||
 | 
					#include <QDBusConnection>
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <vitamtp.h>
 | 
					#include <vitamtp.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class MainWidget : public QWidget
 | 
					class MainWidget : public QWidget
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    Q_OBJECT
 | 
					    Q_OBJECT
 | 
				
			||||||
 | 
					    Q_CLASSINFO("D-Bus Interface", "org.qcma.ClientManager")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public:
 | 
					public:
 | 
				
			||||||
    explicit MainWidget(QWidget *parent = 0);
 | 
					    explicit MainWidget(QWidget *parent = 0);
 | 
				
			||||||
    ~MainWidget();
 | 
					    ~MainWidget();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    void prepareApplication();
 | 
					    void prepareApplication(bool showSystray);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
private:
 | 
					private:
 | 
				
			||||||
    void connectSignals();
 | 
					    void connectSignals();
 | 
				
			||||||
@@ -68,6 +74,10 @@ private:
 | 
				
			|||||||
    QAction *about;
 | 
					    QAction *about;
 | 
				
			||||||
    QAction *about_qt;
 | 
					    QAction *about_qt;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef Q_OS_LINUX
 | 
				
			||||||
 | 
					    QDBusConnection dbus_conn;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef ENABLE_KDE_NOTIFIER
 | 
					#ifndef ENABLE_KDE_NOTIFIER
 | 
				
			||||||
    QSystemTrayIcon *trayIcon;
 | 
					    QSystemTrayIcon *trayIcon;
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
@@ -76,12 +86,22 @@ private:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    const static QStringList path_list;
 | 
					    const static QStringList path_list;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
private slots:
 | 
					signals:
 | 
				
			||||||
    void stopServer();
 | 
					    Q_SCRIPTABLE void deviceConnected(QString);
 | 
				
			||||||
 | 
					    Q_SCRIPTABLE void deviceDisconnected();
 | 
				
			||||||
 | 
					    Q_SCRIPTABLE void databaseUpdated(int count);
 | 
				
			||||||
 | 
					    Q_SCRIPTABLE void messageReceived(QString message);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public slots:
 | 
				
			||||||
 | 
					    void openConfig();
 | 
				
			||||||
    void openManager();
 | 
					    void openManager();
 | 
				
			||||||
    void showAboutQt();
 | 
					    void showAboutQt();
 | 
				
			||||||
    void showAboutDialog();
 | 
					    void showAboutDialog();
 | 
				
			||||||
    void deviceConnected(QString message);
 | 
					    void refreshDatabase();
 | 
				
			||||||
 | 
					    void stopServer();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					private slots:
 | 
				
			||||||
 | 
					    void deviceConnect(QString message);
 | 
				
			||||||
    void deviceDisconnect();
 | 
					    void deviceDisconnect();
 | 
				
			||||||
    void dialogResult(int result);
 | 
					    void dialogResult(int result);
 | 
				
			||||||
    void receiveMessage(QString message);
 | 
					    void receiveMessage(QString message);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -386,7 +386,7 @@ int SQLiteDB::insertObjectEntry(const QString &path, const QString &name, int pa
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
int SQLiteDB::insertObjectEntryInternal(const QString &path, const QString &name, int parent_ohfi, int root_ohfi)
 | 
					int SQLiteDB::insertObjectEntryInternal(const QString &path, const QString &name, int parent_ohfi, int root_ohfi)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    int ohfi;
 | 
					    int ohfi = 0;
 | 
				
			||||||
    QFileInfo info(path, name);
 | 
					    QFileInfo info(path, name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if(info.isDir()) {
 | 
					    if(info.isDir()) {
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user