File indexing completed on 2024-04-21 05:01:42

0001 /*
0002     This class derives from QObject and encapsulates the network items.
0003     It is for use with QtQuick.
0004 
0005     SPDX-FileCopyrightText: 2012-2022 Alexander Reinholdt <alexander.reinholdt@kdemail.net>
0006     SPDX-License-Identifier: GPL-2.0-or-later
0007 */
0008 
0009 // application specific includes
0010 #include "smb4knetworkobject.h"
0011 #include "core/smb4kglobal.h"
0012 #include "core/smb4khost.h"
0013 #include "core/smb4kshare.h"
0014 #include "core/smb4kworkgroup.h"
0015 
0016 // Qt includes
0017 #include <QDebug>
0018 
0019 using namespace Smb4KGlobal;
0020 
0021 class Smb4KNetworkObjectPrivate
0022 {
0023 public:
0024     QString workgroup;
0025     QUrl url;
0026     int type;
0027     int parentType;
0028     QString comment;
0029     bool mounted;
0030     QUrl mountpoint;
0031     bool printer;
0032     bool isMaster;
0033     bool inaccessible;
0034 };
0035 
0036 Smb4KNetworkObject::Smb4KNetworkObject(Smb4KBasicNetworkItem *networkItem, QObject *parent)
0037     : QObject(parent)
0038     , d(new Smb4KNetworkObjectPrivate)
0039 {
0040     switch (networkItem->type()) {
0041     case Smb4KGlobal::Workgroup: {
0042         Smb4KWorkgroup *workgroup = static_cast<Smb4KWorkgroup *>(networkItem);
0043 
0044         if (workgroup) {
0045             d->workgroup = workgroup->workgroupName();
0046             d->url = workgroup->url();
0047             d->mounted = false;
0048             d->inaccessible = false;
0049             d->printer = false;
0050             d->isMaster = false;
0051             setType(Workgroup);
0052         }
0053 
0054         break;
0055     }
0056     case Smb4KGlobal::Host: {
0057         Smb4KHost *host = static_cast<Smb4KHost *>(networkItem);
0058 
0059         if (host) {
0060             d->workgroup = host->workgroupName();
0061             d->url = host->url();
0062             d->comment = host->comment();
0063             d->mounted = false;
0064             d->inaccessible = false;
0065             d->printer = false;
0066             d->isMaster = host->isMasterBrowser();
0067             setType(Host);
0068         }
0069 
0070         break;
0071     }
0072     case Smb4KGlobal::Share: {
0073         Smb4KShare *share = static_cast<Smb4KShare *>(networkItem);
0074 
0075         if (share) {
0076             d->workgroup = share->workgroupName();
0077             d->url = share->url();
0078             d->comment = share->comment();
0079             d->mounted = share->isMounted();
0080             d->inaccessible = share->isInaccessible();
0081             d->printer = share->isPrinter();
0082             d->isMaster = false;
0083             d->mountpoint = QUrl::fromLocalFile(share->path());
0084             setType(Share);
0085         }
0086 
0087         break;
0088     }
0089     default: {
0090         d->url = networkItem->url();
0091 
0092         if (networkItem->url().toString() == QStringLiteral("smb://")) {
0093             d->mounted = false;
0094             d->inaccessible = false;
0095             d->printer = false;
0096             d->isMaster = false;
0097             setType(Network);
0098         } else {
0099             d->mounted = false;
0100             d->inaccessible = false;
0101             d->printer = false;
0102             d->isMaster = false;
0103             setType(Unknown);
0104         }
0105         break;
0106     }
0107     }
0108 }
0109 
0110 Smb4KNetworkObject::Smb4KNetworkObject(QObject *parent)
0111     : QObject(parent)
0112     , d(new Smb4KNetworkObjectPrivate)
0113 {
0114     d->url.setUrl(QStringLiteral("smb://"), QUrl::TolerantMode);
0115     d->mounted = false;
0116     d->inaccessible = false;
0117     d->printer = false;
0118     d->isMaster = false;
0119     setType(Network);
0120 }
0121 
0122 Smb4KNetworkObject::~Smb4KNetworkObject()
0123 {
0124 }
0125 
0126 Smb4KNetworkObject::NetworkItem Smb4KNetworkObject::type() const
0127 {
0128     return static_cast<Smb4KNetworkObject::NetworkItem>(d->type);
0129 }
0130 
0131 Smb4KNetworkObject::NetworkItem Smb4KNetworkObject::parentType() const
0132 {
0133     return static_cast<Smb4KNetworkObject::NetworkItem>(d->parentType);
0134 }
0135 
0136 void Smb4KNetworkObject::setType(NetworkItem type)
0137 {
0138     if (d->type != type) {
0139         d->type = type;
0140 
0141         switch (type) {
0142         case Host: {
0143             d->parentType = Workgroup;
0144             break;
0145         }
0146         case Share: {
0147             d->parentType = Host;
0148             break;
0149         }
0150         default: {
0151             d->parentType = Network;
0152             break;
0153         }
0154         }
0155         Q_EMIT changed();
0156     }
0157 }
0158 
0159 QString Smb4KNetworkObject::workgroupName() const
0160 {
0161     return d->workgroup;
0162 }
0163 
0164 void Smb4KNetworkObject::setWorkgroupName(const QString &name)
0165 {
0166     if (d->workgroup != name) {
0167         d->workgroup = name;
0168         Q_EMIT changed();
0169     }
0170 }
0171 
0172 QString Smb4KNetworkObject::hostName() const
0173 {
0174     return d->url.host().toUpper();
0175 }
0176 
0177 bool Smb4KNetworkObject::isMasterBrowser() const
0178 {
0179     return d->isMaster;
0180 }
0181 
0182 void Smb4KNetworkObject::setMasterBrowser(bool master)
0183 {
0184     if (type() == Host && d->isMaster != master) {
0185         d->isMaster = master;
0186         Q_EMIT changed();
0187     }
0188 }
0189 
0190 QString Smb4KNetworkObject::shareName() const
0191 {
0192     return d->url.path().remove(QStringLiteral("/"));
0193 }
0194 
0195 QString Smb4KNetworkObject::name() const
0196 {
0197     QString name;
0198 
0199     switch (d->type) {
0200     case Workgroup: {
0201         name = workgroupName();
0202         break;
0203     }
0204     case Host: {
0205         name = hostName();
0206         break;
0207     }
0208     case Share: {
0209         name = shareName();
0210         break;
0211     }
0212     default: {
0213         break;
0214     }
0215     }
0216 
0217     return name;
0218 }
0219 
0220 QString Smb4KNetworkObject::comment() const
0221 {
0222     return d->comment;
0223 }
0224 
0225 void Smb4KNetworkObject::setComment(const QString &comment)
0226 {
0227     if (d->comment != comment) {
0228         d->comment = comment;
0229         Q_EMIT changed();
0230     }
0231 }
0232 
0233 QUrl Smb4KNetworkObject::url() const
0234 {
0235     return d->url;
0236 }
0237 
0238 QUrl Smb4KNetworkObject::parentUrl() const
0239 {
0240     QUrl moveUp(QStringLiteral(".."));
0241     QUrl parentUrl = d->url;
0242 
0243     return parentUrl.resolved(moveUp);
0244 }
0245 
0246 void Smb4KNetworkObject::setUrl(const QUrl &url)
0247 {
0248     if (!d->url.matches(url, QUrl::None)) {
0249         d->url = url;
0250         Q_EMIT changed();
0251     }
0252 }
0253 
0254 bool Smb4KNetworkObject::isMounted() const
0255 {
0256     return d->mounted;
0257 }
0258 
0259 void Smb4KNetworkObject::setMounted(bool mounted)
0260 {
0261     if (d->mounted != mounted) {
0262         d->mounted = mounted;
0263         Q_EMIT changed();
0264     }
0265 }
0266 
0267 void Smb4KNetworkObject::update(Smb4KBasicNetworkItem *networkItem)
0268 {
0269     if (d->type == Workgroup && networkItem->type() == Smb4KGlobal::Workgroup) {
0270         Smb4KWorkgroup *workgroup = static_cast<Smb4KWorkgroup *>(networkItem);
0271 
0272         if (workgroup) {
0273             // Check that we update with the correct item.
0274             if (QString::compare(workgroupName(), workgroup->workgroupName(), Qt::CaseInsensitive) == 0) {
0275                 d->workgroup = workgroup->workgroupName();
0276                 d->url = workgroup->url();
0277                 d->type = Workgroup;
0278                 d->mounted = false;
0279                 d->inaccessible = false;
0280                 d->printer = false;
0281             }
0282         }
0283     } else if (d->type == Host && networkItem->type() == Smb4KGlobal::Host) {
0284         Smb4KHost *host = static_cast<Smb4KHost *>(networkItem);
0285 
0286         if (host) {
0287             // Check that we update with the correct item.
0288             if (QString::compare(workgroupName(), host->workgroupName(), Qt::CaseInsensitive) == 0
0289                 && QString::compare(hostName(), host->hostName(), Qt::CaseInsensitive) == 0) {
0290                 d->workgroup = host->workgroupName();
0291                 d->url = host->url();
0292                 d->comment = host->comment();
0293                 d->type = Host;
0294                 d->mounted = false;
0295                 d->inaccessible = false;
0296                 d->printer = false;
0297             }
0298         }
0299     } else if (d->type == Share && networkItem->type() == Smb4KGlobal::Share) {
0300         Smb4KShare *share = static_cast<Smb4KShare *>(networkItem);
0301 
0302         if (share) {
0303             // Check that we update with the correct item.
0304             if (QString::compare(workgroupName(), share->workgroupName(), Qt::CaseInsensitive) == 0
0305                 && QString::compare(hostName(), share->hostName(), Qt::CaseInsensitive) == 0
0306                 && QString::compare(shareName(), share->shareName(), Qt::CaseInsensitive) == 0) {
0307                 d->workgroup = share->workgroupName();
0308                 d->url = share->url();
0309                 d->comment = share->comment();
0310                 d->type = Share;
0311                 d->mounted = share->isMounted();
0312                 d->inaccessible = share->isInaccessible();
0313                 d->printer = share->isPrinter();
0314                 d->mountpoint.setUrl(share->path(), QUrl::TolerantMode);
0315                 d->mountpoint.setScheme(QStringLiteral("file"));
0316             }
0317         }
0318     } else {
0319         d->type = Network;
0320     }
0321 
0322     Q_EMIT changed();
0323 }
0324 
0325 bool Smb4KNetworkObject::isPrinter() const
0326 {
0327     return d->printer;
0328 }
0329 
0330 void Smb4KNetworkObject::setPrinter(bool printer)
0331 {
0332     if (d->printer != printer) {
0333         d->printer = printer;
0334         Q_EMIT changed();
0335     }
0336 }
0337 
0338 QUrl Smb4KNetworkObject::mountpoint() const
0339 {
0340     return d->mountpoint;
0341 }
0342 
0343 void Smb4KNetworkObject::setMountpoint(const QUrl &mountpoint)
0344 {
0345     if (!d->mountpoint.matches(mountpoint, QUrl::None)) {
0346         d->mountpoint = mountpoint;
0347         Q_EMIT changed();
0348     }
0349 }
0350 
0351 bool Smb4KNetworkObject::isInaccessible() const
0352 {
0353     return (d->mounted && d->inaccessible);
0354 }
0355 
0356 void Smb4KNetworkObject::setInaccessible(bool inaccessible)
0357 {
0358     if (d->inaccessible != inaccessible) {
0359         d->inaccessible = inaccessible;
0360         Q_EMIT changed();
0361     }
0362 }