[jdev] File transfer not working using GLOOX
Kalpana Anbalagan
kalpanaanbalagann at gmail.com
Wed Dec 24 09:19:29 UTC 2014
Hi,
I m using GLOOX example code to do file transfer..(ft_send.cpp file)
I have a eJabberd server in my machine (binding to localhost : 5222) and a
Jabber Messenger.
I m running my code in windows platform using the example code given in
ft_send.cpp..
I m not able to transfer the file.
Please let me know what I m doing wrong here..And also wanted to know when
handleFTBytestream() API will get called..
Thanks in advance for your help.
see below my code//
#include "client.h"
#include "connectionlistener.h"
#include "stanza.h"
#include "gloox.h"
#include "disco.h"
#include "loghandler.h"
#include "logsink.h"
#include "siprofileft.h"
#include "siprofilefthandler.h"
#include "bytestreamdatahandler.h"
#include "socks5bytestreamserver.h"
using namespace gloox;
#include <sys/types.h>
#include <sys/stat.h>
//#include <unistd.h>
#include <stdio.h>
#include <string>
#include <fstream>
#include <ios>
#include <time.h>
#include <cstdio> // [s]print[f]
#if defined( WIN32 ) || defined( _WIN32 )
# include <windows.h>
#endif
/**
* Usage:
* ft_send jid at server/full /path/to/file
*
* Sends the given file to the given full JID.
*/
class FTTest : public LogHandler, ConnectionListener, SIProfileFTHandler,
BytestreamDataHandler
{
public:
FTTest( const JID& to, const std::string& file ) : m_bs( 0 ), m_to( to
), m_file( file ), m_quit( false ) {}
virtual ~FTTest() {}
void start()
{
struct stat f_stat;
if( stat( m_file.c_str(), &f_stat ) )
return;
m_size = f_stat.st_size;
std::ifstream ifile( m_file.c_str(), std::ios_base::in |
std::ios_base::binary );
if( !ifile )
return;
JID jid( "kalpana at 127.0.0.1/Jabber Messenger" );
j = new Client( jid, "kalpana" );
j->registerConnectionListener( this );
j->disco()->setVersion( "ftsend", GLOOX_VERSION, "Linux" );
j->disco()->setIdentity( "client", "bot" );
StringList ca;
ca.push_back( "/path/to/cacert.crt" );
j->setCACerts( ca );
j->logInstance().registerLogHandler( LogLevelDebug, LogAreaAll, this
);
m_server = new SOCKS5BytestreamServer( j->logInstance(), 7777 );
printf( "about to listen\n" );
ConnectionError le = ConnNoError;
if( ( le = m_server->listen() ) != ConnNoError )
printf( "listen returned: %d\n", le );
printf( "listening\n" );
f = new SIProfileFT( j, this );
f->registerSOCKS5BytestreamServer( m_server );
f->addStreamHost( j->jid(),"localhost", 7777);
// you should obtain this using disco, really:
f->addStreamHost( JID( "reflector.amessage.eu" ), "
reflector.amessage.eu", 6565 );
// f->addStreamHost( JID( "proxy.jabber.org" ), "208.245.212.98",
7777 );
if( j->connect( false ) )
{
char input[200024];
ConnectionError ce = ConnNoError;
ConnectionError se = ConnNoError;
while( ce == ConnNoError )
{
if( m_quit )
j->disconnect();
ce = j->recv( 1 );
if( m_server )
{
se = m_server->recv( 1 );
if( se != ConnNoError )
{
printf( "SOCKS5BytestreamServer returned: %d\n", se );
delete m_server;
m_server = 0;
m_quit = true;
}
}
if(!ifile.eof() )
{
if( m_bs )
{
if( m_bs->isOpen() )
{
ifile.read( input, 200024 );
std::string t( input, ifile.gcount() );
if( !m_bs->send( t ) )
m_quit = true;
}
m_bs->recv( 1 );
}
}
else if( m_bs )
m_bs->close();
}
printf( "ce: %d\n", ce );
}
f->dispose( m_bs );
delete f;
delete m_server;
delete j;
}
virtual void onConnect()
{
printf( "connected!!!\n" );
f->requestFT( m_to, m_file, m_size);
// f->requestFT( m_to, m_file, m_size );
}
virtual void onDisconnect( ConnectionError e )
{
printf( "ft_send: disconnected: %d\n", e );
if( e == ConnAuthenticationFailed )
printf( "auth failed. reason: %d\n", j->authError() );
}
virtual bool onTLSConnect( const CertInfo& info )
{
time_t from( info.date_from );
time_t to( info.date_to );
printf( "status: %d\nissuer: %s\npeer: %s\nprotocol: %s\nmac:
%s\ncipher: %s\ncompression: %s\n"
"from: %s\nto: %s\n",
info.status, info.issuer.c_str(), info.server.c_str(),
info.protocol.c_str(), info.mac.c_str(), info.cipher.c_str(),
info.compression.c_str(), ctime( &from ), ctime( &to ) );
return true;
}
virtual void handleLog( LogLevel level, LogArea area, const
std::string& message )
{
printf("log: level: %d, area: %d, %s\n", level, area, message.c_str()
);
}
virtual void handleFTRequest( const JID& from, const JID& /*to*/, const
std::string& sid,
const std::string& name, long size, const
std::string& hash,
const std::string& date, const
std::string& mimetype,
const std::string& desc, int /*stypes*/ )
{
printf( "received ft request from %s: %s (%ld bytes, sid: %s). hash:
%s, date: %s, mime-type: %s\n"
"desc: %s\n",
from.full().c_str(), name.c_str(), size, sid.c_str(),
hash.c_str(), date.c_str(),
mimetype.c_str(), desc.c_str() );
f->acceptFT( from, sid, SIProfileFT::FTTypeS5B );
}
// virtual void handleFTRequestResult( const JID& /*from*/, const
std::string& /*sid*/ )
// {
// }
virtual void handleFTRequestError( const IQ& /*iq*/, const std::string&
/*sid*/ )
{
printf( "ft request error\n" );
m_quit = true;
}
virtual void handleFTBytestream( Bytestream* bs )
{
printf( "received bytestream of type: %s", bs->type() ==
Bytestream::S5B ? "s5b" : "ibb" );
m_bs = bs;
m_bs->registerBytestreamDataHandler( this );
if( m_bs->connect() )
{
if( bs->type() == Bytestream::S5B )
printf( "ok! s5b connected to streamhost\n" );
else
printf( "ok! ibb sent request to remote entity\n" );
}
}
virtual const std::string handleOOBRequestResult( const JID& /*from*/,
const JID& /*to*/, const std::string& /*sid*/ )
{
return std::string();
};
virtual void handleBytestreamData( Bytestream* /*bs*/, const
std::string& data )
{
printf( "received %d bytes of data:\n%s\n", data.length(),
data.c_str() );
}
virtual void handleBytestreamError( Bytestream* /*bs*/, const IQ&
/*iq*/ )
{
printf( "bytestream error\n" );
}
virtual void handleBytestreamOpen( Bytestream* /*bs*/ )
{
printf( "bytestream opened\n" );
}
virtual void handleBytestreamClose( Bytestream* /*bs*/ )
{
printf( "bytestream closed\n" );
m_quit = true;
}
private:
Client *j;
SIProfileFT* f;
Bytestream* m_bs;
SOCKS5BytestreamServer* m_server;
JID m_to;
std::string m_file;
bool m_quit;
int m_size;
};
int main( int argc, char** argv )
{
// if( argc == 3 )
{
JID j( "best at 127.0.0.1/Jabber Messenger" );
if( j.resource().empty() )
{
printf( "error: need full jid\n" );
return 1;
}
FTTest *r = new FTTest( j, "c:\\read.xml" );
r->start();
delete( r );
}
// else
{
printf( "error: need jid + file\n" );
}
return 0;
}
Thanks,
kalpana
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://www.jabber.org/jdev/attachments/20141224/f5831b4a/attachment.html>
More information about the JDev
mailing list