SI_SetBoolPref(pref_WalletExtractTables, PR_FALSE);
wallet_UseFileFetchedDuringPreviousBrowserSession() {  nsresult rv;  nsFileSpec dirSpec;  rv = Wallet_ProfileDirectory(dirSpec);  if (NS_FAILED(rv)) {    return;  }  /* obtain version number */  char * version = nsnull;  SI_GetCharPref(pref_WalletVersion, &version);  /* fetch version number from first line of local composite file */  nsInputFileStream allFile(dirSpec + allFileName);  nsAutoString buffer;  if (NS_FAILED(wallet_GetLine(allFile, buffer))) {    return;  }  buffer.StripWhitespace();  if (buffer.EqualsWithConversion(version)) {    /* This is an optimization but we are skipping it for now.  If the user's tables     * become corrupt but his version number indicates that he is up to date, there     * would be no obvious way for him to restore the tables.  If we did the optimization     * we would save only about 150 milliseconds at wallet startup.     *///  return; /* version hasn't changed so stop now */  }  version = buffer.ToNewCString();  SI_SetCharPref(pref_WalletVersion, version);  Recycle(version);  /* get next line of local composite file.   *  This is name of first subfile in the composite file   */  if (NS_FAILED(wallet_GetLine(allFile, buffer))) {    return;  }  /* process each subfile in the composite file */  PRBool atEnd = PR_FALSE;  while(!atEnd) {    /* obtain subfile name and open it as an output stream */    if (buffer.CharAt(0) != '@') {      break; /* error */    }    buffer.StripWhitespace();    nsAutoString filename;    buffer.Right(filename, buffer.Length()-1);    nsOutputFileStream thisFile(dirSpec + filename);    /* copy each line in composite file to the subfile */    for (;;) {      if (NS_FAILED(wallet_GetLine(allFile, buffer))) {        /* end of composite file reached */        atEnd = PR_TRUE;        break;      }      if (buffer.Length() > 0 && buffer.CharAt(0) == '@') {        /* start of next subfile reached */        break;      }      wallet_PutLine(thisFile, buffer);    }  }}