/* Copyright (C) 2003-2005 George Staikos Copyright (C) 2005 Isaac Clerencia This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "allyourbase.h" #include #include #include #include #include #include #include #include #include #include #include #include #include /**************** * TDEWalletFolderItem - ListView items to represent tdewallet folders */ TDEWalletFolderItem::TDEWalletFolderItem(TDEWallet::Wallet *w, TQListView* parent, const TQString &name, int entries) : TDEListViewItem(parent),_wallet(w),_name(name),_entries(entries) { setText(0, TQString("%1 (%2)").arg(_name).arg(_entries)); setRenameEnabled(0, false); setDragEnabled(true); setDropEnabled(true); TQPixmap pix = getFolderIcon(TDEIcon::Small); setPixmap(0,pix); } TQPixmap TDEWalletFolderItem::getFolderIcon(TDEIcon::Group group){ TDEIconLoader *loader = TDEGlobal::instance()->iconLoader(); TQPixmap pix = loader->loadIcon( _name, group, 0, TDEIcon::DefaultState, 0, true ); if (pix.isNull()) pix = loader->loadIcon( _name.lower(), group, 0, TDEIcon::DefaultState, 0, true); if (pix.isNull()) pix = loader->loadIcon( "folder_red", group, 0, TDEIcon::DefaultState, 0, true); return pix; } void TDEWalletFolderItem::refresh() { TQString saveFolder = _wallet->currentFolder(); _wallet->setFolder(_name); setText(0, TQString("%1 (%2)").arg(_name).arg(_wallet->entryList().count())); _wallet->setFolder(saveFolder); } TDEWalletContainerItem* TDEWalletFolderItem::getContainer(TDEWallet::Wallet::EntryType type) { for (TQListViewItem *i = firstChild(); i; i = i->nextSibling()) { TDEWalletContainerItem *ci = dynamic_cast(i); if (!ci) { continue; } if (ci->type() == type) { return ci; } } return 0; } bool TDEWalletFolderItem::contains(const TQString& key) { return (getItem(key) != 0); } TQListViewItem* TDEWalletFolderItem::getItem(const TQString& key) { for (TQListViewItem *i = firstChild(); i; i = i->nextSibling()) { TDEWalletContainerItem *ci = dynamic_cast(i); if (!ci) { continue; } TQListViewItem *tmp = ci->getItem(key); if (tmp) { return tmp; } } return 0; } bool TDEWalletFolderItem::acceptDrop(const TQMimeSource *mime) const { return mime->provides("application/x-tdewallet-entry") || mime->provides("text/uri-list"); } int TDEWalletFolderItem::rtti() const { return TDEWalletFolderItemClass; } TQString TDEWalletFolderItem::name() const { return _name; } TDEWalletFolderItem::~TDEWalletFolderItem() { } /**************** * TDEWalletContainerItem - ListView items to represent tdewallet containers, i.e. * passwords, maps, ... */ TDEWalletContainerItem::TDEWalletContainerItem(TQListViewItem* parent, const TQString &name, TDEWallet::Wallet::EntryType type) : TDEListViewItem(parent, name), _type(type) { setRenameEnabled(0, false); setDragEnabled(true); } TDEWalletContainerItem::~TDEWalletContainerItem() { } int TDEWalletContainerItem::rtti() const { return TDEWalletContainerItemClass; } TDEWallet::Wallet::EntryType TDEWalletContainerItem::type() { return _type; } bool TDEWalletContainerItem::contains(const TQString& key) { return getItem(key) != 0; } TQListViewItem *TDEWalletContainerItem::getItem(const TQString& key) { for (TQListViewItem *i = firstChild(); i; i = i->nextSibling()) { if (i->text(0) == key) { return i; } } return 0; } /**************** * TDEWalletEntryItem - ListView items to represent tdewallet entries */ TDEWalletEntryItem::TDEWalletEntryItem(TDEWallet::Wallet *w, TQListViewItem* parent, const TQString& ename) : TDEListViewItem(parent, ename), _wallet(w), _oldName(ename) { setRenameEnabled(0, true); setDragEnabled(true); } int TDEWalletEntryItem::rtti() const { return TDEWalletEntryItemClass; } TDEWalletEntryItem::~TDEWalletEntryItem() { } /**************** * TDEWalletItem - IconView items to represent wallets */ TDEWalletItem::TDEWalletItem(TQIconView *parent, const TQString& walletName) : TQIconViewItem(parent, walletName, DesktopIcon("tdewalletmanager")) { } TDEWalletItem::~TDEWalletItem() { } bool TDEWalletItem::acceptDrop(const TQMimeSource *mime) const { return mime->provides("application/x-tdewallet-folder") || mime->provides("text/uri-list"); } static bool decodeEntry(TDEWallet::Wallet *_wallet, TQDataStream& ds) { TQ_UINT32 magic; ds >> magic; if (magic != TDEWALLETENTRYMAGIC) { kdDebug() << "bad magic" << endl; return false; } TQString name; TQByteArray value; TDEWallet::Wallet::EntryType et; ds >> name; if (_wallet->hasEntry(name)) { int rc = KMessageBox::warningContinueCancel(0L, i18n("An entry by the name '%1' already exists. Would you like to continue?").arg(name)); if (rc == KMessageBox::Cancel) { return false; } } long l; ds >> l; et = TDEWallet::Wallet::EntryType(l); ds >> value; _wallet->writeEntry(name, value, et); return true; } static bool decodeFolder(TDEWallet::Wallet *_wallet, TQDataStream& ds) { TQ_UINT32 magic; ds >> magic; if (magic != TDEWALLETFOLDERMAGIC) { kdDebug() << "bad magic" << endl; return false; } TQString folder; ds >> folder; if (_wallet->hasFolder(folder)) { int rc = KMessageBox::warningYesNoCancel(0L, i18n("A folder by the name '%1' already exists. What would you like to do?").arg(folder), TQString(), KStdGuiItem::cont(), i18n("Replace")); if (rc == KMessageBox::Cancel) { return false; } if (rc == KMessageBox::No) { _wallet->removeFolder(folder); _wallet->createFolder(folder); } } else { _wallet->createFolder(folder); } _wallet->setFolder(folder); while (!ds.atEnd()) { TQString name; TQByteArray value; TDEWallet::Wallet::EntryType et; ds >> name; long l; ds >> l; et = TDEWallet::Wallet::EntryType(l); ds >> value; _wallet->writeEntry(name, value, et); } return true; } void TDEWalletItem::dropped(TQDropEvent *e, const TQValueList& lst) { Q_UNUSED(lst); if (e->provides("application/x-tdewallet-folder") || e->provides("text/uri-list")) { // FIXME: don't allow the drop if the wallet name is the same TDEWallet::Wallet *_wallet = TDEWallet::Wallet::openWallet(text()); if (!_wallet) { e->ignore(); return; } TQString saveFolder = _wallet->currentFolder(); TQFile file; TQDataStream *ds = 0L; if (e->provides("application/x-tdewallet-folder")) { TQByteArray edata = e->encodedData("application/x-tdewallet-folder"); if (!edata.isEmpty()) { ds = new TQDataStream(edata, IO_ReadOnly); } } else { // text/uri-list TQStrList urls; TQUriDrag::decode(e, urls); if (urls.isEmpty()) { e->ignore(); return; } KURL u(urls.first()); if (u.fileName().isEmpty()) { e->ignore(); return; } TQString tmpFile; if (TDEIO::NetAccess::download(u, tmpFile, 0L)) { file.setName(tmpFile); file.open(IO_ReadOnly); ds = new TQDataStream(&file); TDEIO::NetAccess::removeTempFile(tmpFile); } else { KMessageBox::error(iconView(), TDEIO::NetAccess::lastErrorString()); } } if (ds) { decodeFolder(_wallet, *ds); delete ds; } _wallet->setFolder(saveFolder); delete _wallet; //delete the folder from the source if we were moving TQt::ButtonState state = kapp->keyboardMouseState(); if (e->source() && e->source()->parent() && !strcmp(e->source()->parent()->className(), "TDEWalletEntryList") && !(state & TQt::ControlButton)) { TDEWalletEntryList *el = dynamic_cast(e->source()->parent()); if (el) { TDEWalletFolderItem *fi = dynamic_cast(el->selectedItem()); if (fi) { el->_wallet->removeFolder(fi->name()); } } } e->accept(); } else { e->ignore(); return; } } /**************** * TDEWalletEntryDrag - Stores data for wallet entry drags */ class TDEWalletEntryDrag : public TQStoredDrag { public: TDEWalletEntryDrag(TQWidget *dragSource, const char *name = 0L) : TQStoredDrag("application/x-tdewallet-entry", dragSource, name) { } virtual ~TDEWalletEntryDrag() {} }; /**************** * TDEWalletFolderDrag - Stores data for wallet folder drags */ class TDEWalletFolderDrag : public TQStoredDrag { public: TDEWalletFolderDrag(TQWidget *dragSource, const char *name = 0L) : TQStoredDrag("application/x-tdewallet-folder", dragSource, name) { } virtual ~TDEWalletFolderDrag() {} }; /**************** * TDEWalletEntryList - A listview to store wallet entries */ TDEWalletEntryList::TDEWalletEntryList(TQWidget *parent, const char *name) : TDEListView(parent, name) { addColumn(i18n("Folders")); setRootIsDecorated(true); setDefaultRenameAction(Reject); setAcceptDrops(true); setItemsMovable(false); setDropVisualizer(false); viewport()->setAcceptDrops(true); } TDEWalletEntryList::~TDEWalletEntryList() { } bool TDEWalletEntryList::acceptDrag(TQDropEvent* e) const { TQListViewItem *i = itemAt(contentsToViewport(e->pos())); if (i) { if (e->provides("application/x-tdewallet-entry") || e->provides("text/uri-list")) { return true; } } if ((e->provides("application/x-tdewallet-folder") && e->source() != viewport()) || e->provides("text/uri-list")) { return true; } return false; } //returns true if the item has been dropped successfully void TDEWalletEntryList::itemDropped(TQDropEvent *e, TQListViewItem *item) { bool ok = true; bool isEntry; TQFile file; TQDataStream *ds; TDEWalletEntryList *el = 0L; TQListViewItem *sel = 0L; //detect if we are dragging from tdewallet itself if (e->source() && e->source()->parent() && !strcmp(e->source()->parent()->className(), "TDEWalletEntryList")) { el = dynamic_cast(e->source()->parent()); if (!el) { KMessageBox::error(this, i18n("An unexpected error occurred trying to drop the item")); } else sel = el->selectedItem(); } if (e->provides("application/x-tdewallet-entry")) { //do nothing if we are in the same folder if (sel && sel->parent()->parent() == TDEWalletEntryList::getItemFolder(item)) { e->ignore(); return; } isEntry = true; TQByteArray data = e->encodedData("application/x-tdewallet-entry"); if (data.isEmpty()) { e->ignore(); return; } ds = new TQDataStream(data, IO_ReadOnly); } else if (e->provides("application/x-tdewallet-folder")) { //do nothing if we are in the same wallet if (this == el) { e->ignore(); return; } isEntry = false; TQByteArray data = e->encodedData("application/x-tdewallet-folder"); if (data.isEmpty()) { e->ignore(); return; } ds = new TQDataStream(data, IO_ReadOnly); } else if (e->provides("text/uri-list")) { TQStrList urls; TQUriDrag::decode(e, urls); if (urls.isEmpty()) { e->ignore(); return; } KURL u(urls.first()); if (u.fileName().isEmpty()) { e->ignore(); return; } TQString tmpFile; if (TDEIO::NetAccess::download(u, tmpFile, 0L)) { file.setName(tmpFile); file.open(IO_ReadOnly); ds = new TQDataStream(&file); //check magic to discover mime type TQ_UINT32 magic; (*ds) >> magic; if (magic == TDEWALLETENTRYMAGIC) { isEntry = true; } else if (magic == TDEWALLETFOLDERMAGIC) { isEntry = false; } else { kdDebug() << "bad magic" << endl; e->ignore(); return; } delete ds; //set the file back to the beginning file.reset(); ds = new TQDataStream(&file); TDEIO::NetAccess::removeTempFile(tmpFile); } else { KMessageBox::error(this, TDEIO::NetAccess::lastErrorString()); return; } } else { e->ignore(); return; } TQt::ButtonState state = kapp->keyboardMouseState(); if (isEntry) { if (!item) { e->ignore(); return; } TDEWalletFolderItem *fi = TDEWalletEntryList::getItemFolder(item); if (!fi) { KMessageBox::error(this, i18n("An unexpected error occurred trying to drop the entry")); delete(ds); e->accept(); return; } TQString saveFolder = _wallet->currentFolder(); _wallet->setFolder(fi->name()); ok = decodeEntry(_wallet, *ds); _wallet->setFolder(saveFolder); fi->refresh(); delete(ds); //delete source if we were moving, i.e., we are dragging //from tdewalletmanager and Control is not pressed if (ok && el && !(state & TQt::ControlButton) && sel) { el->_wallet->removeEntry(sel->text(0)); delete sel; } e->accept(); } else { ok = decodeFolder(_wallet, *ds); delete ds; //delete source if we were moving, i.e., we are dragging //from tdewalletmanager and Control is not pressed if (ok && el && !(state & TQt::ControlButton) && sel) { TDEWalletFolderItem *fi = dynamic_cast(sel); if (fi) { el->_wallet->removeFolder(fi->name()); delete sel; } else { KMessageBox::error(this, i18n("An unexpected error occurred trying to delete the original folder, but the folder has been copied successfully")); } } e->accept(); } } void TDEWalletEntryList::setWallet(TDEWallet::Wallet *w) { _wallet = w; } bool TDEWalletEntryList::existsFolder(const TQString& name) { for (TQListViewItem *vi = firstChild(); vi; vi = vi->nextSibling()) { TDEWalletFolderItem *fi = dynamic_cast(vi); if (!fi) { continue; } if (name == fi->name()) { return true; } } return false; } void TDEWalletEntryList::contentsDropEvent(TQDropEvent *e) { TQListViewItem *i = itemAt(contentsToViewport(e->pos())); itemDropped(e, i); } void TDEWalletEntryList::contentsDragEnterEvent(TQDragEnterEvent *e) { if (e->provides("application/x-tdewallet-entry") || e->provides("application/x-tdewallet-folder") || e->provides("application/uri-list")) { e->accept(); } else { e->ignore(); } } TDEWalletFolderItem* TDEWalletEntryList::getFolder(const TQString& name) { for (TQListViewItem *vi = firstChild(); vi; vi = vi->nextSibling()) { TDEWalletFolderItem *fi = dynamic_cast(vi); if (!fi) { continue; } if (name == fi->name()) { return fi; } } return 0; } TDEWalletFolderItem *TDEWalletEntryList::getItemFolder(TQListViewItem *item) { switch (item->rtti()) { case TDEWalletFolderItemClass: return dynamic_cast(item); case TDEWalletContainerItemClass: return dynamic_cast(item->parent()); case TDEWalletEntryItemClass: return dynamic_cast(item->parent()->parent()); } return 0; } /**************** * TDEWalletIconDrag - Stores the data for wallet drags */ class TDEWalletIconDrag : public TQIconDrag { public: TDEWalletIconDrag(TQWidget *dragSource, const char *name = 0L) : TQIconDrag(dragSource, name) { } virtual ~TDEWalletIconDrag() {} virtual const char *format(int i = 0) const { if (i == 0) { return "application/x-qiconlist"; } else if (i == 1) { return "text/uri-list"; } return 0L; } TQByteArray encodedData(const char *mime) const { TQByteArray a; TQCString mimetype(mime); if (mimetype == "application/x-qiconlist") { return TQIconDrag::encodedData(mime); } else if (mimetype == "text/uri-list") { TQCString s = _urls.join("\r\n").latin1(); if (_urls.count() > 0) { s.append("\r\n"); } a.resize(s.length() + 1); memcpy(a.data(), s.data(), s.length() + 1); } return a; } void append(const TQIconDragItem &item, const TQRect &pr, const TQRect &tr, const TQString &url) { TQIconDrag::append(item, pr, tr); _urls.append(url); } private: TQStringList _urls; }; /**************** * * TDEWalletIconView - An iconview to store wallets * */ TDEWalletIconView::TDEWalletIconView(TQWidget *parent, const char *name) : TDEIconView(parent, name) { TDEGlobal::dirs()->addResourceType("tdewallet", "share/apps/tdewallet"); connect(this, TQ_SIGNAL(dropped(TQDropEvent*, const TQValueList&)), TQ_SLOT(slotDropped(TQDropEvent*, const TQValueList&))); } TDEWalletIconView::~TDEWalletIconView() { } void TDEWalletIconView::slotDropped(TQDropEvent *e, const TQValueList& /*lst*/) { if (e->source() == viewport()) { e->ignore(); return; } if (!e->provides("text/uri-list")) { e->ignore(); return; } TQByteArray edata = e->encodedData("text/uri-list"); TQCString urls = edata.data(); TQStringList ul = TQStringList::split("\r\n", urls); if (ul.isEmpty() || ul.first().isEmpty()) { e->ignore(); return; } KURL u(ul.first()); if (u.fileName().isEmpty()) { e->ignore(); return; } TQString dest = TDEGlobal::dirs()->saveLocation("tdewallet") + u.fileName(); if (TQFile::exists(dest)) { KMessageBox::sorry(viewport(), i18n("That wallet file already exists. You cannot overwrite wallets.")); e->ignore(); return; } // FIXME: verify that it is a real wallet file first TDEIO::NetAccess::file_copy(u, KURL::fromPathOrURL(dest)); e->accept(); } void TDEWalletIconView::contentsMousePressEvent(TQMouseEvent *e) { _mousePos = e->pos(); if (!findItem(_mousePos)) { clearSelection(); } TDEIconView::contentsMousePressEvent( e ); } TQDragObject *TDEWalletIconView::dragObject() { TDEWalletIconDrag* id = new TDEWalletIconDrag(viewport(), "TDEWallet Drag"); TQString path = "file:" + TDEGlobal::dirs()->saveLocation("tdewallet"); TQPoint pos = _mousePos; for (TQIconViewItem *item = firstItem(); item; item = item->nextItem()) { if (item->isSelected()) { TQString url = path + item->text() + ".kwl"; TQIconDragItem idi; idi.setData(url.local8Bit()); id->append(idi, TQRect(item->pixmapRect(false).topLeft() - pos, item->pixmapRect(false).size()), TQRect(item->textRect(false).topLeft() - pos, item->textRect(false).size()), url); } } id->setPixmap(*currentItem()->pixmap(), pos - currentItem()->pixmapRect(false).topLeft()); return id; } TQDragObject *TDEWalletEntryList::dragObject() { TQListViewItem *i = currentItem(); TQStoredDrag *sd = 0L; if (i->rtti() == TDEWalletEntryItemClass) { TDEWalletEntryItem *ei = dynamic_cast(i); if (!ei) { return 0L; } sd = new TDEWalletEntryDrag(viewport(), "TDEWallet Entry Drag"); TQByteArray a; TQDataStream ds(a, IO_WriteOnly); ds << TDEWALLETENTRYMAGIC; ds << *ei; sd->setEncodedData(a); } else if (i->rtti() == TDEWalletFolderItemClass) { TDEWalletFolderItem *fi = dynamic_cast(i); if (!fi) { return 0L; } sd = new TDEWalletFolderDrag(viewport(), "TDEWallet Folder Drag"); TQByteArray a; TQDataStream ds(a, IO_WriteOnly); ds << TDEWALLETFOLDERMAGIC; ds << *fi; sd->setEncodedData(a); } return sd; } #include "allyourbase.moc"