20
21
* You should have received a copy of the GNU General Public License *
21
22
* along with this program; if not, write to the *
22
* Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, *
23
* Free Software Foundation, 51 Franklin Street, Suite 500, Boston, *
24
* MA 02110-1335, USA *
24
25
***************************************************************************/
27
#include <QApplication>
29
29
#include <QHostAddress>
30
30
#include <QAbstractSocket>
31
#include <QDesktopWidget>
35
34
#include <kapplication.h>
42
// Application specific includes.
36
// application specific includes
43
37
#include <smb4kscanner.h>
44
38
#include <smb4kscanner_p.h>
45
#include <smb4kauthinfo.h>
46
#include <smb4kcoremessage.h>
47
#include <smb4kglobal.h>
48
#include <smb4ksambaoptionshandler.h>
49
39
#include <smb4ksettings.h>
40
#include <smb4kbasicnetworkitem.h>
50
41
#include <smb4kworkgroup.h>
51
42
#include <smb4khost.h>
52
43
#include <smb4kshare.h>
44
#include <smb4kglobal.h>
53
45
#include <smb4kipaddressscanner.h>
54
#include <smb4khomesshareshandler.h>
46
#include <smb4kauthinfo.h>
55
47
#include <smb4kwalletmanager.h>
48
#include <smb4knotification.h>
57
50
using namespace Smb4KGlobal;
59
typedef Smb4KScannerQueueContainer QueueContainer;
62
Smb4KScanner::Smb4KScanner( QObject *parent )
52
#define TIMER_INTERVAL 250
54
K_GLOBAL_STATIC( Smb4KScannerPrivate, p );
57
Smb4KScanner::Smb4KScanner() : KCompositeJob( 0 )
65
m_priv = new Smb4KScannerPrivate;
67
m_proc = new KProcess( this );
71
m_process_error = (QProcess::ProcessError)(-1);
73
connect( m_proc, SIGNAL( finished( int, QProcess::ExitStatus ) ),
74
this, SLOT( slotProcessFinished( int, QProcess::ExitStatus ) ) );
76
connect( m_proc, SIGNAL( error( QProcess::ProcessError ) ),
77
this, SLOT( slotProcessError( QProcess::ProcessError ) ) );
79
connect( Smb4KIPAddressScanner::self(), SIGNAL( ipAddress( Smb4KHost * ) ),
80
this, SIGNAL( ipAddress( Smb4KHost * ) ) );
59
setAutoDelete( false );
62
m_scanning_allowed = true;
64
connect( QCoreApplication::instance(), SIGNAL( aboutToQuit() ), SLOT( slotAboutToQuit() ) );
84
68
Smb4KScanner::~Smb4KScanner()
92
void Smb4KScanner::init()
94
startTimer( TIMER_INTERVAL );
100
void Smb4KScanner::abort()
102
while ( !m_queue.isEmpty() )
107
if ( m_proc->state() == QProcess::Running )
116
void Smb4KScanner::rescan()
118
m_queue.enqueue( QueueContainer( Init ) );
122
void Smb4KScanner::getWorkgroupMembers( Smb4KWorkgroup *workgroup )
124
m_queue.enqueue( QueueContainer( Hosts, *workgroup ) );
128
void Smb4KScanner::getShares( Smb4KHost *host )
130
m_queue.enqueue( QueueContainer( Shares, *host ) );
134
void Smb4KScanner::getInfo( Smb4KHost *host )
136
Smb4KHost *known_host = findHost( host->name(), host->workgroup() );
73
Smb4KScanner *Smb4KScanner::self()
79
bool Smb4KScanner::isRunning()
81
return !subjobs().isEmpty();
85
bool Smb4KScanner::isRunning( Smb4KScanner::Process process, Smb4KBasicNetworkItem *item )
93
// We do not need a network item with this kind
94
// of process. We'll just test if at least on job labeled
95
// 'LookupDomainsJob' or 'ScanBAreasJob' is running.
96
for ( int i = 0; i < subjobs().size(); ++i )
98
if ( QString::compare( subjobs().at( i )->objectName(), "LookupDomainsJob" ) == 0 ||
99
QString::compare( subjobs().at( i )->objectName(), "ScanBAreasJob" ) == 0 )
111
case LookupDomainMembers:
113
if ( item && item->type() == Smb4KBasicNetworkItem::Workgroup )
115
// Only return TRUE if a job for the passed workgroup is running.
116
Smb4KWorkgroup *workgroup = static_cast<Smb4KWorkgroup *>( item );
120
for ( int i = 0; i < subjobs().size(); ++i )
122
if ( QString::compare( subjobs().at( i )->objectName(),
123
QString( "LookupDomainMembersJob_%1" ).arg( workgroup->workgroupName() ), Qt::CaseInsensitive ) == 0 )
136
// Do nothing --- This should not happen.
141
// If no item is defined, we just loop through the subjobs
142
// and search for a "LookupDomainMembersJob".
143
for ( int i = 0; i < subjobs().size(); ++i )
145
if ( subjobs().at( i )->objectName().startsWith( "LookupDomainMembersJob" ) )
160
if ( item && item->type() == Smb4KBasicNetworkItem::Host )
162
// Only return TRUE if a job for the passed host is running.
163
Smb4KHost *host = static_cast<Smb4KHost *>( item );
167
for ( int i = 0; i < subjobs().size(); ++i )
169
if ( QString::compare( subjobs().at( i )->objectName(),
170
QString( "LookupSharesJob_%1" ).arg( host->hostName() ), Qt::CaseInsensitive ) == 0 )
183
// Do nothing --- This should not happen.
188
// If no item is defined, we just loop through the subjobs
189
// and search for a "LookupSharesJob".
190
for ( int i = 0; i < subjobs().size(); ++i )
192
if ( subjobs().at( i )->objectName().startsWith( "LookupSharesJob" ) )
207
if ( item && item->type() == Smb4KBasicNetworkItem::Host )
209
// Only return TRUE if a job for the passed host is running.
210
Smb4KHost *host = static_cast<Smb4KHost *>( item );
214
for ( int i = 0; i < subjobs().size(); ++i )
216
if ( QString::compare( subjobs().at( i )->objectName(),
217
QString( "LookupInfoJob_%1" ).arg( host->hostName() ), Qt::CaseInsensitive ) == 0 )
230
// Do nothing --- This should not happen.
235
// If no item is defined, we just loop through the subjobs
236
// and search for a "LookupInfoJob".
237
for ( int i = 0; i < subjobs().size(); ++i )
239
if ( subjobs().at( i )->objectName().startsWith( "LookupInfoJob" ) )
262
void Smb4KScanner::abortAll()
264
for ( int i = 0; i < subjobs().size(); ++i )
266
subjobs().at( i )->kill( KJob::EmitResult );
271
void Smb4KScanner::abort( Smb4KScanner::Process process, Smb4KBasicNetworkItem *item )
277
// We do not need a network item with this kind
278
// of process. We'll just kill all jobs labeled
279
// 'LookupDomainsJob' and 'ScanBAreasJob'.
280
for ( int i = 0; i < subjobs().size(); ++i )
282
if ( QString::compare( subjobs().at( i )->objectName(), "LookupDomainsJob" ) == 0 ||
283
QString::compare( subjobs().at( i )->objectName(), "ScanBAreasJob" ) == 0 )
285
subjobs().at( i )->kill( KJob::EmitResult );
295
case LookupDomainMembers:
297
if ( item && item->type() == Smb4KBasicNetworkItem::Workgroup )
299
// Only kill a job if the workgroup matches.
300
Smb4KWorkgroup *workgroup = static_cast<Smb4KWorkgroup *>( item );
304
for ( int i = 0; i < subjobs().size(); ++i )
306
if ( QString::compare( subjobs().at( i )->objectName(),
307
QString( "LookupDomainMembersJob_%1" ).arg( workgroup->workgroupName() ), Qt::CaseInsensitive ) == 0 )
309
subjobs().at( i )->kill( KJob::EmitResult );
320
// Do nothing --- This should not happen.
325
// If no item is defined, we just loop through the subjobs
326
// and search for a "LookupDomainMembersJob".
327
for ( int i = 0; i < subjobs().size(); ++i )
329
if ( subjobs().at( i )->objectName().startsWith( "LookupDomainMembersJob" ) )
331
subjobs().at( i )->kill( KJob::EmitResult );
344
if ( item && item->type() == Smb4KBasicNetworkItem::Host )
346
// Only kill a job if the host matches
347
Smb4KHost *host = static_cast<Smb4KHost *>( item );
351
for ( int i = 0; i < subjobs().size(); ++i )
353
if ( QString::compare( subjobs().at( i )->objectName(),
354
QString( "LookupSharesJob_%1" ).arg( host->hostName() ), Qt::CaseInsensitive ) == 0 )
356
subjobs().at( i )->kill( KJob::EmitResult );
367
// Do nothing --- This should not happen.
372
// If no item is defined, we just loop through the subjobs
373
// and search for a "LookupSharesJob".
374
for ( int i = 0; i < subjobs().size(); ++i )
376
if ( subjobs().at( i )->objectName().startsWith( "LookupSharesJob" ) )
378
subjobs().at( i )->kill( KJob::EmitResult );
392
if ( item && item->type() == Smb4KBasicNetworkItem::Host )
394
// Only return TRUE if a job for the passed host is running.
395
Smb4KHost *host = static_cast<Smb4KHost *>( item );
399
for ( int i = 0; i < subjobs().size(); ++i )
401
if ( QString::compare( subjobs().at( i )->objectName(),
402
QString( "LookupInfoJob_%1" ).arg( host->hostName() ), Qt::CaseInsensitive ) == 0 )
404
subjobs().at( i )->kill( KJob::EmitResult );
415
// Do nothing --- This should not happen.
420
// If no item is defined, we just loop through the subjobs
421
// and search for a "LookupInfoJob".
422
for ( int i = 0; i < subjobs().size(); ++i )
424
if ( subjobs().at( i )->objectName().startsWith( "LookupInfoJob" ) )
426
subjobs().at( i )->kill( KJob::EmitResult );
445
void Smb4KScanner::start()
447
// Avoid a race with QApplication and use 50 ms here.
448
QTimer::singleShot( 50, this, SLOT( slotStartJobs() ) );
452
void Smb4KScanner::lookupDomains( QWidget *parent )
454
if ( Smb4KSettings::lookupDomains() )
456
Smb4KLookupDomainsJob *job = new Smb4KLookupDomainsJob( this );
457
job->setObjectName( "LookupDomainsJob" );
458
job->setupLookup( parent );
460
connect( job, SIGNAL( result( KJob * ) ), SLOT( slotJobFinished( KJob * ) ) );
461
connect( job, SIGNAL( aboutToStart() ), SLOT( slotAboutToStartDomainsLookup() ) );
462
connect( job, SIGNAL( finished() ), SLOT( slotDomainsLookupFinished() ) );
463
connect( job, SIGNAL( workgroups( const QList<Smb4KWorkgroup> & ) ), SLOT( slotWorkgroups( const QList<Smb4KWorkgroup> & ) ) );
467
QApplication::setOverrideCursor( Qt::BusyCursor );
478
else if ( Smb4KSettings::queryCurrentMaster() )
480
Smb4KQueryMasterJob *job = new Smb4KQueryMasterJob( this );
481
job->setObjectName( "LookupDomainsJob" );
482
job->setupLookup( QString(), parent );
484
connect( job, SIGNAL( result( KJob * ) ), SLOT( slotJobFinished( KJob * ) ) );
485
connect( job, SIGNAL( aboutToStart() ), SLOT( slotAboutToStartDomainsLookup() ) );
486
connect( job, SIGNAL( finished() ), SLOT( slotDomainsLookupFinished() ) );
487
connect( job, SIGNAL( workgroups( const QList<Smb4KWorkgroup> & ) ), SLOT( slotWorkgroups( const QList<Smb4KWorkgroup> & ) ) );
488
connect( job, SIGNAL( authError( Smb4KQueryMasterJob * ) ), SLOT( slotAuthError( Smb4KQueryMasterJob * ) ) );
492
QApplication::setOverrideCursor( Qt::BusyCursor );
503
else if ( Smb4KSettings::queryCustomMaster() )
505
// If the custom master browser entry is empty, warn the user
506
// and tell him/her that we are going to query the current master
508
if ( Smb4KSettings::customMasterBrowser().isEmpty() )
510
Smb4KNotification *notification = new Smb4KNotification();
511
notification->emptyCustomMasterBrowser();
518
Smb4KQueryMasterJob *job = new Smb4KQueryMasterJob( this );
519
job->setObjectName( "LookupDomainsJob" );
520
job->setupLookup( Smb4KSettings::customMasterBrowser(), parent );
522
connect( job, SIGNAL( result( KJob * ) ), SLOT( slotJobFinished( KJob * ) ) );
523
connect( job, SIGNAL( aboutToStart() ), SLOT( slotAboutToStartDomainsLookup() ) );
524
connect( job, SIGNAL( finished() ), SLOT( slotDomainsLookupFinished() ) );
525
connect( job, SIGNAL( workgroups( const QList<Smb4KWorkgroup> & ) ), SLOT( slotWorkgroups( const QList<Smb4KWorkgroup> & ) ) );
526
connect( job, SIGNAL( authError( Smb4KQueryMasterJob * ) ), SLOT( slotAuthError( Smb4KQueryMasterJob * ) ) );
530
QApplication::setOverrideCursor( Qt::BusyCursor );
541
else if ( Smb4KSettings::scanBroadcastAreas() )
543
if ( !Smb4KSettings::broadcastAreas().isEmpty() )
545
Smb4KScanBAreasJob *job = new Smb4KScanBAreasJob( this );
546
job->setObjectName( "ScanBAreasJob" );
547
job->setupScan( parent );
549
connect( job, SIGNAL( result( KJob * ) ), SLOT( slotJobFinished( KJob * ) ) );
550
connect( job, SIGNAL( aboutToStart() ), SLOT( slotAboutToStartDomainsLookup() ) );
551
connect( job, SIGNAL( finished() ), SLOT( slotDomainsLookupFinished() ) );
552
connect( job, SIGNAL( workgroups( const QList<Smb4KWorkgroup> & ) ), SLOT( slotWorkgroups( const QList<Smb4KWorkgroup> & ) ) );
553
connect( job, SIGNAL( hosts( const QList<Smb4KHost> & ) ), SLOT( slotHosts( const QList<Smb4KHost> & ) ) );
557
QApplication::setOverrideCursor( Qt::BusyCursor );
570
Smb4KNotification *notification = new Smb4KNotification();
571
notification->emptyBroadcastAreas();
581
void Smb4KScanner::lookupDomainMembers( Smb4KWorkgroup *workgroup, QWidget *parent )
583
Q_ASSERT( workgroup );
585
Smb4KLookupDomainMembersJob *job = new Smb4KLookupDomainMembersJob( this );
586
job->setObjectName( QString( "LookupDomainMembersJob_%1" ).arg( workgroup->workgroupName() ) );
587
job->setupLookup( workgroup, parent );
589
connect( job, SIGNAL( result( KJob * ) ), SLOT( slotJobFinished( KJob * ) ) );
590
connect( job, SIGNAL( aboutToStart( Smb4KWorkgroup * ) ), SLOT( slotAboutToStartHostsLookup( Smb4KWorkgroup * ) ) );
591
connect( job, SIGNAL( finished( Smb4KWorkgroup * ) ), SLOT( slotHostsLookupFinished( Smb4KWorkgroup * ) ) );
592
connect( job, SIGNAL( hosts( Smb4KWorkgroup *, const QList<Smb4KHost> & ) ), SLOT( slotHosts( Smb4KWorkgroup *, const QList<Smb4KHost> & ) ) );
593
connect( job, SIGNAL( authError( Smb4KLookupDomainMembersJob * ) ), SLOT( slotAuthError( Smb4KLookupDomainMembersJob * ) ) );
597
QApplication::setOverrideCursor( Qt::BusyCursor );
610
void Smb4KScanner::lookupShares( Smb4KHost *host, QWidget *parent )
614
Smb4KLookupSharesJob *job = new Smb4KLookupSharesJob( this );
615
job->setObjectName( QString( "LookupSharesJob_%1" ).arg( host->hostName() ) );
616
job->setupLookup( host, parent );
618
connect( job, SIGNAL( result( KJob * ) ), SLOT( slotJobFinished( KJob * ) ) );
619
connect( job, SIGNAL( aboutToStart( Smb4KHost * ) ), SLOT( slotAboutToStartSharesLookup( Smb4KHost * ) ) );
620
connect( job, SIGNAL( finished( Smb4KHost * ) ), SLOT( slotSharesLookupFinished( Smb4KHost * ) ) );
621
connect( job, SIGNAL( shares( Smb4KHost *, const QList<Smb4KShare> & ) ), SLOT( slotShares( Smb4KHost *, const QList<Smb4KShare> &) ) );
622
connect( job, SIGNAL( authError( Smb4KLookupSharesJob * ) ), SLOT( slotAuthError( Smb4KLookupSharesJob * ) ) );
626
QApplication::setOverrideCursor( Qt::BusyCursor );
639
void Smb4KScanner::lookupInfo( Smb4KHost *host, QWidget *parent )
643
// Check if the additional information (Server, OS) has already been
644
// aquired previously or if we need to start a lookup job.
645
Smb4KHost *known_host = findHost( host->hostName(), host->workgroupName() );
138
647
if ( known_host && known_host->infoChecked() )
140
649
emit info( known_host );
146
// Don't let Smb4K check this host several times. This will
147
// be reset in processInfo() if necessary.
148
host->setInfo( QString(), QString() );
151
m_queue.enqueue( QueueContainer( Info, *host ) );
155
void Smb4KScanner::lookupDomains()
157
// Abort any process that is still running.
160
// Assemble the command.
163
command.append( "nmblookup -M " );
164
command.append( Smb4KSambaOptionsHandler::self()->nmblookupOptions() );
165
command.append( " -- - | grep '<01>' | awk '{print $1}'" );
166
command.append( !Smb4KSambaOptionsHandler::self()->winsServer().isEmpty() ?
167
QString( " | xargs -Iips nmblookup -R -U %1 -A ips" ).arg( Smb4KSambaOptionsHandler::self()->winsServer() ) :
168
" | xargs -Iips nmblookup -A ips" );
169
command.append( Smb4KSambaOptionsHandler::self()->nmblookupOptions() );
171
m_proc->setShellCommand( command );
173
startProcess( Workgroups );
177
void Smb4KScanner::queryMasterBrowser()
179
// Abort any process that is still running.
182
// Assemble the command.
185
command.append( "net " );
187
if ( Smb4KSettings::queryCurrentMaster() )
189
Smb4KWorkgroup workgroup( Smb4KSettings::domainName() );
191
command.append( Smb4KSambaOptionsHandler::self()->netOptions( Smb4KSambaOptionsHandler::LookupMaster, workgroup ) );
192
command.append( " -U % | xargs -Imaster net " );
193
command.append( Smb4KSambaOptionsHandler::self()->netOptions( Smb4KSambaOptionsHandler::Domain ) );
194
command.append( " -U % -S master" );
196
else if ( Smb4KSettings::queryCustomMaster() )
198
Smb4KHost host( Smb4KSettings::customMasterBrowser() );
200
command.append( Smb4KSambaOptionsHandler::self()->netOptions( Smb4KSambaOptionsHandler::LookupHost, host ) );
201
command.append( " -U % -S "+KShell::quoteArg( host.name() ) );
202
command.append( " | xargs -Iip net " );
203
command.append( Smb4KSambaOptionsHandler::self()->netOptions( Smb4KSambaOptionsHandler::Domain ) );
204
command.append( " -U % -S "+KShell::quoteArg( host.name() )+" -I ip" );
211
m_proc->setShellCommand( command );
213
startProcess( QueryHost );
217
void Smb4KScanner::scanBroadcastAreas()
219
// Abort any process that is still running.
222
// Assemble the command.
225
// Get the broadcast addresses that are to be scanned:
226
QStringList addresses = Smb4KSettings::broadcastAreas().split( ",", QString::SkipEmptyParts );
228
// Build the command:
229
for ( int i = 0; i < addresses.size(); ++i )
231
command.append( "nmblookup " );
232
// We want all globally defined options for nmblookup, except
233
// the broadcast address, because that is needed for the IP
235
command.append( Smb4KSambaOptionsHandler::self()->nmblookupOptions( false ) );
236
command.append( " -B "+addresses.at( i )+" -- '*' " );
237
command.append( "| sed -e /querying/d | awk '{print $1}' " );
238
command.append( "| xargs -Iip nmblookup " );
239
// This time we want to have the globally defined broadcast
241
command.append( Smb4KSambaOptionsHandler::self()->nmblookupOptions() );
242
// Include the WINS server:
243
command.append( !Smb4KSambaOptionsHandler::self()->winsServer().isEmpty() ?
244
" -R -U "+Smb4KSambaOptionsHandler::self()->winsServer()+" " : "" );
245
command.append( " -A ip" );
246
command.append( " ; " );
249
// Get rid of the last 3 characters (" ; "):
250
command.truncate( command.length() - 3 );
252
m_proc->setShellCommand( command );
254
startProcess( IPScan );
258
void Smb4KScanner::scanForWorkgroupMembers( const Smb4KWorkgroup &workgroup )
260
m_priv->setWorkgroup( workgroup );
264
if ( !workgroup.masterBrowserIP().isEmpty() )
266
command.append( "net "+Smb4KSambaOptionsHandler::self()->netOptions( Smb4KSambaOptionsHandler::ServerDomain ) );
267
command.append( " -I "+workgroup.masterBrowserIP() );
268
command.append( " -w "+KShell::quoteArg( workgroup.name() ) );
269
command.append( " -S "+KShell::quoteArg( workgroup.masterBrowserName() ) );
271
if ( Smb4KSettings::masterBrowsersRequireAuth() )
273
// Find the master browser and read the authentication information
275
Smb4KHost *master = findHost( workgroup.masterBrowserName(), workgroup.name() );
276
Smb4KAuthInfo authInfo;
280
authInfo = Smb4KAuthInfo( master );
281
Smb4KWalletManager::self()->readAuthInfo( &authInfo );
288
if ( !authInfo.login().isEmpty() )
290
command.append( QString( " -U %1" ).arg( KShell::quoteArg( authInfo.login() ) ) );
292
if ( !authInfo.password().isEmpty() )
294
m_proc->setEnv( "PASSWD", authInfo.password() );
303
command.append( " -U %" );
308
command.append( " -U %" );
313
command.append( "net "+Smb4KSambaOptionsHandler::self()->netOptions( Smb4KSambaOptionsHandler::LookupHost, workgroup ) );
314
command.append( " -S "+KShell::quoteArg( workgroup.masterBrowserName() ) );
315
command.append( " -w "+KShell::quoteArg( workgroup.name() ) );
316
command.append( " -U % " );
317
// FIXME: Maybe we need to know the shell if the user does not use a
318
// sh-compatible one...?
319
command.append( "| xargs -Iip " );
320
command.append( getenv( "SHELL" ) );
321
command.append( " -c 'echo \"*** "+workgroup.masterBrowserName()+": ip ***\" && " );
322
command.append( "net "+Smb4KSambaOptionsHandler::self()->netOptions( Smb4KSambaOptionsHandler::ServerDomain ) );
323
command.append( " -I ip" );
324
command.append( " -w "+KShell::quoteArg( workgroup.name() ) );
325
command.append( " -S "+KShell::quoteArg( workgroup.masterBrowserName() ) );
327
if ( Smb4KSettings::masterBrowsersRequireAuth() )
329
Smb4KHost *master = findHost( workgroup.masterBrowserName(), workgroup.name() );
330
Smb4KAuthInfo authInfo;
334
authInfo = Smb4KAuthInfo( master );
335
Smb4KWalletManager::self()->readAuthInfo( &authInfo );
342
if ( !authInfo.login().isEmpty() )
344
command.append( QString( " -U %1'" ).arg( KShell::quoteArg( authInfo.login() ) ) );
346
if ( !authInfo.password().isEmpty() )
348
m_proc->setEnv( "PASSWD", authInfo.password() );
357
command.append( " -U %'" );
362
command.append( " -U %'" );
366
m_proc->setShellCommand( command );
368
startProcess( Hosts );
372
void Smb4KScanner::scanForShares( const Smb4KHost &host )
374
m_priv->setHost( host );
376
Smb4KAuthInfo authInfo( &host );
377
Smb4KWalletManager::self()->readAuthInfo( &authInfo );
381
command.append( "net "+Smb4KSambaOptionsHandler::self()->netOptions( Smb4KSambaOptionsHandler::Share, host ) );
382
command.append( " -w "+KShell::quoteArg( host.workgroup() ) );
383
command.append( " -S "+KShell::quoteArg( host.name() ) );
385
if ( !host.ip().isEmpty() )
387
command.append( QString( " -I %1" ).arg( KShell::quoteArg( host.ip() ) ) );
390
if ( !authInfo.login().isEmpty() )
392
command.append( QString( " -U %1" ).arg( KShell::quoteArg( authInfo.login() ) ) );
394
if ( !authInfo.password().isEmpty() )
396
m_proc->setEnv( "PASSWD", authInfo.password() );
401
command.append( " -U guest%" );
404
m_proc->setShellCommand( command );
406
startProcess( Shares );
410
void Smb4KScanner::scanForInfo( const Smb4KHost &host )
412
m_priv->setHost( host );
414
QString smbclient_options = Smb4KSambaOptionsHandler::self()->smbclientOptions();
417
command.append( "smbclient -d1 -U guest%" );
418
command.append( " -W "+KShell::quoteArg( host.workgroup() ) );
419
command.append( " -L "+KShell::quoteArg( host.name() ) );
421
if ( !host.ip().isEmpty() )
423
command.append( " -I "+KShell::quoteArg( host.ip() ) );
426
if ( !smbclient_options.trimmed().isEmpty() )
428
command.append( smbclient_options );
431
m_proc->setShellCommand( command );
433
startProcess( Info );
437
void Smb4KScanner::startProcess( int state )
445
QApplication::setOverrideCursor( Qt::WaitCursor );
448
m_proc->setOutputChannelMode( KProcess::SeparateChannels );
453
void Smb4KScanner::endProcess( int /*exitCode*/, QProcess::ExitStatus exitStatus )
455
if ( exitStatus == QProcess::NormalExit )
472
processWorkgroupMembers();
482
processInfo( exitStatus );
493
// In case we searched for information, invoke processInfo(),
494
// since the host needs to be resetted.
499
processInfo( exitStatus );
508
// Something went wrong. Throw an error if the problem was not
509
// caused by using the abort() function.
512
if ( m_process_error != -1 )
514
Smb4KCoreMessage::processError( ERROR_PROCESS_ERROR, m_process_error );
518
Smb4KCoreMessage::processError( ERROR_PROCESS_EXIT, m_process_error );
533
QApplication::restoreOverrideCursor();
534
m_proc->clearProgram();
536
m_process_error = (QProcess::ProcessError)(-1);
539
emit state( SCANNER_STOP );
543
void Smb4KScanner::processWorkgroups()
545
// Read from stderr and decide what to do:
546
QString stderr_output = QString::fromLocal8Bit( m_proc->readAllStandardError(), -1 ).trimmed();
548
if ( !stderr_output.isEmpty() )
552
Smb4KCoreMessage::error( ERROR_GETTING_WORKGROUPS, QString(), stderr_output );
554
// Emit these signals so that the browser can be cleared.
555
emit workgroups( *Smb4KGlobal::workgroupsList() );
556
emit hostListChanged();
561
// There was no error. We can proceed with processing the
562
// output from stdout.
563
QString stdout_output = QString::fromLocal8Bit( m_proc->readAllStandardOutput(), -1 ).trimmed();
564
QStringList list = stdout_output.split( "\n", QString::KeepEmptyParts );
566
QList<Smb4KWorkgroup *> temp_workgroups_list;
572
Smb4KWorkgroup temp_workgroup;
575
for ( int i = 0; i < list.size(); ++i )
577
if ( list.at( i ).startsWith( "Looking up status of" ) )
579
// Get the IP address of the host.
580
temp_host.setIP( list.at( i ).section( "of", 1, 1 ).trimmed() );
584
else if ( list.at( i ).contains( "MAC Address", Qt::CaseSensitive ) )
586
// Add workgroup and host to global lists.
587
if ( !temp_workgroup.masterBrowserName().trimmed().isEmpty() )
589
Smb4KWorkgroup *workgroup = findWorkgroup( temp_workgroup.name() );
593
// Check if the master browser changed, get the old one (if necessary)
595
if ( QString::compare( temp_workgroup.masterBrowserName(),
596
workgroup->masterBrowserName(), Qt::CaseInsensitive ) != 0 )
598
Smb4KHost *old_master_browser = findHost( workgroup->masterBrowserName(), workgroup->name() );
600
if ( old_master_browser )
602
old_master_browser->setIsMasterBrowser( false );
611
// The old master browser is also the new one. The updating will be
615
// Update the workgroup.
616
workgroup->setMasterBrowser( temp_workgroup.masterBrowserName(),
617
temp_workgroup.masterBrowserIP(),
620
// Put it into the temporary list...
621
temp_workgroups_list.append( new Smb4KWorkgroup( *workgroup ) );
623
// ... and remove it from the global one.
624
int index = Smb4KGlobal::workgroupsList()->indexOf( workgroup );
625
delete Smb4KGlobal::workgroupsList()->takeAt( index );
629
// Copy temporary workgroup and add it to the temporary list.
630
temp_workgroups_list.append( new Smb4KWorkgroup( temp_workgroup ) );
635
// Do nothing. The workgroup object has no master browser entry.
638
if ( !temp_host.isEmpty() )
640
Smb4KHost *host = findHost( temp_host.name(), temp_host.workgroup() );
645
host->setIP( temp_host.ip() );
646
host->setIsMasterBrowser( temp_host.isMasterBrowser() );
651
Smb4KGlobal::hostsList()->append( new Smb4KHost( temp_host ) );
655
// Clear the temporary objects.
656
temp_workgroup = Smb4KWorkgroup();
657
temp_host = Smb4KHost();
661
else if ( list.at( i ).contains( " <00> ", Qt::CaseSensitive ) )
663
// Set the name of the workgroup/host.
664
if ( list.at( i ).contains( " <GROUP> ", Qt::CaseSensitive ) )
666
temp_workgroup.setName( list.at( i ).section( "<00>", 0, 0 ).trimmed() );
667
temp_host.setWorkgroup( list.at( i ).section( "<00>", 0, 0 ).trimmed() );
671
temp_host.setName( list.at( i ).section( "<00>", 0, 0 ).trimmed() );
676
else if ( list.at( i ).contains( "__MSBROWSE__", Qt::CaseSensitive ) &&
677
list.at( i ).contains( " <01> ", Qt::CaseSensitive ) )
679
// The host is a master browser.
680
temp_workgroup.setMasterBrowser( temp_host.name(), temp_host.ip(), false );
681
temp_host.setIsMasterBrowser( true );
695
Smb4KWorkgroup temp_workgroup;
698
for ( int i = 0; i < list.size(); ++i )
700
if ( list.at( i ).trimmed().startsWith( "Enumerating" ) )
704
else if ( list.at( i ).trimmed().startsWith( "Domain name" ) )
708
else if ( list.at( i ).trimmed().startsWith( "-------------" ) )
712
else if ( list.at( i ).trimmed().isEmpty() )
718
// This is the workgroup and master entry. Process it.
719
temp_workgroup.setName( list.at( i ).section( " ", 0, 0 ).trimmed() );
720
temp_workgroup.setMasterBrowserName( list.at( i ).section( " ", 1, -1 ).trimmed() );
722
temp_host.setName( temp_workgroup.masterBrowserName() );
723
temp_host.setWorkgroup( temp_workgroup.name() );
724
temp_host.setIsMasterBrowser( true );
726
// Get the workgroup if it exists.
727
Smb4KWorkgroup *workgroup = findWorkgroup( temp_workgroup.name() );
731
// Check if the master browser changed, get the old one (if necessary)
733
if ( QString::compare( temp_workgroup.masterBrowserName(),
734
workgroup->masterBrowserName(), Qt::CaseInsensitive ) != 0 )
736
Smb4KHost *old_master_browser = findHost( workgroup->masterBrowserName(), workgroup->name() );
738
if ( old_master_browser )
740
old_master_browser->setIsMasterBrowser( false );
749
// The old master browser is also the new one. The updating will be
753
// Update the workgroup.
754
workgroup->setMasterBrowser( temp_workgroup.masterBrowserName(),
758
// Put it into the temporary list...
759
temp_workgroups_list.append( new Smb4KWorkgroup( *workgroup ) );
761
// ... and remove it from the global one.
762
int index = Smb4KGlobal::workgroupsList()->indexOf( workgroup );
763
delete Smb4KGlobal::workgroupsList()->takeAt( index );
767
// Copy temporary workgroup and add it to the temporary list.
768
temp_workgroups_list.append( new Smb4KWorkgroup( temp_workgroup ) );
771
// Search the new master browser in the global hosts list.
772
Smb4KHost *host = findHost( temp_host.name(), temp_host.workgroup() );
777
host->setIP( temp_host.ip() );
778
host->setIsMasterBrowser( temp_host.isMasterBrowser() );
783
Smb4KGlobal::hostsList()->append( new Smb4KHost( temp_host ) );
786
// Clear the temporary objects.
787
temp_workgroup = Smb4KWorkgroup();
788
temp_host = Smb4KHost();
802
// Clean up the internal hosts list. In Smb4KGlobal::workgroupsList()
803
// only the obsolete workgroups are present. We use those to remove
804
// all obsolete hosts.
805
if ( !Smb4KGlobal::workgroupsList()->isEmpty() )
807
// Normally the list of obsolete workgroups is rather small.
808
// Thus, we will loop through the host list and check the
810
for ( int i = 0; i < Smb4KGlobal::hostsList()->size(); ++i )
812
Smb4KWorkgroup *workgroup = findWorkgroup( Smb4KGlobal::hostsList()->at( i )->workgroup() );
816
// The workgroup is obsolete. Remove the host.
817
delete Smb4KGlobal::hostsList()->takeAt( i );
823
// The workgroup is not obsolete.
828
// Clear the list of workgroups.
829
while ( !Smb4KGlobal::workgroupsList()->isEmpty() )
831
delete Smb4KGlobal::workgroupsList()->takeFirst();
839
// Update the list of workgroups. We can append the new
840
// list, because Smb4KGlobal::workgroupsList() is empty.
841
*Smb4KGlobal::workgroupsList() += temp_workgroups_list;
843
Smb4KIPAddressScanner::self()->triggerScan();
845
emit workgroups( *Smb4KGlobal::workgroupsList() );
846
emit hostListChanged();
850
void Smb4KScanner::processIPScan()
852
// Read from stderr and decide what to do:
853
QString stderr_output = QString::fromLocal8Bit( m_proc->readAllStandardError(), -1 ).trimmed();
855
if ( !stderr_output.isEmpty() )
859
Smb4KCoreMessage::error( ERROR_PERFORMING_IPSCAN, QString(), stderr_output );
861
// Emit these signals so that the browser can be cleared.
862
emit workgroups( *Smb4KGlobal::workgroupsList() );
863
emit hostListChanged();
868
// There was no error. We can proceed with processing the
869
// output from stdout.
870
QString stdout_output = QString::fromLocal8Bit( m_proc->readAllStandardOutput(), -1 ).trimmed();
871
QStringList list = stdout_output.split( "\n", QString::KeepEmptyParts );
873
QList<Smb4KWorkgroup *> temp_workgroups_list;
874
QList<Smb4KHost *> temp_hosts_list;
877
Smb4KWorkgroup temp_workgroup;
880
for ( int i = 0; i < list.size(); ++i )
882
if ( list.at( i ).startsWith( "Looking up status of" ) )
884
// Get the IP address of the host.
885
temp_host.setIP( list.at( i ).section( "of", 1, 1 ).trimmed() );
889
else if ( list.at( i ).contains( "MAC Address", Qt::CaseSensitive ) )
891
// Add workgroup and host to global lists.
892
if ( !temp_workgroup.masterBrowserName().trimmed().isEmpty() )
894
Smb4KWorkgroup *workgroup = findWorkgroup( temp_workgroup.name() );
898
// Find out if we need to add it to the temporary list.
899
bool found_workgroup = false;
901
for ( int j = 0; j < temp_workgroups_list.size(); ++j )
903
if ( QString::compare( temp_workgroups_list.at( j )->name(), workgroup->name() ) == 0 )
905
found_workgroup = true;
915
if ( !found_workgroup )
917
// Update the workgroup.
918
workgroup->setMasterBrowser( temp_workgroup.masterBrowserName(),
919
temp_workgroup.masterBrowserIP(),
922
temp_workgroups_list.append( new Smb4KWorkgroup( *workgroup ) );
931
// Copy temporary workgroup and add it to the temporary list.
932
temp_workgroups_list.append( new Smb4KWorkgroup( temp_workgroup ) );
937
// Do nothing. The workgroup object has no master browser entry.
940
if ( !temp_host.isEmpty() )
942
Smb4KHost *host = findHost( temp_host.name(), temp_host.workgroup() );
947
host->setIP( temp_host.ip() );
948
host->setIsMasterBrowser( temp_host.isMasterBrowser() );
950
temp_hosts_list.append( new Smb4KHost( *host ) );
954
temp_hosts_list.append( new Smb4KHost( temp_host ) );
958
// Clear the temporary objects.
959
temp_workgroup = Smb4KWorkgroup();
960
temp_host = Smb4KHost();
964
else if ( list.at( i ).contains( " <00> ", Qt::CaseSensitive ) )
966
// Set the name of the workgroup/host.
967
if ( list.at( i ).contains( " <GROUP> ", Qt::CaseSensitive ) )
969
temp_workgroup.setName( list.at( i ).section( "<00>", 0, 0 ).trimmed() );
970
temp_host.setWorkgroup( list.at( i ).section( "<00>", 0, 0 ).trimmed() );
974
temp_host.setName( list.at( i ).section( "<00>", 0, 0 ).trimmed() );
979
else if ( list.at( i ).contains( "__MSBROWSE__", Qt::CaseSensitive ) &&
980
list.at( i ).contains( " <01> ", Qt::CaseSensitive ) )
982
// The host is a master browser.
983
temp_workgroup.setMasterBrowser( temp_host.name(), temp_host.ip(), false );
984
temp_host.setIsMasterBrowser( true );
994
// No extra lookup of IP addresses is needed since
995
// we searched for IP addresses.
997
// Clear the internal list of workgroups and replace
998
// it with the temporary one.
999
while ( !Smb4KGlobal::workgroupsList()->isEmpty() )
1001
delete Smb4KGlobal::workgroupsList()->takeFirst();
1004
*Smb4KGlobal::workgroupsList() += temp_workgroups_list;
1006
// Clear the internal list of hosts and replace it with
1007
// the temporary one.
1008
while ( !Smb4KGlobal::hostsList()->isEmpty() )
1010
delete Smb4KGlobal::hostsList()->takeFirst();
1013
*Smb4KGlobal::hostsList() += temp_hosts_list;
1015
emit workgroups( *Smb4KGlobal::workgroupsList() );
1016
emit hostListChanged();
1020
void Smb4KScanner::processWorkgroupMembers()
1022
// Read from stderr and decide what to do:
1023
QString stderr_output = QString::fromLocal8Bit( m_proc->readAllStandardError(), -1 ).trimmed();
1025
if ( !stderr_output.isEmpty() )
1027
if ( Smb4KSettings::lookupDomains() ||
1028
Smb4KSettings::queryCurrentMaster() ||
1029
Smb4KSettings::queryCustomMaster() )
1031
if ( stderr_output.contains( "The username or password was not correct." ) ||
1032
stderr_output.contains( "NT_STATUS_ACCOUNT_DISABLED" ) /* AD error */ ||
1033
stderr_output.contains( "NT_STATUS_ACCESS_DENIED" ) ||
1034
stderr_output.contains( "NT_STATUS_LOGON_FAILURE" ) )
1036
// Authentication failed.
1039
Smb4KAuthInfo authInfo( &m_priv->host() );
1041
if ( Smb4KWalletManager::self()->showPasswordDialog( &authInfo ) )
1043
m_queue.enqueue( QueueContainer( Hosts, m_priv->host() ) );
1052
// Notify the rest of the program, that something went wrong.
1056
Smb4KCoreMessage::error( ERROR_GETTING_MEMBERS, QString(), stderr_output );
1059
else if ( Smb4KSettings::scanBroadcastAreas() )
1061
// We are in IP scan mode, so we can ignore the error and emit
1062
// what we already have.
1063
emit members( m_priv->workgroup().name(), *Smb4KGlobal::hostsList() );
1064
emit hostListChanged();
1074
// There was no error. We can proceed with processing the
1075
// output from stdout.
1076
QString stdout_output = QString::fromLocal8Bit( m_proc->readAllStandardOutput(), -1 ).trimmed();
1077
QStringList list = stdout_output.split( "\n", QString::SkipEmptyParts );
1079
if ( Smb4KSettings::lookupDomains() ||
1080
Smb4KSettings::queryCurrentMaster() ||
1081
Smb4KSettings::queryCustomMaster() )
1083
QList<Smb4KHost *> temp_hosts_list;
1084
Smb4KHost temp_host;
1086
for ( int i = 0; i < list.size(); ++i )
1088
if ( list.at( i ).startsWith( "***" ) && list.at( i ).endsWith( "***" ) )
1090
// This is the IP address of the master browser. Add it
1091
// to the respective workgroup, if necessary.
1092
Smb4KWorkgroup *workgroup = findWorkgroup( m_priv->workgroup().name() );
1094
if ( workgroup && workgroup->masterBrowserIP().isEmpty() )
1096
workgroup->setMasterBrowserIP( list.at( i ).section( ":", 1, 1 ).section( "***", 0, 0 ).trimmed() );
1105
else if ( list.at( i ).trimmed().startsWith( "Enumerating" ) )
1109
else if ( list.at( i ).trimmed().startsWith( "Server name" ) )
1113
else if ( list.at( i ).trimmed().startsWith( "-------------" ) )
1117
else if ( list.at( i ).trimmed().isEmpty() )
1123
temp_host.setName( list.at( i ).section( " ", 0, 0 ).trimmed() );
1124
temp_host.setWorkgroup( m_priv->workgroup().name() );
1125
temp_host.setComment( list.at( i ).section( " ", 1, -1 ).trimmed() );
1127
// Check if the host is equal to the master browser of the
1128
// workgroup. If it is, copy the IP address and set the master
1129
// browser flag to true.
1130
Smb4KWorkgroup *workgroup = findWorkgroup( temp_host.workgroup() );
1132
if ( workgroup && QString::compare( temp_host.name(), workgroup->masterBrowserName(), Qt::CaseInsensitive ) == 0 )
1134
if ( temp_host.ip().isEmpty() && !workgroup->masterBrowserIP().isEmpty() )
1136
temp_host.setIP( workgroup->masterBrowserIP() );
1143
temp_host.setIsMasterBrowser( true );
1150
// Search the host in the global list. If it already exists, update it,
1151
// copy it to the temporary list and delete it from the global list
1152
// (it will be reentered in a short moment). If it does not exist yet,
1153
// just copy the temporary host to the list.
1154
Smb4KHost *host = NULL;
1156
if ( (host = findHost( temp_host.name(), temp_host.workgroup() )) != NULL )
1158
host->setComment( temp_host.comment() );
1160
temp_hosts_list.append( new Smb4KHost( *host ) );
1162
int index = Smb4KGlobal::hostsList()->indexOf( host );
1163
delete Smb4KGlobal::hostsList()->takeAt( index );
1167
temp_hosts_list.append( new Smb4KHost( temp_host ) );
1170
temp_host = Smb4KHost();
1176
// If the temporary list should be empty, put at least the master
1178
if ( temp_hosts_list.isEmpty() )
1180
temp_host.setName( m_priv->workgroup().masterBrowserName() );
1181
temp_host.setWorkgroup( m_priv->workgroup().name() );
1182
temp_host.setIP( m_priv->workgroup().masterBrowserIP() );
1183
temp_host.setIsMasterBrowser( true );
1185
temp_hosts_list.append( new Smb4KHost( temp_host ) );
1192
// Add the temporary hosts list to the global one.
1193
*Smb4KGlobal::hostsList() += temp_hosts_list;
1195
// Emit the signal that the workgroup members have been
1197
emit members( m_priv->workgroup().name(), temp_hosts_list );
1199
// Lookup missing IP addresses
1200
Smb4KIPAddressScanner::self()->triggerScan();
1202
else if ( Smb4KSettings::scanBroadcastAreas() )
1204
// We will not remove any host from the list in IP scan mode,
1205
// but we will add additional infomation, if available.
1206
for ( int i = 0; i < list.size(); ++i )
1208
if ( list.at( i ).trimmed().startsWith( "Enumerating" ) )
1212
else if ( list.at( i ).trimmed().startsWith( "Server name" ) )
1216
else if ( list.at( i ).trimmed().startsWith( "-------------" ) )
1220
else if ( list.at( i ).trimmed().isEmpty() )
1226
// FIXME: Should we add newly discovered hosts to the global list?
1228
// Look for a comment and add it to the host item
1229
// if one was found.
1230
if ( !list.at( i ).trimmed().contains( " " ) )
1237
Smb4KHost *host = findHost( list.at( i ).section( " ", 0, 0 ).trimmed(),
1238
m_priv->workgroup().name() );
1242
host->setComment( list.at( i ).section( " ", 1, -1 ).trimmed() );
1252
emit members( m_priv->workgroup().name(), *Smb4KGlobal::hostsList() );
1259
emit hostListChanged();
1263
void Smb4KScanner::processShares()
1265
// Read from stderr and decide what to do:
1266
QString stderr_output = QString::fromLocal8Bit( m_proc->readAllStandardError(), -1 ).trimmed();
1268
if ( !stderr_output.isEmpty() )
1270
if ( stderr_output.contains( "The username or password was not correct." ) ||
1271
stderr_output.contains( "NT_STATUS_ACCOUNT_DISABLED" ) /* AD error */ ||
1272
stderr_output.contains( "NT_STATUS_ACCESS_DENIED" ) ||
1273
stderr_output.contains( "NT_STATUS_LOGON_FAILURE" ) )
1275
// Authentication failed.
1278
Smb4KAuthInfo authInfo( &m_priv->host() );
1280
if ( Smb4KWalletManager::self()->showPasswordDialog( &authInfo ) )
1282
m_queue.enqueue( QueueContainer( Shares, m_priv->host() ) );
1291
else if ( stderr_output.contains( "could not obtain sid for domain", Qt::CaseSensitive ) )
1293
// FIXME: Does this error only occur when we scan a server that is
1294
// only capable of the RAP protocol or also under other conditions?
1295
m_priv->host().setProtocol( Smb4KHost::RAP );
1297
m_queue.enqueue( QueueContainer( Shares, m_priv->host() ) );
1299
m_priv->retry = true;
1305
if ( !stderr_output.contains( "creating lame", Qt::CaseSensitive ) )
1307
// We could not get the list of shares:
1311
Smb4KCoreMessage::error( ERROR_GETTING_SHARES, QString(), stderr_output );
1322
// There was no error. We can proceed with processing the
1323
// output from stdout.
1324
QString stdout_output = QString::fromLocal8Bit( m_proc->readAllStandardOutput(), -1 ).trimmed();
1325
QStringList list = stdout_output.split( "\n", QString::SkipEmptyParts );
1327
QList<Smb4KShare *> temp_shares_list;
1328
Smb4KShare temp_share;
1330
for ( int i = 0; i < list.size(); ++i )
1332
if ( list.at( i ).trimmed().startsWith( "Enumerating" ) )
1336
else if ( list.at( i ).trimmed().startsWith( "Share name" ) )
1340
else if ( list.at( i ).trimmed().startsWith( "----------" ) )
1344
else if ( list.at( i ).trimmed().isEmpty() )
1350
if ( list.at( i ).contains( " Disk ", Qt::CaseSensitive ) ||
1351
(!list.at( i ).contains( " Disk ", Qt::CaseSensitive ) &&
1352
list.at( i ).trimmed().endsWith( " Disk", Qt::CaseSensitive )) )
1354
if ( !list.at( i ).trimmed().endsWith( " Disk", Qt::CaseSensitive ) )
1356
temp_share.setName( list.at( i ).section( " Disk ", 0, 0 ).trimmed() );
1357
temp_share.setComment( list.at( i ).section( " Disk ", 1, 1 ).trimmed() );
1361
temp_share.setName( list.at( i ).section( " Disk", 0, 0 ).trimmed() );
1362
temp_share.setComment( "" );
1365
temp_share.setHost( m_priv->host().name() );
1366
temp_share.setWorkgroup( m_priv->host().workgroup() );
1367
temp_share.setType( "Disk" );
1369
// Check if we also have an IP address we can add to the
1371
if ( m_priv->host().ipChecked() && !m_priv->host().ip().isEmpty() )
1373
temp_share.setHostIP( m_priv->host().ip() );
1377
Smb4KHost *host = findHost( m_priv->host().name(), m_priv->host().workgroup() );
1379
if ( host && host->ipChecked() && !host->ip().isEmpty() )
1381
temp_share.setHostIP( host->ip() );
1389
// In case this is a 'homes' share, set also the user names.
1390
if ( QString::compare( temp_share.name(), "homes" ) == 0 )
1392
Smb4KHomesSharesHandler::self()->setHomesUsers( &temp_share );
1399
temp_shares_list.append( new Smb4KShare( temp_share ) );
1401
temp_share = Smb4KShare();
1405
else if ( list.at( i ).contains( " IPC ", Qt::CaseSensitive ) ||
1406
(!list.at( i ).contains( " IPC ", Qt::CaseSensitive ) &&
1407
list.at( i ).trimmed().endsWith( " IPC", Qt::CaseSensitive )) )
1409
if ( !list.at( i ).trimmed().endsWith( " IPC", Qt::CaseSensitive ) )
1411
temp_share.setName( list.at( i ).section( " IPC ", 0, 0 ).trimmed() );
1412
temp_share.setComment( list.at( i ).section( " IPC ", 1, 1 ).trimmed() );
1416
temp_share.setName( list.at( i ).section( " IPC", 0, 0 ).trimmed() );
1417
temp_share.setComment( "" );
1420
temp_share.setHost( m_priv->host().name() );
1421
temp_share.setWorkgroup( m_priv->host().workgroup() );
1422
temp_share.setType( "IPC" );
1424
// Check if we also have an IP address we can add to the
1426
if ( m_priv->host().ipChecked() && !m_priv->host().ip().isEmpty() )
1428
temp_share.setHostIP( m_priv->host().ip() );
1432
Smb4KHost *host = findHost( m_priv->host().name(), m_priv->host().workgroup() );
1434
if ( host && host->ipChecked() && !host->ip().isEmpty() )
1436
temp_share.setHostIP( host->ip() );
1444
temp_shares_list.append( new Smb4KShare( temp_share ) );
1446
temp_share = Smb4KShare();
1450
else if ( list.at( i ).contains( " Print ", Qt::CaseSensitive ) ||
1451
(!list.at( i ).contains( " Print ", Qt::CaseSensitive ) &&
1452
list.at( i ).trimmed().endsWith( " Print", Qt::CaseSensitive )) )
1454
if ( !list.at( i ).trimmed().endsWith( " Print", Qt::CaseSensitive ) )
1456
temp_share.setName( list.at( i ).section( " Print ", 0, 0 ).trimmed() );
1457
temp_share.setComment( list.at( i ).section( " Print ", 1, 1 ).trimmed() );
1461
temp_share.setName( list.at( i ).section( " Print", 0, 0 ).trimmed() );
1462
temp_share.setComment( "" );
1465
temp_share.setHost( m_priv->host().name() );
1466
temp_share.setWorkgroup( m_priv->host().workgroup() );
1467
temp_share.setType( "Printer" );
1469
// Check if we also have an IP address we can add to the
1471
if ( m_priv->host().ipChecked() && !m_priv->host().ip().isEmpty() )
1473
temp_share.setHostIP( m_priv->host().ip() );
1477
Smb4KHost *host = findHost( m_priv->host().name(), m_priv->host().workgroup() );
1479
if ( host && host->ipChecked() && !host->ip().isEmpty() )
1481
temp_share.setHostIP( host->ip() );
1489
// Printer shares cannot be mounted, thus we do not need to check
1492
temp_shares_list.append( new Smb4KShare( temp_share ) );
1494
temp_share = Smb4KShare();
1507
// Check if a share in the list is mounted.
1508
for ( int i = 0; i < temp_shares_list.size(); ++i )
1510
for ( int j = 0; j < Smb4KGlobal::mountedSharesList()->size(); ++j )
1512
if ( QString::compare( Smb4KGlobal::mountedSharesList()->at( j )->host(), temp_shares_list.at( i )->host() ) == 0 &&
1513
QString::compare( Smb4KGlobal::mountedSharesList()->at( j )->name(), temp_shares_list.at( i )->name() ) == 0 )
1515
temp_shares_list.at( i )->setMountData( Smb4KGlobal::mountedSharesList()->at( j ) );
1526
emit shares( m_priv->host().name(), temp_shares_list );
1530
void Smb4KScanner::processInfo( QProcess::ExitStatus status )
1534
case QProcess::NormalExit:
1536
// Since the information about the server and operating system
1537
// is debug information, it will be reported via stderr.
1538
QString stderr_output = QString::fromLocal8Bit( m_proc->readAllStandardError(), -1 ).trimmed();
1541
Smb4KHost *host = findHost( m_priv->host().name(), m_priv->host().workgroup() );
1545
// The output should only be one line, so we can process it
1547
if ( stderr_output.trimmed().startsWith( "Domain" ) || stderr_output.trimmed().startsWith( "OS" ) )
1549
host->setInfo( stderr_output.section( "Server=[", 1, 1 ).section( "]", 0, 0 ).trimmed(),
1550
stderr_output.section( "OS=[", 1, 1 ).section( "]", 0, 0 ).trimmed() );
1568
// Enable checking again.
1569
Smb4KHost *host = findHost( m_priv->host().name(), m_priv->host().workgroup() );
1584
void Smb4KScanner::insertHost( Smb4KHost *host )
1586
if ( host && !findHost( host->name(), host->workgroup() ) )
1588
// Use the copy constructor here, so that we do not run into
1589
// trouble when/if host is deleted.
1590
Smb4KHost *new_host = new Smb4KHost( *host );
1592
Smb4KGlobal::hostsList()->append( new_host );
1594
// Check if the workgroup is already known. If not, create a new Smb4KWorkgroup object,
1595
// declare the host a pseudo master and add the workgroup to the list.
1596
if ( !findWorkgroup( new_host->workgroup() ) )
1598
Smb4KWorkgroup *workgroup = new Smb4KWorkgroup( new_host->workgroup() );
1599
workgroup->setMasterBrowser( new_host->name(), new_host->ip(), true );
1601
new_host->setIsMasterBrowser( true ); // pseudo master
1603
appendWorkgroup( workgroup );
1606
// Lookup at least the IP address of this host, if necessary:
1607
if ( new_host->ip().isEmpty() )
1609
Smb4KIPAddressScanner::self()->triggerScan();
1612
emit hostInserted( new_host );
1613
emit hostListChanged();
1618
void Smb4KScanner::appendWorkgroup( Smb4KWorkgroup *workgroup )
1620
if ( !findWorkgroup( workgroup->name() ) )
1622
// Append the workgroup.
1623
Smb4KGlobal::workgroupsList()->append( workgroup );
1625
// Add the master browser to the list of hosts.
1626
if ( !workgroup->masterBrowserName().isEmpty() )
1628
Smb4KHost *master_browser = new Smb4KHost( workgroup->masterBrowserName() );
1629
master_browser->setWorkgroup( workgroup->name() );
1630
master_browser->setIP( workgroup->masterBrowserIP() );
1633
emit workgroups( *Smb4KGlobal::workgroupsList() );
1634
emit hostListChanged();
1643
void Smb4KScanner::timerEvent( QTimerEvent * )
1645
if ( !m_working && !m_queue.isEmpty() )
1647
// Tell the program, that the scanner is running.
1650
QueueContainer c = m_queue.dequeue();
1656
if ( Smb4KSettings::lookupDomains() )
1658
emit state( SCANNER_LOOKUP_DOMAINS );
657
Smb4KLookupInfoJob *job = new Smb4KLookupInfoJob( this );
658
job->setObjectName( QString( "LookupInfoJob_%1" ).arg( host->hostName() ) );
659
job->setupLookup( host, parent );
661
connect( job, SIGNAL( result( KJob * ) ), SLOT( slotJobFinished( KJob * ) ) );
662
connect( job, SIGNAL( aboutToStart( Smb4KHost * ) ), SLOT( slotAboutToStartSharesLookup( Smb4KHost * ) ) );
663
connect( job, SIGNAL( finished( Smb4KHost * ) ), SLOT( slotSharesLookupFinished( Smb4KHost * ) ) );
664
connect( job, SIGNAL( info( Smb4KHost * ) ), SLOT( slotInfo( Smb4KHost * ) ) );
668
QApplication::setOverrideCursor( Qt::BusyCursor );
681
void Smb4KScanner::timerEvent( QTimerEvent */*e*/ )
683
if ( Smb4KSettings::periodicScanning() )
685
if ( m_interval == 0 )
687
if ( m_periodic_jobs.isEmpty() )
689
// This case occurs when the user enables periodic scanning during
690
// runtime. We need to fill the list of periodic jobs here, so that
691
// we can immediately start periodic scanning.
692
m_periodic_jobs << LookupDomains;
693
m_periodic_jobs << LookupDomainMembers;
694
m_periodic_jobs << LookupShares;
698
// This is the regular case. We do not need to do anything.
701
Process p = m_periodic_jobs.takeFirst();
707
m_scanning_allowed = false;
1659
708
lookupDomains();
1661
else if ( Smb4KSettings::queryCurrentMaster() ||
1662
Smb4KSettings::queryCustomMaster() )
1664
emit state( SCANNER_QUERY_MASTER_BROWSER );
1665
queryMasterBrowser();
1667
else if ( Smb4KSettings::scanBroadcastAreas() )
1669
emit state( SCANNER_SCAN_BROADCAST_AREAS );
1670
scanBroadcastAreas();
719
if ( m_interval >= (Smb4KSettings::scanInterval() * 60000 /* milliseconds */) )
721
// Reset interval. Since the check above
722
m_interval = -TIMER_INTERVAL;
725
m_periodic_jobs << LookupDomains;
726
m_periodic_jobs << LookupDomainMembers;
727
m_periodic_jobs << LookupShares;
731
// Check if we need to do something.
732
// Do not start any process before the previous has not finished.
733
if ( !m_periodic_jobs.isEmpty() && m_scanning_allowed )
735
Process p = m_periodic_jobs.takeFirst();
739
case LookupDomainMembers:
741
for ( int i = 0; i < workgroupsList().size(); ++i )
743
m_scanning_allowed = false;
744
lookupDomainMembers( workgroupsList()[i] );
750
for ( int i = 0; i < hostsList().size(); ++i )
752
m_scanning_allowed = false;
753
lookupShares( hostsList()[i] );
1681
emit state( SCANNER_OPEN_WORKGROUP );
1682
scanForWorkgroupMembers( c.workgroup() );
1687
emit state( SCANNER_OPEN_HOST );
1689
if ( m_priv->retry )
1691
m_priv->retry = false;
1694
scanForShares( c.host() );
1699
emit state( SCANNER_QUERY_INFO );
1700
scanForInfo( c.host() );
770
m_interval += TIMER_INTERVAL;
774
// Periodic scanning is not enabled or has been disabled
775
// during runtime. So, reset the interval, if necessary.
776
if ( m_interval != 0 )
1716
789
/////////////////////////////////////////////////////////////////////////////
1717
790
// SLOT IMPLEMENTATIONS
1718
791
/////////////////////////////////////////////////////////////////////////////
1721
void Smb4KScanner::slotProcessFinished( int exitCode, QProcess::ExitStatus exitStatus )
1723
endProcess( exitCode, exitStatus );
1727
void Smb4KScanner::slotProcessError( QProcess::ProcessError errorCode )
1729
m_process_error = errorCode;
1733
#include <smb4kscanner.moc>
793
void Smb4KScanner::slotAboutToQuit()
799
void Smb4KScanner::slotStartJobs()
801
// If the user wants to have periodic scanning of the network
802
// neighborhood, set it up here here.
803
if ( Smb4KSettings::periodicScanning() )
806
m_periodic_jobs << LookupDomains;
807
m_periodic_jobs << LookupDomainMembers;
808
m_periodic_jobs << LookupShares;
815
// Start the timer in any case. Thus, we are able to switch
816
// to periodic scanning seamlessly in the timerEvent() function.
817
startTimer( TIMER_INTERVAL );
821
void Smb4KScanner::slotJobFinished( KJob *job )
827
QApplication::restoreOverrideCursor();
836
void Smb4KScanner::slotAuthError( Smb4KQueryMasterJob *job )
838
Smb4KHost master_browser;
840
if ( !job->masterBrowser().isEmpty() )
842
master_browser.setIsMasterBrowser( true );
844
if ( QHostAddress( job->masterBrowser() ).protocol() == QAbstractSocket::UnknownNetworkLayerProtocol )
846
master_browser.setHostName( job->masterBrowser() );
850
master_browser.setIP( job->masterBrowser() );
853
emit authError ( &master_browser, LookupDomains );
860
if ( Smb4KWalletManager::self()->showPasswordDialog( &master_browser, job->parentWidget() ) )
862
// Start a query job with the returned master browser.
863
Smb4KQueryMasterJob *job = new Smb4KQueryMasterJob( this );
864
job->setObjectName( "LookupDomainsJob" );
865
job->setupLookup( job->masterBrowser(), job->parentWidget() );
867
connect( job, SIGNAL( result( KJob * ) ), SLOT( slotJobFinished( KJob * ) ) );
868
connect( job, SIGNAL( aboutToStart() ), SLOT( slotAboutToStartDomainsLookup() ) );
869
connect( job, SIGNAL( finished() ), SLOT( slotDomainsLookupFinished() ) );
870
connect( job, SIGNAL( workgroups( const QList<Smb4KWorkgroup> & ) ), SLOT( slotWorkgroups( const QList<Smb4KWorkgroup> & ) ) );
871
connect( job, SIGNAL( authError( Smb4KQueryMasterJob * ) ), SLOT( slotAuthError( Smb4KQueryMasterJob * ) ) );
875
QApplication::setOverrideCursor( Qt::BusyCursor );
893
void Smb4KScanner::slotAuthError( Smb4KLookupDomainMembersJob *job )
895
Smb4KHost *master_browser = findHost( job->workgroup()->masterBrowserName(), job->workgroup()->workgroupName() );
897
if ( master_browser )
899
emit authError( master_browser, LookupDomainMembers );
901
if ( Smb4KWalletManager::self()->showPasswordDialog( master_browser, job->parentWidget() ) )
903
lookupDomainMembers( job->workgroup(), job->parentWidget() );
917
void Smb4KScanner::slotAuthError( Smb4KLookupSharesJob *job )
919
Smb4KHost *host = findHost( job->host()->hostName(), job->host()->workgroupName() );
923
emit authError( host, LookupShares );
925
if ( Smb4KWalletManager::self()->showPasswordDialog( host, job->parentWidget() ) )
927
lookupShares( host, job->parentWidget() );
941
void Smb4KScanner::slotAboutToStartDomainsLookup()
943
Smb4KBasicNetworkItem item;
944
emit aboutToStart( &item, LookupDomains );
948
void Smb4KScanner::slotDomainsLookupFinished()
950
Smb4KBasicNetworkItem item;
951
emit finished( &item, LookupDomains );
952
m_scanning_allowed = true;
956
void Smb4KScanner::slotAboutToStartHostsLookup( Smb4KWorkgroup *workgroup )
958
emit aboutToStart( workgroup, LookupDomainMembers );
962
void Smb4KScanner::slotHostsLookupFinished( Smb4KWorkgroup *workgroup )
964
emit finished( workgroup, LookupDomainMembers );
965
m_scanning_allowed = true;
969
void Smb4KScanner::slotAboutToStartSharesLookup( Smb4KHost *host )
971
emit aboutToStart( host, LookupShares );
975
void Smb4KScanner::slotSharesLookupFinished( Smb4KHost *host )
977
emit finished( host, LookupShares );
978
m_scanning_allowed = true;
982
void Smb4KScanner::slotAboutToStartInfoLookup( Smb4KHost *host )
984
emit aboutToStart( host, LookupInfo );
988
void Smb4KScanner::slotInfoLookupFinished( Smb4KHost *host )
990
emit finished( host, LookupInfo );
994
void Smb4KScanner::slotWorkgroups( const QList<Smb4KWorkgroup> &workgroups_list )
996
// The new workgroup list will be used as global workgroup list.
997
// We do some checks and adjustments now, so that the host list
998
// is also correctly updated.
999
if ( !workgroups_list.isEmpty() )
1001
for ( int i = 0; i < workgroups_list.size(); ++i )
1003
Smb4KWorkgroup *workgroup = findWorkgroup( workgroups_list.at( i ).workgroupName() );
1005
// Check if the master browser changed.
1008
if ( QString::compare( workgroups_list.at( i ).masterBrowserName(), workgroup->masterBrowserName(), Qt::CaseInsensitive ) != 0 )
1010
// Get the old master browser and reset the master browser flag.
1011
Smb4KHost *old_master_browser = findHost( workgroup->masterBrowserName(), workgroup->workgroupName() );
1013
if ( old_master_browser )
1015
old_master_browser->setIsMasterBrowser( false );
1022
// Lookup new master browser and either set the master browser flag
1023
// or insert it if it does not exit yet.
1024
Smb4KHost *new_master_browser = findHost( workgroups_list.at( i ).masterBrowserName(), workgroups_list.at( i ).workgroupName() );
1026
if ( new_master_browser )
1028
if ( workgroups_list.at( i ).hasMasterBrowserIP() )
1030
new_master_browser->setIP( workgroups_list.at( i ).masterBrowserIP() );
1037
new_master_browser->setIsMasterBrowser( true );
1041
new_master_browser = new Smb4KHost();
1042
new_master_browser->setHostName( workgroups_list.at( i ).masterBrowserName() );
1044
if ( workgroups_list.at( i ).hasMasterBrowserIP() )
1046
new_master_browser->setIP( workgroups_list.at( i ).masterBrowserIP() );
1053
new_master_browser->setWorkgroupName( workgroups_list.at( i ).workgroupName() );
1054
new_master_browser->setIsMasterBrowser( true );
1056
addHost( new_master_browser );
1064
removeWorkgroup( workgroup );
1068
// Check if the master browser of the new workgroup list is by chance
1069
// already in the list of hosts. If it exists, set the master browser
1070
// flag, else insert it.
1071
Smb4KHost *new_master_browser = findHost( workgroups_list.at( i ).masterBrowserName(), workgroups_list.at( i ).workgroupName() );
1073
if ( new_master_browser )
1075
if ( workgroups_list.at( i ).hasMasterBrowserIP() )
1077
new_master_browser->setIP( workgroups_list.at( i ).masterBrowserIP() );
1084
new_master_browser->setIsMasterBrowser( true );
1088
new_master_browser = new Smb4KHost();
1089
new_master_browser->setHostName( workgroups_list.at( i ).masterBrowserName() );
1091
if ( workgroups_list.at( i ).hasMasterBrowserIP() )
1093
new_master_browser->setIP( workgroups_list.at( i ).masterBrowserIP() );
1100
new_master_browser->setWorkgroupName( workgroups_list.at( i ).workgroupName() );
1101
new_master_browser->setIsMasterBrowser( true );
1103
addHost( new_master_browser );
1113
// The global workgroup list only contains obsolete workgroups now.
1114
// Remove all hosts belonging to those obsolete workgroups from the
1115
// host list and then also the workgroups themselves.
1116
while ( !workgroupsList().isEmpty() )
1118
Smb4KWorkgroup *workgroup = workgroupsList().first();
1119
QList<Smb4KHost *> obsolete_hosts = workgroupMembers( workgroup );
1120
QListIterator<Smb4KHost *> h( obsolete_hosts );
1122
while ( h.hasNext() )
1124
Smb4KHost *host = h.next();
1128
removeWorkgroup( workgroup );
1131
// Add a copy of all workgroups to the global list.
1132
for ( int i = 0; i < workgroups_list.size(); ++i )
1134
addWorkgroup( new Smb4KWorkgroup( workgroups_list.at( i ) ) );
1137
// Scan for IP addresses if necessary
1138
if ( !Smb4KSettings::scanBroadcastAreas() )
1140
Smb4KIPAddressScanner::self()->lookup();
1147
emit workgroups( workgroupsList() );
1148
emit hostListChanged();
1152
void Smb4KScanner::slotHosts( const QList<Smb4KHost> &hosts_list )
1154
slotHosts( NULL, hosts_list );
1158
void Smb4KScanner::slotHosts( Smb4KWorkgroup *workgroup, const QList<Smb4KHost> &hosts_list )
1160
QList<Smb4KHost> internal_hosts_list;
1162
if ( !hosts_list.isEmpty() )
1164
// Copy any information we might need to the internal list and
1165
// remove the host from the global list. It will be added again
1167
for ( int i = 0; i < hosts_list.size(); ++i )
1169
Smb4KHost new_host = hosts_list[i];
1170
Smb4KHost *host = findHost( new_host.hostName(), new_host.workgroupName() );
1175
if ( new_host.comment().isEmpty() && !host->comment().isEmpty() )
1177
new_host.setComment( host->comment() );
1184
// Set the additional information
1185
if ( !new_host.infoChecked() && host->infoChecked() )
1187
new_host.setInfo( host->serverString(), host->osString() );
1194
// Set the IP addresses
1195
if ( !new_host.hasIP() && host->hasIP() )
1197
new_host.setIP( host->ip() );
1211
internal_hosts_list << new_host;
1221
// Now remove all (obsolete) hosts of the scanned workgroup from
1222
// the global list as well as their shares.
1223
QList<Smb4KHost *> obsolete_hosts = workgroupMembers( workgroup );
1224
QListIterator<Smb4KHost *> h( obsolete_hosts );
1226
while ( h.hasNext() )
1228
Smb4KHost *host = h.next();
1230
QList<Smb4KShare *> obsolete_shares = sharedResources( host );
1231
QListIterator<Smb4KShare *> s( obsolete_shares );
1233
while ( s.hasNext() )
1235
Smb4KShare *share = s.next();
1236
removeShare( share );
1244
// If no workgroup was passed it means that we are doing an IP scan
1245
// or at least members of more than one workgroup were looked up. In
1246
// this case the global hosts list is considered to carry obsolete
1247
// host entries at this point. Remove them as well as their shares.
1248
while ( !hostsList().isEmpty() )
1250
Smb4KHost *host = hostsList().first();
1252
QList<Smb4KShare *> obsolete_shares = sharedResources( host );
1253
QListIterator<Smb4KShare *> s( obsolete_shares );
1255
while ( s.hasNext() )
1257
Smb4KShare *share = s.next();
1258
removeShare( share );
1265
// Add a copy of all hosts to the global list.
1266
for ( int i = 0; i < internal_hosts_list.size(); ++i )
1268
addHost( new Smb4KHost( internal_hosts_list.at( i ) ) );
1271
// Scan for IP addresses if necessary
1272
if ( !internal_hosts_list.isEmpty() && !Smb4KSettings::scanBroadcastAreas() )
1274
Smb4KIPAddressScanner::self()->lookup();
1283
QList<Smb4KHost *> workgroup_members = workgroupMembers( workgroup );
1284
emit hosts( workgroup, workgroup_members );
1288
emit hosts( workgroup, hostsList() );
1290
emit hostListChanged();
1294
void Smb4KScanner::slotShares( Smb4KHost *host, const QList<Smb4KShare> &shares_list )
1298
QList<Smb4KShare> internal_shares_list;
1300
if ( !shares_list.isEmpty() )
1302
// Copy some information before processing the shares further.
1303
// Note, that the IP address and other information stemming from
1304
// the host were already entered by the lookup job.
1305
for ( int i = 0; i < shares_list.size(); ++i )
1307
Smb4KShare new_share = shares_list[i];
1309
// Check if the share has already been mounted.
1310
QList<Smb4KShare *> mounted_shares = findShareByUNC( new_share.unc() );
1312
if ( !mounted_shares.isEmpty() )
1314
// FIXME: We cannot honor Smb4KSettings::showAllShares() here, because
1315
// in case the setting is changed, there will be no automatic rescan
1316
// (in case of an automatic or periodical rescan that would be the
1317
// favorable method...
1319
// For now, we prefer the share mounted by the user or use the first
1320
// occurrence if he/she did not mount it.
1321
Smb4KShare *mounted_share = mounted_shares.first();
1323
for ( int j = 0; j < mounted_shares.size(); ++j )
1325
if ( !mounted_shares.at( j )->isForeign() )
1327
mounted_share = mounted_shares[j];
1336
new_share.setMountData( mounted_share );
1343
// Now set some information that might have been collected
1344
// since the lookup started...
1345
Smb4KShare *share = findShare( new_share.shareName(), new_share.hostName(), new_share.workgroupName() );
1349
if ( !new_share.hasHostIP() && share->hasHostIP() )
1351
new_share.setHostIP( share->hostIP() );
1358
removeShare( share );
1365
internal_shares_list << new_share;
1373
// Copy authentication information
1374
Smb4KHost *known_host = findHost( host->hostName(), host->workgroupName() );
1378
known_host->setLogin( host->login() );
1379
known_host->setPassword( host->password() );
1386
// Now remove all (obsolete) shares of the scanned host from
1388
QList<Smb4KShare *> obsolete_shares = sharedResources( host );
1389
QListIterator<Smb4KShare *> s( obsolete_shares );
1391
while ( s.hasNext() )
1393
Smb4KShare *share = s.next();
1394
removeShare( share );
1397
// Add a copy of all shares to the global list.
1398
for ( int i = 0; i < internal_shares_list.size(); ++i )
1400
addShare( new Smb4KShare( internal_shares_list.at( i ) ) );
1403
QList<Smb4KShare *> shared_resources = sharedResources( host );
1404
emit shares( host, shared_resources );
1408
void Smb4KScanner::slotInfo( Smb4KHost *host )
1412
Smb4KHost *known_host = NULL;
1414
if ( host->infoChecked() )
1416
// Copy the information also to host in the global list, if present,
1417
// or copy 'host' to the global list.
1418
known_host = findHost( host->hostName(), host->workgroupName() );
1422
known_host->setInfo( host->serverString(), host->osString() );
1426
known_host = new Smb4KHost( *host );
1427
addHost( known_host );
1435
// Emit the host here.
1436
emit info( known_host );
1440
#include "smb4kscanner.moc"