1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
|
/**
* @file llconversationlog.h
*
* $LicenseInfo:firstyear=2002&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2012, Linden Research, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License only.
*
* 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
#ifndef LLCONVERSATIONLOG_H_
#define LLCONVERSATIONLOG_H_
#include "llcallingcard.h"
#include "llimfloater.h"
#include "llimview.h"
class LLConversationLogObserver;
struct Conversation_params;
typedef LLIMModel::LLIMSession::SType SessionType;
/*
* This class represents a particular session(conversation) of any type(im/voice/p2p/group/...) by storing some of session's data.
* Each LLConversation object has a corresponding visual representation in a form of LLConversationLogListItem.
*/
class LLConversation
{
public:
LLConversation(const Conversation_params& params);
LLConversation(const LLIMModel::LLIMSession& session);
LLConversation(const LLConversation& conversation);
~LLConversation();
const SessionType& getConversationType() const { return mConversationType; }
const std::string& getConversationName() const { return mConversationName; }
const std::string& getHistoryFileName() const { return mHistoryFileName; }
const LLUUID& getSessionID() const { return mSessionID; }
const LLUUID& getParticipantID() const { return mParticipantID; }
const std::string& getTimestamp() const { return mTimestamp; }
const time_t& getTime() const { return mTime; }
bool isVoice() const { return mIsVoice; }
bool hasOfflineMessages() const { return mHasOfflineIMs; }
/*
* Resets flag of unread offline message to false when im floater with this conversation is opened.
*/
void onIMFloaterShown(const LLUUID& session_id);
/*
* returns string representation(in form of: mm/dd/yyyy hh:mm) of time when conversation was started
*/
static const std::string createTimestamp(const time_t& utc_time);
private:
/*
* If conversation has unread offline messages sets callback for opening LLIMFloater
* with this conversation.
*/
void setListenIMFloaterOpened();
boost::signals2::connection mIMFloaterShowedConnection;
time_t mTime; // start time of conversation
SessionType mConversationType;
std::string mConversationName;
std::string mHistoryFileName;
LLUUID mSessionID;
LLUUID mParticipantID;
bool mIsVoice;
bool mHasOfflineIMs;
std::string mTimestamp; // conversation start time in form of: mm/dd/yyyy hh:mm
};
/**
* LLConversationLog stores all agent's conversations.
* This class is responsible for creating and storing LLConversation objects when im or voice session starts.
* Also this class saves/retrieves conversations to/from file.
*
* Also please note that it may be several conversations with the same sessionID stored in the conversation log.
* To distinguish two conversations with the same sessionID it's also needed to compare their creation date.
*/
class LLConversationLog : public LLSingleton<LLConversationLog>, LLIMSessionObserver
{
friend class LLSingleton<LLConversationLog>;
public:
/**
* adds conversation to the conversation list and notifies observers
*/
void logConversation(const LLConversation& conversation);
void removeConversation(const LLConversation& conversation);
/**
* Returns first conversation with matched session_id
*/
const LLConversation* getConversation(const LLUUID& session_id);
void addObserver(LLConversationLogObserver* observer);
void removeObserver(LLConversationLogObserver* observer);
const std::vector<LLConversation>& getConversations() { return mConversations; }
// LLIMSessionObserver triggers
virtual void sessionAdded(const LLUUID& session_id, const std::string& name, const LLUUID& other_participant_id);
virtual void sessionVoiceOrIMStarted(const LLUUID& session_id){} // Stub
virtual void sessionRemoved(const LLUUID& session_id){} // Stub
virtual void sessionIDUpdated(const LLUUID& old_session_id, const LLUUID& new_session_id){} // Stub
// Triggered by LLFriendObserver change
void notifyObservers();
/**
* public method which is called on viewer exit to save conversation log
*/
void cache();
private:
LLConversationLog();
/**
* constructs file name in which conversations log will be saved
* file name template: agentID.call_log.
* For example: a086icaa-782d-88d0-ae29-987a55c99sss.call_log
*/
std::string getFileName();
bool saveToFile(const std::string& filename);
bool loadFromFile(const std::string& filename);
typedef std::vector<LLConversation> conversations_vec_t;
std::vector<LLConversation> mConversations;
std::set<LLConversationLogObserver*> mObservers;
LLFriendObserver* mFriendObserver; // Observer of the LLAvatarTracker instance
};
class LLConversationLogObserver
{
public:
virtual ~LLConversationLogObserver(){}
virtual void changed() = 0;
};
#endif /* LLCONVERSATIONLOG_H_ */
|