int read (void* dest, int numNeeded) const { int total = 0; while (ok && numNeeded > 0) { DWORD available = 0; if (! PeekNamedPipe ((HANDLE) readPipe, nullptr, 0, nullptr, &available, nullptr)) break; const int numToDo = jmin ((int) available, numNeeded); if (available == 0) { if (! isRunning()) break; Thread::yield(); } else { DWORD numRead = 0; if (! ReadFile ((HANDLE) readPipe, dest, numToDo, &numRead, nullptr)) break; total += numRead; dest = addBytesToPointer (dest, numRead); numNeeded -= numRead; } } return total; }
int MemoryInputStream::read (void* const buffer, const int howMany) { jassert (buffer != nullptr && howMany >= 0); const int num = jmin (howMany, (int) (dataSize - position)); if (num <= 0) return 0; memcpy (buffer, addBytesToPointer (data, position), (size_t) num); position += (unsigned int) num; return num; }
//============================================================================== bool InterprocessConnection::readNextMessageInt() { uint32 messageHeader[2]; const int bytes = socket != nullptr ? socket->read (messageHeader, sizeof (messageHeader), true) : pipe ->read (messageHeader, sizeof (messageHeader), -1); if (bytes == sizeof (messageHeader) && ByteOrder::swapIfBigEndian (messageHeader[0]) == magicMessageHeader) { int bytesInMessage = (int) ByteOrder::swapIfBigEndian (messageHeader[1]); if (bytesInMessage > 0) { MemoryBlock messageData ((size_t) bytesInMessage, true); int bytesRead = 0; while (bytesInMessage > 0) { if (threadShouldExit()) return false; const int numThisTime = jmin (bytesInMessage, 65536); void* const data = addBytesToPointer (messageData.getData(), bytesRead); const int bytesIn = socket != nullptr ? socket->read (data, numThisTime, true) : pipe ->read (data, numThisTime, -1); if (bytesIn <= 0) break; bytesRead += bytesIn; bytesInMessage -= bytesIn; } if (bytesRead >= 0) deliverDataInt (messageData); } } else if (bytes < 0) { if (socket != nullptr) { const ScopedLock sl (pipeAndSocketLock); socket = nullptr; } connectionLostInt(); return false; } return true; }
XmlElement* AudioProcessor::getXmlFromBinary (const void* data, const int sizeInBytes) { if (sizeInBytes > 8 && ByteOrder::littleEndianInt (data) == magicXmlNumber) { const int stringLength = (int) ByteOrder::littleEndianInt (addBytesToPointer (data, 4)); if (stringLength > 0) return XmlDocument::parse (String::fromUTF8 (static_cast<const char*> (data) + 8, jmin ((sizeInBytes - 8), stringLength))); } return nullptr; }
void DropShadowEffect::applyEffect (Image& image, Graphics& g, float alpha) { const int w = image.getWidth(); const int h = image.getHeight(); Image shadowImage (Image::SingleChannel, w, h, false); { const Image::BitmapData srcData (image, Image::BitmapData::readOnly); const Image::BitmapData destData (shadowImage, Image::BitmapData::readWrite); const int filter = roundToInt (63.0f / radius); const int radiusMinus1 = roundToInt ((radius - 1.0f) * 63.0f); for (int x = w; --x >= 0;) { int shadowAlpha = 0; const PixelARGB* src = ((const PixelARGB*) srcData.data) + x; uint8* shadowPix = destData.data + x; for (int y = h; --y >= 0;) { shadowAlpha = ((shadowAlpha * radiusMinus1 + (src->getAlpha() << 6)) * filter) >> 12; *shadowPix = (uint8) shadowAlpha; src = addBytesToPointer (src, srcData.lineStride); shadowPix += destData.lineStride; } } for (int y = h; --y >= 0;) { int shadowAlpha = 0; uint8* shadowPix = destData.getLinePointer (y); for (int x = w; --x >= 0;) { shadowAlpha = ((shadowAlpha * radiusMinus1 + (*shadowPix << 6)) * filter) >> 12; *shadowPix++ = (uint8) shadowAlpha; } } } g.setColour (Colours::black.withAlpha (opacity * alpha)); g.drawImageAt (shadowImage, offsetX, offsetY, true); g.setOpacity (alpha); g.drawImageAt (image, 0, 0); }
int readOrSkip (void* buffer, int bytesToRead, bool skip) { if (bytesToRead <= 0) return 0; size_t pos = 0; size_t len = static_cast<size_t> (bytesToRead); while (len > 0) { size_t bufferBytes = curlBuffer.getSize(); bool removeSection = true; if (bufferBytes == 0) { // do not call curl again if we are finished { const ScopedLock lock (cleanupLock); if (finished || curl == nullptr) return static_cast<int> (pos); } skipBytes = skip ? len : 0; singleStep(); // update the amount that was read/skipped from curl bufferBytes = skip ? len - skipBytes : curlBuffer.getSize(); removeSection = ! skip; } // can we copy data from the internal buffer? if (bufferBytes > 0) { size_t max = jmin (len, bufferBytes); if (! skip) memcpy (addBytesToPointer (buffer, pos), curlBuffer.getData(), max); pos += max; streamPos += static_cast<int64> (max); len -= max; if (removeSection) curlBuffer.removeSection (0, max); } } return static_cast<int> (pos); }
bool InterprocessConnection::readNextMessage() { uint32 messageHeader[2]; auto bytes = readData (messageHeader, sizeof (messageHeader)); if (bytes == sizeof (messageHeader) && ByteOrder::swapIfBigEndian (messageHeader[0]) == magicMessageHeader) { auto bytesInMessage = (int) ByteOrder::swapIfBigEndian (messageHeader[1]); if (bytesInMessage > 0) { MemoryBlock messageData ((size_t) bytesInMessage, true); int bytesRead = 0; while (bytesInMessage > 0) { if (thread->threadShouldExit()) return false; auto numThisTime = jmin (bytesInMessage, 65536); auto bytesIn = readData (addBytesToPointer (messageData.getData(), bytesRead), numThisTime); if (bytesIn <= 0) break; bytesRead += bytesIn; bytesInMessage -= bytesIn; } if (bytesRead >= 0) deliverDataInt (messageData); } return true; } if (bytes < 0) { if (socket != nullptr) deletePipeAndSocket(); connectionLostInt(); } return false; }
int MemoryInputStream::read (void* const buffer, const int howMany) { jassert (buffer != nullptr && howMany >= 0); if (howMany <= 0 || position >= dataSize) return 0; const size_t num = jmin ((size_t) howMany, dataSize - position); if (num > 0) { memcpy (buffer, addBytesToPointer (data, position), num); position += num; } return (int) num; }
static int readSocket (const SocketHandle handle, void* const destBuffer, const int maxBytesToRead, bool volatile& connected, const bool blockUntilSpecifiedAmountHasArrived) noexcept { int bytesRead = 0; while (bytesRead < maxBytesToRead) { int bytesThisTime; #if JUCE_WINDOWS bytesThisTime = recv (handle, static_cast<char*> (destBuffer) + bytesRead, maxBytesToRead - bytesRead, 0); #else while ((bytesThisTime = (int) ::read (handle, addBytesToPointer (destBuffer, bytesRead), (size_t) (maxBytesToRead - bytesRead))) < 0 && errno == EINTR && connected) { } #endif if (bytesThisTime <= 0 || ! connected) { if (bytesRead == 0) bytesRead = -1; break; } bytesRead += bytesThisTime; if (! blockUntilSpecifiedAmountHasArrived) break; } return bytesRead; }