Reduce amount of string allocations/copies when doing a search.

This commit is contained in:
rjc%netscape.com 2007-09-06 21:57:01 +00:00
Родитель a6ec7086e1
Коммит 8ff5ccdb74
2 изменённых файлов: 34 добавлений и 42 удалений

Просмотреть файл

@ -48,7 +48,7 @@ interface nsIInternetSearchService : nsISupports
nsIRDFDataSource GetCategoryDataSource(); nsIRDFDataSource GetCategoryDataSource();
}; };
[scriptable, uuid(ac0c0781-ab71-11d3-a652-b09b68feee44)] [noscript, uuid(ac0c0781-ab71-11d3-a652-b09b68feee44)]
interface nsIInternetSearchContext : nsISupports interface nsIInternetSearchContext : nsISupports
{ {
nsIUnicodeDecoder GetUnicodeDecoder(); nsIUnicodeDecoder GetUnicodeDecoder();
@ -56,7 +56,7 @@ interface nsIInternetSearchContext : nsISupports
nsIRDFResource GetEngine(); nsIRDFResource GetEngine();
void AppendBytes(in string buffer, in long numBytes); void AppendBytes(in string buffer, in long numBytes);
void AppendUnicodeBytes(in wstring buffer, in long numUniBytes); void AppendUnicodeBytes(in wstring buffer, in long numUniBytes);
void GetBuffer(out wstring buffer); void GetBufferConst([shared] out wstring buffer);
void Truncate(); void Truncate();
}; };

Просмотреть файл

