AtkAttributeSet* ConvertToAtkAttributeSet(nsIPersistentProperties* aAttributes) { if (!aAttributes) return nsnull; AtkAttributeSet *objAttributeSet = nsnull; nsCOMPtr<nsISimpleEnumerator> propEnum; nsresult rv = aAttributes->Enumerate(getter_AddRefs(propEnum)); NS_ENSURE_SUCCESS(rv, nsnull); PRBool hasMore; while (NS_SUCCEEDED(propEnum->HasMoreElements(&hasMore)) && hasMore) { nsCOMPtr<nsISupports> sup; rv = propEnum->GetNext(getter_AddRefs(sup)); NS_ENSURE_SUCCESS(rv, objAttributeSet); nsCOMPtr<nsIPropertyElement> propElem(do_QueryInterface(sup)); NS_ENSURE_TRUE(propElem, objAttributeSet); nsCAutoString name; rv = propElem->GetKey(name); NS_ENSURE_SUCCESS(rv, objAttributeSet); nsAutoString value; rv = propElem->GetValue(value); NS_ENSURE_SUCCESS(rv, objAttributeSet); AtkAttribute *objAttr = (AtkAttribute *)g_malloc(sizeof(AtkAttribute)); objAttr->name = g_strdup(name.get()); objAttr->value = g_strdup(NS_ConvertUTF16toUTF8(value).get()); objAttributeSet = g_slist_prepend(objAttributeSet, objAttr); } //libspi will free it return objAttributeSet; }
bool DocAccessibleChild::RecvAttributes(const uint64_t& aID, nsTArray<Attribute>* aAttributes) { Accessible* acc = IdToAccessible(aID); if (!acc) return true; nsCOMPtr<nsIPersistentProperties> props = acc->Attributes(); if (!props) return true; nsCOMPtr<nsISimpleEnumerator> propEnum; nsresult rv = props->Enumerate(getter_AddRefs(propEnum)); NS_ENSURE_SUCCESS(rv, false); bool hasMore; while (NS_SUCCEEDED(propEnum->HasMoreElements(&hasMore)) && hasMore) { nsCOMPtr<nsISupports> sup; rv = propEnum->GetNext(getter_AddRefs(sup)); NS_ENSURE_SUCCESS(rv, false); nsCOMPtr<nsIPropertyElement> propElem(do_QueryInterface(sup)); NS_ENSURE_TRUE(propElem, false); nsAutoCString name; rv = propElem->GetKey(name); NS_ENSURE_SUCCESS(rv, false); nsAutoString value; rv = propElem->GetValue(value); NS_ENSURE_SUCCESS(rv, false); aAttributes->AppendElement(Attribute(name, value)); } return true; }