void nsCertTree::RemoveCacheEntry(void *key) { PL_DHashTableOperate(&mCompareCache, key, PL_DHASH_REMOVE); }
// static PRBool xptiManifest::Read(xptiInterfaceInfoManager* aMgr, xptiWorkingSet* aWorkingSet) { int i; char* whole = nsnull; PRBool succeeded = PR_FALSE; PRUint32 flen; nsManifestLineReader reader; xptiHashEntry* hashEntry; int headerCount = 0; int dirCount = 0; int fileCount = 0; int zipItemCount = -1; int interfaceCount = 0; int dir; int flags; char* values[6]; // 6 is currently the max items we need to parse int lengths[6]; PRUint32 size32; PRInt64 size; PRInt64 date; whole = ReadManifestIntoMemory(aMgr, &flen); if(!whole) return PR_FALSE; reader.Init(whole, flen); // All exits from here on should be via 'goto out' // Look for "Header" section // This version accepts only version 1,0. We also freak if the header // has more than one entry. The rationale is that we want to force an // autoreg if the xpti.dat file was written by *any* other version of // the software. Future versions may wish to support updating older // manifests in some interesting way. if(!ReadSectionHeader(reader, g_TOKEN_Header, 2, &headerCount)) goto out; if(headerCount != 2) goto out; // Verify the version number if(!reader.NextLine()) goto out; // index,VersionLiteral,major,minor if(4 != reader.ParseLine(values, lengths, 4)) goto out; // index if(0 != atoi(values[0])) goto out; // VersionLiteral if(0 != PL_strcmp(values[1], g_TOKEN_Version)) goto out; // major if(g_VERSION_MAJOR != atoi(values[2])) goto out; // minor if(g_VERSION_MINOR != atoi(values[3])) goto out; // Verify the application directory if(!reader.NextLine()) goto out; // index,AppDirLiteral,directoryname if(3 != reader.ParseLine(values, lengths, 3)) goto out; // index if(1 != atoi(values[0])) goto out; // AppDirLiteral if(0 != PL_strcmp(values[1], g_TOKEN_AppDir)) goto out; if(!CurrentAppDirMatchesPersistentDescriptor(aMgr, values[2])) goto out; // Look for "Directories" section if(!ReadSectionHeader(reader, g_TOKEN_Directories, 1, &dirCount)) goto out; else { // To validate that the directory list matches the current search path // we first confirm that the list lengths match. nsCOMPtr<nsISupportsArray> searchPath; aMgr->GetSearchPath(getter_AddRefs(searchPath)); PRUint32 searchPathCount; searchPath->Count(&searchPathCount); if(dirCount != (int) searchPathCount) goto out; } // Read the directory records for(i = 0; i < dirCount; ++i) { if(!reader.NextLine()) goto out; // index,directoryname if(2 != reader.ParseLine(values, lengths, 2)) goto out; // index if(i != atoi(values[0])) goto out; // directoryname if(!aWorkingSet->DirectoryAtMatchesPersistentDescriptor(i, values[1])) goto out; } // Look for "Files" section if(!ReadSectionHeader(reader, g_TOKEN_Files, 1, &fileCount)) goto out; // Alloc room in the WorkingSet for the filearray. if(!aWorkingSet->NewFileArray(fileCount)) goto out; // Read the file records for(i = 0; i < fileCount; ++i) { if(!reader.NextLine()) goto out; // index,filename,dirIndex,dilesSize,filesDate if(5 != reader.ParseLine(values, lengths, 5)) goto out; // index if(i != atoi(values[0])) goto out; // filename if(!*values[1]) goto out; // dirIndex dir = atoi(values[2]); if(dir < 0 || dir > dirCount) goto out; // fileSize size32 = atoi(values[3]); if(size32 <= 0) goto out; LL_UI2L(size, size32); // fileDate date = nsCRT::atoll(values[4]); if(LL_IS_ZERO(date)) goto out; // Append a new file record to the array. aWorkingSet->AppendFile( xptiFile(nsInt64(size), nsInt64(date), dir, values[1], aWorkingSet)); } // Look for "ZipItems" section if(!ReadSectionHeader(reader, g_TOKEN_ArchiveItems, 0, &zipItemCount)) goto out; // Alloc room in the WorkingSet for the zipItemarray. if(zipItemCount) if(!aWorkingSet->NewZipItemArray(zipItemCount)) goto out; // Read the zipItem records for(i = 0; i < zipItemCount; ++i) { if(!reader.NextLine()) goto out; // index,filename if(2 != reader.ParseLine(values, lengths, 2)) goto out; // index if(i != atoi(values[0])) goto out; // filename if(!*values[1]) goto out; // Append a new zipItem record to the array. aWorkingSet->AppendZipItem(xptiZipItem(values[1], aWorkingSet)); } // Look for "Interfaces" section if(!ReadSectionHeader(reader, g_TOKEN_Interfaces, 1, &interfaceCount)) goto out; // Read the interface records for(i = 0; i < interfaceCount; ++i) { int fileIndex; int zipItemIndex; nsIID iid; xptiInterfaceEntry* entry; xptiTypelib typelibRecord; if(!reader.NextLine()) goto out; // index,interfaceName,iid,fileIndex,zipIndex,flags if(6 != reader.ParseLine(values, lengths, 6)) goto out; // index if(i != atoi(values[0])) goto out; // interfaceName if(!*values[1]) goto out; // iid if(!iid.Parse(values[2])) goto out; // fileIndex fileIndex = atoi(values[3]); if(fileIndex < 0 || fileIndex >= fileCount) goto out; // zipIndex (NOTE: -1 is a valid value) zipItemIndex = atoi(values[4]); if(zipItemIndex < -1 || zipItemIndex >= zipItemCount) goto out; // flags flags = atoi(values[5]); if(flags != 0 && flags != 1) goto out; // Build an InterfaceInfo and hook it in. if(zipItemIndex == -1) typelibRecord.Init(fileIndex); else typelibRecord.Init(fileIndex, zipItemIndex); entry = xptiInterfaceEntry::NewEntry(values[1], lengths[1], iid, typelibRecord, aWorkingSet); if(!entry) goto out; entry->SetScriptableFlag(flags==1); // Add our entry to the iid hashtable. hashEntry = (xptiHashEntry*) PL_DHashTableOperate(aWorkingSet->mNameTable, entry->GetTheName(), PL_DHASH_ADD); if(hashEntry) hashEntry->value = entry; // Add our entry to the name hashtable. hashEntry = (xptiHashEntry*) PL_DHashTableOperate(aWorkingSet->mIIDTable, entry->GetTheIID(), PL_DHASH_ADD); if(hashEntry) hashEntry->value = entry; } // success! succeeded = PR_TRUE; out: if(whole) delete [] whole; if(!succeeded) { // Cleanup the WorkingSet on failure. aWorkingSet->InvalidateInterfaceInfos(); aWorkingSet->ClearHashTables(); aWorkingSet->ClearFiles(); } return succeeded; }