summaryrefslogtreecommitdiff
path: root/indra/newview/llsyntaxid.h
blob: 75cfc453809777e47942f8220b88e4a5090218de (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
/** 
 * @file llsyntaxid.h
 * @brief Contains methods to access the LSLSyntaxId feature and LSLSyntax capability
 * to use the appropriate syntax file for the current region's LSL version.
 * @author Ima Mechanique
 *
 * $LicenseInfo:firstyear=2013&license=viewerlgpl$
 * Second Life Viewer Source Code
 * Copyright (C) 2013, 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 LL_SYNTAXID_H
#define LL_SYNTAXID_H

#include "llviewerprecompiledheaders.h"

#include "llagent.h"
#include "llenvmanager.h"
#include "llhttpclient.h"
#include "llsingleton.h"
#include "llviewerregion.h"


/**
 * @file llsyntaxid.h
 * @brief Tracks the file needed to decorate the current sim's version of LSL.
 */
class LLSyntaxIdLSL: public LLSingleton<LLSyntaxIdLSL>
{
friend class fetchKeywordsFileResponder;
public:
	typedef boost::signals2::signal<void()> file_fetched_signal_t;

	static const std::string	CAPABILITY_NAME;
	static const std::string	FILENAME_DEFAULT;
	static const std::string	SIMULATOR_FEATURE;

protected:
	static bool		sInitialised;
	static LLSD		sKeywordsXml;
	static bool		sLoaded;
	static bool		sLoadFailed;
	static bool		sVersionChanged;
	static file_fetched_signal_t	sFileFetchedSignal;

private:
	std::string		mCapabilityName;
	std::string		mCapabilityURL;
	std::string		mFileNameCurrent;
	std::string		mFileNameDefault;
	std::string		mFileNameNew;
	ELLPath			mFilePath;
	std::string		mFullFileSpec;
	std::string		mSimulatorFeature;
	LLUUID			mSyntaxIdCurrent;
	LLUUID			mSyntaxIdNew;



public:
	LLSyntaxIdLSL();
	LLSyntaxIdLSL(const std::string& filename, const std::string& sim_feature, const std::string& capability);

	bool			checkSyntaxIdChanged();
	bool			fetching();
	std::string		getFileNameCurrent()	const { return mFileNameCurrent; }
	ELLPath			getFilePath()			const { return mFilePath; }
	std::string		getFileSpec()			const { return mFullFileSpec; }
	LLSD			getKeywordsXML()		const { return sKeywordsXml; }
	LLUUID			getSyntaxId()			const { return mSyntaxIdCurrent; }
	bool			isDifferentVersion()	const { return sVersionChanged; }
	bool			isInitialised()			const { return sInitialised; }

	void			initialise();
	bool			isLoaded() { return sLoaded; }

	static bool		isSupportedVersion(const LLSD& content);
	static void		setKeywordsXml(const LLSD& content) { sKeywordsXml = content; }

	boost::signals2::connection		addFileFetchedCallback(const file_fetched_signal_t::slot_type& cb);
	void							removeFileFetchedCallback(boost::signals2::connection callback);


protected:
	std::string		buildFileNameNew();
	std::string		buildFullFileSpec();
	void			fetchKeywordsFile();
	void			loadDefaultKeywordsIntoLLSD();
	void			loadKeywordsIntoLLSD();
	void			setSyntaxId(LLUUID SyntaxId) { mSyntaxIdCurrent = SyntaxId; }
	void			setFileNameCurrent(const std::string& name) { mFileNameCurrent = name; }
	void			setFileNameDefault(const std::string& name) { mFileNameDefault = name; }
	void			setFileNameNew(const std::string name) { mFileNameNew = name; }
};


/**
 * @file  llsyntaxid.h
 * @brief Handles responses for the LSLSyntax capability's get call. Is a friend of LLSyntaxIdLSL
 */
class fetchKeywordsFileResponder : public LLHTTPClient::Responder
{
public:
	std::string	mFileSpec;

	/**
	 * @brief fetchKeywordsFileResponder
	 * @param filespec	File path and name of where to save the returned data
	 */
	fetchKeywordsFileResponder(std::string filespec);

	void errorWithContent(U32 status,
						const std::string& reason,
						const LLSD& content);

	/**
	 * @brief Checks the returned LLSD for version and stores it in the LLSyntaxIdLSL object.
	 * @param content_ref The returned LLSD.
	 */
	void result(const LLSD& content_ref);

	/**
	 * @brief Saves the returned file to the location provided at instantiation.
	 *			Could be extended to manage cached entries.
	 * @param content_ref	The LSL syntax file for the sim.
	 */
	void cacheFile(const LLSD& content_ref);
};

#endif // LLSYNTAXID_H