void TX_ToLowerCase(nsAString& aString) { nsAString::iterator fromBegin, fromEnd; ConvertToLowerCase converter; copy_string(aString.BeginWriting(fromBegin), aString.EndWriting(fromEnd), converter); }
nsresult nsSOAPUtils::MakeNamespacePrefix(nsISOAPEncoding * aEncoding, nsIDOMElement * aScope, const nsAString & aURI, nsAString & aPrefix) { // This may change for level 3 serialization, so be sure to gut this // and call the standardized level 3 method when it is available. nsAutoString externalURI; if (aEncoding) { nsresult rc = aEncoding->GetExternalSchemaURI(aURI,externalURI); if (NS_FAILED(rc)) return rc; } else { externalURI.Assign(aURI); } aPrefix.Truncate(); if (externalURI.IsEmpty()) return NS_OK; if (externalURI.Equals(gSOAPStrings->kXMLNamespaceURI)) { aPrefix.Assign(gSOAPStrings->kXMLPrefix); return NS_OK; } nsCOMPtr<nsIDOMNode> current = aScope; nsCOMPtr<nsIDOMNamedNodeMap> attrs; nsCOMPtr<nsIDOMNode> temp; nsAutoString tstr; nsresult rc; PRUint32 maxns = 0; // Keep track of max generated NS for (;;) { rc = current->GetAttributes(getter_AddRefs(attrs)); if (NS_FAILED(rc)) return rc; if (attrs) { PRUint32 i; PRUint32 count; rc = attrs->GetLength(&count); if (NS_FAILED(rc)) return PR_FALSE; for (i = 0;i < count;i++) { attrs->Item(i, getter_AddRefs(temp)); if (!temp) break; temp->GetNamespaceURI(tstr); if (!tstr.Equals(gSOAPStrings->kXMLNamespaceNamespaceURI)) continue; temp->GetNodeValue(tstr); if (tstr.Equals(externalURI)) { nsAutoString prefix; rc = temp->GetLocalName(prefix); if (NS_FAILED(rc)) return rc; nsCOMPtr<nsIDOMNode> check = aScope; PRBool hasDecl; nsCOMPtr<nsIDOMElement> echeck; while (check != current) { // Make sure prefix is not overridden echeck = do_QueryInterface(check); if (echeck) { rc = echeck-> HasAttributeNS(gSOAPStrings->kXMLNamespaceNamespaceURI, prefix, &hasDecl); if (NS_FAILED(rc)) return rc; if (hasDecl) break; echeck->GetParentNode(getter_AddRefs(check)); } } if (check == current) { aPrefix.Assign(prefix); return NS_OK; } } rc = temp->GetLocalName(tstr); if (NS_FAILED(rc)) return rc; else { // Decode the generated namespace into a number nsReadingIterator < PRUnichar > i1; nsReadingIterator < PRUnichar > i2; tstr.BeginReading(i1); tstr.EndReading(i2); if (i1 == i2 || *i1 != 'n') continue; i1++; if (i1 == i2 || *i1 != 's') continue; i1++; PRUint32 n = 0; while (i1 != i2) { PRUnichar c = *i1; i1++; if (c < '0' || c > '9') { n = 0; break; } n = n * 10 + (c - '0'); } if (n > maxns) maxns = n; } } } current->GetParentNode(getter_AddRefs(temp)); if (temp) current = temp; else break; } // Create a unique prefix... PRUint32 len = 3; PRUint32 c = maxns + 1; while (c >= 10) { c = c / 10; len++; } // Set the length and write it backwards since that's the easiest way.. aPrefix.SetLength(len); nsWritingIterator < PRUnichar > i2; aPrefix.EndWriting(i2); c = maxns + 1; while (c > 0) { PRUint32 r = c % 10; c = c / 10; i2--; *i2 = (PRUnichar) (r + '0'); } i2--; *i2 = 's'; i2--; *i2 = 'n'; // Declare the fabricated prefix if (aScope) { tstr.Assign(gSOAPStrings->kXMLNamespacePrefix); tstr.Append(aPrefix); rc = aScope->SetAttributeNS(gSOAPStrings->kXMLNamespaceNamespaceURI, tstr, externalURI); } return NS_OK; }