smbview.cpp
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"
This file is part of the documentation for kdeprint Library Version 3.3.0.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Thu Sep 23 17:12:56 2004 by
doxygen 1.3.8-20040913 written by
Dimitri van Heesch, © 1997-2003