2007-12-11 20:43:17 -05:00
/*
* libretroshare / src / services chatservice . h
*
* Services for RetroShare .
*
* Copyright 2004 - 2008 by Robert Fernie .
*
* This library is free software ; you can redistribute it and / or
* modify it under the terms of the GNU Library General Public
* License Version 2 as published by the Free Software Foundation .
*
* This library is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the GNU
* Library General Public License for more details .
*
* You should have received a copy of the GNU Library General Public
* License along with this library ; if not , write to the Free Software
* Foundation , Inc . , 59 Temple Place , Suite 330 , Boston , MA 02111 - 1307
* USA .
*
* Please report all bugs and problems to " retroshare@lunamutt.com " .
*
*/
# ifndef SERVICE_CHAT_HEADER
# define SERVICE_CHAT_HEADER
# include <list>
# include <string>
2012-01-06 17:17:08 -05:00
# include <vector>
2007-12-11 20:43:17 -05:00
# include "serialiser/rsmsgitems.h"
# include "services/p3service.h"
2013-04-08 17:25:32 -04:00
# include "pgp/pgphandler.h"
# include "turtle/turtleclientservice.h"
2010-08-31 13:13:52 -04:00
# include "retroshare/rsmsgs.h"
2010-04-24 07:27:25 -04:00
2011-07-09 14:39:34 -04:00
class p3LinkMgr ;
2011-09-29 05:20:09 -04:00
class p3HistoryMgr ;
2013-04-08 17:25:32 -04:00
class p3turtle ;
2011-07-09 14:39:34 -04:00
2014-03-17 16:56:06 -04:00
typedef RsPeerId ChatLobbyVirtualPeerId ;
2010-04-24 07:27:25 -04:00
//!The basic Chat service.
/**
*
* Can be used to send and receive chats , immediate status ( using notify ) , avatars , and custom status
* This service uses rsnotify ( callbacks librs clients ( e . g . rs - gui ) )
* @ see NotifyBase
*/
2013-04-08 17:25:32 -04:00
class p3ChatService : public p3Service , public p3Config , public pqiMonitor , public RsTurtleClientService
2007-12-11 20:43:17 -05:00
{
public :
2011-09-29 05:20:09 -04:00
p3ChatService ( p3LinkMgr * cm , p3HistoryMgr * historyMgr ) ;
2009-01-30 14:52:47 -05:00
2014-03-21 23:53:44 -04:00
virtual RsServiceInfo getServiceInfo ( ) ;
2010-09-20 20:08:06 -04:00
/***** overloaded from p3Service *****/
2010-08-31 13:13:52 -04:00
/*!
* This retrieves all chat msg items and also ( important ! )
* processes chat - status items that are in service item queue . chat msg item requests are also processed and not returned
* ( important ! also ) notifications sent to notify base on receipt avatar , immediate status and custom status
* : notifyCustomState , notifyChatStatus , notifyPeerHasNewAvatar
* @ see NotifyBase
*/
2009-01-30 14:52:47 -05:00
virtual int tick ( ) ;
virtual int status ( ) ;
2010-09-20 20:08:06 -04:00
/*************** pqiMonitor callback ***********************/
virtual void statusChange ( const std : : list < pqipeer > & plist ) ;
2010-04-24 07:27:25 -04:00
/*!
* public chat sent to all peers
*/
2013-10-03 17:41:34 -04:00
int sendPublicChat ( const std : : string & msg ) ;
2010-04-24 07:27:25 -04:00
2010-09-20 20:08:06 -04:00
/********* RsMsgs ***********/
2010-04-24 07:27:25 -04:00
/*!
* chat is sent to specifc peer
2010-09-01 13:56:15 -04:00
* @ param id peer to send chat msg to
2010-04-24 07:27:25 -04:00
*/
2014-03-17 16:56:06 -04:00
bool sendPrivateChat ( const RsPeerId & id , const std : : string & msg ) ;
2010-04-24 07:27:25 -04:00
/*!
2010-04-27 07:53:46 -04:00
* can be used to send ' immediate ' status msgs , these status updates are meant for immediate use by peer ( not saved by rs )
2010-04-24 07:27:25 -04:00
* e . g currently used to update user when a peer ' is typing ' during a chat
*/
2014-03-17 16:56:06 -04:00
void sendStatusString ( const RsPeerId & peer_id , const std : : string & status_str ) ;
2010-04-24 07:27:25 -04:00
/*!
* send to all peers online
* @ see sendStatusString ( )
*/
2009-09-29 16:37:20 -04:00
void sendGroupChatStatusString ( const std : : string & status_str ) ;
2009-10-04 18:27:42 -04:00
2010-04-24 07:27:25 -04:00
/*!
2010-04-27 07:53:46 -04:00
* this retrieves custom status for a peers , generate a requests to the peer
2010-04-24 07:27:25 -04:00
* @ param peer_id the id of the peer you want status string for
*/
2014-03-17 16:56:06 -04:00
std : : string getCustomStateString ( const RsPeerId & peer_id ) ;
2010-04-24 07:27:25 -04:00
/*!
* sets the client ' s custom status , generates ' status available ' item sent to all online peers
*/
2009-10-04 18:27:42 -04:00
void setOwnCustomStateString ( const std : : string & ) ;
2010-04-24 07:27:25 -04:00
/*!
* @ return client ' s custom string
*/
2009-10-04 18:27:42 -04:00
std : : string getOwnCustomStateString ( ) ;
2007-12-11 20:43:17 -05:00
2010-04-15 06:47:48 -04:00
/*! gets the peer's avatar in jpeg format, if available. Null otherwise. Also asks the peer to send
* its avatar , if not already available . Creates a new unsigned char array . It ' s the caller ' s
* responsibility to delete this ones used .
*/
2014-03-17 16:56:06 -04:00
void getAvatarJpegData ( const RsPeerId & peer_id , unsigned char * & data , int & size ) ;
2007-12-11 20:43:17 -05:00
2010-04-15 06:47:48 -04:00
/*!
* Sets the avatar data and size for client ' s account
* @ param data is copied , so should be destroyed by the caller
*/
2009-01-30 14:52:47 -05:00
void setOwnAvatarJpegData ( const unsigned char * data , int size ) ;
2010-04-15 06:47:48 -04:00
/*!
* Gets the avatar data for clients account
2010-04-27 07:53:46 -04:00
* data is in jpeg format
2010-04-15 06:47:48 -04:00
*/
2009-01-30 14:52:47 -05:00
void getOwnAvatarJpegData ( unsigned char * & data , int & size ) ;
2007-12-11 20:43:17 -05:00
2010-04-24 07:27:25 -04:00
/*!
2010-09-20 20:08:06 -04:00
* returns the count of messages in public queue
2010-09-01 13:56:15 -04:00
* @ param public or private queue
2010-04-24 07:27:25 -04:00
*/
2010-09-20 20:08:06 -04:00
int getPublicChatQueueCount ( ) ;
2010-09-01 13:56:15 -04:00
/*!
* This retrieves all public chat msg items
*/
bool getPublicChatQueue ( std : : list < ChatInfo > & chats ) ;
2010-09-20 20:08:06 -04:00
/*!
* returns the count of messages in private queue
* @ param public or private queue
*/
int getPrivateChatQueueCount ( bool incoming ) ;
2010-09-01 13:56:15 -04:00
/*!
* @ param id ' s of available private chat messages
*/
2014-03-17 16:56:06 -04:00
bool getPrivateChatQueueIds ( bool incoming , std : : list < RsPeerId > & ids ) ;
2010-09-01 13:56:15 -04:00
/*!
* This retrieves all private chat msg items for peer
*/
2014-03-17 16:56:06 -04:00
bool getPrivateChatQueue ( bool incoming , const RsPeerId & id , std : : list < ChatInfo > & chats ) ;
2010-09-20 20:08:06 -04:00
2013-08-08 05:55:19 -04:00
/*!
* Checks message security , especially remove billion laughs attacks
*/
static bool checkForMessageSecurity ( RsChatMsgItem * ) ;
2010-09-20 20:08:06 -04:00
/*!
* @ param clear private chat queue
*/
2014-03-17 16:56:06 -04:00
bool clearPrivateChatQueue ( bool incoming , const RsPeerId & id ) ;
2008-01-25 02:49:28 -05:00
2014-03-17 16:56:06 -04:00
bool getVirtualPeerId ( const ChatLobbyId & lobby_id , RsPeerId & virtual_peer_id ) ;
bool isLobbyId ( const RsPeerId & virtual_peer_id , ChatLobbyId & lobby_id ) ;
2013-12-27 15:21:44 -05:00
void getChatLobbyList ( std : : list < ChatLobbyInfo , std : : allocator < ChatLobbyInfo > > & cl_infos ) ;
2011-11-28 17:36:13 -05:00
bool acceptLobbyInvite ( const ChatLobbyId & id ) ;
void denyLobbyInvite ( const ChatLobbyId & id ) ;
void getPendingChatLobbyInvites ( std : : list < ChatLobbyInvite > & invites ) ;
2014-03-17 16:56:06 -04:00
void invitePeerToLobby ( const ChatLobbyId & , const RsPeerId & peer_id , bool connexion_challenge = false ) ;
2011-11-27 16:04:10 -05:00
void unsubscribeChatLobby ( const ChatLobbyId & lobby_id ) ;
2011-12-26 17:43:54 -05:00
bool setNickNameForChatLobby ( const ChatLobbyId & lobby_id , const std : : string & nick ) ;
2011-11-27 16:04:10 -05:00
bool getNickNameForChatLobby ( const ChatLobbyId & lobby_id , std : : string & nick ) ;
2011-12-26 17:43:54 -05:00
bool setDefaultNickNameForChatLobby ( const std : : string & nick ) ;
bool getDefaultNickNameForChatLobby ( std : : string & nick ) ;
2013-06-29 12:15:33 -04:00
void setLobbyAutoSubscribe ( const ChatLobbyId & lobby_id , const bool autoSubscribe ) ;
bool getLobbyAutoSubscribe ( const ChatLobbyId & lobby_id ) ;
2012-01-06 17:17:08 -05:00
void sendLobbyStatusString ( const ChatLobbyId & id , const std : : string & status_string ) ;
2014-03-17 16:56:06 -04:00
ChatLobbyId createChatLobby ( const std : : string & lobby_name , const std : : string & lobby_topic , const std : : list < RsPeerId > & invited_friends , uint32_t privacy_type ) ;
2012-01-07 14:52:58 -05:00
2012-12-04 16:36:05 -05:00
void getListOfNearbyChatLobbies ( std : : vector < VisibleChatLobbyRecord > & public_lobbies ) ;
bool joinVisibleChatLobby ( const ChatLobbyId & id ) ;
2011-11-23 17:10:37 -05:00
2011-06-30 16:50:08 -04:00
protected :
2009-09-29 16:37:20 -04:00
/************* from p3Config *******************/
virtual RsSerialiser * setupSerialiser ( ) ;
2010-04-24 07:27:25 -04:00
/*!
* chat msg items and custom status are saved
*/
2010-12-18 14:35:07 -05:00
virtual bool saveList ( bool & cleanup , std : : list < RsItem * > & ) ;
2010-09-20 20:08:06 -04:00
virtual void saveDone ( ) ;
2010-12-18 14:35:07 -05:00
virtual bool loadList ( std : : list < RsItem * > & load ) ;
2009-03-20 16:41:31 -04:00
2014-03-17 16:56:06 -04:00
bool isOnline ( const RsPeerId & id ) ;
2008-01-25 02:49:28 -05:00
private :
2009-03-20 16:41:31 -04:00
RsMutex mChatMtx ;
2009-01-30 14:52:47 -05:00
class AvatarInfo ;
2009-10-04 18:27:42 -04:00
class StateStringInfo ;
2009-01-30 14:52:47 -05:00
2010-08-31 13:13:52 -04:00
// Receive chat queue
void receiveChatQueue ( ) ;
2013-04-08 17:25:32 -04:00
void handleIncomingItem ( RsItem * ) ; // called by the former, and turtle handler for incoming encrypted items
2010-08-31 13:13:52 -04:00
void initRsChatInfo ( RsChatMsgItem * c , ChatInfo & i ) ;
2013-03-18 19:19:37 -04:00
/// make some statistics about time shifts, to prevent various issues.
void addTimeShiftStatistics ( int shift ) ;
2010-08-31 13:13:52 -04:00
2009-01-30 14:52:47 -05:00
/// Send avatar info to peer in jpeg format.
2014-03-17 16:56:06 -04:00
void sendAvatarJpegData ( const RsPeerId & peer_id ) ;
2009-01-30 14:52:47 -05:00
2010-04-24 06:33:12 -04:00
/// Send custom state info to peer
2014-03-17 16:56:06 -04:00
void sendCustomState ( const RsPeerId & peer_id ) ;
2010-04-24 06:33:12 -04:00
2009-01-30 14:52:47 -05:00
/// Receive the avatar in a chat item, with RS_CHAT_RECEIVE_AVATAR flag.
2009-09-29 16:37:20 -04:00
void receiveAvatarJpegData ( RsChatAvatarItem * ci ) ; // new method
2014-03-17 16:56:06 -04:00
void receiveStateString ( const RsPeerId & id , const std : : string & s ) ;
2009-01-30 14:52:47 -05:00
2012-01-06 17:17:08 -05:00
/// methods for handling various Chat items.
bool handleRecvChatMsgItem ( RsChatMsgItem * item ) ; // returns false if the item should be deleted.
void handleRecvChatStatusItem ( RsChatStatusItem * item ) ;
void handleRecvChatAvatarItem ( RsChatAvatarItem * item ) ;
void handleRecvChatLobbyListRequest ( RsChatLobbyListRequestItem * item ) ;
void handleRecvChatLobbyList ( RsChatLobbyListItem * item ) ;
void handleRecvChatLobbyEventItem ( RsChatLobbyEventItem * item ) ;
2013-09-19 18:10:24 -04:00
/// Checks that the lobby object is not flooding a lobby.
2014-03-17 16:56:06 -04:00
bool locked_bouncingObjectCheck ( RsChatLobbyBouncingObject * obj , const RsPeerId & peer_id , uint32_t lobby_count ) ;
2013-09-19 18:10:24 -04:00
2009-01-30 14:52:47 -05:00
/// Sends a request for an avatar to the peer of given id
2014-03-17 16:56:06 -04:00
void sendAvatarRequest ( const RsPeerId & peer_id ) ;
2009-01-30 14:52:47 -05:00
2010-04-24 06:33:12 -04:00
/// Send a request for custom status string
2014-03-17 16:56:06 -04:00
void sendCustomStateRequest ( const RsPeerId & peer_id ) ;
2010-04-24 06:33:12 -04:00
2011-05-04 16:52:45 -04:00
/// called as a proxy to sendItem(). Possibly splits item into multiple items of size lower than the maximum item size.
2012-01-06 17:17:08 -05:00
void checkSizeAndSendMessage ( RsChatLobbyMsgItem * item ) ;
void checkSizeAndSendMessage_deprecated ( RsChatMsgItem * item ) ; // keep for compatibility for a few weeks.
2011-05-04 16:52:45 -04:00
/// Called when a RsChatMsgItem is received. The item may be collapsed with any waiting partial chat item from the same peer.
2012-01-06 17:17:08 -05:00
bool locked_checkAndRebuildPartialMessage ( RsChatLobbyMsgItem * ) ;
bool locked_checkAndRebuildPartialMessage_deprecated ( RsChatMsgItem * ) ;
2011-05-04 16:52:45 -04:00
2011-11-25 16:31:52 -05:00
/// receive and handle chat lobby item
2014-03-17 16:56:06 -04:00
bool recvLobbyChat ( RsChatLobbyMsgItem * , const RsPeerId & src_peer_id ) ;
bool sendLobbyChat ( const RsPeerId & id , const std : : string & , const ChatLobbyId & ) ;
2011-11-26 16:23:31 -05:00
void handleRecvLobbyInvite ( RsChatLobbyInviteItem * ) ;
2011-12-04 09:31:48 -05:00
void checkAndRedirectMsgToLobby ( RsChatMsgItem * ) ;
2011-12-26 09:45:45 -05:00
void handleConnectionChallenge ( RsChatLobbyConnectChallengeItem * item ) ;
void sendConnectionChallenge ( ChatLobbyId id ) ;
2011-12-27 08:47:37 -05:00
void handleFriendUnsubscribeLobby ( RsChatLobbyUnsubscribeItem * ) ;
2011-12-26 17:43:54 -05:00
void cleanLobbyCaches ( ) ;
2014-03-17 16:56:06 -04:00
bool bounceLobbyObject ( RsChatLobbyBouncingObject * obj , const RsPeerId & peer_id ) ;
2012-01-06 17:17:08 -05:00
void sendLobbyStatusItem ( const ChatLobbyId & , int type , const std : : string & status_string ) ;
void sendLobbyStatusPeerLiving ( const ChatLobbyId & lobby_id ) ;
2012-05-23 18:33:45 -04:00
void sendLobbyStatusPeerChangedNickname ( const ChatLobbyId & lobby_id , const std : : string & newnick ) ;
2012-05-06 18:19:59 -04:00
2012-01-06 17:17:08 -05:00
void sendLobbyStatusNewPeer ( const ChatLobbyId & lobby_id ) ;
2012-01-23 17:49:47 -05:00
void sendLobbyStatusKeepAlive ( const ChatLobbyId & ) ;
2012-01-06 17:17:08 -05:00
2013-09-05 16:55:59 -04:00
bool locked_initLobbyBouncableObject ( const ChatLobbyId & id , RsChatLobbyBouncingObject & ) ;
2011-12-26 09:45:45 -05:00
2014-03-17 16:56:06 -04:00
static ChatLobbyVirtualPeerId makeVirtualPeerId ( ChatLobbyId ) ;
static uint64_t makeConnexionChallengeCode ( const RsPeerId & peer_id , ChatLobbyId lobby_id , ChatLobbyMsgId msg_id ) ;
2011-11-25 16:31:52 -05:00
2011-12-26 09:45:45 -05:00
void locked_printDebugInfo ( ) const ;
2009-09-29 16:37:20 -04:00
RsChatAvatarItem * makeOwnAvatarItem ( ) ;
2009-10-04 18:27:42 -04:00
RsChatStatusItem * makeOwnCustomStateStringItem ( ) ;
2009-03-20 16:41:31 -04:00
2011-07-09 14:39:34 -04:00
p3LinkMgr * mLinkMgr ;
2011-09-29 05:20:09 -04:00
p3HistoryMgr * mHistoryMgr ;
2009-01-30 14:52:47 -05:00
2010-09-01 13:56:15 -04:00
std : : list < RsChatMsgItem * > publicList ;
2010-09-20 20:08:06 -04:00
std : : list < RsChatMsgItem * > privateIncomingList ;
std : : list < RsChatMsgItem * > privateOutgoingList ;
2010-08-31 13:13:52 -04:00
2009-01-30 14:52:47 -05:00
AvatarInfo * _own_avatar ;
2014-03-17 16:56:06 -04:00
std : : map < RsPeerId , AvatarInfo * > _avatars ;
std : : map < RsPeerId , RsChatMsgItem * > _pendingPartialMessages ;
2012-01-06 17:17:08 -05:00
std : : map < ChatLobbyMsgId , std : : vector < RsChatLobbyMsgItem * > > _pendingPartialLobbyMessages ; // should be used for all chat msgs after version updgrade
2009-09-29 16:37:20 -04:00
std : : string _custom_status_string ;
2014-03-17 16:56:06 -04:00
std : : map < RsPeerId , StateStringInfo > _state_strings ;
2011-11-25 16:31:52 -05:00
class ChatLobbyEntry : public ChatLobbyInfo
{
public :
std : : map < ChatLobbyMsgId , time_t > msg_cache ;
2014-03-17 16:56:06 -04:00
RsPeerId virtual_peer_id ;
2011-12-26 09:45:45 -05:00
int connexion_challenge_count ;
2012-01-06 17:17:08 -05:00
time_t last_connexion_challenge_time ;
2012-01-23 17:49:47 -05:00
time_t last_keep_alive_packet_time ;
2014-03-17 16:56:06 -04:00
std : : set < RsPeerId > previously_known_peers ;
2013-06-29 12:15:33 -04:00
uint32_t flags ;
2011-11-25 16:31:52 -05:00
} ;
std : : map < ChatLobbyId , ChatLobbyEntry > _chat_lobbys ;
2011-11-26 16:23:31 -05:00
std : : map < ChatLobbyId , ChatLobbyInvite > _lobby_invites_queue ;
2012-12-04 16:36:05 -05:00
std : : map < ChatLobbyId , VisibleChatLobbyRecord > _visible_lobbies ;
2014-03-17 16:56:06 -04:00
std : : map < ChatLobbyVirtualPeerId , ChatLobbyId > _lobby_ids ;
2013-06-29 12:15:33 -04:00
std : : map < ChatLobbyId , ChatLobbyFlags > _known_lobbies_flags ; // flags for all lobbies, including the ones that are not known. So we can't
// store them in _chat_lobbies (subscribed lobbies) nor _visible_lobbies.
// Known flags:
// RS_CHAT_LOBBY_FLAGS_AUTO_SUBSCRIBE
2011-12-26 09:45:45 -05:00
std : : string _default_nick_name ;
2013-03-18 19:19:37 -04:00
float _time_shift_average ;
2013-04-08 17:25:32 -04:00
time_t last_lobby_challenge_time ; // prevents bruteforce attack
2012-12-04 16:36:05 -05:00
time_t last_visible_lobby_info_request_time ; // allows to ask for updates
2012-01-15 08:00:57 -05:00
bool _should_reset_lobby_counts ;
2013-04-08 17:25:32 -04:00
RsChatSerialiser * _serializer ;
// ===========================================================//
// Members related to anonymous distant chat. //
// ===========================================================//
2013-04-10 04:52:52 -04:00
public :
2013-12-27 15:06:47 -05:00
virtual void connectToTurtleRouter ( p3turtle * ) ;
2013-04-10 04:52:52 -04:00
2013-04-10 17:21:52 -04:00
// Creates the invite if the public key of the distant peer is available.
// Om success, stores the invite in the map above, so that we can respond to tunnel requests.
//
2014-03-17 16:56:06 -04:00
bool createDistantChatInvite ( const RsPgpId & pgp_id , time_t time_of_validity , std : : string & enc_b64_string ) ;
2013-04-14 11:05:24 -04:00
bool getDistantChatInviteList ( std : : vector < DistantChatInviteInfo > & invites ) ;
2014-03-17 16:56:06 -04:00
bool initiateDistantChatConnexion ( const std : : string & encrypted_string , time_t time_of_validity , DistantChatPeerId & pid , uint32_t & error_code ) ; // from encrypted data
bool initiateDistantChatConnexion ( const DistantChatPeerId & pid , uint32_t & error_code ) ; // from known hash of a decrypted link
bool closeDistantChatConnexion ( const DistantChatPeerId & pid ) ;
bool removeDistantChatInvite ( const DistantChatPeerId & pid ) ;
2013-04-23 18:43:19 -04:00
2014-03-17 16:56:06 -04:00
virtual bool getDistantChatStatus ( const DistantChatPeerId & hash , uint32_t & status , RsPgpId & pgp_id ) ;
2013-04-14 11:05:24 -04:00
2013-04-10 04:52:52 -04:00
private :
2013-04-08 17:25:32 -04:00
struct DistantChatInvite
{
unsigned char aes_key [ 16 ] ;
2013-04-10 16:28:13 -04:00
std : : string encrypted_radix64_string ;
2014-03-17 16:56:06 -04:00
RsPgpId destination_pgp_id ;
2013-04-10 04:52:52 -04:00
time_t time_of_validity ;
time_t last_hit_time ;
2013-10-07 16:49:02 -04:00
uint32_t flags ;
2013-04-08 17:25:32 -04:00
} ;
struct DistantChatPeerInfo
{
time_t last_contact ; // used to send keep alive packets
unsigned char aes_key [ 16 ] ; // key to encrypt packets
2013-04-18 17:41:13 -04:00
uint32_t status ; // info: do we have a tunnel ?
2014-03-17 16:56:06 -04:00
RsPeerId virtual_peer_id ; // given by the turtle router. Identifies the tunnel.
RsPgpId pgp_id ; // pgp id of the peer we're talking to.
2013-06-12 17:10:09 -04:00
RsTurtleGenericTunnelItem : : Direction direction ; // specifiec wether we are client(managing the tunnel) or server.
2013-04-08 17:25:32 -04:00
} ;
// This map contains the ongoing invites. This is the list where to look to
// handle tunnel requests.
//
std : : map < TurtleFileHash , DistantChatInvite > _distant_chat_invites ;
// This maps contains the current peers to talk to with distant chat.
//
2014-03-17 16:56:06 -04:00
std : : map < TurtleFileHash , DistantChatPeerInfo > _distant_chat_peers ;
2013-04-08 17:25:32 -04:00
2013-07-14 09:59:38 -04:00
// List of items to be sent asap. Used to store items that we cannot pass directly to
// sendTurtleData(), because of Mutex protection.
std : : list < RsChatItem * > pendingDistantChatItems ;
2013-04-08 17:25:32 -04:00
// Overloaded from RsTurtleClientService
2014-03-17 16:56:06 -04:00
virtual bool handleTunnelRequest ( const RsFileHash & hash , const RsPeerId & peer_id ) ;
virtual void receiveTurtleData ( RsTurtleGenericTunnelItem * item , const RsFileHash & hash , const RsPeerId & virtual_peer_id , RsTurtleGenericTunnelItem : : Direction direction ) ;
2013-04-20 14:56:06 -04:00
void addVirtualPeer ( const TurtleFileHash & , const TurtleVirtualPeerId & , RsTurtleGenericTunnelItem : : Direction dir ) ;
2013-04-10 04:52:52 -04:00
void removeVirtualPeer ( const TurtleFileHash & , const TurtleVirtualPeerId & ) ;
2014-03-17 16:56:06 -04:00
void markDistantChatAsClosed ( const TurtleVirtualPeerId & vpid ) ;
void startClientDistantChatConnection ( const RsFileHash & hash , const RsPgpId & pgp_id , const unsigned char * aes_key_buf ) ;
bool findHashForVirtualPeerId ( const TurtleVirtualPeerId & pid , RsFileHash & hash ) ;
2013-04-08 17:25:32 -04:00
// Utility functions
void cleanDistantChatInvites ( ) ;
2013-04-20 14:56:06 -04:00
void sendTurtleData ( RsChatItem * ) ;
void sendPrivateChatItem ( RsChatItem * ) ;
2013-04-08 17:25:32 -04:00
2014-03-17 16:56:06 -04:00
static TurtleFileHash hashFromVirtualPeerId ( const DistantChatPeerId & peerId ) ; // converts IDs so that we can talk to RsPeerId from outside
static DistantChatPeerId virtualPeerIdFromHash ( const TurtleFileHash & hash ) ; // ... and to a hash for p3turtle
2013-04-08 17:25:32 -04:00
p3turtle * mTurtle ;
2007-12-11 20:43:17 -05:00
} ;
2011-06-30 16:50:08 -04:00
class p3ChatService : : StateStringInfo
{
public :
StateStringInfo ( )
{
_custom_status_string = " " ; // the custom status string of the peer
_peer_is_new = false ; // true when the peer has a new avatar
_own_is_new = false ; // true when I myself a new avatar to send to this peer.
}
std : : string _custom_status_string ;
int _peer_is_new ; // true when the peer has a new avatar
int _own_is_new ; // true when I myself a new avatar to send to this peer.
} ;
2007-12-11 20:43:17 -05:00
# endif // SERVICE_CHAT_HEADER
2009-01-30 14:52:47 -05:00