aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/linden/indra/newview/llviewerparcelmedia.h
blob: f4c4312cc3444f6dd95ddaeeed22c868745e15d7 (plain)
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
/**
 * @file llviewerparcelmedia.h
 * @brief Handlers for multimedia on a per-parcel basis
 *
 * $LicenseInfo:firstyear=2007&license=viewergpl$
 * 
 * Copyright (c) 2007-2009, Linden Research, Inc.
 * 
 * Second Life Viewer Source Code
 * The source code in this file ("Source Code") is provided by Linden Lab
 * to you under the terms of the GNU General Public License, version 2.0
 * ("GPL"), unless you have obtained a separate licensing agreement
 * ("Other License"), formally executed by you and Linden Lab.  Terms of
 * the GPL can be found in doc/GPL-license.txt in this distribution, or
 * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
 * 
 * There are special exceptions to the terms and conditions of the GPL as
 * it is applied to this Source Code. View the full text of the exception
 * in the file doc/FLOSS-exception.txt in this software distribution, or
 * online at
 * http://secondlifegrid.net/programs/open_source/licensing/flossexception
 * 
 * By copying, modifying or distributing this software, you acknowledge
 * that you have read and understood your obligations described above,
 * and agree to abide by those obligations.
 * 
 * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
 * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
 * COMPLETENESS OR PERFORMANCE.
 * $/LicenseInfo$
 */

#ifndef LLVIEWERPARCELMEDIA_H
#define LLVIEWERPARCELMEDIA_H

#include "llviewermedia.h"
#include "llmemory.h"

// For use by other patches so they know that media filtering is implemented.
#define MEDIA_FILTERING 1

class LLMessageSystem;
class LLParcel;
class LLViewerParcelMediaNavigationObserver;
class LLViewerParcelMediaInfo;


// This class understands land parcels, network traffic, LSL media
// transport commands, and talks to the LLViewerMedia class to actually
// do playback.  It allows us to remove code from LLViewerParcelMgr.
class LLViewerParcelMedia : public LLViewerMediaObserver
{
	LOG_CLASS(LLViewerParcelMedia);
	private:
		typedef enum e_command_origin
		{
			COMMAND_ORIGIN_LOCAL,
			COMMAND_ORIGIN_REMOTE
		} ECommandOrigin;

	public:
		static void initClass();
		static void cleanupClass();

		static void update(LLParcel* parcel);
			// called when the agent's parcel has a new URL, or the agent has
			// walked on to a new parcel with media

		static void play(LLParcel* parcel, bool filter = true, const ECommandOrigin origin = COMMAND_ORIGIN_LOCAL);
			// user clicked play button in media transport controls
		static void playStreamingMusic(LLParcel* parcel, bool filter = true);
			// play the parcel music stream
		static void stopStreamingMusic();
			// stop the parcel music stream

		static void filterMedia(LLParcel* parcel, U32 type, const ECommandOrigin origin); // type: 0 = media, 1 = streaming music
		static bool allowedMedia(std::string media_url);

		static bool loadDomainFilterList();
		static void saveDomainFilterList();
		static void clearDomainFilterList();
		static std::string extractDomain(std::string url);

		static void stop();
			// user clicked stop button in media transport controls

		static void pause();
		static void start();
			// restart after pause - no need for all the setup

		static void focus(bool focus);

		static void seek(F32 time);
		    // jump to timecode time

		static LLViewerMediaImpl::EMediaStatus getStatus();
		static std::string getMimeType();
		static viewer_media_t getParcelMedia();

		static void processParcelMediaCommandMessage( LLMessageSystem *msg, void ** );
		static void processParcelMediaUpdate( LLMessageSystem *msg, void ** );
		static void undoParcelMediaUpdate(); // reset the parcel's media to what it was before ParcelMediaUpdate
		static void sendMediaNavigateMessage(const std::string& url);
		
		// inherited from LLViewerMediaObserver
		virtual void handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event);

	public:
		static S32 sMediaParcelLocalID;
		static LLUUID sMediaRegionID;
		// HACK: this will change with Media on a Prim
		static viewer_media_t sMediaImpl;

		static bool sIsUserAction;
		static bool sMediaFilterListLoaded;
		static LLSD sMediaFilterList;
		static std::set<std::string> sMediaQueries;
		static std::set<std::string> sAllowedMedia;
		static std::set<std::string> sDeniedMedia;
		static LLPointer<LLViewerParcelMediaInfo> sSavedMediaInfo; // The parcel original media (before a remote command is applied)
};


class LLViewerParcelMediaNavigationObserver
{
public:
	std::string mCurrentURL;
	bool mFromMessage;

	// void onNavigateComplete( const EventType& event_in );

};

class LLViewerParcelMediaInfo : public LLRefCount
{
public:
	LLViewerParcelMediaInfo(const std::string url, 
							const std::string type,
							const LLUUID media_id,
							const S32 width,
							const S32 height,
							const U8 scale,
							const U8 loop);
	LLViewerParcelMediaInfo(const LLParcel* parcel);
	~LLViewerParcelMediaInfo() {}
	void applyToParcel(LLParcel* parcel);
	bool sameParcel(const LLParcel* parcel) const;
	bool operator==(const LLViewerParcelMediaInfo &rhs) const;
private:
	std::string			mMediaURL;
	std::string 		mMediaType;
	LLUUID				mMediaID;
	S32					mMediaWidth;
	S32					mMediaHeight;
	U8					mMediaAutoScale;
	U8                  mMediaLoop;
	S32					mParcelLocalID;
};
#endif