kdeprint Library API Documentation

smbview.cpp

00001 /*
00002  *  This file is part of the KDE libraries
00003  *  Copyright (c) 2001 Michael Goffioul <goffioul@imec.be>
00004  *
00005  *  This library is free software; you can redistribute it and/or
00006  *  modify it under the terms of the GNU Library General Public
00007  *  License version 2 as published by the Free Software Foundation.
00008  *
00009  *  This library is distributed in the hope that it will be useful,
00010  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00011  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00012  *  Library General Public License for more details.
00013  *
00014  *  You should have received a copy of the GNU Library General Public License
00015  *  along with this library; see the file COPYING.LIB.  If not, write to
00016  *  the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
00017  *  Boston, MA 02111-1307, USA.
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 
00031 //*********************************************************************************************
00032 
00033 SmbView::SmbView(QWidget *parent, const char *name)
00034 : KListView(parent,name)
00035 {
00036     addColumn(i18n("Printer"));
00037     addColumn(i18n("Comment"));
00038     setFrameStyle(QFrame::WinPanel|QFrame::Sunken);
00039     setLineWidth(1);
00040     setAllColumnsShowFocus(true);
00041     setRootIsDecorated(true);
00042 
00043     m_state = Idle;
00044     m_current = 0;
00045     m_proc = new KProcess();
00046     m_proc->setUseShell(true);
00047     m_passwdFile = 0;
00048     connect(m_proc,SIGNAL(processExited(KProcess*)),SLOT(slotProcessExited(KProcess*)));
00049     connect(m_proc,SIGNAL(receivedStdout(KProcess*,char*,int)),SLOT(slotReceivedStdout(KProcess*,char*,int)));
00050     connect(this,SIGNAL(selectionChanged(QListViewItem*)),SLOT(slotSelectionChanged(QListViewItem*)));
00051 }
00052 
00053 SmbView::~SmbView()
00054 {
00055     delete m_proc;
00056     delete m_passwdFile;
00057 }
00058 
00059 void SmbView::setLoginInfos(const QString& login, const QString& password)
00060 {
00061     m_login = login;
00062     m_password = password;
00063 
00064     // We can't pass the password via the command line or the environment 
00065     // because the command line is publically accessible on most OSes and
00066     // the environment is publically accessible on some OSes.
00067     // Therefor we write the password to a file and pass that file to 
00068     // smbclient with the -A option
00069     delete m_passwdFile;
00070     m_passwdFile = new KTempFile;
00071     m_passwdFile->setAutoDelete(true);
00072         
00073     QTextStream *passwdFile = m_passwdFile->textStream();
00074     if (!passwdFile) return; // Error
00075     (*passwdFile) << "username = " << m_login << endl;
00076     (*passwdFile) << "password = " << m_password << endl;
00077     // (*passwdFile) << "domain = " << ???? << endl; 
00078         
00079     m_passwdFile->close();
00080 }
00081 
00082 void SmbView::startProcess(int state)
00083 {
00084     m_buffer = QString::null;
00085     m_state = state;
00086     QApplication::setOverrideCursor(waitCursor);
00087     m_proc->start(KProcess::NotifyOnExit,KProcess::Stdout);
00088     emit running(true);
00089 }
00090 
00091 void SmbView::endProcess()
00092 {
00093     switch (m_state)
00094     {
00095         case GroupListing:
00096             processGroups();
00097             break;
00098         case ServerListing:
00099             processServers();
00100             break;
00101         case ShareListing:
00102             processShares();
00103             break;
00104         default:
00105             break;
00106     }
00107     m_state = Idle;
00108     QApplication::restoreOverrideCursor();
00109     emit running(false);
00110     // clean up for future usage
00111     m_proc->clearArguments();
00112 }
00113 
00114 void SmbView::slotProcessExited(KProcess*)
00115 {
00116     endProcess();
00117 }
00118 
00119 void SmbView::slotReceivedStdout(KProcess*, char *buf, int len)
00120 {
00121     m_buffer.append(QString::fromLocal8Bit(buf,len));
00122 }
00123 
00124 void SmbView::init()
00125 {
00126     QString cmd("nmblookup -M -- - | grep '<01>' | awk '{print $1}' | xargs nmblookup -A | grep '<1d>'");
00127     *m_proc << cmd;
00128     startProcess(GroupListing);
00129 }
00130 
00131 void SmbView::setOpen(QListViewItem *item, bool on)
00132 {
00133     if (on && item->childCount() == 0)
00134     {
00135         if (item->depth() == 0)
00136         { // opening group
00137             m_current = item;
00138             *m_proc << "nmblookup -M ";
00139                         *m_proc << KProcess::quote(item->text(0));
00140                         *m_proc << " -S | grep '<20>' | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*<20>.*//' | xargs -iserv_name smbclient -N -L 'serv_name' -W ";
00141                         *m_proc << KProcess::quote(item->text(0));
00142             *m_proc << " -A ";
00143                         *m_proc << KProcess::quote(m_passwdFile->name());
00144             startProcess(ServerListing);
00145         }
00146         else if (item->depth() == 1)
00147         { // opening server
00148             m_current = item;
00149             *m_proc << "smbclient -N -L ";
00150                         *m_proc << KProcess::quote(item->text(0));
00151                         *m_proc << " -W ";
00152                         *m_proc << KProcess::quote(item->parent()->text(0));
00153             *m_proc << " -A ";
00154                         *m_proc << KProcess::quote(m_passwdFile->name());
00155             startProcess(ShareListing);
00156         }
00157     }
00158     QListView::setOpen(item,on);
00159 }
00160 
00161 void SmbView::processGroups()
00162 {
00163     QStringList grps = QStringList::split('\n',m_buffer,false);
00164     clear();
00165     for (QStringList::ConstIterator it=grps.begin(); it!=grps.end(); ++it)
00166     {
00167         int p = (*it).find("<1d>");
00168         if (p == -1)
00169             continue;
00170         QListViewItem   *item = new QListViewItem(this,(*it).left(p).stripWhiteSpace());
00171         item->setExpandable(true);
00172         item->setPixmap(0,SmallIcon("network"));
00173     }
00174 }
00175 
00176 void SmbView::processServers()
00177 {
00178     QStringList lines = QStringList::split('\n',m_buffer,true);
00179     QString     line;
00180     uint        index(0);
00181     for (;index < lines.count();index++)
00182         if (lines[index].stripWhiteSpace().startsWith("Server"))
00183             break;
00184     index += 2;
00185     while (index < lines.count())
00186     {
00187         line = lines[index++].stripWhiteSpace();
00188         if (line.isEmpty())
00189             break;
00190         QStringList words = QStringList::split(' ',line,false);
00191         QListViewItem   *item = new QListViewItem(m_current,words[0]);
00192         item->setExpandable(true);
00193         item->setPixmap(0,SmallIcon("kdeprint_computer"));
00194     }
00195 }
00196 
00197 void SmbView::processShares()
00198 {
00199     QStringList lines = QStringList::split('\n',m_buffer,true);
00200     QString     line;
00201     uint        index(0);
00202     for (;index < lines.count();index++)
00203         if (lines[index].stripWhiteSpace().startsWith("Sharename"))
00204             break;
00205     index += 2;
00206     while (index < lines.count())
00207     {
00208         line = lines[index++].stripWhiteSpace();
00209         if (line.isEmpty())
00210             break;
00211         QString typestr(line.mid(15, 10).stripWhiteSpace());
00212         //QStringList   words = QStringList::split(' ',line,false);
00213         //if (words[1] == "Printer")
00214         if (typestr == "Printer")
00215         {
00216             QString comm(line.mid(25).stripWhiteSpace()), sharen(line.mid(0, 15).stripWhiteSpace());
00217             //for (uint i=2; i<words.count(); i++)
00218             //  comm += (words[i]+" ");
00219             //QListViewItem *item = new QListViewItem(m_current,words[0],comm);
00220             QListViewItem   *item = new QListViewItem(m_current,sharen,comm);
00221             item->setPixmap(0,SmallIcon("kdeprint_printer"));
00222         }
00223     }
00224 }
00225 
00226 void SmbView::slotSelectionChanged(QListViewItem *item)
00227 {
00228     if (item && item->depth() == 2)
00229         emit printerSelected(item->parent()->parent()->text(0),item->parent()->text(0),item->text(0));
00230 }
00231 
00232 void SmbView::abort()
00233 {
00234     if (m_proc->isRunning())
00235         m_proc->kill();
00236 }
00237 #include "smbview.moc"
KDE Logo
This file is part of the documentation for kdeprint Library Version 3.2.0.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Wed Feb 4 12:36:26 2004 by doxygen 1.2.18 written by Dimitri van Heesch, © 1997-2003