nsresult foundListToArray(T (*aFoundToObject)(GnomeKeyringFound*), GList* aFoundList, PRUint32 *aCount, T **aArray) { PRUint32 count = 0; GList *l = aFoundList; while (l) { count++; l = l->next; } GK_LOG(("Num items: %i\n", count)); T *array = static_cast<T*>(nsMemory::Alloc(count * sizeof(T))); NS_ENSURE_TRUE(array, NS_ERROR_OUT_OF_MEMORY); memset(array, 0, count * sizeof(T)); PRUint32 i = 0; for (GList* l = aFoundList; l != NULL; l = l->next, i++) { GnomeKeyringFound* found = static_cast<GnomeKeyringFound*>(l->data); GK_LOG(("Found item with id %i\n", found->item_id)); T obj = aFoundToObject(found); NS_ENSURE_STATE(obj); array[i] = obj; } *aCount = count; *aArray = array; return NS_OK; }
nsresult GnomeKeyring::deleteFoundItems(GList* foundList, PRBool aExpectOnlyOne = PR_FALSE) { if (foundList == NULL) { GK_LOG(("Found not items to delete")); return NS_OK; } PRUint32 i = 0; for (GList* l = foundList; l != NULL; l = l->next, i++) { GnomeKeyringFound* found = static_cast<GnomeKeyringFound*>(l->data); GK_LOG(("Found item with id %i\n", found->item_id)); GnomeKeyringResult result = gnome_keyring_item_delete_sync(keyringName.get(), found->item_id); if (result != GNOME_KEYRING_RESULT_OK) { return NS_ERROR_FAILURE; } if (i == 1 && aExpectOnlyOne) NS_WARNING("Expected only one item to delete, but found more"); } return NS_OK; }
PRUnichar * foundToHost(GnomeKeyringFound* found) { PRUnichar *host = NULL; GnomeKeyringAttribute *attrArray = (GnomeKeyringAttribute *)found->attributes->data; for (PRUint32 i = 0; i < found->attributes->len; i++) { if (attrArray[i].type != GNOME_KEYRING_ATTRIBUTE_TYPE_STRING) continue; const char *attrName = attrArray[i].name; const char *attrValue = attrArray[i].value.string; GK_LOG(("Attr value %s\n", attrValue)); if (!strcmp(attrName, kDisabledHostAttrName)) host = NS_StringCloneData(NS_ConvertUTF8toUTF16(attrValue)); } // TODO what to do in that case? if (!host) host = NS_StringCloneData(NS_ConvertASCIItoUTF16("undefined")); return host; }
nsresult GnomeKeyring::deleteFoundItems(GList* foundList, bool aExpectOnlyOne = PR_FALSE) { if (foundList == NULL) { GK_LOG(("Found not items to delete")); return NS_OK; } bool deleted = PR_FALSE; for (GList* l = foundList; l != NULL; l = l->next, deleted = PR_TRUE) { if (aExpectOnlyOne && deleted) NS_WARNING("Expected only one item to delete, but found more"); GnomeKeyringFound* found = static_cast<GnomeKeyringFound*>(l->data); GK_LOG(("Found item with id %i\n", found->item_id)); GnomeKeyringResult result = gnome_keyring_item_delete_sync(found->keyring, found->item_id); MGK_GK_CHECK_NS(result); } return NS_OK; }
nsILoginInfo* foundToLoginInfo(GnomeKeyringFound* found) { nsCOMPtr<nsILoginInfo> loginInfo = do_CreateInstance(NS_LOGININFO_CONTRACTID); if (!loginInfo) return nullptr; loginInfo->SetPassword(NS_ConvertUTF8toUTF16(found->secret)); GnomeKeyringAttribute *attrArray = (GnomeKeyringAttribute *)found->attributes->data; for (PRUint32 i = 0; i < found->attributes->len; i++) { if (attrArray[i].type != GNOME_KEYRING_ATTRIBUTE_TYPE_STRING) continue; const char *attrName = attrArray[i].name; const char *attrValue = attrArray[i].value.string; GK_LOG(("Attr value %s\n", attrValue)); if (!strcmp(attrName, kHostnameAttr)) loginInfo->SetHostname(NS_ConvertUTF8toUTF16(attrValue)); else if (!strcmp(attrName, kFormSubmitURLAttr)) loginInfo->SetFormSubmitURL(NS_ConvertUTF8toUTF16(attrValue)); else if (!strcmp(attrName, kHttpRealmAttr)) loginInfo->SetHttpRealm(NS_ConvertUTF8toUTF16(attrValue)); else if (!strcmp(attrName, kUsernameAttr)) loginInfo->SetUsername(NS_ConvertUTF8toUTF16(attrValue)); else if (!strcmp(attrName, kUsernameFieldAttr)) loginInfo->SetUsernameField(NS_ConvertUTF8toUTF16(attrValue)); else if (!strcmp(attrName, kPasswordFieldAttr)) loginInfo->SetPasswordField(NS_ConvertUTF8toUTF16(attrValue)); else NS_WARNING(("Unknown %s attribute name", attrName)); } NS_ADDREF((nsILoginInfo*) loginInfo); return loginInfo; }