si_RemoveUser(const char *passwordRealm, const nsString& userName, PRBool save, PRBool first = PR_FALSE) {
si_RemoveUser(const char *passwordRealm, const nsString& userName, PRBool save, PRBool notify, PRBool first = PR_FALSE) {
si_RemoveUser(const char *passwordRealm, const nsString& userName, PRBool save, PRBool first = PR_FALSE) {  si_SignonURLStruct * url;  si_SignonUserStruct * user;  si_SignonDataStruct * data;  si_lock_signon_list();  /* get URL corresponding to host */  url = si_GetURL(passwordRealm);  if (!url) {    /* URL not found */    si_unlock_signon_list();    return PR_FALSE;  }  /* free the data in each node of the specified user node for this URL */  if (first) {    /* remove the first user */    user = NS_STATIC_CAST(si_SignonUserStruct *,                          url->signonUser_list.ElementAt(0));  } else {    /* find the specified user */    PRInt32 userCount = url->signonUser_list.Count();    for (PRInt32 i=0; i<userCount; i++) {      user = NS_STATIC_CAST(si_SignonUserStruct*, url->signonUser_list.ElementAt(i));      PRInt32 dataCount = user->signonData_list.Count();      for (PRInt32 ii=0; ii<dataCount; ii++) {        data = NS_STATIC_CAST(si_SignonDataStruct*, user->signonData_list.ElementAt(ii));        if (si_CompareEncryptedToCleartext(data->value, userName)) {          goto foundUser;        }      }    }    si_unlock_signon_list();    return PR_FALSE; /* user not found so nothing to remove */    foundUser: ;  }  /* free the user node */  url->signonUser_list.RemoveElement(user);  delete user;  /* remove this URL if it contains no more users */  if (url->signonUser_list.Count() == 0) {    PR_Free(url->passwordRealm);    si_signon_list->RemoveElement(url);    delete url;  }  /* write out the change to disk */  if (save) {    si_signon_list_changed = PR_TRUE;    si_SaveSignonDataLocked();  }  si_unlock_signon_list();  return PR_TRUE;}