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.
tdenetwork/kopete/protocols/sms/services/smssendprovider.cpp

289 lines
8.0 KiB

/* *************************************************************************
* copyright: (C) 2003 Richard Lärkäng <nouseforaname@home.se> *
* copyright: (C) 2003 Gav Wood <gav@kde.org> *
*************************************************************************
*/
/* *************************************************************************
* *
* 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. *
* *
*************************************************************************
*/
#include <tqvaluelist.h>
#include <tqlabel.h>
#include <tqfile.h>
#include <kconfigbase.h>
#include <kprocess.h>
#include <klineedit.h>
#include <kmessagebox.h>
#include <kdebug.h>
#include <klocale.h>
#include "kopeteaccount.h"
#include "kopeteuiglobal.h"
#include "smssendprovider.h"
#include "smsprotocol.h"
#include "smscontact.h"
SMSSendProvider::SMSSendProvider(const TQString& providerName, const TQString& prefixValue, Kopete::Account* account, TQObject* parent, const char *name)
: TQObject( parent, name ), m_account(account)
{
kdWarning( 14160 ) << k_funcinfo << "this = " << this << ", m_account = " << m_account << " (should be ok if zero!!)" << endl;
provider = providerName;
prefix = prefixValue;
m_maxSize = 160;
messagePos = -1;
telPos = -1;
TQString file = prefix + "/share/smssend/" + provider + ".sms";
TQFile f(file);
if (f.open(IO_ReadOnly))
{
TQTextStream t(&f);
TQString group = TQString("SMSSend-%1").tqarg(provider);
bool exactNumberMatch = false;
TQStringList numberWords;
numberWords.append("Tel");
numberWords.append("Number");
numberWords.append("number");
numberWords.append("TelNum");
numberWords.append("Recipient");
numberWords.append("Tel1");
numberWords.append("To");
numberWords.append("nummer");
numberWords.append("telefone");
numberWords.append("ToPhone");
while( !t.eof())
{
TQString s = t.readLine();
if( s[0] == '%')
{
TQStringList args = TQStringList::split(':',s);
TQStringList options = TQStringList::split(' ', args[0]);
names.append(options[0].replace(0,1,""));
bool hidden = false;
for(unsigned i = 1; i < options.count(); i++)
if(options[i] == "Hidden")
{ hidden = true;
break;
}
isHiddens.append(hidden);
// Strip trailing whitespace in the end
// and '%' in the beginning
args[0] = args[0].simplifyWhiteSpace().mid(1);
descriptions.append(args[1]);
if (m_account)
values.append(m_account->configGroup()->readEntry(TQString("%1:%2").tqarg(group).tqarg(names[names.count()-1]),
TQString()));
else
values.append("");
if( args[0].contains("Message") || args[0].contains("message")
|| args[0].contains("message") || args[0].contains("nachricht")
|| args[0].contains("Msg") || args[0].contains("Mensagem") )
{
for( unsigned i = 0; i < options.count(); i++)
{
if (options[i].contains("Size="))
{
TQString option = options[i];
option.replace(0,5,"");
m_maxSize = option.toInt();
}
}
messagePos = names.count()-1;
}
else if (!exactNumberMatch)
{
for (TQStringList::Iterator it=numberWords.begin(); it != numberWords.end(); ++it)
{
if (args[0].contains(*it))
{
telPos = names.count() - 1;
if (args[0] == *it)
{
// kdDebug(14160) << "Exact match for " << args[0] << endl;
exactNumberMatch = true;
}
// kdDebug(14160) << "args[0] (" << args[0] << ") contains " << *it << endl;
}
}
}
}
}
}
f.close();
if ( messagePos == -1 || telPos == -1 )
{
canSend = false;
return;
}
canSend = true;
}
SMSSendProvider::~SMSSendProvider()
{
kdWarning( 14160 ) << k_funcinfo << "this = " << this << endl;
}
void SMSSendProvider::setAccount(Kopete::Account *account)
{
m_account = account;
}
const TQString& SMSSendProvider::name(int i)
{
if ( telPos == i || messagePos == i)
return TQString();
else
return names[i];
}
const TQString& SMSSendProvider::value(int i)
{
return values[i];
}
const TQString& SMSSendProvider::description(int i)
{
return descriptions[i];
}
const bool SMSSendProvider::isHidden(int i)
{
return isHiddens[i];
}
void SMSSendProvider::save(TQPtrList<KLineEdit>& args)
{
kdDebug( 14160 ) << k_funcinfo << "m_account = " << m_account << " (should be non-zero!!)" << endl;
if (!m_account) return; // prevent crash in worst case
TQString group = TQString("SMSSend-%1").tqarg(provider);
int namesI=0;
for (unsigned i=0; i < args.count(); i++)
{
if (telPos == namesI || messagePos == namesI)
{
// kdDebug(14160) << k_funcinfo << "Skipping pos " << namesI << endl;
namesI++;
if (telPos == namesI || messagePos == namesI)
{
// kdDebug(14160) << k_funcinfo << "Skipping pos " << namesI << endl;
namesI++;
}
}
// kdDebug(14160) << k_funcinfo << "saving " << args.at(i) << " to " << names[namesI] << endl;
if (!args.at(i)->text().isEmpty())
{ values[namesI] = args.at(i)->text();
m_account->configGroup()->writeEntry(TQString("%1:%2").tqarg(group).tqarg(names[namesI]), values[namesI]);
}
namesI++;
}
}
int SMSSendProvider::count()
{
return names.count();
}
void SMSSendProvider::send(const Kopete::Message& msg)
{
if ( canSend == false )
{
if ( messagePos == -1 )
{
canSend = false;
KMessageBox::error(Kopete::UI::Global::mainWidget(), i18n("Could not determine which argument which should contain the message."),
i18n("Could Not Send Message"));
return;
}
if ( telPos == -1 )
{
canSend = false;
KMessageBox::error(Kopete::UI::Global::mainWidget(), i18n("Could not determine which argument which should contain the number."),
i18n("Could Not Send Message"));
return;
}
}
m_msg = msg;
TQString message = msg.plainBody();
TQString nr = dynamic_cast<SMSContact *>(msg.to().first())->qualifiedNumber();
if (canSend = false)
return;
values[messagePos] = message;
values[telPos] = nr;
KProcess* p = new KProcess;
kdWarning( 14160 ) << "Executing " << TQString("%1/bin/smssend").tqarg(prefix) << " \"" << provider << "\" " << values.join("\" \"") << "\"" << endl;
*p << TQString("%1/bin/smssend").tqarg(prefix) << provider << values;
output = "";
connect( p, TQT_SIGNAL(processExited(KProcess *)), this, TQT_SLOT(slotSendFinished(KProcess *)));
connect( p, TQT_SIGNAL(receivedStdout(KProcess *, char *, int)), this, TQT_SLOT(slotReceivedOutput(KProcess *, char *, int)));
// connect( p, TQT_SIGNAL(receivedStderr(KProcess *, char *, int)), this, TQT_SLOT(slotReceivedOutput(KProcess *, char *, int)));
p->start(KProcess::NotifyOnExit, KProcess::AllOutput);
}
void SMSSendProvider::slotSendFinished(KProcess *p)
{
kdWarning( 14160 ) << k_funcinfo << "this = " << this << ", es = " << p->exitStatus() << ", p = " << p << " (should be non-zero!!)" << endl;
if (p->exitStatus() == 0)
emit messageSent(m_msg);
else
emit messageNotSent(m_msg, TQString().setLatin1(output));
p->deleteLater();
}
void SMSSendProvider::slotReceivedOutput(KProcess *, char *buffer, int buflen)
{
// TQStringList lines = TQStringList::split("\n", TQString::fromLocal8Bit(buffer, buflen));
// for (TQStringList::Iterator it = lines.begin(); it != lines.end(); ++it)
for(int i = 0; i < buflen; i++)
output += buffer[i];
kdWarning( 14160 ) << k_funcinfo << " output now = " << output << endl;
}
int SMSSendProvider::maxSize()
{
return m_maxSize;
}
#include "smssendprovider.moc"
/*
* Local variables:
* c-indentation-style: k&r
* c-basic-offset: 8
* indent-tabs-mode: t
* End:
*/
// vim: set noet ts=4 sts=4 sw=4: