2012-02-07 17:28:30 +01:00
// Copyright (c) 2009-2012 The Bitcoin developers
2011-12-24 05:27:12 +01:00
// Distributed under the MIT/X11 software license, see the accompanying
// file license.txt or http://www.opensource.org/licenses/mit-license.php.
# include <boost/algorithm/string.hpp>
# include <boost/interprocess/ipc/message_queue.hpp>
# include <boost/tokenizer.hpp>
# include <boost/date_time/posix_time/posix_time.hpp>
2012-03-25 22:17:39 +02:00
# include <boost/version.hpp>
# if defined(WIN32) && (!defined(BOOST_INTERPROCESS_HAS_WINDOWS_KERNEL_BOOTTIME) || !defined(BOOST_INTERPROCESS_HAS_KERNEL_BOOTTIME) || BOOST_VERSION < 104900)
# warning Compiling without BOOST_INTERPROCESS_HAS_WINDOWS_KERNEL_BOOTTIME and BOOST_INTERPROCESS_HAS_KERNEL_BOOTTIME uncommented in boost / interprocess / detail / tmp_dir_helpers.hpp or using a boost version before 1.49 may have unintended results see svn.boost.org / trac / boost / ticket / 5392
# endif
2011-12-24 05:27:12 +01:00
2012-04-16 14:56:45 +02:00
# include "ui_interface.h"
2012-03-25 23:25:10 +02:00
# include "qtipcserver.h"
2011-12-24 05:27:12 +01:00
using namespace boost : : interprocess ;
using namespace boost : : posix_time ;
using namespace boost ;
using namespace std ;
void ipcShutdown ( )
{
2012-03-25 23:25:10 +02:00
message_queue : : remove ( BITCOINURI_QUEUE_NAME ) ;
2011-12-24 05:27:12 +01:00
}
void ipcThread ( void * parg )
{
message_queue * mq = ( message_queue * ) parg ;
char strBuf [ 257 ] ;
size_t nSize ;
unsigned int nPriority ;
loop
{
ptime d = boost : : posix_time : : microsec_clock : : universal_time ( ) + millisec ( 100 ) ;
if ( mq - > timed_receive ( & strBuf , sizeof ( strBuf ) , nSize , nPriority , d ) )
{
2012-05-06 19:40:58 +02:00
uiInterface . ThreadSafeHandleURI ( std : : string ( strBuf , nSize ) ) ;
2011-12-24 05:27:12 +01:00
Sleep ( 1000 ) ;
}
if ( fShutdown )
{
ipcShutdown ( ) ;
break ;
}
}
ipcShutdown ( ) ;
}
void ipcInit ( )
{
2012-02-27 22:08:08 +01:00
# ifdef MAC_OSX
// TODO: implement bitcoin: URI handling the Mac Way
return ;
# endif
2011-12-24 05:27:12 +01:00
message_queue * mq ;
char strBuf [ 257 ] ;
size_t nSize ;
unsigned int nPriority ;
try {
2012-03-25 23:25:10 +02:00
mq = new message_queue ( open_or_create , BITCOINURI_QUEUE_NAME , 2 , 256 ) ;
2011-12-24 05:27:12 +01:00
// Make sure we don't lose any bitcoin: URIs
for ( int i = 0 ; i < 2 ; i + + )
{
ptime d = boost : : posix_time : : microsec_clock : : universal_time ( ) + millisec ( 1 ) ;
if ( mq - > timed_receive ( & strBuf , sizeof ( strBuf ) , nSize , nPriority , d ) )
{
2012-05-06 19:40:58 +02:00
uiInterface . ThreadSafeHandleURI ( std : : string ( strBuf , nSize ) ) ;
2011-12-24 05:27:12 +01:00
}
else
break ;
}
// Make sure only one bitcoin instance is listening
2012-03-25 23:25:10 +02:00
message_queue : : remove ( BITCOINURI_QUEUE_NAME ) ;
mq = new message_queue ( open_or_create , BITCOINURI_QUEUE_NAME , 2 , 256 ) ;
2011-12-24 05:27:12 +01:00
}
catch ( interprocess_exception & ex ) {
return ;
}
if ( ! CreateThread ( ipcThread , mq ) )
{
delete mq ;
}
}