00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
#include "smbview.h"
00021
00022
#include <kprocess.h>
00023
#include <ktempfile.h>
00024
#include <qheader.h>
00025
#include <qapplication.h>
00026
00027
#include <kiconloader.h>
00028
#include <klocale.h>
00029
#include <kdebug.h>
00030
#include <kmessagebox.h>
00031
#include <kcursor.h>
00032
00033
00034
00035 SmbView::SmbView(
QWidget *parent,
const char *name)
00036 : KListView(parent,name)
00037 {
00038 addColumn(i18n(
"Printer"));
00039 addColumn(i18n(
"Comment"));
00040 setFrameStyle(QFrame::WinPanel|QFrame::Sunken);
00041 setLineWidth(1);
00042 setAllColumnsShowFocus(
true);
00043 setRootIsDecorated(
true);
00044
00045 m_state = Idle;
00046 m_current = 0;
00047 m_proc =
new KProcess();
00048 m_proc->setUseShell(
true);
00049 m_passwdFile = 0;
00050 connect(m_proc,SIGNAL(processExited(KProcess*)),SLOT(slotProcessExited(KProcess*)));
00051 connect(m_proc,SIGNAL(receivedStdout(KProcess*,
char*,
int)),SLOT(slotReceivedStdout(KProcess*,
char*,
int)));
00052 connect(
this,SIGNAL(selectionChanged(
QListViewItem*)),SLOT(slotSelectionChanged(
QListViewItem*)));
00053 }
00054
00055 SmbView::~SmbView()
00056 {
00057
delete m_proc;
00058
delete m_passwdFile;
00059 }
00060
00061
void SmbView::setLoginInfos(
const QString& login,
const QString& password)
00062 {
00063 m_login = login;
00064 m_password = password;
00065
00066
00067
00068
00069
00070
00071
delete m_passwdFile;
00072 m_passwdFile =
new KTempFile;
00073 m_passwdFile->setAutoDelete(
true);
00074
00075
QTextStream *passwdFile = m_passwdFile->textStream();
00076
if (!passwdFile)
return;
00077 (*passwdFile) <<
"username = " << m_login << endl;
00078 (*passwdFile) <<
"password = " << m_password << endl;
00079
00080
00081 m_passwdFile->close();
00082 }
00083
00084
void SmbView::startProcess(
int state)
00085 {
00086 m_buffer = QString::null;
00087 m_state = state;
00088
QApplication::setOverrideCursor(KCursor::waitCursor());
00089 m_proc->start(KProcess::NotifyOnExit,KProcess::Stdout);
00090 emit running(
true);
00091 }
00092
00093
void SmbView::endProcess()
00094 {
00095
switch (m_state)
00096 {
00097
case GroupListing:
00098 processGroups();
00099
break;
00100
case ServerListing:
00101 processServers();
00102
break;
00103
case ShareListing:
00104 processShares();
00105
break;
00106
default:
00107
break;
00108 }
00109 m_state = Idle;
00110
QApplication::restoreOverrideCursor();
00111 emit running(
false);
00112
00113 m_proc->clearArguments();
00114 }
00115
00116
void SmbView::slotProcessExited(KProcess*)
00117 {
00118 endProcess();
00119 }
00120
00121
void SmbView::slotReceivedStdout(KProcess*,
char *buf,
int len)
00122 {
00123 m_buffer.append(QString::fromLocal8Bit(buf,len));
00124 }
00125
00126
void SmbView::init()
00127 {
00128
QString cmd(
"nmblookup -M -- - | grep '<01>' | awk '{print $1}' | xargs nmblookup -A | grep '<1d>'");
00129 *m_proc << cmd;
00130 startProcess(GroupListing);
00131 }
00132
00133
void SmbView::setOpen(
QListViewItem *item,
bool on)
00134 {
00135
if (on && item->
childCount() == 0)
00136 {
00137
if (item->
depth() == 0)
00138 {
00139 m_current = item;
00140 *m_proc <<
"nmblookup -M ";
00141 *m_proc << KProcess::quote(item->text(0));
00142 *m_proc <<
" -S | grep '<20>' | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*<20>.*//' | xargs -iserv_name smbclient -N -L 'serv_name' -W ";
00143 *m_proc << KProcess::quote(item->text(0));
00144 *m_proc <<
" -A ";
00145 *m_proc << KProcess::quote(m_passwdFile->name());
00146 startProcess(ServerListing);
00147 }
00148
else if (item->
depth() == 1)
00149 {
00150 m_current = item;
00151 *m_proc <<
"smbclient -N -L ";
00152 *m_proc << KProcess::quote(item->text(0));
00153 *m_proc <<
" -W ";
00154 *m_proc << KProcess::quote(item->parent()->text(0));
00155 *m_proc <<
" -A ";
00156 *m_proc << KProcess::quote(m_passwdFile->name());
00157 startProcess(ShareListing);
00158 }
00159 }
00160
QListView::setOpen(item,on);
00161 }
00162
00163
void SmbView::processGroups()
00164 {
00165
QStringList grps =
QStringList::split(
'\n',m_buffer,
false);
00166 clear();
00167
for (QStringList::ConstIterator it=grps.begin(); it!=grps.end(); ++it)
00168 {
00169
int p = (*it).find(
"<1d>");
00170
if (p == -1)
00171
continue;
00172
QListViewItem *item =
new QListViewItem(
this,(*it).left(p).stripWhiteSpace());
00173 item->
setExpandable(
true);
00174 item->
setPixmap(0,SmallIcon(
"network"));
00175 }
00176 }
00177
00178
void SmbView::processServers()
00179 {
00180
QStringList lines =
QStringList::split(
'\n',m_buffer,
true);
00181
QString line;
00182 uint index(0);
00183
for (;index < lines.count();index++)
00184
if (lines[index].stripWhiteSpace().startsWith(
"Server"))
00185
break;
00186 index += 2;
00187
while (index < lines.count())
00188 {
00189 line = lines[index++].stripWhiteSpace();
00190
if (line.
isEmpty())
00191
break;
00192
QStringList words =
QStringList::split(
' ',line,
false);
00193
QListViewItem *item =
new QListViewItem(m_current,words[0]);
00194 item->
setExpandable(
true);
00195 item->
setPixmap(0,SmallIcon(
"kdeprint_computer"));
00196 }
00197 }
00198
00199
void SmbView::processShares()
00200 {
00201
QStringList lines =
QStringList::split(
'\n',m_buffer,
true);
00202
QString line;
00203 uint index(0);
00204
for (;index < lines.count();index++)
00205
if (lines[index].stripWhiteSpace().startsWith(
"Sharename"))
00206
break;
00207 index += 2;
00208
while (index < lines.count())
00209 {
00210 line = lines[index++].stripWhiteSpace();
00211
if (line.
isEmpty())
00212
break;
00213
else if ( line.
startsWith(
"Error returning" ) )
00214 {
00215 KMessageBox::error(
this, line );
00216
break;
00217 }
00218
QString typestr(line.
mid(15, 10).stripWhiteSpace());
00219
00220
00221
if (typestr ==
"Printer")
00222 {
00223
QString comm(line.
mid(25).stripWhiteSpace()), sharen(line.
mid(0, 15).stripWhiteSpace());
00224
00225
00226
00227
QListViewItem *item =
new QListViewItem(m_current,sharen,comm);
00228 item->
setPixmap(0,SmallIcon(
"kdeprint_printer"));
00229 }
00230 }
00231 }
00232
00233
void SmbView::slotSelectionChanged(
QListViewItem *item)
00234 {
00235
if (item && item->
depth() == 2)
00236 emit printerSelected(item->
parent()->parent()->text(0),item->
parent()->text(0),item->
text(0));
00237 }
00238
00239
void SmbView::abort()
00240 {
00241
if (m_proc->isRunning())
00242 m_proc->kill();
00243 }
00244
#include "smbview.moc"