You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdesvn/src/tdeiosvn/tdeiolistener.cpp

409 lines
15 KiB

/***************************************************************************
* Copyright (C) 2005-2007 by Rajko Albrecht *
* ral@alwins-world.de *
* *
* 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; if not, write to the *
* Free Software Foundation, Inc., *
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
***************************************************************************/
#include "tdeiolistener.h"
#include "tdeiosvn.h"
#include <kdebug.h>
#include <tdelocale.h>
#include <dcopclient.h>
namespace TDEIO {
KioListener::KioListener(TDEIO::tdeio_svnProtocol*_par)
: svn::ContextListener(),m_notifyCounter(0),m_External(false),m_HasChanges(false),m_FirstTxDelta(false),m_Canceld(false)
{
par = _par;
}
KioListener::~KioListener()
{
}
/*!
\fn KioListener::contextCancel()
*/
bool KioListener::contextCancel()
{
return par->wasKilled()||m_Canceld;
}
/*!
\fn KioListener::contextGetLogMessage (TQString & msg)
*/
bool KioListener::contextGetLogMessage (TQString & msg,const svn::CommitItemList&_items)
{
#if 1
TQByteArray reply;
TQByteArray params;
TQCString replyType;
TQDataStream stream(params,IO_WriteOnly);
if (_items.count()>0) {
TQMap<TQString,TQString> list;
for (unsigned i = 0;i<_items.count();++i) {
if (_items[i].path().isEmpty()) {
list[_items[i].url()]=TQChar(_items[i].actionType());
} else {
list[_items[i].path()]=TQChar(_items[i].actionType());
}
}
stream << list;
if (!par->dcopClient()->call("kded","tdesvnd","get_logmsg(TQMap<TQString,TQString>)",params,replyType,reply)) {
msg = "Communication with dcop failed";
kdWarning()<<msg<<endl;
return false;
}
} else {
if (!par->dcopClient()->call("kded","tdesvnd","get_logmsg()",params,replyType,reply)) {
msg = "Communication with dcop failed";
kdWarning()<<msg<<endl;
return false;
}
}
if (replyType!=TQSTRINGLIST_OBJECT_NAME_STRING) {
msg = "Wrong reply type";
kdWarning()<<msg<<endl;
return false;
}
TQDataStream stream2(reply,IO_ReadOnly);
TQStringList lt;
stream2>>lt;
if (lt.count()!=1) {
msg = "Wrong or missing log (may cancel pressed).";
kdDebug()<< msg << endl;
return false;
}
msg = lt[0];
#else
msg = "Made with a tdeio::svn client";
#endif
return true;
}
/*! the content of that method is taken from the notify in tdeio::svn in KDE SDK */
/* this moment we don't use it full 'cause not all is made via TDEIO */
void KioListener::contextNotify (const char * path,svn_wc_notify_action_t action,svn_node_kind_t kind ,const char * mime_type ,svn_wc_notify_state_t content_state, svn_wc_notify_state_t prop_state,svn_revnum_t revision)
{
if (par->wasKilled()) {
return;
}
TQString userstring;
switch(action) {
case svn_wc_notify_add:
{
if (mime_type && (svn_mime_type_is_binary (mime_type)))
userstring = i18n( "A (bin) %1" ).arg( path );
else
userstring = i18n( "A %1" ).arg( path );
break;
}
break;
case svn_wc_notify_copy: //copy
break;
case svn_wc_notify_delete: //delete
m_HasChanges = TRUE;
userstring = i18n( "D %1" ).arg( path );
break;
case svn_wc_notify_restore : //restore
userstring=i18n( "Restored %1." ).arg( path );
break;
case svn_wc_notify_revert : //revert
userstring=i18n( "Reverted %1." ).arg( path );
break;
case svn_wc_notify_failed_revert: //failed revert
userstring=i18n( "Failed to revert %1.\nTry updating instead." ).arg( path );
break;
case svn_wc_notify_resolved: //resolved
userstring=i18n( "Resolved conflicted state of %1." ).arg( path );
break;
case svn_wc_notify_skip: //skip
if ( content_state == svn_wc_notify_state_missing )
userstring=i18n("Skipped missing target %1.").arg( path );
else
userstring=i18n("Skipped %1.").arg( path );
break;
case svn_wc_notify_update_delete: //update_delete
m_HasChanges = TRUE;
userstring=i18n( "D %1" ).arg( path );
break;
case svn_wc_notify_update_add: //update_add
m_HasChanges = TRUE;
userstring=i18n( "A %1" ).arg( path );
break;
case svn_wc_notify_update_update: //update_update
{
/* If this is an inoperative dir change, do no notification.
An inoperative dir change is when a directory gets closed
without any props having been changed. */
if (! ((kind == svn_node_dir)
&& ((prop_state == svn_wc_notify_state_inapplicable)
|| (prop_state == svn_wc_notify_state_unknown)
|| (prop_state == svn_wc_notify_state_unchanged)))) {
m_HasChanges = TRUE;
if (kind == svn_node_file) {
if (content_state == svn_wc_notify_state_conflicted)
userstring = "C";
else if (content_state == svn_wc_notify_state_merged)
userstring = "G";
else if (content_state == svn_wc_notify_state_changed)
userstring = "U";
}
if (prop_state == svn_wc_notify_state_conflicted)
userstring += "C";
else if (prop_state == svn_wc_notify_state_merged)
userstring += "G";
else if (prop_state == svn_wc_notify_state_changed)
userstring += "U";
else
userstring += " ";
if (! ((content_state == svn_wc_notify_state_unchanged
|| content_state == svn_wc_notify_state_unknown)
&& (prop_state == svn_wc_notify_state_unchanged
|| prop_state == svn_wc_notify_state_unknown)))
userstring += TQString( " " ) + path;
}
break;
}
case svn_wc_notify_update_completed: //update_completed
{
if (!m_External) {
if (SVN_IS_VALID_REVNUM(revision)) {
userstring = i18n("Finished at revision %1.").arg(revision);
} else {
userstring = i18n("Finished.");
}
} else {
if (SVN_IS_VALID_REVNUM(revision)) {
userstring = i18n("Finished external at revision %1.").arg(revision);
} else {
userstring = i18n("Finished external.");
}
}
}
if (m_External)
m_External = FALSE;
break;
case svn_wc_notify_update_external: //update_external
m_External = TRUE;
userstring = i18n("Fetching external item into %1." ).arg( path );
break;
case svn_wc_notify_status_completed: //status_completed
if (SVN_IS_VALID_REVNUM (revision))
userstring = i18n( "Status against revision: %1.").arg( revision );
break;
case svn_wc_notify_status_external: //status_external
userstring = i18n("Performing status on external item at %1.").arg( path );
break;
case svn_wc_notify_commit_modified: //commit_modified
userstring = i18n( "Sending %1.").arg( path );
break;
case svn_wc_notify_commit_added: //commit_added
if (mime_type && svn_mime_type_is_binary (mime_type)) {
userstring = i18n( "Adding (bin) %1.").arg( path );
} else {
userstring = i18n( "Adding %1.").arg( path );
}
break;
case svn_wc_notify_commit_deleted: //commit_deleted
userstring = i18n( "Deleting %1.").arg( path );
break;
case svn_wc_notify_commit_replaced: //commit_replaced
userstring = i18n( "Replacing %1.").arg( path );
break;
case svn_wc_notify_commit_postfix_txdelta: //commit_postfix_txdelta
if (!m_FirstTxDelta) {
m_FirstTxDelta = TRUE;
// check fullstops!
userstring=i18n("Transmitting file data ");
} else {
userstring=".";
}
break;
break;
case svn_wc_notify_blame_revision: //blame_revision
break;
default:
break;
}
par->setMetaData(TQString::number(counter()).rightJustify( 10,'0' )+ "path" , TQString::FROMUTF8( path ));
par->setMetaData(TQString::number( counter() ).rightJustify( 10,'0' )+ "action", TQString::number( action ));
par->setMetaData(TQString::number( counter() ).rightJustify( 10,'0' )+ "kind", TQString::number( kind ));
par->setMetaData(TQString::number( counter() ).rightJustify( 10,'0' )+ "mime_t", TQString::FROMUTF8( mime_type ));
par->setMetaData(TQString::number( counter() ).rightJustify( 10,'0' )+ "content", TQString::number( content_state ));
par->setMetaData(TQString::number( counter() ).rightJustify( 10,'0' )+ "prop", TQString::number( prop_state ));
par->setMetaData(TQString::number( counter() ).rightJustify( 10,'0' )+ "rev", TQString::number( revision ));
par->setMetaData(TQString::number( counter() ).rightJustify( 10,'0' )+ "string", userstring );
incCounter();
}
void KioListener::contextNotify (const svn_wc_notify_t *action)
{
if (!action) return;
// if (action->action<svn_wc_notify_locked) {
contextNotify(action->path,action->action,action->kind,action->mime_type,
action->content_state,action->prop_state,action->revision);
// return;
// }
// TQString aString = NotifyAction(action->action);
}
svn::ContextListener::SslServerTrustAnswer
KioListener::contextSslServerTrustPrompt (const SslServerTrustData & data, apr_uint32_t & acceptedFailures)
{
TQByteArray reply;
TQByteArray params;
TQCString replyType;
TQDataStream stream(params,IO_WriteOnly);
stream << data.hostname
<< data.fingerprint
<< data.validFrom
<< data.validUntil
<< data.issuerDName
<< data.realm;
if (!par->dcopClient()->call("kded","tdesvnd",
"get_sslaccept(TQString,TQString,TQString,TQString,TQString,TQString)",
params,replyType,reply)) {
kdWarning()<<"Communication with dcop failed"<<endl;
return DONT_ACCEPT;
}
if (replyType!="int") {
kdWarning()<<"Wrong reply type"<<endl;
return DONT_ACCEPT;
}
TQDataStream stream2(reply,IO_ReadOnly);
int res;
stream2>>res;
switch (res) {
case -1:
return DONT_ACCEPT;
break;
case 1:
return ACCEPT_PERMANENTLY;
break;
default:
case 0:
return ACCEPT_TEMPORARILY;
break;
}
/* avoid compiler warnings */
return ACCEPT_TEMPORARILY;
}
bool KioListener::contextLoadSslClientCertPw(TQString&password,const TQString&realm)
{
return PwStorage::self()->getCertPw(realm,password);
}
bool KioListener::contextSslClientCertPrompt (TQString & certFile)
{
TQByteArray reply;
TQByteArray params;
TQCString replyType;
if (!par->dcopClient()->call("kded","tdesvnd",
"get_sslclientcertfile()",
params,replyType,reply)) {
kdWarning()<<"Communication with dcop failed"<<endl;
return false;
}
if (replyType!=TQSTRING_OBJECT_NAME_STRING) {
kdWarning()<<"Wrong reply type"<<endl;
return false;
}
TQDataStream stream2(reply,IO_ReadOnly);
stream2>>certFile;
if (certFile.isEmpty()) {
return false;
}
return true;
}
bool KioListener::contextSslClientCertPwPrompt (TQString & password,
const TQString & realm, bool & maySave)
{
return false;
}
bool KioListener::contextGetSavedLogin (const TQString & realm,TQString & username,TQString & password)
{
PwStorage::self()->getLogin(realm,username,password);
return true;
}
bool KioListener::contextGetCachedLogin (const TQString & realm,TQString & username,TQString & password)
{
return true;
}
bool KioListener::contextGetLogin (const TQString & realm, TQString & username, TQString & password, bool & maySave)
{
TQByteArray reply;
TQByteArray params;
TQCString replyType;
TQDataStream stream(params,IO_WriteOnly);
stream << realm;
stream << username;
if (!par->dcopClient()->call("kded","tdesvnd","get_login(TQString,TQString)",params,replyType,reply)) {
kdWarning()<<"Communication with dcop failed"<<endl;
return false;
}
if (replyType!=TQSTRINGLIST_OBJECT_NAME_STRING) {
kdWarning()<<"Wrong reply type"<<endl;
return false;
}
TQDataStream stream2(reply,IO_ReadOnly);
TQStringList lt;
stream2>>lt;
if (lt.count()!=3) {
kdDebug()<<"Wrong or missing auth list (may cancel pressed)." << endl;
return false;
}
username = lt[0];
password = lt[1];
maySave = lt[2]=="true";
return true;
}
/*!
\fn KioListener::contextProgress(long long int current, long long int max)
*/
void KioListener::contextProgress(long long int cur, long long int max)
{
if (par) {
par->contextProgress(cur,max);
}
}
} // namespace TDEIO