bool VLPrefixSet::GetSmallestPrefix(nsDependentCSubstring& aOutString) { PrefixString* pick = nullptr; for (auto iter = mMap.ConstIter(); !iter.Done(); iter.Next()) { PrefixString* str = iter.Data(); if (!str->get()) { continue; } if (aOutString.IsEmpty()) { aOutString.Rebind(str->get(), iter.Key()); pick = str; continue; } nsDependentCSubstring cur(str->get(), iter.Key()); if (cur < aOutString) { aOutString.Rebind(str->get(), iter.Key()); pick = str; } } if (pick) { pick->next(); } return pick != nullptr; }
void VolumeManager::OnLineRead(int aFd, nsDependentCSubstring& aMessage) { MOZ_ASSERT(aFd == mSocket.get()); char* endPtr; int responseCode = strtol(aMessage.Data(), &endPtr, 10); if (*endPtr == ' ') { endPtr++; } // Now fish out the rest of the line after the response code nsDependentCString responseLine(endPtr, aMessage.Length() - (endPtr - aMessage.Data())); DBG("Rcvd: %d '%s'", responseCode, responseLine.Data()); if (responseCode >= ::ResponseCode::UnsolicitedInformational) { // These are unsolicited broadcasts. We intercept these and process // them ourselves HandleBroadcast(responseCode, responseLine); } else { // Everything else is considered to be part of the command response. if (mCommands.size() > 0) { VolumeCommand* cmd = mCommands.front(); cmd->HandleResponse(responseCode, responseLine); if (responseCode >= ::ResponseCode::CommandOkay) { // That's a terminating response. We can remove the command. mCommands.pop(); mCommandPending = false; // Start the next command, if there is one. WriteCommandData(); } } else { ERR("Response with no command"); } } }
/* static */ nsresult DataStorage::Reader::ParseLine(nsDependentCSubstring& aLine, nsCString& aKeyOut, Entry& aEntryOut) { // First find the indices to each part of the line. int32_t scoreIndex; scoreIndex = aLine.FindChar('\t', 0) + 1; if (scoreIndex <= 0) { return NS_ERROR_UNEXPECTED; } int32_t accessedIndex = aLine.FindChar('\t', scoreIndex) + 1; if (accessedIndex <= 0) { return NS_ERROR_UNEXPECTED; } int32_t valueIndex = aLine.FindChar('\t', accessedIndex) + 1; if (valueIndex <= 0) { return NS_ERROR_UNEXPECTED; } // Now make substrings based on where each part is. nsDependentCSubstring keyPart(aLine, 0, scoreIndex - 1); nsDependentCSubstring scorePart(aLine, scoreIndex, accessedIndex - scoreIndex - 1); nsDependentCSubstring accessedPart(aLine, accessedIndex, valueIndex - accessedIndex - 1); nsDependentCSubstring valuePart(aLine, valueIndex); nsresult rv; rv = DataStorage::ValidateKeyAndValue(nsCString(keyPart), nsCString(valuePart)); if (NS_FAILED(rv)) { return NS_ERROR_UNEXPECTED; } // Now attempt to decode the score part as a uint32_t. // XXX nsDependentCSubstring doesn't support ToInteger int32_t integer = nsCString(scorePart).ToInteger(&rv); if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } if (integer < 0) { return NS_ERROR_UNEXPECTED; } aEntryOut.mScore = (uint32_t)integer; integer = nsCString(accessedPart).ToInteger(&rv); if (NS_FAILED(rv)) { return rv; } if (integer < 0) { return NS_ERROR_UNEXPECTED; } aEntryOut.mLastAccessed = integer; // Now set the key and value. aKeyOut.Assign(keyPart); aEntryOut.mValue.Assign(valuePart); return NS_OK; }
/* static */ bool MatchAutoCompleteFunction::findBeginning(const nsDependentCSubstring &aToken, const nsACString &aSourceString) { NS_PRECONDITION(!aToken.IsEmpty(), "Don't search for an empty token!"); // We can't use StringBeginsWith here, unfortunately. Although it will // happily take a case-insensitive UTF8 comparator, it eventually calls // nsACString::Equals, which checks that the two strings contain the same // number of bytes before calling the comparator. This is clearly not what // we want. const_char_iterator tokenStart(aToken.BeginReading()), tokenEnd(aToken.EndReading()), sourceStart(aSourceString.BeginReading()), sourceEnd(aSourceString.EndReading()); PRBool dummy; while (sourceStart < sourceEnd && CaseInsensitiveUTF8CharsEqual(sourceStart, tokenStart, sourceEnd, tokenEnd, &sourceStart, &tokenStart, &dummy)) { // We found the token! if (tokenStart >= tokenEnd) { return true; } } // We don't need to check CaseInsensitiveUTF8CharsEqual's error condition // (stored in |dummy|), since the function will return false if it // encounters an error. return false; }
static void AppendPrefixToMap(PrefixStringMap& prefixes, nsDependentCSubstring& prefix) { if (!prefix.Length()) { return; } nsCString* prefixString = prefixes.LookupOrAdd(prefix.Length()); prefixString->Append(prefix.BeginReading(), prefix.Length()); }
NS_IMETHODIMP nsStringInputStream::ReadSegments(nsWriteSegmentFun aWriter, void* aClosure, uint32_t aCount, uint32_t* aResult) { NS_ASSERTION(aResult, "null ptr"); NS_ASSERTION(Length() >= mOffset, "bad stream state"); if (Closed()) { return NS_BASE_STREAM_CLOSED; } // We may be at end-of-file uint32_t maxCount = LengthRemaining(); if (maxCount == 0) { *aResult = 0; return NS_OK; } if (aCount > maxCount) { aCount = maxCount; } nsresult rv = aWriter(this, aClosure, mData.BeginReading() + mOffset, 0, aCount, aResult); if (NS_SUCCEEDED(rv)) { NS_ASSERTION(*aResult <= aCount, "writer should not write more than we asked it to write"); mOffset += *aResult; } // errors returned from the writer end here! return NS_OK; }
NS_IMETHODIMP nsStringInputStream::SetData(const nsACString& aData) { mData.Assign(aData); mOffset = 0; return NS_OK; }
void Tokenizer::Claim(nsDependentCSubstring& aResult, ClaimInclusion aInclusion) { nsACString::const_char_iterator close = aInclusion == EXCLUDE_LAST ? mRollback : mCursor; aResult.Rebind(mRecord, close - mRecord); }
/* static */ bool MatchAutoCompleteFunction::findBeginningCaseSensitive( const nsDependentCSubstring &aToken, const nsACString &aSourceString) { NS_PRECONDITION(!aToken.IsEmpty(), "Don't search for an empty token!"); return StringBeginsWith(aSourceString, aToken); }
NS_IMETHODIMP nsStringInputStream::AdoptData(char* aData, int32_t aDataLen) { if (NS_WARN_IF(!aData)) { return NS_ERROR_INVALID_ARG; } mData.Adopt(aData, aDataLen); mOffset = 0; return NS_OK; }
NS_IMETHODIMP nsStringInputStream::SetData(const nsACString& aData) { if (NS_WARN_IF(!mData.Assign(aData, fallible))) { return NS_ERROR_OUT_OF_MEMORY; } mOffset = 0; return NS_OK; }
bool Tokenizer::ReadWord(nsDependentCSubstring& aValue) { Token t; if (!Check(TOKEN_WORD, t)) { return false; } aValue.Rebind(t.AsString().BeginReading(), t.AsString().Length()); return true; }
void NetdClient::OnLineRead(int aFd, nsDependentCSubstring& aMessage) { // Set errno to 0 first. For preventing to use the stale version of errno. errno = 0; // We found a line terminator. Each line is formatted as an // integer response code followed by the rest of the line. // Fish out the response code. int responseCode = strtol(aMessage.Data(), nullptr, 10); if (!errno) { NetdCommand* response = new NetdCommand(); // Passing all the response message, including the line terminator. response->mSize = aMessage.Length(); memcpy(response->mData, aMessage.Data(), aMessage.Length()); gNetdConsumer->MessageReceived(response); } if (!responseCode) { LOG("Can't parse netd's response"); } }
NS_IMETHODIMP nsStringInputStream::SetData(const char* aData, int32_t aDataLen) { if (NS_WARN_IF(!aData)) { return NS_ERROR_INVALID_ARG; } if (NS_WARN_IF(!mData.Assign(aData, aDataLen, fallible))) { return NS_ERROR_OUT_OF_MEMORY; } mOffset = 0; return NS_OK; }
NS_IMETHODIMP nsStringInputStream::ShareData(const char* aData, int32_t aDataLen) { if (NS_WARN_IF(!aData)) { return NS_ERROR_INVALID_ARG; } if (aDataLen < 0) { aDataLen = strlen(aData); } mData.Rebind(aData, aDataLen); mOffset = 0; return NS_OK; }
nsresult nsNetscapeProfileMigratorBase::ImportNetscapeCookies(nsIFile* aCookiesFile) { nsresult rv; nsCOMPtr<nsIInputStream> cookiesStream; rv = NS_NewLocalFileInputStream(getter_AddRefs(cookiesStream), aCookiesFile); if (NS_FAILED(rv)) return rv; nsCOMPtr<nsILineInputStream> lineInputStream(do_QueryInterface(cookiesStream)); // This code is copied from mozilla/netwerk/cookie/src/nsCookieManager.cpp static NS_NAMED_LITERAL_CSTRING(kTrue, "TRUE"); nsCAutoString buffer; PRBool isMore = PR_TRUE; PRInt32 hostIndex = 0, isDomainIndex, pathIndex, secureIndex, expiresIndex, nameIndex, cookieIndex; PRInt32 numInts; PRInt64 expires; PRBool isDomain; PRInt64 currentTime = PR_Now() / PR_USEC_PER_SEC; nsCOMPtr<nsICookieManager2> cookieManager(do_GetService(NS_COOKIEMANAGER_CONTRACTID, &rv)); if (NS_FAILED(rv)) return rv; /* file format is: * * host \t isDomain \t path \t secure \t expires \t name \t cookie * * if this format isn't respected we move onto the next line in the file. * isDomain is "TRUE" or "FALSE" (default to "FALSE") * isSecure is "TRUE" or "FALSE" (default to "TRUE") * expires is a PRInt64 integer * note 1: cookie can contain tabs. * note 2: cookies are written in order of lastAccessed time: * most-recently used come first; least-recently-used come last. */ while (isMore && NS_SUCCEEDED(lineInputStream->ReadLine(buffer, &isMore))) { if (buffer.IsEmpty() || buffer.First() == '#') continue; // this is a cheap, cheesy way of parsing a tab-delimited line into // string indexes, which can be lopped off into substrings. just for // purposes of obfuscation, it also checks that each token was found. // todo: use iterators? if ((isDomainIndex = buffer.FindChar('\t', hostIndex) + 1) == 0 || (pathIndex = buffer.FindChar('\t', isDomainIndex) + 1) == 0 || (secureIndex = buffer.FindChar('\t', pathIndex) + 1) == 0 || (expiresIndex = buffer.FindChar('\t', secureIndex) + 1) == 0 || (nameIndex = buffer.FindChar('\t', expiresIndex) + 1) == 0 || (cookieIndex = buffer.FindChar('\t', nameIndex) + 1) == 0) continue; // check the expirytime first - if it's expired, ignore // nullstomp the trailing tab, to avoid copying the string char *iter = buffer.BeginWriting(); *(iter += nameIndex - 1) = char(0); numInts = PR_sscanf(buffer.get() + expiresIndex, "%lld", &expires); if (numInts != 1 || expires < currentTime) continue; isDomain = Substring(buffer, isDomainIndex, pathIndex - isDomainIndex - 1).Equals(kTrue); const nsDependentCSubstring host = Substring(buffer, hostIndex, isDomainIndex - hostIndex - 1); // check for bad legacy cookies (domain not starting with a dot, or containing a port), // and discard if (isDomain && !host.IsEmpty() && host.First() != '.' || host.FindChar(':') != -1) continue; // create a new nsCookie and assign the data. rv = cookieManager->Add(host, Substring(buffer, pathIndex, secureIndex - pathIndex - 1), Substring(buffer, nameIndex, cookieIndex - nameIndex - 1), Substring(buffer, cookieIndex, buffer.Length() - cookieIndex), Substring(buffer, secureIndex, expiresIndex - secureIndex - 1).Equals(kTrue), PR_FALSE, // isHttpOnly PR_FALSE, // isSession expires); } return rv; }