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.
184 lines
5.1 KiB
184 lines
5.1 KiB
/*
|
|
msninvitation.cpp
|
|
|
|
Copyright (c) 2003 by Olivier Goffart <ogoffart @ 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 "netmeetinginvitation.h"
|
|
|
|
#include "kopeteuiglobal.h"
|
|
|
|
#include "msnchatsession.h"
|
|
#include "msnswitchboardsocket.h"
|
|
#include "msncontact.h"
|
|
#include "kopetemetacontact.h"
|
|
|
|
#include <klocale.h>
|
|
#include <kmessagebox.h>
|
|
#include <kdebug.h>
|
|
#include <kconfig.h>
|
|
#include <kglobal.h>
|
|
|
|
|
|
#include <tqtimer.h>
|
|
#include <kprocess.h>
|
|
|
|
NetMeetingInvitation::NetMeetingInvitation(bool incoming, MSNContact *c, TQObject *parent)
|
|
: TQObject(parent) , MSNInvitation( incoming, NetMeetingInvitation::applicationID() , i18n("NetMeeting") )
|
|
{
|
|
m_contact=c;
|
|
oki=false;
|
|
}
|
|
|
|
|
|
NetMeetingInvitation::~NetMeetingInvitation()
|
|
{
|
|
}
|
|
|
|
|
|
TQString NetMeetingInvitation::invitationHead()
|
|
{
|
|
TQTimer::singleShot( 10*60000, this, TQT_SLOT( slotTimeout() ) ); //send TIMEOUT in 10 minute if the invitation has not been accepted/refused
|
|
return TQString( MSNInvitation::invitationHead()+
|
|
"Session-Protocol: SM1\r\n"
|
|
"Session-ID: {6672F94C-45BF-11D7-B4AE-00010A1008DF}\r\n" //FIXME i don't know what is the session id
|
|
"\r\n").utf8();
|
|
}
|
|
|
|
void NetMeetingInvitation::parseInvitation(const TQString& msg)
|
|
{
|
|
TQRegExp rx("Invitation-Command: ([A-Z]*)");
|
|
rx.search(msg);
|
|
TQString command=rx.cap(1);
|
|
if( msg.contains("Invitation-Command: INVITE") )
|
|
{
|
|
MSNInvitation::parseInvitation(msg); //for the cookie
|
|
|
|
unsigned int result = KMessageBox::questionYesNo( Kopete::UI::Global::mainWidget(),
|
|
i18n("%1 wants to start a chat with NetMeeting; do you want to accept it? " ).tqarg(m_contact->metaContact()->displayName()),
|
|
i18n("MSN Plugin") , i18n("Accept"),i18n("Refuse"));
|
|
|
|
MSNChatSession* manager=dynamic_cast<MSNChatSession*>(m_contact->manager());
|
|
|
|
if(manager && manager->service())
|
|
{
|
|
if(result==3) // Yes == 3
|
|
{
|
|
TQCString message=TQString(
|
|
"MIME-Version: 1.0\r\n"
|
|
"Content-Type: text/x-msmsgsinvite; charset=UTF-8\r\n"
|
|
"\r\n"
|
|
"Invitation-Command: ACCEPT\r\n"
|
|
"Invitation-Cookie: " + TQString::number(cookie()) + "\r\n"
|
|
"Session-ID: {6672F94C-45BF-11D7-B4AE-00010A1008DF}\r\n" //FIXME
|
|
"Session-Protocol: SM1\r\n"
|
|
"Launch-Application: TRUE\r\n"
|
|
"Request-Data: IP-Address:\r\n"
|
|
"IP-Address: " + manager->service()->getLocalIP()+ "\r\n"
|
|
"\r\n" ).utf8();
|
|
|
|
|
|
manager->service()->sendCommand( "MSG" , "N", true, message );
|
|
oki=false;
|
|
TQTimer::singleShot( 10* 60000, this, TQT_SLOT( slotTimeout() ) ); //TIMOUT afte 10 min
|
|
}
|
|
else //No
|
|
{
|
|
manager->service()->sendCommand( "MSG" , "N", true, rejectMessage() );
|
|
emit done(this);
|
|
}
|
|
}
|
|
}
|
|
else if( msg.contains("Invitation-Command: ACCEPT") )
|
|
{
|
|
if( ! incoming() )
|
|
{
|
|
MSNChatSession* manager=dynamic_cast<MSNChatSession*>(m_contact->manager());
|
|
if(manager && manager->service())
|
|
{
|
|
TQCString message=TQString(
|
|
"MIME-Version: 1.0\r\n"
|
|
"Content-Type: text/x-msmsgsinvite; charset=UTF-8\r\n"
|
|
"\r\n"
|
|
"Invitation-Command: ACCEPT\r\n"
|
|
"Invitation-Cookie: " + TQString::number(cookie()) + "\r\n"
|
|
"Session-ID: {6672F94C-45BF-11D7-B4AE-00010A1008DF}\r\n" //FIXME: what is session id?
|
|
"Session-Protocol: SM1\r\n"
|
|
"Launch-Application: TRUE\r\n"
|
|
"Request-Data: IP-Address:\r\n"
|
|
"IP-Address: " + manager->service()->getLocalIP() + "\r\n"
|
|
"\r\n" ).utf8();
|
|
manager->service()->sendCommand( "MSG" , "N", true, message );
|
|
}
|
|
rx=TQRegExp("IP-Address: ([0-9\\:\\.]*)");
|
|
rx.search(msg);
|
|
TQString ip_address = rx.cap(1);
|
|
startMeeting(ip_address);
|
|
kdDebug() << k_funcinfo << ip_address << endl;
|
|
}
|
|
else
|
|
{
|
|
rx=TQRegExp("IP-Address: ([0-9\\:\\.]*)");
|
|
rx.search(msg);
|
|
TQString ip_address = rx.cap(1);
|
|
|
|
startMeeting(ip_address);
|
|
}
|
|
}
|
|
else //CANCEL
|
|
{
|
|
emit done(this);
|
|
}
|
|
}
|
|
|
|
void NetMeetingInvitation::slotTimeout()
|
|
{
|
|
if(oki)
|
|
return;
|
|
|
|
MSNChatSession* manager=dynamic_cast<MSNChatSession*>(m_contact->manager());
|
|
|
|
if(manager && manager->service())
|
|
{
|
|
manager->service()->sendCommand( "MSG" , "N", true, rejectMessage("TIMEOUT") );
|
|
}
|
|
emit done(this);
|
|
|
|
}
|
|
|
|
|
|
void NetMeetingInvitation::startMeeting(const TQString & ip_address)
|
|
{
|
|
//TODO: use KProcess
|
|
|
|
KConfig *config=KGlobal::config();
|
|
config->setGroup("Netmeeting Plugin");
|
|
TQString app=config->readEntry("NetmeetingApplication","ekiga -c callto://%1").tqarg(ip_address);
|
|
|
|
kdDebug() << k_funcinfo << app << endl ;
|
|
|
|
TQStringList args=TQStringList::split(" ", app);
|
|
|
|
KProcess p;
|
|
for(TQStringList::Iterator it=args.begin() ; it != args.end() ; ++it)
|
|
{
|
|
p << *it;
|
|
}
|
|
p.start();
|
|
}
|
|
|
|
#include "netmeetinginvitation.moc"
|
|
|
|
|
|
|
|
|