File: foldermanager.hpp

package info (click to toggle)
gobby 0.6.0-3
  • links: PTS
  • area: main
  • in suites: forky, sid, trixie
  • size: 4,872 kB
  • sloc: cpp: 19,417; ansic: 12,094; sh: 4,162; makefile: 417; xml: 42
file content (134 lines) | stat: -rw-r--r-- 4,691 bytes parent folder | download | duplicates (3)
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
/* Gobby - GTK-based collaborative text editor
 * Copyright (C) 2008-2014 Armin Burgmeier <armin@arbur.net>
 *
 * Permission to use, copy, modify, and/or distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */

#ifndef _GOBBY_FOLDERMANAGER_HPP_
#define _GOBBY_FOLDERMANAGER_HPP_

#include "core/browser.hpp"
#include "core/folder.hpp"
#include "core/userjoin.hpp"
#include "core/documentinfostorage.hpp"

#include <libinfinity/common/inf-browser.h>
#include <libinfinity/common/inf-session-proxy.h>

namespace Gobby
{

// The FolderManager class manages the two folders, for text documents and
// chat documents. On top of this, it also manages a relation of browser
// entries to sessions and session proxies.
class FolderManager: public sigc::trackable
{
public:
	typedef std::unique_ptr<UserJoin>* UserJoinRef;

	typedef sigc::signal<void, InfBrowser*, const InfBrowserIter*,
	                     InfSessionProxy*, Folder&, SessionView&,
	                     UserJoinRef>
		SignalDocumentAdded;

	typedef sigc::signal<void, InfBrowser*, const InfBrowserIter*,
	                     InfSessionProxy*, Folder&, SessionView&>
		SignalDocumentRemoved;

	FolderManager(Browser& browser,
	              DocumentInfoStorage& info_storage,
	              Folder& text_folder,
	              Folder& chat_folder);
	~FolderManager();

	const Folder& get_text_folder() const { return m_text_folder; }
	const Folder& get_chat_folder() const { return m_chat_folder; }

	// Add a SessionView for the given session
	void add_document(InfBrowser* browser, const InfBrowserIter* iter,
	                  InfSessionProxy* proxy, UserJoinRef userjoin);
	void remove_document(SessionView& view);

	SessionView* lookup_document(InfSession* session) const;
	void switch_to_document(SessionView& view);

	// Emitted whenever a document has been added, either for text or
	// for chat sessions.
	SignalDocumentAdded signal_document_added() const
	{
		return m_signal_document_added;
	}

	SignalDocumentRemoved signal_document_removed() const
	{
		return m_signal_document_removed;
	}

protected:
	static void on_set_browser_static(InfGtkBrowserModel* model,
	                                  GtkTreePath* path,
	                                  GtkTreeIter* iter,
	                                  InfBrowser* old_browser,
	                                  InfBrowser* new_browser,
	                                  gpointer user_data)
	{
		static_cast<FolderManager*>(user_data)->on_set_browser(
			model, iter, old_browser, new_browser);
	}

	static void on_unsubscribe_session_static(InfBrowser* browser,
	                                          const InfBrowserIter* iter,
	                                          InfSessionProxy* proxy,
	                                          InfRequest* request,
	                                          gpointer user_data)
	{
		static_cast<FolderManager*>(user_data)->
			on_unsubscribe_session(browser, iter, proxy, request);
	}

	void on_set_browser(InfGtkBrowserModel* model, GtkTreeIter* iter,
	                    InfBrowser* old_browser, InfBrowser* new_browser);

	void on_unsubscribe_session(InfBrowser* browser,
	                            const InfBrowserIter* iter,
	                            InfSessionProxy* proxy,
	                            InfRequest* request);

	void on_text_document_added(SessionView& view);
	void on_chat_document_added(SessionView& view);
	void on_document_removed(SessionView& view);

	Browser& m_browser;
	DocumentInfoStorage& m_info_storage;
	Folder& m_text_folder;
	Folder& m_chat_folder;

	sigc::connection m_text_document_added_connection;
	sigc::connection m_chat_document_added_connection;
	gulong m_set_browser_handler;

	class BrowserInfo;
	typedef std::map<InfBrowser*, BrowserInfo*> BrowserMap;
	BrowserMap m_browser_map;

	class SessionInfo;
	typedef std::map<InfSession*, SessionInfo*> SessionMap;
	SessionMap m_session_map;

	SignalDocumentAdded m_signal_document_added;
	SignalDocumentRemoved m_signal_document_removed;
};

}

#endif // _GOBBY_FOLDERMANAGER_HPP_