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