diff options
Diffstat (limited to 'indra')
| -rw-r--r-- | indra/llui/llnotifications.cpp | 10 | ||||
| -rw-r--r-- | indra/llui/llsdparam.cpp | 33 | ||||
| -rw-r--r-- | indra/llxml/llxmlnode.cpp | 87 | ||||
| -rw-r--r-- | indra/llxml/llxmlnode.h | 5 | ||||
| -rw-r--r-- | indra/llxuixml/llinitparam.cpp | 5 | ||||
| -rw-r--r-- | indra/llxuixml/llinitparam.h | 31 | ||||
| -rw-r--r-- | indra/llxuixml/llxuiparser.cpp | 12 | 
7 files changed, 66 insertions, 117 deletions
| diff --git a/indra/llui/llnotifications.cpp b/indra/llui/llnotifications.cpp index 48128e0b40..7e1e2c3c9b 100644 --- a/indra/llui/llnotifications.cpp +++ b/indra/llui/llnotifications.cpp @@ -223,14 +223,6 @@ LLNotificationForm::LLNotificationForm(const std::string& name, const LLNotifica  	LLParamSDParser parser;  	parser.writeSD(mFormData, p.form_elements); -	if (!mFormData.isArray() && !mFormData.isUndefined()) -	{ -		// change existing contents to a one element array -		LLSD new_llsd_array = LLSD::emptyArray(); -		new_llsd_array.append(mFormData); -		mFormData = new_llsd_array; -	} -  	for (LLSD::array_iterator it = mFormData.beginArray(), end_it = mFormData.endArray();  		it != end_it;  		++it) @@ -516,7 +508,7 @@ LLSD LLNotification::asLLSD()  	p.id = mId;  	p.name = mTemplatep->mName;  	p.form_elements = getForm()->asLLSD(); - +	  	p.substitutions = mSubstitutions;  	p.payload = mPayload;  	p.time_stamp = mTimestamp; diff --git a/indra/llui/llsdparam.cpp b/indra/llui/llsdparam.cpp index 811e20e810..5a0d688f4f 100644 --- a/indra/llui/llsdparam.cpp +++ b/indra/llui/llsdparam.cpp @@ -223,10 +223,14 @@ LLSD& LLParamSDParserUtilities::getSDWriteNode(LLSD& input, LLInitParam::Parser:  	{  		bool new_traversal = it->second; -		LLSD* child_sd = it->first.empty() ? sd_to_write : &(*sd_to_write)[it->first]; - -		if (child_sd->isArray()) +		LLSD* child_sd; +		if (it->first.empty())  		{ +			child_sd = sd_to_write; +			if (child_sd->isUndefined()) +			{ +				*child_sd = LLSD::emptyArray(); +			}  			if (new_traversal)  			{  				// write to new element at end @@ -240,22 +244,7 @@ LLSD& LLParamSDParserUtilities::getSDWriteNode(LLSD& input, LLInitParam::Parser:  		}  		else  		{ -			if (new_traversal  -				&& child_sd->isDefined()  -				&& !child_sd->isArray()) -			{ -				// copy child contents into first element of an array -				LLSD new_array = LLSD::emptyArray(); -				new_array.append(*child_sd); -				// assign array to slot that previously held the single value -				*child_sd = new_array; -				// return next element in that array -				sd_to_write = &((*child_sd)[1]); -			} -			else -			{ -				sd_to_write = child_sd; -			} +			sd_to_write = &(*sd_to_write)[it->first];  		}  		it->second = false;  	} @@ -283,11 +272,9 @@ void LLParamSDParserUtilities::readSDValues(read_sd_cb_t cb, const LLSD& sd, LLI  			it != sd.endArray();  			++it)  		{ -			if (!stack.empty()) -			{ -				stack.back().second = true; -			} +			stack.push_back(make_pair(std::string(), true));  			readSDValues(cb, *it, stack); +			stack.pop_back();  		}  	}  	else if (sd.isUndefined()) diff --git a/indra/llxml/llxmlnode.cpp b/indra/llxml/llxmlnode.cpp index 2ffb0d8503..45839595a0 100644 --- a/indra/llxml/llxmlnode.cpp +++ b/indra/llxml/llxmlnode.cpp @@ -259,7 +259,7 @@ BOOL LLXMLNode::removeChild(LLXMLNode *target_child)  	return FALSE;  } -void LLXMLNode::addChild(LLXMLNodePtr new_child, LLXMLNodePtr after_child) +void LLXMLNode::addChild(LLXMLNodePtr& new_child)  {  	if (new_child->mParent != NULL)  	{ @@ -273,6 +273,11 @@ void LLXMLNode::addChild(LLXMLNodePtr new_child, LLXMLNodePtr after_child)  	new_child->mParent = this;  	if (new_child->mIsAttribute)  	{ +		LLXMLAttribList::iterator found_it = mAttributes.find(new_child->mName); +		if (found_it != mAttributes.end()) +		{ +			removeChild(found_it->second); +		}  		mAttributes.insert(std::make_pair(new_child->mName, new_child));  	}  	else @@ -285,49 +290,11 @@ void LLXMLNode::addChild(LLXMLNodePtr new_child, LLXMLNodePtr after_child)  		}  		mChildren->map.insert(std::make_pair(new_child->mName, new_child)); -		// if after_child is specified, it damn well better be in the list of children -		// for this node. I'm not going to assert that, because it would be expensive, -		// but don't specify that parameter if you didn't get the value for it from the -		// list of children of this node! -		if (after_child.isNull()) -		{ -			if (mChildren->tail != new_child) -			{ -				mChildren->tail->mNext = new_child; -				new_child->mPrev = mChildren->tail; -				mChildren->tail = new_child; -			} -		} -		// if after_child == parent, then put new_child at beginning -		else if (after_child == this) -		{ -			// add to front of list -			new_child->mNext = mChildren->head; -			if (mChildren->head) -			{ -				mChildren->head->mPrev = new_child; -				mChildren->head = new_child; -			} -			else // no children -			{ -				mChildren->head = new_child; -				mChildren->tail = new_child; -			} -		} -		else +		if (mChildren->tail != new_child)  		{ -			if (after_child->mNext.notNull()) -			{ -				// if after_child was not the last item, fix up some pointers -				after_child->mNext->mPrev = new_child; -				new_child->mNext = after_child->mNext; -			} -			new_child->mPrev = after_child; -			after_child->mNext = new_child; -			if (mChildren->tail == after_child) -			{ -				mChildren->tail = new_child; -			} +			mChildren->tail->mNext = new_child; +			new_child->mPrev = mChildren->tail; +			mChildren->tail = new_child;  		}  	} @@ -343,8 +310,9 @@ LLXMLNodePtr LLXMLNode::createChild(const char* name, BOOL is_attribute)  // virtual   LLXMLNodePtr LLXMLNode::createChild(LLStringTableEntry* name, BOOL is_attribute)  { -	LLXMLNode* ret = new LLXMLNode(name, is_attribute); +	LLXMLNodePtr ret(new LLXMLNode(name, is_attribute));  	ret->mID.clear(); +	  	addChild(ret);  	return ret;  } @@ -358,11 +326,12 @@ BOOL LLXMLNode::deleteChild(LLXMLNode *child)  	return FALSE;  } -void LLXMLNode::setParent(LLXMLNodePtr new_parent) +void LLXMLNode::setParent(LLXMLNodePtr& new_parent)  {  	if (new_parent.notNull())  	{ -		new_parent->addChild(this); +		LLXMLNodePtr this_ptr(this); +		new_parent->addChild(this_ptr);  	}  	else  	{ @@ -681,27 +650,6 @@ bool LLXMLNode::updateNode(  	return TRUE;  } - -// static  -LLXMLNodePtr LLXMLNode::replaceNode(LLXMLNodePtr node, LLXMLNodePtr update_node) -{	 -	if (!node || !update_node) -	{ -		llwarns << "Node invalid" << llendl; -		return node; -	} -	 -	LLXMLNodePtr cloned_node = update_node->deepCopy(); -	node->mParent->addChild(cloned_node, node);	// add after node -	LLXMLNodePtr parent = node->mParent; -	parent->removeChild(node); -	parent->updateDefault(); -	 -	return cloned_node; -} - - -  // static  bool LLXMLNode::parseFile(const std::string& filename, LLXMLNodePtr& node, LLXMLNode* defaults_tree)  { @@ -1198,7 +1146,7 @@ void LLXMLNode::scrubToTree(LLXMLNode *tree)  		std::vector<LLXMLNodePtr>::iterator itor3;  		for (itor3=to_delete_list.begin(); itor3!=to_delete_list.end(); ++itor3)  		{ -			(*itor3)->setParent(NULL); +			(*itor3)->setParent(LLXMLNodePtr());  		}  	}  } @@ -2733,7 +2681,8 @@ void LLXMLNode::setName(LLStringTableEntry* name)  	mName = name;  	if (old_parent)  	{ -		old_parent->addChild(this); +		LLXMLNodePtr this_ptr(this); +		old_parent->addChild(this_ptr);  	}  } diff --git a/indra/llxml/llxmlnode.h b/indra/llxml/llxmlnode.h index e3da7169e7..ec486d7957 100644 --- a/indra/llxml/llxmlnode.h +++ b/indra/llxml/llxmlnode.h @@ -127,8 +127,8 @@ public:  	BOOL isNull();  	BOOL deleteChild(LLXMLNode* child); -    void addChild(LLXMLNodePtr new_child, LLXMLNodePtr after_child = LLXMLNodePtr(NULL));  -    void setParent(LLXMLNodePtr new_parent); // reparent if necessary +    void addChild(LLXMLNodePtr& new_child);  +    void setParent(LLXMLNodePtr& new_parent); // reparent if necessary      // Serialization  	static bool parseFile( @@ -147,7 +147,6 @@ public:  	static bool updateNode(  		LLXMLNodePtr& node,  		LLXMLNodePtr& update_node); -	static LLXMLNodePtr replaceNode(LLXMLNodePtr node, LLXMLNodePtr replacement_node);  	static bool getLayeredXMLNode(LLXMLNodePtr& root, const std::vector<std::string>& paths); diff --git a/indra/llxuixml/llinitparam.cpp b/indra/llxuixml/llinitparam.cpp index 3c0d0aaa7e..bb160b3c0b 100644 --- a/indra/llxuixml/llinitparam.cpp +++ b/indra/llxuixml/llinitparam.cpp @@ -227,12 +227,7 @@ namespace LLInitParam  			if (serialize_func)  			{  				const Param* diff_param = diff_block ? diff_block->getParamFromHandle(param_handle) : NULL; -				// each param descriptor remembers its serial number -				// so we can inspect the same param under different names -				// and see that it has the same number -				name_stack.push_back(std::make_pair("", true));  				serialize_func(*param, parser, name_stack, diff_param); -				name_stack.pop_back();  			}  		} diff --git a/indra/llxuixml/llinitparam.h b/indra/llxuixml/llinitparam.h index d44ccac6e4..606676be2c 100644 --- a/indra/llxuixml/llinitparam.h +++ b/indra/llxuixml/llinitparam.h @@ -1317,10 +1317,18 @@ namespace LLInitParam  		static bool deserializeParam(Param& param, Parser& parser, const Parser::name_stack_range_t& name_stack_range, bool new_name)  		{  +			Parser::name_stack_range_t new_name_stack_range(name_stack_range);  			self_t& typed_param = static_cast<self_t&>(param);  			value_t value; + +			// pop first element if empty string +			if (new_name_stack_range.first != new_name_stack_range.second && new_name_stack_range.first->first.empty()) +			{ +				++new_name_stack_range.first; +			} +  			// no further names in stack, attempt to parse value now -			if (name_stack_range.first == name_stack_range.second) +			if (new_name_stack_range.first == new_name_stack_range.second)  			{  				// attempt to read value directly  				if (parser.readValue(value)) @@ -1353,14 +1361,14 @@ namespace LLInitParam  		static void serializeParam(const Param& param, Parser& parser, Parser::name_stack_t& name_stack, const Param* diff_param)  		{  			const self_t& typed_param = static_cast<const self_t&>(param); -			if (!typed_param.isProvided() || name_stack.empty()) return; +			if (!typed_param.isProvided()) return;  			for (const_iterator it = typed_param.mValues.begin(), end_it = typed_param.mValues.end();  				it != end_it;  				++it)  			{  				std::string key = it->getValueName(); -				name_stack.back().second = true; +				name_stack.push_back(std::make_pair(std::string(), true));  				if(key.empty())  				// not parsed via name values, write out value directly @@ -1382,6 +1390,8 @@ namespace LLInitParam  						break;  					}  				} + +				name_stack.pop_back();  			}  		} @@ -1519,9 +1529,16 @@ namespace LLInitParam  		static bool deserializeParam(Param& param, Parser& parser, const Parser::name_stack_range_t& name_stack_range, bool new_name)   		{  +			Parser::name_stack_range_t new_name_stack_range(name_stack_range);  			self_t& typed_param = static_cast<self_t&>(param);  			bool new_value = false; +			// pop first element if empty string +			if (new_name_stack_range.first != new_name_stack_range.second && new_name_stack_range.first->first.empty()) +			{ +				new_value |= new_name_stack_range.first->second; +				++new_name_stack_range.first; +			}  			if (new_name || typed_param.mValues.empty())  			{  				new_value = true; @@ -1531,7 +1548,7 @@ namespace LLInitParam  			param_value_t& value = typed_param.mValues.back();  			// attempt to parse block... -			if(value.deserializeBlock(parser, name_stack_range, new_name)) +			if(value.deserializeBlock(parser, new_name_stack_range, new_name))  			{  				typed_param.setProvided();  				return true; @@ -1564,13 +1581,13 @@ namespace LLInitParam  		static void serializeParam(const Param& param, Parser& parser, Parser::name_stack_t& name_stack, const Param* diff_param)  		{  			const self_t& typed_param = static_cast<const self_t&>(param); -			if (!typed_param.isProvided() || name_stack.empty()) return; +			if (!typed_param.isProvided()) return;  			for (const_iterator it = typed_param.mValues.begin(), end_it = typed_param.mValues.end();  				it != end_it;  				++it)  			{ -				name_stack.back().second = true; +				name_stack.push_back(std::make_pair(std::string(), true));  				std::string key = it->getValueName();  				if (!key.empty()) @@ -1583,6 +1600,8 @@ namespace LLInitParam  				{  					it->serializeBlock(parser, name_stack, NULL);  				} + +				name_stack.pop_back();  			}  		} diff --git a/indra/llxuixml/llxuiparser.cpp b/indra/llxuixml/llxuiparser.cpp index 9cd88a1620..3ad5ad7d42 100644 --- a/indra/llxuixml/llxuiparser.cpp +++ b/indra/llxuixml/llxuiparser.cpp @@ -621,7 +621,7 @@ void LLXUIXSDWriter::writeXSD(const std::string& type_name, const std::string& p  			nodep->createChild("schemaLocation", true)->setStringValue(widget_name + ".xsd");  			// add to front of schema -			mSchemaNode->addChild(nodep, mSchemaNode); +			mSchemaNode->addChild(nodep);  		}  		for (widget_registry_t::Registrar::registry_map_t::const_iterator it = widget_registryp->currentRegistrar().beginItems(); @@ -877,16 +877,24 @@ LLXMLNodePtr LLXUIParser::getNode(name_stack_t& stack)  		it = next_it)  	{  		++next_it; +		bool force_new_node = false; +  		if (it->first.empty())  		{  			it->second = false;  			continue;  		} +		if (next_it != stack.end() && next_it->first.empty() && next_it->second) +		{ +			force_new_node = true; +		} + +  		out_nodes_t::iterator found_it = mOutNodes.find(it->first);  		// node with this name not yet written -		if (found_it == mOutNodes.end() || it->second) +		if (found_it == mOutNodes.end() || it->second || force_new_node)  		{  			// make an attribute if we are the last element on the name stack  			bool is_attribute = next_it == stack.end(); | 
