File indexing completed on 2024-05-05 17:01:33

0001 /***************************************************************************
0002     This class derives from QObject and encapsulates the network items. 
0003     It is for use with QtQuick.
0004                              -------------------
0005     begin                : Fr Mär 02 2012
0006     copyright            : (C) 2012-2019 by Alexander Reinholdt
0007     email                : alexander.reinholdt@kdemail.net
0008  ***************************************************************************/
0009 
0010 /***************************************************************************
0011  *   This program is free software; you can redistribute it and/or modify  *
0012  *   it under the terms of the GNU General Public License as published by  *
0013  *   the Free Software Foundation; either version 2 of the License, or     *
0014  *   (at your option) any later version.                                   *
0015  *                                                                         *
0016  *   This program is distributed in the hope that it will be useful, but   *
0017  *   WITHOUT ANY WARRANTY; without even the implied warranty of            *
0018  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU     *
0019  *   General Public License for more details.                              *
0020  *                                                                         *
0021  *   You should have received a copy of the GNU General Public License     *
0022  *   along with this program; if not, write to the                         *
0023  *   Free Software Foundation, Inc., 51 Franklin Street, Suite 500, Boston,*
0024  *   MA 02110-1335, USA                                                    *
0025  ***************************************************************************/
0026 
0027 #ifdef HAVE_CONFIG_H
0028 #include <config.h>
0029 #endif
0030 
0031 // application specific includes
0032 #include "smb4knetworkobject.h"
0033 #include "core/smb4kglobal.h"
0034 
0035 // Qt includes
0036 #include <QDebug>
0037 
0038 using namespace Smb4KGlobal;
0039 
0040 
0041 class Smb4KNetworkObjectPrivate
0042 {
0043   public:
0044     QString workgroup;
0045     QUrl url;
0046     int type;
0047     int parentType;
0048     QString comment;
0049     bool mounted;
0050     QUrl mountpoint;
0051     bool printer;
0052     bool isMaster;
0053     bool inaccessible;
0054 };
0055 
0056 
0057 Smb4KNetworkObject::Smb4KNetworkObject(Smb4KWorkgroup *workgroup, QObject *parent)
0058 : QObject(parent), d(new Smb4KNetworkObjectPrivate)
0059 {
0060   d->workgroup    = workgroup->workgroupName();
0061   d->url          = workgroup->url();
0062   d->mounted      = false;
0063   d->inaccessible = false;
0064   d->printer      = false;
0065   d->isMaster     = false;
0066   setType(Workgroup);
0067 }
0068 
0069 
0070 Smb4KNetworkObject::Smb4KNetworkObject(Smb4KHost *host, QObject *parent)
0071 : QObject(parent), d(new Smb4KNetworkObjectPrivate)
0072 {
0073   d->workgroup    = host->workgroupName();
0074   d->url          = host->url();
0075   d->comment      = host->comment();
0076   d->mounted      = false;
0077   d->inaccessible = false;
0078   d->printer      = false;
0079   d->isMaster     = host->isMasterBrowser();
0080   setType(Host);
0081 }
0082 
0083 
0084 Smb4KNetworkObject::Smb4KNetworkObject(Smb4KShare *share, QObject *parent)
0085 : QObject(parent), d(new Smb4KNetworkObjectPrivate)
0086 {
0087   d->workgroup    = share->workgroupName();
0088   d->url          = share->url();
0089   d->comment      = share->comment();
0090   d->mounted      = share->isMounted();
0091   d->inaccessible = share->isInaccessible();
0092   d->printer      = share->isPrinter();
0093   d->isMaster     = false;
0094   d->mountpoint   = QUrl::fromLocalFile(share->path());
0095   setType(Share);
0096 }
0097 
0098 
0099 Smb4KNetworkObject::Smb4KNetworkObject(QObject *parent)
0100 : QObject(parent), d(new Smb4KNetworkObjectPrivate)
0101 {
0102   d->url.setUrl("smb://", QUrl::TolerantMode);
0103   d->mounted      = false;
0104   d->inaccessible = false;
0105   d->printer      = false;
0106   d->isMaster     = false;
0107   setType(Network);
0108 }
0109 
0110 
0111 Smb4KNetworkObject::~Smb4KNetworkObject()
0112 {
0113 }
0114 
0115 
0116 Smb4KNetworkObject::NetworkItem Smb4KNetworkObject::type() const
0117 {
0118   return static_cast<Smb4KNetworkObject::NetworkItem>(d->type);
0119 }
0120 
0121 
0122 Smb4KNetworkObject::NetworkItem Smb4KNetworkObject::parentType() const
0123 {
0124   return static_cast<Smb4KNetworkObject::NetworkItem>(d->parentType);
0125 }
0126 
0127 
0128 void Smb4KNetworkObject::setType(NetworkItem type)
0129 {
0130   d->type = type;
0131   
0132   switch (type)
0133   {
0134     case Host:
0135     {
0136       d->parentType = Workgroup;
0137       break;
0138     }
0139     case Share:
0140     {
0141       d->parentType = Host;
0142       break;
0143     }
0144     default:
0145     {
0146       d->parentType = Network;
0147       break;
0148     }
0149   }
0150   emit changed();
0151 }
0152 
0153 
0154 QString Smb4KNetworkObject::workgroupName() const
0155 {
0156   return d->workgroup;
0157 }
0158 
0159 
0160 void Smb4KNetworkObject::setWorkgroupName(const QString& name)
0161 {
0162   d->workgroup = name;
0163   emit changed();
0164 }
0165 
0166 
0167 QString Smb4KNetworkObject::hostName() const
0168 {
0169   return d->url.host().toUpper();
0170 }
0171 
0172 
0173 void Smb4KNetworkObject::setHostName(const QString& name)
0174 {
0175   d->url.setHost(name);
0176   emit changed();
0177 }
0178 
0179 
0180 bool Smb4KNetworkObject::isMasterBrowser() const
0181 {
0182   return d->isMaster;
0183 }
0184 
0185 
0186 void Smb4KNetworkObject::setMasterBrowser(bool master)
0187 {
0188   if (type() == Host)
0189   {
0190     d->isMaster = master;
0191     emit changed();
0192   }
0193 }
0194 
0195 
0196 QString Smb4KNetworkObject::shareName() const
0197 {
0198   // Since users might come up with very weird share names,
0199   // we are careful and do not use QString::remove("/"), but
0200   // only remove preceding and trailing slashes.
0201   QString share_name = d->url.path();
0202 
0203   if (share_name.startsWith('/'))
0204   {
0205     share_name = share_name.remove(0, 1);
0206   }
0207 
0208   if (share_name.endsWith('/'))
0209   {
0210     share_name = share_name.remove(share_name.size() - 1, 1);
0211   }
0212 
0213   return share_name;
0214 }
0215 
0216 
0217 void Smb4KNetworkObject::setShareName(const QString& name)
0218 {
0219   d->url.setPath(name);
0220   emit changed();
0221 }
0222 
0223 
0224 QString Smb4KNetworkObject::name() const
0225 {
0226   QString name;
0227   
0228   switch (d->type)
0229   {
0230     case Workgroup:
0231     {
0232       name = workgroupName();
0233       break;
0234     }
0235     case Host:
0236     {
0237       name = hostName();
0238       break;
0239     }
0240     case Share:
0241     {
0242       name = shareName();
0243       break;
0244     }
0245     default:
0246     {
0247       break;
0248     }
0249   }
0250   
0251   return name;
0252 }
0253 
0254 
0255 QString Smb4KNetworkObject::comment() const
0256 {
0257   return d->comment;
0258 }
0259 
0260 
0261 void Smb4KNetworkObject::setComment(const QString& comment)
0262 {
0263   d->comment = comment;
0264   emit changed();
0265 }
0266 
0267 
0268 QUrl Smb4KNetworkObject::url() const
0269 {
0270   return d->url;
0271 }
0272 
0273 
0274 QUrl Smb4KNetworkObject::parentUrl() const
0275 {
0276   // Do not use QUrl::upUrl() here, because it produces
0277   // an URL like this: smb://HOST/Share/../ and we do not
0278   // want that.
0279   QUrl parent_url;
0280   parent_url.setUrl("smb://");
0281 
0282   switch (d->type)
0283   {
0284     case Host:
0285     {
0286       parent_url.setHost(d->workgroup);
0287       break;
0288     }
0289     case Share:
0290     {
0291       parent_url.setHost(d->url.host());
0292       break;
0293     }
0294     default:
0295     {
0296       break;
0297     }
0298   }
0299   
0300   return parent_url;
0301 }
0302 
0303 
0304 void Smb4KNetworkObject::setUrl(const QUrl& url)
0305 {
0306   d->url = url;
0307   emit changed();
0308 }
0309 
0310 
0311 bool Smb4KNetworkObject::isMounted() const
0312 {
0313   return d->mounted;
0314 }
0315 
0316 
0317 void Smb4KNetworkObject::setMounted(bool mounted)
0318 {
0319   d->mounted = mounted;
0320   emit changed();
0321 }
0322 
0323 
0324 void Smb4KNetworkObject::update(Smb4KBasicNetworkItem *networkItem)
0325 {
0326   if (d->type == Workgroup && networkItem->type() == Smb4KGlobal::Workgroup)
0327   {
0328     Smb4KWorkgroup *workgroup = static_cast<Smb4KWorkgroup *>(networkItem);
0329     
0330     if (workgroup)
0331     {
0332       // Check that we update with the correct item.
0333       if (QString::compare(workgroupName(), workgroup->workgroupName(), Qt::CaseInsensitive) == 0)
0334       {
0335         d->workgroup    = workgroup->workgroupName();
0336         d->url          = workgroup->url();
0337         d->type         = Workgroup;
0338         d->mounted      = false;
0339         d->inaccessible = false;
0340         d->printer      = false;
0341       }
0342     }
0343   }
0344   else if (d->type == Host && networkItem->type() == Smb4KGlobal::Host)
0345   {
0346     Smb4KHost *host = static_cast<Smb4KHost *>(networkItem);
0347     
0348     if (host)
0349     {
0350       // Check that we update with the correct item.
0351       if (QString::compare(workgroupName(), host->workgroupName(), Qt::CaseInsensitive) == 0 &&
0352           QString::compare(hostName(), host->hostName(), Qt::CaseInsensitive) == 0)
0353       {
0354         d->workgroup    = host->workgroupName();
0355         d->url          = host->url();
0356         d->comment      = host->comment();
0357         d->type         = Host;
0358         d->mounted      = false;
0359         d->inaccessible = false;
0360         d->printer      = false;
0361       }
0362     }
0363   }
0364   else if (d->type == Share && networkItem->type() == Smb4KGlobal::Share)
0365   {
0366     Smb4KShare *share = static_cast<Smb4KShare *>(networkItem);
0367     
0368     if (share)
0369     {
0370       // Check that we update with the correct item.
0371       if (QString::compare(workgroupName(), share->workgroupName(), Qt::CaseInsensitive) == 0 &&
0372           QString::compare(hostName(), share->hostName(), Qt::CaseInsensitive) == 0 &&
0373           QString::compare(shareName(), share->shareName(), Qt::CaseInsensitive) == 0)
0374       {
0375         d->workgroup    = share->workgroupName();
0376         d->url          = share->url();
0377         d->comment      = share->comment();
0378         d->type         = Share;
0379         d->mounted      = share->isMounted();
0380         d->inaccessible = share->isInaccessible();
0381         d->printer      = share->isPrinter();
0382         d->mountpoint.setUrl(share->path(), QUrl::TolerantMode);
0383         d->mountpoint.setScheme("file");
0384       }
0385     }
0386   }
0387   else
0388   {
0389     d->type = Network;
0390   }
0391   
0392   emit changed();
0393 }
0394 
0395 
0396 bool Smb4KNetworkObject::isPrinter() const
0397 {
0398   return d->printer;
0399 }
0400 
0401 
0402 void Smb4KNetworkObject::setPrinter(bool printer)
0403 {
0404   d->printer = printer;
0405   emit changed();
0406 }
0407 
0408 
0409 QUrl Smb4KNetworkObject::mountpoint() const
0410 {
0411   return d->mountpoint;
0412 }
0413 
0414 
0415 void Smb4KNetworkObject::setMountpoint(const QUrl &mountpoint)
0416 {
0417   d->mountpoint = mountpoint;
0418   emit changed();
0419 }
0420 
0421 
0422 bool Smb4KNetworkObject::isInaccessible() const
0423 {
0424   return (d->mounted && d->inaccessible);
0425 }
0426 
0427 
0428 void Smb4KNetworkObject::setInaccessible(bool inaccessible)
0429 {
0430   d->inaccessible = inaccessible;
0431 }
0432 
0433 
0434