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