All pastes #2074949 Raw Edit

clueless

public text v1 · immutable
#2074949 ·published 2011-06-05 08:15 UTC
rendered paste body
diff -r 29a6b40dc6b0 indra/newview/CMakeLists.txt--- a/indra/newview/CMakeLists.txt	Tue May 31 23:13:20 2011 +0200+++ b/indra/newview/CMakeLists.txt	Sun Jun 05 04:15:17 2011 -0400@@ -78,6 +78,7 @@     floatermedialists.cpp     fscontactsfloater.cpp     fsareasearch.cpp+    fsdata.cpp     fskeywords.cpp     llagent.cpp     llagentaccess.cpp@@ -641,6 +642,7 @@     floatermedialists.h     fscontactsfloater.h     fsareasearch.h+    fsdata.h     fskeywords.h     llagent.h     llagentaccess.hdiff -r 29a6b40dc6b0 indra/newview/fsdata.cpp--- /dev/null	Thu Jan 01 00:00:00 1970 +0000+++ b/indra/newview/fsdata.cpp	Sun Jun 05 04:15:17 2011 -0400@@ -0,0 +1,622 @@+/* Copyright (c) 2010+ *+ * Modular Systems All rights reserved.+ *+ * Redistribution and use in source and binary forms, with or+ * without modification, are permitted provided that the following+ * conditions are met:+ *+ *   1. Redistributions of source code must retain the above copyright+ *      notice, this list of conditions and the following disclaimer.+ *   2. Redistributions in binary form must reproduce the above+ *      copyright notice, this list of conditions and the following+ *      disclaimer in the documentation and/or other materials provided+ *      with the distribution.+ *   3. Neither the name Modular Systems nor the names of its contributors+ *      may be used to endorse or promote products derived from this+ *      software without specific prior written permission.+ *+ * THIS SOFTWARE IS PROVIDED BY MODULAR SYSTEMS AND CONTRIBUTORS "AS IS"+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MODULAR SYSTEMS OR CONTRIBUTORS+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF+ * THE POSSIBILITY OF SUCH DAMAGE.+ */++#include "llviewerprecompiledheaders.h"++#include "fsdata.h"++#include "llbufferstream.h"++#include "llappviewer.h"++#include <boost/bind.hpp>+#include <boost/function.hpp>+#include <boost/lexical_cast.hpp>++#include "llsdserialize.h"++#include "llversionviewer.h"+#include "llprimitive.h"+#include "llagent.h"+#include "llnotifications.h"+#include "llimview.h"+#include "llfloaterabout.h"+#include "llviewercontrol.h"+//#include "floaterblacklist.h"+#include "llsys.h"+#include "llviewermedia.h"+#include "llagentui.h"++std::string FSData::blacklist_version;+LLSD FSData::blocked_login_info = 0;+LLSD FSData::phoenix_tags = 0;+BOOL FSData::msDataDone = FALSE;++FSData* FSData::sInstance;++FSData::FSData()+{+	sInstance = this;+}++FSData::~FSData()+{+	sInstance = NULL;+}++FSData* FSData::getInstance()+{+	if(sInstance)return sInstance;+	else+	{+		sInstance = new FSData();+		return sInstance;+	}+}++static const std::string versionid = llformat("%s %d.%d.%d (%d)", LL_CHANNEL, LL_VERSION_MAJOR, LL_VERSION_MINOR, LL_VERSION_PATCH, LL_VERSION_BUILD);+static const std::string fsdata_url = "http://phoenixviewer.com/app/fsdata/data.xml";+static const std::string releases_url = "http://phoenixviewer.com/app/fsdata/releases.xml";+static const std::string agents_url = "http://phoenixviewer.com/app/fsdata/agents.xml";+//static const std::string blacklist_url = "http://phoenixviewer.com/app/fsdata/blacklist.xml";+const std::string releases_filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "releases.xml");+const std::string agents_filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "agents.xml");++void FSData::startDownload()+{+	LLSD headers;+	headers.insert("User-Agent", LLViewerMedia::getCurrentUserAgent());+	headers.insert("viewer-version", versionid);+	LL_INFOS("Data") << "Downloading data.xml" << LL_ENDL;+	LLHTTPClient::get(fsdata_url,new FSDownloader( FSData::processData ),headers);+}+	+void FSData::processData(U32 status, std::string body)+{+	if(status != 200)+	{+		LL_WARNS("Data") << "data.xml download failed with status of " << status << LL_ENDL;+		return;+	}+	LLSD fsData;+	std::istringstream istr(body);+	LLSDSerialize::fromXML(fsData, istr);+	if(!fsData.isDefined())+	{+	  LL_WARNS("Data") << "Bad data in data.xml, aborting" << LL_ENDL;+	  return;+	}++	// Set Message Of The Day if present+	if(fsData.has("MOTD"))+	{+		gAgent.mMOTD.assign(fsData["MOTD"]);+	}++	FSData* self = getInstance();+	bool local_file = false;+	if (!(fsData["Releases"].asInteger() == 0))+	{+		llifstream releases_file(releases_filename);+		LLSD releases;+		if(releases_file.is_open())+		{+			if(LLSDSerialize::fromXML(releases, releases_file) >= 1)+			{+				if(releases.has("ReleaseVersion"))+				{+					if (fsData["Releases"].asInteger() <= releases["ReleaseVersion"].asInteger())+					{+						LLSD& fs_versions = releases["FirestormReleases"];+						self->versions2.clear();+						for(LLSD::map_iterator itr = fs_versions.beginMap(); itr != fs_versions.endMap(); ++itr)+						{+							std::string key = (*itr).first;+							key += "\n";+							LLSD& content = (*itr).second;+							U8 val = 0;+							if(content.has("beta"))val = val | PH_BETA;+							if(content.has("release"))val = val | PH_RELEASE;+							self->versions2[key] = val;+						}+						+						if(releases.has("BlockedReleases"))+						{+							LLSD& blocked = releases["BlockedReleases"];+							self->blocked_versions.clear();+							for (LLSD::map_iterator itr = blocked.beginMap(); itr != blocked.endMap(); ++itr)+							{+								std::string vers = itr->first;+								LLSD& content = itr->second;+								self->blocked_versions.insert(vers, content);+							}+						}+						local_file = true;+					}+				}+			}+			releases_file.close();+		}+	}++	if (!local_file)+	{+		LLHTTPClient::get(releases_url,new FSDownloader( FSData::processReleases ));+	}+++	local_file = false;+	if (!(fsData["Agents"].asInteger() == 0))+	{+		llifstream agents_file(agents_filename);+		LLSD agents;+		if(agents_file.is_open())+		{+			if(LLSDSerialize::fromXML(agents, agents_file) >= 1)+			{+				if(agents.has("ReleaseVersion"))+				{+					if (fsData["Agents"].asInteger() <= agents["AgentsVersion"].asInteger())+					{+						LLSD& support_agents = agents["SupportAgents"];+						self->personnel.clear();+						for(LLSD::map_iterator itr = support_agents.beginMap(); itr != support_agents.endMap(); ++itr)+						{+							std::string key = (*itr).first;+							LLSD& content = (*itr).second;+							U8 val = 0;+							if(content.has("support"))val = val | EM_SUPPORT;+							if(content.has("developer"))val = val | EM_DEVELOPER;+							self->personnel[LLUUID(key)] = val;+						}+						local_file = true;+					}+				}+			}+			agents_file.close();+		}+	}++	if (!local_file)+	{+		LLHTTPClient::get(agents_url,new FSDownloader( FSData::processAgents ));+	}++	//TODO: add blacklist support+// 	LL_INFOS("Blacklist") << "Downloading blacklist.xml" << LL_ENDL;+// 	LLHTTPClient::get(url,new FSDownloader( FSData::msblacklist ),headers);++	//TODO: add legisity client tags+	//downloadClientTags();+}++void FSData::processReleases(U32 status, std::string body)+{+  	if(status != 200)+	{+		LL_WARNS("Releases") << "releases.xml download failed with status of " << status << LL_ENDL;+		return;+	}+  +	FSData* self = getInstance();+	LLSD releases;+	std::istringstream istr(body);+	LLSDSerialize::fromXML(releases, istr);+	if(releases.isDefined())+	{+		LLSD& fs_versions = releases["FirestormReleases"];+		self->versions2.clear();+		for(LLSD::map_iterator itr = fs_versions.beginMap(); itr != fs_versions.endMap(); ++itr)+		{+			std::string key = (*itr).first;+			key += "\n";+			LLSD& content = (*itr).second;+			U8 val = 0;+			if(content.has("beta"))val = val | PH_BETA;+			if(content.has("release"))val = val | PH_RELEASE;+			self->versions2[key] = val;+		}+		+		if(releases.has("BlockedReleases"))+		{+			LLSD& blocked = releases["BlockedReleases"];+			self->blocked_versions.clear();+			for (LLSD::map_iterator itr = blocked.beginMap(); itr != blocked.endMap(); ++itr)+			{+				std::string vers = itr->first;+				LLSD& content = itr->second;+				self->blocked_versions.insert(vers, content);+			}+		}+		+		// save the download to a file+		llofstream releases_file;+		releases_file.open(releases_filename);+		LLSDSerialize::toPrettyXML(releases, releases_file);+		releases_file.close();+	}+}++void FSData::processAgents(U32 status, std::string body)+{+  	if(status != 200)+	{+		LL_WARNS("Releases") << "agents.xml download failed with status of " << status << LL_ENDL;+		return;+	}+  +	FSData* self = getInstance();+	LLSD agents;+	std::istringstream istr(body);+	LLSDSerialize::fromXML(agents, istr);+	if(agents.isDefined())+	{+		LLSD& support_agents = agents["agents"];+		self->personnel.clear();+		for(LLSD::map_iterator itr = support_agents.beginMap(); itr != support_agents.endMap(); ++itr)+		{+			std::string key = (*itr).first;+			LLSD& content = (*itr).second;+			U8 val = 0;+			if(content.has("support"))val = val | EM_SUPPORT;+			if(content.has("developer"))val = val | EM_DEVELOPER;+			self->personnel[LLUUID(key)] = val;+		}+		+		// save the download to a file+		llofstream agents_file;+		agents_file.open(agents_filename);+		LLSDSerialize::toPrettyXML(agents, agents_file);+		agents_file.close();+	}+}++//TODO: add legisity tags support+#if (0)+void FSData::downloadClientTags()+{+	if(gSavedSettings.getBOOL("PhoenixDownloadClientTags"))+	{+		//url = "http://phoenixviewer.com/app/client_tags/client_list.xml";+		std::string url("http://phoenixviewer.com/app/client_tags/client_list_v2.xml");+		// if(gSavedSettings.getBOOL("PhoenixDontUseMultipleColorTags"))+		// {+		//	 url="http://phoenixviewer.com/app/client_list_unified_colours.xml";+		// }+		LLSD headers;+		LLHTTPClient::get(url,new FSDownloader( FSData::updateClientTags),headers);+		LL_INFOS("CLIENTTAGS DOWNLOADER") << "Getting new tags" << LL_ENDL;+	}+	else+	{+		updateClientTagsLocal();+	}+	+}++void FSData::msblacklist(U32 status,std::string body)+{+	if(status != 200)+	{+		LL_WARNS("Blacklist") << "Something went wrong with the blacklist download status code " << status << LL_ENDL;+	}++	std::istringstream istr(body);+	if (body.size() > 0)+	{+		LLSD data;+		if(LLSDSerialize::fromXML(data,istr) >= 1)+		{+			LL_INFOS("Blacklist") << body.size() << " bytes received, updating local blacklist" << LL_ENDL;+			for(LLSD::map_iterator itr = data.beginMap(); itr != data.endMap(); ++itr)+			{+				if(itr->second.has("name"))+					LLFloaterBlacklist::addEntry(LLUUID(itr->first),itr->second);+			}+		}+		else+		{+			LL_INFOS("Blacklist") << "Failed to parse blacklist.xml" << LL_ENDL;+		}+	}+	else+	{+		LL_INFOS("Blacklist") << "Empty blacklist.xml" << LL_ENDL;+	}+}++void FSData::updateClientTags(U32 status,std::string body)+{+    std::string client_list_filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "client_list_v2.xml");++    std::istringstream istr(body);+    LLSD data;+    if(LLSDSerialize::fromXML(data, istr) >= 1)+	{+		llofstream export_file;+        export_file.open(client_list_filename);+        LLSDSerialize::toPrettyXML(data, export_file);+        export_file.close();+    }+}++void FSData::updateClientTagsLocal()+{+	std::string client_list_filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "client_list_v2.xml");++	llifstream xml_file(client_list_filename);+	LLSD data;+	if(!xml_file.is_open()) return;+	if(LLSDSerialize::fromXML(data, xml_file) >= 1)+	{+		if(data.has("phoenixTags"))+		{+			phoenix_tags = data["phoenixTags"];+			LLPrimitive::tagstring = FSData::phoenix_tags[gSavedSettings.getString("PhoenixTagColor")].asString();+		}++		xml_file.close();+	}+}++void FSData::msdata(U32 status, std::string body)+{+	FSData* self = getInstance();+	//cmdline_printchat("msdata downloaded");++	LLSD data;+	std::istringstream istr(body);+	LLSDSerialize::fromXML(data, istr);+	if(data.isDefined())+	{++// Removed code chunks as they are ported to help keep track of what needs done. -- Techwolf Lupindo+++		if(data.has("phoenixTags"))+		{+			phoenix_tags = data["phoenixTags"];+			LLPrimitive::tagstring = FSData::phoenix_tags[gSavedSettings.getString("PhoenixTagColor")].asString();+		}+		msDataDone = TRUE;+	}++	//LLSD& dev_agents = data["dev_agents"];+	//LLSD& client_ids = data["client_ids"];+}+#endif++BOOL FSData::is_support(LLUUID id)+{+	FSData* self = getInstance();+	if(self->personnel.find(id) != self->personnel.end())+	{+		return ((self->personnel[id] & EM_SUPPORT) != 0) ? TRUE : FALSE;+	}+	return FALSE;+}++BOOL FSData::is_BetaVersion(std::string version)+{+	FSData* self = getInstance();+	if(self->versions2.find(version) != self->versions2.end())+	{+		return ((self->versions2[version] & PH_BETA) != 0) ? TRUE : FALSE;+	}+	return FALSE;+}++BOOL FSData::is_ReleaseVersion(std::string version)+{+	FSData* self = getInstance();+	if(self->versions2.find(version) != self->versions2.end())+	{+		return ((self->versions2[version] & PH_RELEASE) != 0) ? TRUE : FALSE;+	}+	return FALSE;+}++BOOL FSData::is_developer(LLUUID id)+{+	FSData* self = getInstance();+	if(self->personnel.find(id) != self->personnel.end())+	{+		return ((self->personnel[id] & EM_DEVELOPER) != 0) ? TRUE : FALSE;+	}+	return FALSE;+}++LLSD FSData::allowed_login()+{+	FSData* self = getInstance();+	std::map<std::string, LLSD>::iterator iter = self->blocked_versions.find(versionid);+	if (iter == self->blocked_versions.end())+	{+		LLSD empty;+		return empty; +	}+	else+	{+		return iter->second;+	}+}+++std::string FSData::processRequestForInfo(LLUUID requester, std::string message, std::string name, LLUUID sessionid)+{+	std::string detectstring = "/reqsysinfo";+	if(!message.find(detectstring)==0)+	{+		//llinfos << "sysinfo was not found in this message, it was at " << message.find("/sysinfo") << " pos." << llendl;+		return message;+	}+	if(!(is_support(requester)||is_developer(requester)))+	{+		return message;+	}++	//llinfos << "sysinfo was found in this message, it was at " << message.find("/sysinfo") << " pos." << llendl;+	std::string outmessage("I am requesting information about your system setup.");+	std::string reason("");+	if(message.length()>detectstring.length())+	{+		reason = std::string(message.substr(detectstring.length()));+		//there is more to it!+		outmessage = std::string("I am requesting information about your system setup for this reason : "+reason);+		reason = "The reason provided was : "+reason;+	}+	LLSD args;+	args["REASON"] =reason;+	args["NAME"] = name;+	args["FROMUUID"]=requester;+	args["SESSIONID"]=sessionid;+	LLNotifications::instance().add("FireStormReqInfo",args,LLSD(), callbackReqInfo);++	return outmessage;+}+void FSData::sendInfo(LLUUID destination, LLUUID sessionid, std::string myName, EInstantMessage dialog)+{++	std::string myInfo1 = getMyInfo(1);+//	std::string myInfo2 = getMyInfo(2);	++	pack_instant_message(+		gMessageSystem,+		gAgent.getID(),+		FALSE,+		gAgent.getSessionID(),+		destination,+		myName,+		myInfo1,+		IM_ONLINE,+		dialog,+		sessionid+		);+	gAgent.sendReliableMessage();+// 	pack_instant_message(+// 		gMessageSystem,+// 		gAgent.getID(),+// 		FALSE,+// 		gAgent.getSessionID(),+// 		destination,+// 		myName,+// 		myInfo2,+// 		IM_ONLINE,+// 		dialog,+// 		sessionid);+// 	gAgent.sendReliableMessage();+	gIMMgr->addMessage(gIMMgr->computeSessionID(dialog,destination),destination,myName,"Information Sent: "++		myInfo1); //+"\n"+myInfo2);+}+void FSData::callbackReqInfo(const LLSD &notification, const LLSD &response)+{+	S32 option = LLNotification::getSelectedOption(notification, response);+	std::string my_name;+	LLSD subs = LLNotification(notification).getSubstitutions();+	LLUUID uid = subs["FROMUUID"].asUUID();+	LLUUID sessionid = subs["SESSIONID"].asUUID();++	llinfos << "the uuid is " << uid.asString().c_str() << llendl;+	LLAgentUI::buildFullname(my_name);+	//LLUUID sessionid = gIMMgr->computeSessionID(IM_NOTHING_SPECIAL,uid);+	if ( option == 0 )//yes+	{+		sendInfo(uid,sessionid,my_name,IM_NOTHING_SPECIAL);+	}+	else+	{++		pack_instant_message(+			gMessageSystem,+			gAgent.getID(),+			FALSE,+			gAgent.getSessionID(),+			uid,+			my_name,+			"Request Denied.",+			IM_ONLINE,+			IM_NOTHING_SPECIAL,+			sessionid+			);+		gAgent.sendReliableMessage();+		gIMMgr->addMessage(sessionid,uid,my_name,"Request Denied");+	}+}+//part , 0 for all, 1 for 1st half, 2 for 2nd+std::string FSData::getMyInfo(int part)+{+	//copied from Zi llimfloater sendinfobutton function.+	//TODO: create a single function to elemenate code dupe.+	LLSD info=LLFloaterAbout::getInfo();++	std::ostringstream support;+	support <<+		info["CHANNEL"] << " " << info["VIEWER_VERSION_STR"] << "\n" <<+		"Sim: " << info["HOSTNAME"] << "(" << info["HOSTIP"] << ") " << info["SERVER_VERSION"] << "\n" <<+		"Packet loss: " << info["PACKETS_PCT"].asReal() << "% (" << info["PACKETS_IN"].asReal() << "/" << info["PACKETS_LOST"].asReal() << ")\n" <<+		"CPU: " << info["CPU"] << "\n" <<+		"Memory: " << info["MEMORY_MB"] << "\n" <<+		"OS: " << info["OS_VERSION"] << "\n" <<+		"GPU: " << info["GRAPHICS_CARD_VENDOR"] << " " << info["GRAPHICS_CARD"] << "\n";++	if(info.has("GRAPHICS_DRIVER_VERSION"))+		support << "Driver: " << info["GRAPHICS_DRIVER_VERSION"] << "\n";++	support <<+		"OpenGL: " << info["OPENGL_VERSION"] << "\n" <<+		"Skin: " << info["SKIN"] << "(" << info["THEME"] << ")\n" <<+		"RLV: " << info["RLV_VERSION"] << "\n" <<+		"Curl: " << info ["LIBCURL_VERSION"] << "\n" <<+		"J2C: " << info["J2C_VERSION"] << "\n" <<+		"Audio: " << info["AUDIO_DRIVER_VERSION"] << "\n" <<+		"Webkit: " << info["QT_WEBKIT_VERSION"] << "\n" <<+		"Voice: " << info["VOICE_VERSION"] << "\n" <<+		"Compiler: " << info["COMPILER"] << " Version " << info["COMPILER_VERSION"].asInteger() << "\n"+		;+	+	return support.str();+}++FSDownloader::FSDownloader(void (*callback)(U32, std::string)) : mCallback(callback) {}+FSDownloader::~FSDownloader(){}+void FSDownloader::error(U32 status, const std::string& reason){}+void FSDownloader::completedRaw(+			U32 status,+			const std::string& reason,+			const LLChannelDescriptors& channels,+			const LLIOPipe::buffer_ptr_t& buffer)+{+	LLBufferStream istr(channels, buffer.get());+	std::stringstream strstrm;+	strstrm << istr.rdbuf();+	std::string result = std::string(strstrm.str());+	mCallback(status, result);+}diff -r 29a6b40dc6b0 indra/newview/fsdata.h--- /dev/null	Thu Jan 01 00:00:00 1970 +0000+++ b/indra/newview/fsdata.h	Sun Jun 05 04:15:17 2011 -0400@@ -0,0 +1,106 @@+/* Copyright (c) 2010+ *+ * Modular Systems All rights reserved.+ *+ * Redistribution and use in source and binary forms, with or+ * without modification, are permitted provided that the following+ * conditions are met:+ *+ *   1. Redistributions of source code must retain the above copyright+ *      notice, this list of conditions and the following disclaimer.+ *   2. Redistributions in binary form must reproduce the above+ *      copyright notice, this list of conditions and the following+ *      disclaimer in the documentation and/or other materials provided+ *      with the distribution.+ *   3. Neither the name Modular Systems nor the names of its contributors+ *      may be used to endorse or promote products derived from this+ *      software without specific prior written permission.+ *+ * THIS SOFTWARE IS PROVIDED BY MODULAR SYSTEMS AND CONTRIBUTORS “AS IS”+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MODULAR SYSTEMS OR CONTRIBUTORS+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF+ * THE POSSIBILITY OF SUCH DAMAGE.+ */++#include <map>+#include <llsd.h>+#include <llhttpclient.h>+#include <llinstantmessage.h>+++class FSDownloader : public LLHTTPClient::Responder+{+public:+	FSDownloader(void (*callback)(U32, std::string));+	~FSDownloader();+	virtual void error(U32 status, const std::string& reason);+	virtual void completedRaw(+		U32 status,+		const std::string& reason,+		const LLChannelDescriptors& channels,+		const LLIOPipe::buffer_ptr_t& buffer);+private:+	void	(*mCallback)(U32, std::string);+};++class FSData+{+	LOG_CLASS(FSData);+	FSData();+	~FSData();+	static FSData* sInstance;+public:+	static FSData* getInstance();++	void startDownload();+	void processData(U32 status, std::string body);+	void downloadClientTags();+	bool checkFile(std::string filename);++	static void processReleases(U32 status, std::string body);+	static void processAgents(U32 status, std::string body);+	static void msdata(U32 status, std::string body);+	static void msblacklist(U32 status, std::string body);+	static void updateClientTags(U32 status,std::string body);+	static void updateClientTagsLocal();+	static const U8 EM_SUPPORT		= 0x01;+	static const U8 EM_DEVELOPER	= 0x02;+	static const U8 PH_BETA			= 0x01;+	static const U8 PH_RELEASE		= 0x02;+	//static const U8 x = 0x04;+	//static const U8 x = 0x08;+	//static const U8 x = 0x10;++	std::map<LLUUID, U8> personnel;+	std::map<std::string, U8> versions2;++	static BOOL is_BetaVersion(std::string version);+	static BOOL is_ReleaseVersion(std::string version);+	static BOOL is_developer(LLUUID id);+	static BOOL is_support(LLUUID id);++	static LLSD allowed_login();++	static std::string processRequestForInfo(LLUUID requester,std::string message, std::string name, LLUUID sessionid);+	static std::string getMyInfo(int part =0);+	static void callbackReqInfo(const LLSD &notification, const LLSD &response);+	static void sendInfo(LLUUID destination, LLUUID sessionid, std::string myName, EInstantMessage dialog);++	static LLSD phoenix_tags;+	std::map<std::string, LLSD> blocked_versions;+	static LLSD blocked_login_info;+	// std::string ms_motd;+	static BOOL isMSDone() { return msDataDone; }+private:+	static BOOL msDataDone;+	static std::string blacklist_version;+++};\ No newline at end of filediff -r 29a6b40dc6b0 indra/newview/llpanellogin.cpp--- a/indra/newview/llpanellogin.cpp	Tue May 31 23:13:20 2011 +0200+++ b/indra/newview/llpanellogin.cpp	Sun Jun 05 04:15:17 2011 -0400@@ -69,6 +69,8 @@ #include "llglheaders.h" #include "llpanelloginlistener.h" +#include "fsdata.h"+ #if LL_WINDOWS #pragma warning(disable: 4355)      // 'this' used in initializer list #endif  // LL_WINDOWS@@ -952,41 +954,48 @@ 		updateStartSLURL(); 		std::string username = sInstance->getChild<LLUICtrl>("username_combo")->getValue().asString(); -		-		if(username.empty())+		LLSD blocked = FSData::allowed_login();+		if (!blocked.isMap()) //hack for testing for an empty LLSD 		{-			// user must type in something into the username field-			LLNotificationsUtil::add("MustHaveAccountToLogIn");+			if(username.empty())+			{+				// user must type in something into the username field+				LLNotificationsUtil::add("MustHaveAccountToLogIn");+			}+			else+			{+				LLPointer<LLCredential> cred;+				BOOL remember;+				getFields(cred, remember);+				std::string identifier_type;+				cred->identifierType(identifier_type);+				LLSD allowed_credential_types;+				LLGridManager::getInstance()->getLoginIdentifierTypes(allowed_credential_types);+				+				// check the typed in credential type against the credential types expected by the server.+				for(LLSD::array_iterator i = allowed_credential_types.beginArray();+					i != allowed_credential_types.endArray();+					i++)+				{+					+					if(i->asString() == identifier_type)+					{+						// yay correct credential type+						sInstance->mCallback(0, sInstance->mCallbackData);+						return;+					}+				}+				+				// Right now, maingrid is the only thing that is picky about+				// credential format, as it doesn't yet allow account (single username)+				// format creds.  - Rox.  James, we wanna fix the message when we change+				// this.+				LLNotificationsUtil::add("InvalidCredentialFormat");			+			} 		} 		else 		{-			LLPointer<LLCredential> cred;-			BOOL remember;-			getFields(cred, remember);-			std::string identifier_type;-			cred->identifierType(identifier_type);-			LLSD allowed_credential_types;-			LLGridManager::getInstance()->getLoginIdentifierTypes(allowed_credential_types);-			-			// check the typed in credential type against the credential types expected by the server.-			for(LLSD::array_iterator i = allowed_credential_types.beginArray();-				i != allowed_credential_types.endArray();-				i++)-			{-				-				if(i->asString() == identifier_type)-				{-					// yay correct credential type-					sInstance->mCallback(0, sInstance->mCallbackData);-					return;-				}-			}-			-			// Right now, maingrid is the only thing that is picky about-			// credential format, as it doesn't yet allow account (single username)-			// format creds.  - Rox.  James, we wanna fix the message when we change-			// this.-			LLNotificationsUtil::add("InvalidCredentialFormat");			+			LLNotificationsUtil::add("BlockLoginInfo", blocked); 		} 	} }diff -r 29a6b40dc6b0 indra/newview/llstartup.cpp--- a/indra/newview/llstartup.cpp	Tue May 31 23:13:20 2011 +0200+++ b/indra/newview/llstartup.cpp	Sun Jun 05 04:15:17 2011 -0400@@ -3111,10 +3111,11 @@ 		gAgent.setHomePosRegion(region_handle, position); 	} -	// AO - Kill LL message of the day for now, There's too many unwanted shoe and jewelry adverts.-	//      We can set it to a more informational, less commercialized feed in the future.-	//gAgent.mMOTD.assign(response["message"]);-	gAgent.mMOTD.assign("Welcome to Advertisement-Free Firestorm");+	// If MOTD has not been set by fsdata, fallback to LL MOTD+	if ((gAgent.mMOTD == NULL) || gAgent.mMOTD.empty())+	{+		gAgent.mMOTD.assign(response["message"]);+	}  	// Options... 	// Each 'option' is an array of submaps. diff -r 29a6b40dc6b0 indra/newview/llviewermessage.cpp--- a/indra/newview/llviewermessage.cpp	Tue May 31 23:13:20 2011 +0200+++ b/indra/newview/llviewermessage.cpp	Sun Jun 05 04:15:17 2011 -0400@@ -113,6 +113,7 @@ // [/RLVa:KB]  #include "fsareasearch.h"+#include "fsdata.h"  #include <boost/algorithm/string/split.hpp> // #include <boost/regex.hpp>@@ -2484,6 +2485,10 @@ */ 			if (!mute_im || is_linden)  			{+				// checkfor and process reqinfo+				message = FSData::processRequestForInfo(from_id,message,name,session_id);+				buffer = saved + message;+ 				gIMMgr->addMessage( 					session_id, 					from_id,diff -r 29a6b40dc6b0 indra/newview/skins/default/xui/en/notifications.xml--- a/indra/newview/skins/default/xui/en/notifications.xml	Tue May 31 23:13:20 2011 +0200+++ b/indra/newview/skins/default/xui/en/notifications.xml	Sun Jun 05 04:15:17 2011 -0400@@ -7138,3 +7138,34 @@   </notification>  </notifications>++<!-- fsdata -->+<notification+   icon="alertmodal.tga"+   name="BlockLoginInfo"+   type="alertmodal">+    [REASON]+    <usetemplate+     name="okbutton"+     yestext="OK"/>+</notification>++<notification+   icon="notify.tga"+   name="FireStormReqInfo"+   type="notify">+    [NAME] is requesting that you send them information about your Phoenix setup.+    (This is the same information that can be found by going to Help->About Phoenix)    +    [REASON]+    Would you like to send them this information?+    <form name="form">+      <button+       index="0"+       name="Yes"+       text="Yes"/>+      <button+       index="1"+       name="No"+       text="No"/>+    </form>+</notification>