@ -116,7 +116,7 @@ private:
nsCOMPtr<nsIRDFResource> mParent; nsCOMPtr<nsIRDFResource> mParent;
nsCOMPtr<nsIRDFResource> mEngine; nsCOMPtr<nsIRDFResource> mEngine;
nsCOMPtr<nsIUnicodeDecoder> mUnicodeDecoder; nsCOMPtr<nsIUnicodeDecoder> mUnicodeDecoder;
nsAutoString mBuffer; nsString mBuffer;
public: public:
InternetSearchContext(nsIRDFResource *aParent, nsIRDFResource *aEngine, nsIUnicodeDecoder *aUnicodeDecoder); InternetSearchContext(nsIRDFResource *aParent, nsIRDFResource *aEngine, nsIUnicodeDecoder *aUnicodeDecoder);
@ -201,9 +201,9 @@ InternetSearchContext::AppendUnicodeBytes(const PRUnichar *buffer, PRInt32 numUn
NS_IMETHODIMP NS_IMETHODIMP
InternetSearchContext::GetBuffer(PRUnichar **buffer) InternetSearchContext::GetBufferConst(const PRUnichar **buffer)
{ {
*buffer = NS_CONST_CAST(PRUnichar *, mBuffer.GetUnicode()); *buffer = mBuffer.GetUnicode();
return(NS_OK); return(NS_OK);
} }
@ -322,7 +322,7 @@ friend NS_IMETHODIMP NS_NewInternetSearchService(nsISupports* aOuter, REFNSIID a
nsresult GetNumInterpretSections(const nsString &data, PRUint32 &numInterpretSections); nsresult GetNumInterpretSections(const nsString &data, PRUint32 &numInterpretSections);
nsresult GetInputs(const nsString &data, nsString &userVar, const nsString &text, nsString &input); nsresult GetInputs(const nsString &data, nsString &userVar, const nsString &text, nsString &input);
nsresult GetURL(nsIRDFResource *source, nsIRDFLiteral** aResult); nsresult GetURL(nsIRDFResource *source, nsIRDFLiteral** aResult);
nsresult ParseHTML(nsIURI *aURL, nsIRDFResource *mParent, nsIRDFResource *engine, const nsString &htmlPage); nsresult ParseHTML(nsIURI *aURL, nsIRDFResource *mParent, nsIRDFResource *engine, const PRUnichar *htmlPage);
nsresult SetHint(nsIRDFResource *mParent, nsIRDFResource *hintRes); nsresult SetHint(nsIRDFResource *mParent, nsIRDFResource *hintRes);
nsresult ConvertEntities(nsString &str, PRBool removeHTMLFlag = PR_TRUE, PRBool removeCRLFsFlag = PR_TRUE, PRBool trimWhiteSpaceFlag = PR_TRUE); nsresult ConvertEntities(nsString &str, PRBool removeHTMLFlag = PR_TRUE, PRBool removeCRLFsFlag = PR_TRUE, PRBool trimWhiteSpaceFlag = PR_TRUE);
@ -3355,56 +3355,48 @@ InternetSearchDataSource::OnStopRequest(nsIChannel* channel, nsISupports *ctxt,
rv = mInner->Assert(mEngine, kNC_StatusIcon, engineIconStatusNode, PR_TRUE); rv = mInner->Assert(mEngine, kNC_StatusIcon, engineIconStatusNode, PR_TRUE);
} }
PRUnichar *uniBuf = nsnull; const PRUnichar *uniBuf = nsnull;
if (NS_SUCCEEDED(rv = context->GetBuffer(&uniBuf)) && (uniBuf)) if (NS_SUCCEEDED(rv = context->GetBufferConst(&uniBuf)) && (uniBuf))
{ {
// Note: don't free uniBuf, its really a const * if (mParent)
nsAutoString htmlResults(uniBuf);
context->Truncate();
if (htmlResults.Length() > 0)
{ {
if (mParent) // save HTML result page for this engine
nsCOMPtr<nsIRDFLiteral> htmlLiteral;
if (NS_SUCCEEDED(rv = gRDFService->GetLiteral(uniBuf, getter_AddRefs(htmlLiteral))))
{ {
// save HTML result page for this engine rv = mInner->Assert(mEngine, kNC_HTML, htmlLiteral, PR_TRUE);
const PRUnichar *htmlUni = htmlResults.GetUnicode();
if (htmlUni)
{
nsCOMPtr<nsIRDFLiteral> htmlLiteral;
if (NS_SUCCEEDED(rv = gRDFService->GetLiteral(htmlUni, getter_AddRefs(htmlLiteral))))
{
rv = mInner->Assert(mEngine, kNC_HTML, htmlLiteral, PR_TRUE);
}
}
} }
}
// parse up HTML results // parse up HTML results
rv = ParseHTML(aURL, mParent, mEngine, htmlResults); rv = ParseHTML(aURL, mParent, mEngine, uniBuf);
}
else
{
#ifdef DEBUG_SEARCH_OUTPUT
printf(" *** InternetSearchDataSourceCallback::OnStopRequest: no data.\n\n");
#endif
}
} }
else
{
#ifdef DEBUG_SEARCH_OUTPUT
printf(" *** InternetSearchDataSourceCallback::OnStopRequest: no data.\n\n");
#endif
}
// after we're all done with the html buffer, get rid of it
context->Truncate();
// (do this last) potentially remove the loading attribute // (do this last) potentially remove the loading attribute
nsCOMPtr<nsIRDFLiteral> trueLiteral; nsCOMPtr<nsIRDFLiteral> trueLiteral;
if (NS_SUCCEEDED(rv = gRDFService->GetLiteral(nsAutoString("true").GetUnicode(), getter_AddRefs(trueLiteral)))) if (NS_SUCCEEDED(rv = gRDFService->GetLiteral(nsAutoString("true").GetUnicode(), getter_AddRefs(trueLiteral))))
{ {
mInner->Unassert(mEngine, kNC_loading, trueLiteral); mInner->Unassert(mEngine, kNC_loading, trueLiteral);
}
if (mLoadGroup) if (mLoadGroup)
{
PRUint32 count = 0;
if (NS_SUCCEEDED(rv = mLoadGroup->GetActiveCount(&count)))
{ {
PRUint32 count = 0; // is this the last connection in the loadgroup?
if (NS_SUCCEEDED(rv = mLoadGroup->GetActiveCount(&count))) if (count <= 1)
{ {
// is this the last connection in the loadgroup? Stop();
if (count <= 1)
{
Stop();
}
} }
} }
} }
@ -3416,7 +3408,7 @@ InternetSearchDataSource::OnStopRequest(nsIChannel* channel, nsISupports *ctxt,
nsresult nsresult
InternetSearchDataSource::ParseHTML(nsIURI *aURL, nsIRDFResource *mParent, nsIRDFResource *mEngine, InternetSearchDataSource::ParseHTML(nsIURI *aURL, nsIRDFResource *mParent, nsIRDFResource *mEngine,
const nsString &htmlPage) const PRUnichar *htmlPage)
{ {
// get data out of graph // get data out of graph
nsresult rv; nsresult rv;