NS_IMETHODIMP nsJSONListener::OnDataAvailable(nsIRequest *aRequest, nsISupports *aContext, nsIInputStream *aStream, uint64_t aOffset, uint32_t aLength) { nsresult rv = NS_OK; if (mNeedsConverter && mSniffBuffer.Length() < 4) { uint32_t readCount = (aLength < 4) ? aLength : 4; rv = NS_ConsumeStream(aStream, readCount, mSniffBuffer); NS_ENSURE_SUCCESS(rv, rv); if (mSniffBuffer.Length() < 4) return NS_OK; } char buffer[JSON_STREAM_BUFSIZE]; unsigned long bytesRemaining = aLength - mSniffBuffer.Length(); while (bytesRemaining) { unsigned int bytesRead; rv = aStream->Read(buffer, std::min((unsigned long)sizeof(buffer), bytesRemaining), &bytesRead); NS_ENSURE_SUCCESS(rv, rv); rv = ProcessBytes(buffer, bytesRead); NS_ENSURE_SUCCESS(rv, rv); bytesRemaining -= bytesRead; } return rv; }
NS_IMETHODIMP nsJSONListener::OnStopRequest(nsIRequest *aRequest, nsISupports *aContext, nsresult aStatusCode) { nsresult rv; // This can happen with short UTF-8 messages (<4 bytes) if (!mSniffBuffer.IsEmpty()) { // Just consume mSniffBuffer rv = ProcessBytes(nullptr, 0); NS_ENSURE_SUCCESS(rv, rv); } JS::RootedValue reviver(mCx, JS::NullValue()), value(mCx); JS::StableCharPtr chars(reinterpret_cast<const jschar*>(mBufferedChars.Elements()), mBufferedChars.Length()); JSBool ok = js::ParseJSONWithReviver(mCx, chars, (uint32_t) mBufferedChars.Length(), reviver, &value, mDecodingMode); *mRootVal = value; mBufferedChars.TruncateLength(0); return ok ? NS_OK : NS_ERROR_FAILURE; }
void* ServerWaitMessages(void* networkManager) { CNetworkManager* nm = static_cast<CNetworkManager*>(networkManager); nm->ClientSocket = INVALID_SOCKET; // Accept a client socket nm->ClientSocket = accept(nm->ListenSocket, NULL, NULL); if (nm->ClientSocket == INVALID_SOCKET) { int i = WSAGetLastError(); printf("accept failed: %d\n", i); closesocket(nm->ListenSocket); WSACleanup(); return NULL; } char recvbuf[DEFAULT_BUFLEN]; int recvbuflen = DEFAULT_BUFLEN; int iResult; // Receive until the peer shuts down the connection do { iResult = recv(nm->ClientSocket, recvbuf, recvbuflen, 0); if (iResult > 0) { ProcessBytes(recvbuf, iResult, nm); } else if (iResult == 0) printf("Connection closing...\n"); else { printf("recv failed: %d\n", WSAGetLastError()); closesocket(nm->ClientSocket); WSACleanup(); return NULL; } } while (iResult > 0); return NULL; };
NS_IMETHODIMP nsJSONListener::OnStopRequest(nsIRequest *aRequest, nsISupports *aContext, nsresult aStatusCode) { nsresult rv; // This can happen with short UTF-8 messages if (!mSniffBuffer.IsEmpty()) { rv = ProcessBytes(mSniffBuffer.get(), mSniffBuffer.Length()); NS_ENSURE_SUCCESS(rv, rv); } JSBool ok = JS_FinishJSONParse(mCx, mJSONParser, JSVAL_NULL); mJSONParser = nsnull; if (!ok) return NS_ERROR_FAILURE; return NS_OK; }
void* ClientWaitMessages(void* networkManager) { CNetworkManager* nm = static_cast<CNetworkManager*>(networkManager); int recvbuflen = DEFAULT_BUFLEN; int iResult; char recvbuf[DEFAULT_BUFLEN]; // Receive data until the server closes the connection do { iResult = recv(nm->ConnectSocket, recvbuf, recvbuflen, 0); if (iResult > 0) { ProcessBytes(recvbuf, iResult, nm); } else if (iResult == 0) printf("Connection closed\n"); else printf("recv failed: %d\n", WSAGetLastError()); } while (iResult > 0); return NULL; };
bool MonitorRTMPProtocol::SignalInputData(IOBuffer &buffer) { return ProcessBytes(buffer); }