Files
Mozilla/mozilla/caps/src/nsPrincipalArray.cpp
arielb%netscape.com 788241b16c Fix to bug 11330 and some changes to reduce warnings in linux builds
git-svn-id: svn://10.0.0.236/trunk@42661 18797224-902f-48f8-a5cc-f745e15eee43
1999-08-07 19:59:31 +00:00

168 lines
4.4 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* The contents of this file are subject to the Netscape Public License
* Version 1.0 (the "NPL"); you may not use this file except in
* compliance with the NPL. You may obtain a copy of the NPL at
* http://www.mozilla.org/NPL/
*
* Software distributed under the NPL is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
* for the specific language governing rights and limitations under the
* NPL.
*
* The Initial Developer of this code under the NPL is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1999 Netscape Communications Corporation. All Rights
* Reserved.
*/
/*used to pass principals through xpcom in arrays*/
#include "nsPrincipalArray.h"
static NS_DEFINE_IID(kIPrincipalArrayIID, NS_IPRINCIPALARRAY_IID);
NS_IMPL_ISUPPORTS(nsPrincipalArray, kIPrincipalArrayIID);
nsPrincipalArray::nsPrincipalArray(void)
{
this->Init(0);
}
nsPrincipalArray::nsPrincipalArray(PRUint32 count)
{
this->Init(count);
}
void
nsPrincipalArray::Init(PRUint32 count)
{
NS_INIT_REFCNT();
NS_ADDREF(this);
this->itsArray = new nsVector();
if(this->itsArray)
this->itsArray->SetSize(count, 1);
}
nsPrincipalArray::~nsPrincipalArray(void)
{
this->FreePrincipalArray();
}
NS_IMETHODIMP
nsPrincipalArray::SetPrincipalArrayElement(PRUint32 itsIndex, nsIPrincipal * principal)
{
if (this->itsArray != NULL) this->itsArray->Set(itsIndex, principal);
return NS_OK;
}
NS_IMETHODIMP
nsPrincipalArray::GetPrincipalArraySize(PRUint32 * size)
{
* size = (this->itsArray == NULL) ? 0 : this->itsArray->GetSize();
return NS_OK;
}
NS_IMETHODIMP
nsPrincipalArray::FreePrincipalArray()
{
if (this->itsArray) {
this->itsArray->RemoveAll();
delete this->itsArray;
}
return NS_OK;
}
NS_IMETHODIMP
nsPrincipalArray::AddPrincipalArrayElement(nsIPrincipal * principal)
{
if(!this->itsArray) this->itsArray = new nsVector();
itsArray->Add(principal);
return NS_OK;
}
NS_IMETHODIMP
nsPrincipalArray::GetPrincipalArrayElement(PRUint32 itsIndex, nsIPrincipal * * result)
{
* result = (this->itsArray) ? (nsIPrincipal *) this->itsArray->Get(itsIndex) : NULL;
return NS_OK;
}
NS_IMETHODIMP
nsPrincipalArray::ComparePrincipalArray(nsIPrincipalArray * other, PRInt16 * comparisonType)
{
nsHashtable * p2Hashtable = new nsHashtable();
PRBool value;
nsIPrincipal * prin;
PRUint32 i;
other->GetPrincipalArraySize(& i);
while (i-- > 0) {
other->GetPrincipalArrayElement(i,& prin);
PrincipalKey prinKey(prin);
p2Hashtable->Put(& prinKey, (void *)PR_TRUE);
}
this->GetPrincipalArraySize(& i);
while (i-- > 0) {
this->GetPrincipalArrayElement(i,& prin);
PrincipalKey prinKey(prin);
value = (PRBool)p2Hashtable->Get(&prinKey);
if (!value)
{
* comparisonType = nsPrincipalArray::SetComparisonType_NoSubset;
return NS_OK;
}
if (value == PR_TRUE) p2Hashtable->Put(& prinKey, (void *)PR_FALSE);
}
other->GetPrincipalArraySize(& i);
while(i-- > 0) {
other->GetPrincipalArrayElement(i,& prin);
PrincipalKey prinKey(prin);
value = (PRBool)p2Hashtable->Get(&prinKey);
if (value == PR_TRUE)
{
* comparisonType = nsPrincipalArray::SetComparisonType_ProperSubset;
return NS_OK;
}
}
* comparisonType = nsPrincipalArray::SetComparisonType_Equal;
return NS_OK;
}
NS_METHOD
nsPrincipalArray::IntersectPrincipalArray(nsIPrincipalArray * other, nsIPrincipalArray * * result)
{
PRUint32 thisLength = 0, otherLength = 0;
this->GetPrincipalArraySize(& thisLength);
other->GetPrincipalArraySize(& otherLength);
nsVector * in = new nsVector();
nsIPrincipal * prin1 = NULL, * prin2 = NULL;
PRUint32 i = 0, j = 0, count = 0;
in->SetSize(thisLength, 1);
PRUint32 inLength = in->GetSize();
PRBool doesIntersect = PR_FALSE, eq = PR_FALSE;
for (i=0; i < thisLength; i++) {
for (j=0; j < otherLength; j++) {
this->GetPrincipalArrayElement(i,& prin1);
other->GetPrincipalArrayElement(j,& prin2);
prin1->Equals(prin2, & eq);
if (eq) {
in->Set(i, (void *)PR_TRUE);
count++;
break;
} else {
in->Set(i, (void *)PR_FALSE);
}
}
}
* result = new nsPrincipalArray(count);
PR_ASSERT(inLength == thisLength);
PR_ASSERT(inLength == inLength);
for (i = 0; i < inLength; i++) {
doesIntersect = (PRBool)in->Get(i);
if (doesIntersect) {
PR_ASSERT(j < count);
this->GetPrincipalArrayElement(i,& prin1);
(* result)->SetPrincipalArrayElement(j, prin1);
j++;
}
}
return NS_OK;
}