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