//============================================================================== void getStateInformation (MemoryBlock& destData) override { MemoryOutputStream stream (destData, true); stream.writeFloat (*radius); stream.writeFloat (*phi); }
Drawable* Drawable::createFromImageDataStream (InputStream& dataSource) { MemoryOutputStream mo; mo.writeFromInputStream (dataSource, -1); return createFromImageData (mo.getData(), mo.getDataSize()); }
const var var::readFromStream (InputStream& input) { const int numBytes = input.readCompressedInt(); if (numBytes > 0) { switch (input.readByte()) { case 1: return var (input.readInt()); case 2: return var (true); case 3: return var (false); case 4: return var (input.readDouble()); case 5: { MemoryOutputStream mo; mo.writeFromInputStream (input, numBytes - 1); return var (mo.toUTF8()); } default: input.skipNextBytes (numBytes - 1); break; } } return var::null; }
static void findTimeSigEvents (MidiFile& midiFile, StringPairArray& midiMetadata) { MidiMessageSequence timeSigEvents; midiFile.findAllTimeSigEvents (timeSigEvents); const int numTimeSigEvents = timeSigEvents.getNumEvents(); MemoryOutputStream timeSigSequence; for (int i = 0; i < numTimeSigEvents; ++i) { int numerator, denominator; timeSigEvents.getEventPointer(i)->message.getTimeSignatureInfo (numerator, denominator); String timeSigString; timeSigString << numerator << '/' << denominator; if (i == 0) midiMetadata.set (CoreAudioFormat::timeSig, timeSigString); if (numTimeSigEvents > 1) timeSigSequence << timeSigString << ',' << timeSigEvents.getEventTime (i) << ';'; } if (timeSigSequence.getDataSize() > 0) midiMetadata.set ("time signature sequence", timeSigSequence.toUTF8()); }
//============================================================================== void getStateInformation (MemoryBlock& destData) override { MemoryOutputStream stream (destData, true); stream.writeFloat (*isRecordingParam); stream.writeFloat (*roomSizeParam); }
static void findKeySigEvents (MidiFile& midiFile, StringPairArray& midiMetadata) { MidiMessageSequence keySigEvents; midiFile.findAllKeySigEvents (keySigEvents); const int numKeySigEvents = keySigEvents.getNumEvents(); MemoryOutputStream keySigSequence; for (int i = 0; i < numKeySigEvents; ++i) { const MidiMessage& message (keySigEvents.getEventPointer (i)->message); const int key = jlimit (0, 14, message.getKeySignatureNumberOfSharpsOrFlats() + 7); const bool isMajor = message.isKeySignatureMajorKey(); static const char* majorKeys[] = { "Cb", "Gb", "Db", "Ab", "Eb", "Bb", "F", "C", "G", "D", "A", "E", "B", "F#", "C#" }; static const char* minorKeys[] = { "Ab", "Eb", "Bb", "F", "C", "G", "D", "A", "E", "B", "F#", "C#", "G#", "D#", "A#" }; String keySigString (isMajor ? majorKeys[key] : minorKeys[key]); if (! isMajor) keySigString << 'm'; if (i == 0) midiMetadata.set (CoreAudioFormat::keySig, keySigString); if (numKeySigEvents > 1) keySigSequence << keySigString << ',' << keySigEvents.getEventTime (i) << ';'; } if (keySigSequence.getDataSize() > 0) midiMetadata.set ("key signature sequence", keySigSequence.toUTF8()); }
static void findTempoEvents (MidiFile& midiFile, StringPairArray& midiMetadata) { MidiMessageSequence tempoEvents; midiFile.findAllTempoEvents (tempoEvents); const int numTempoEvents = tempoEvents.getNumEvents(); MemoryOutputStream tempoSequence; for (int i = 0; i < numTempoEvents; ++i) { const double tempo = getTempoFromTempoMetaEvent (tempoEvents.getEventPointer (i)); if (tempo > 0.0) { if (i == 0) midiMetadata.set (CoreAudioFormat::tempo, String (tempo)); if (numTempoEvents > 1) tempoSequence << String (tempo) << ',' << tempoEvents.getEventTime (i) << ';'; } } if (tempoSequence.getDataSize() > 0) midiMetadata.set ("tempo sequence", tempoSequence.toUTF8()); }
//============================================================================== void getStateInformation (MemoryBlock& destData) override { MemoryOutputStream stream (destData, true); stream.writeFloat (*threshold); stream.writeFloat (*alpha); }
void ValueTreeSynchroniser::valueTreeChildRemoved (ValueTree& parentTree, ValueTree&, int oldIndex) { MemoryOutputStream m; ValueTreeSynchroniserHelpers::writeHeader (*this, m, ValueTreeSynchroniserHelpers::childRemoved, parentTree); m.writeCompressedInt (oldIndex); stateChanged (m.getData(), m.getDataSize()); }
void ValueTreeSynchroniser::sendFullSyncCallback() { MemoryOutputStream m; writeHeader (m, ValueTreeSynchroniserHelpers::fullSync); valueTree.writeToStream (m); stateChanged (m.getData(), m.getDataSize()); }
void Robot::timerCallback() { MemoryOutputStream * out = messageBuffer.getReader(); if (out != nullptr) { send(out->getData(), out->getDataSize()); messageBuffer.readDone(); } }
void HelmPlugin::getStateInformation(MemoryBlock& dest_data) { var state = LoadSave::stateToVar(&synth_, gui_state_, getCallbackLock()); String data_string = JSON::toString(state); MemoryOutputStream stream; stream.writeString(data_string); dest_data.append(stream.getData(), stream.getDataSize()); }
OutputStream& JUCE_CALLTYPE operator<< (OutputStream& stream, const MemoryOutputStream& streamToRead) { const size_t dataSize = streamToRead.getDataSize(); if (dataSize > 0) stream.write (streamToRead.getData(), dataSize); return stream; }
static Result parseString (const juce_wchar quoteChar, String::CharPointerType& t, var& result) { MemoryOutputStream buffer (256); for (;;) { juce_wchar c = t.getAndAdvance(); if (c == quoteChar) break; if (c == '\\') { c = t.getAndAdvance(); switch (c) { case '"': case '\'': case '\\': case '/': break; case 'a': c = '\a'; break; case 'b': c = '\b'; break; case 'f': c = '\f'; break; case 'n': c = '\n'; break; case 'r': c = '\r'; break; case 't': c = '\t'; break; case 'u': { c = 0; for (int i = 4; --i >= 0;) { const int digitValue = CharacterFunctions::getHexDigitValue (t.getAndAdvance()); if (digitValue < 0) return createFail ("Syntax error in unicode escape sequence"); c = (juce_wchar) ((c << 4) + digitValue); } break; } } } if (c == 0) return createFail ("Unexpected end-of-input in string constant"); buffer.appendUTF8Char (c); } result = buffer.toUTF8(); return Result::ok(); }
static void create (MemoryBlock& block, const StringPairArray& values) { auto numNotes = values.getValue ("NumCueNotes", "0").getIntValue(); if (numNotes > 0) { MemoryOutputStream out (block, false); out.writeShortBigEndian ((short) numNotes); for (int i = 0; i < numNotes; ++i) { auto prefix = "CueNote" + String (i); out.writeIntBigEndian (values.getValue (prefix + "TimeStamp", "0").getIntValue()); out.writeShortBigEndian ((short) values.getValue (prefix + "Identifier", "0").getIntValue()); auto comment = values.getValue (prefix + "Text", String()); auto commentLength = jmin (comment.getNumBytesAsUTF8(), (size_t) 65534); out.writeShortBigEndian ((short) commentLength + 1); out.write (comment.toUTF8(), commentLength); out.writeByte (0); if ((out.getDataSize() & 1) != 0) out.writeByte (0); } } }
void ValueTreeSynchroniser::valueTreeChildAdded (ValueTree& parentTree, ValueTree& childTree) { const int index = parentTree.indexOf (childTree); jassert (index >= 0); MemoryOutputStream m; ValueTreeSynchroniserHelpers::writeHeader (*this, m, ValueTreeSynchroniserHelpers::childAdded, parentTree); m.writeCompressedInt (index); childTree.writeToStream (m); stateChanged (m.getData(), m.getDataSize()); }
void URL::createHeadersAndPostData (String& headers, MemoryBlock& postDataToWrite) const { MemoryOutputStream data (postDataToWrite, false); if (filesToUpload.size() > 0) { // (this doesn't currently support mixing custom post-data with uploads..) jassert (postData.getSize() == 0); auto boundary = String::toHexString (Random::getSystemRandom().nextInt64()); headers << "Content-Type: multipart/form-data; boundary=" << boundary << "\r\n"; data << "--" << boundary; for (int i = 0; i < parameterNames.size(); ++i) { data << "\r\nContent-Disposition: form-data; name=\"" << parameterNames[i] << "\"\r\n\r\n" << parameterValues[i] << "\r\n--" << boundary; } for (auto* f : filesToUpload) { data << "\r\nContent-Disposition: form-data; name=\"" << f->parameterName << "\"; filename=\"" << f->filename << "\"\r\n"; if (f->mimeType.isNotEmpty()) data << "Content-Type: " << f->mimeType << "\r\n"; data << "Content-Transfer-Encoding: binary\r\n\r\n"; if (f->data != nullptr) data << *f->data; else data << f->file; data << "\r\n--" << boundary; } data << "--\r\n"; } else { data << URLHelpers::getMangledParameters (*this) << postData; // if the user-supplied headers didn't contain a content-type, add one now.. if (! headers.containsIgnoreCase ("Content-Type")) headers << "Content-Type: application/x-www-form-urlencoded\r\n"; headers << "Content-length: " << (int) data.getDataSize() << "\r\n"; } }
void OnlineUnlockStatus::save() { MemoryOutputStream mo; { GZIPCompressorOutputStream gzipStream (&mo, 9); status.writeToStream (gzipStream); } saveState (mo.getMemoryBlock().toBase64Encoding()); }
void TommyCoin::Write( MemoryOutputStream& inStream ) const { if( inStream.GetRemainingBytes() >= 3 * sizeof( float ) + sizeof( XMVECTOR ) ) { XMVECTORF32 location; location.v = GetLocation(); inStream.Write( location.f[ 0 ] ); inStream.Write( location.f[ 1 ] ); inStream.Write( GetRotation() ); inStream.Write( GetColor() ); } }
void jojo_write (t_jojo *x, const File& aFile) { MemoryOutputStream myText; GZIPCompressorOutputStream zipper (&myText); zipper << "Stately, plump Buck Mulligan came from the stairhead, " << newLine << "bearing a bowl of lather on which a mirror and a razor lay crossed." << newLine; zipper.flush(); aFile.replaceWithData (myText.getData(), myText.getDataSize()); }
String PerformanceCounter::Statistics::toString() const { MemoryOutputStream s; s << "Performance count for \"" << name << "\" over " << numRuns << " run(s)" << newLine << "Average = " << timeToString (averageSeconds) << ", minimum = " << timeToString (minimumSeconds) << ", maximum = " << timeToString (maximumSeconds) << ", total = " << timeToString (totalSeconds); return s.toString(); }
//============================================================================== static String encryptXML (const XmlElement& xml, RSAKey privateKey) { MemoryOutputStream text; text << xml.createDocument (StringRef(), true); BigInteger val; val.loadFromMemoryBlock (text.getMemoryBlock()); privateKey.applyToValue (val); return val.toString (16); }
void writeToStream (const ValueUnion& data, OutputStream& output) const { MemoryOutputStream buffer (512); const int numItems = data.arrayValue->size(); buffer.writeCompressedInt (numItems); for (int i = 0; i < numItems; ++i) data.arrayValue->getReference(i).writeToStream (buffer); output.writeCompressedInt (1 + (int) buffer.getDataSize()); output.writeByte (varMarker_Array); output << buffer; }
static void writeHeader (ValueTreeSynchroniser& target, MemoryOutputStream& stream, ChangeType type, ValueTree v) { writeHeader (stream, type); Array<int> path; getValueTreePath (v, target.getRoot(), path); stream.writeCompressedInt (path.size()); for (int i = path.size(); --i >= 0;) stream.writeCompressedInt (path.getUnchecked(i)); }
var var::readFromStream (InputStream& input) { const int numBytes = input.readCompressedInt(); if (numBytes > 0) { switch (input.readByte()) { case varMarker_Int: return var (input.readInt()); case varMarker_Int64: return var (input.readInt64()); case varMarker_BoolTrue: return var (true); case varMarker_BoolFalse: return var (false); case varMarker_Double: return var (input.readDouble()); case varMarker_String: { MemoryOutputStream mo; mo.writeFromInputStream (input, numBytes - 1); return var (mo.toUTF8()); } case varMarker_Binary: { MemoryBlock mb (numBytes - 1); if (numBytes > 1) { const int numRead = input.read (mb.getData(), numBytes - 1); mb.setSize (numRead); } return var (mb); } case varMarker_Array: { var v; Array<var>* const destArray = v.convertToArray(); for (int i = input.readCompressedInt(); --i >= 0;) destArray->add (readFromStream (input)); return v; } default: input.skipNextBytes (numBytes - 1); break; } } return var::null; }
Result download (MemoryBlock& dest) { setStatusMessage ("Downloading..."); int statusCode = 302; const int maxRedirects = 5; // we need to do the redirecting manually due to inconsistencies on the way headers are handled on redirects ScopedPointer<InputStream> in; for (int redirect = 0; redirect < maxRedirects; ++redirect) { StringPairArray responseHeaders; in = url.createInputStream (false, nullptr, nullptr, headers, 10000, &responseHeaders, &statusCode, 0); if (in == nullptr || statusCode != 302) break; String redirectPath = responseHeaders ["Location"]; if (redirectPath.isEmpty()) break; url = LatestVersionChecker::getLatestVersionURL (headers, redirectPath); } if (in != nullptr && statusCode == 200) { int64 total = 0; MemoryOutputStream mo (dest, true); for (;;) { if (threadShouldExit()) return Result::fail ("cancel"); int64 written = mo.writeFromInputStream (*in, 8192); if (written == 0) break; total += written; setStatusMessage (String (TRANS ("Downloading... (123)")) .replace ("123", File::descriptionOfSizeInBytes (total))); } return Result::ok(); } return Result::fail ("Failed to download from: " + url.toString (false)); }
void AudioProcessor::copyXmlToBinary (const XmlElement& xml, juce::MemoryBlock& destData) { { MemoryOutputStream out (destData, false); out.writeInt (magicXmlNumber); out.writeInt (0); xml.writeToStream (out, String::empty, true, false); out.writeByte (0); } // go back and write the string length.. static_cast<uint32*> (destData.getData())[1] = ByteOrder::swapIfBigEndian ((uint32) destData.getSize() - 9); }
PxConvexMesh* createConvexMesh( const std::vector<PxVec3>& verts, PxConvexFlags flags ) { PxConvexMeshDesc convexDesc; convexDesc.points.count = verts.size(); convexDesc.points.stride = sizeof(PxVec3); convexDesc.points.data = &(verts[0]); convexDesc.flags = flags; MemoryOutputStream writeBuffer; if ( !SDK_COOK->cookConvexMesh(convexDesc, writeBuffer) ) return NULL; MemoryInputData readBuffer( writeBuffer.getData(), writeBuffer.getSize() ); return SDK_OBJ->createConvexMesh( readBuffer ); }
void create (MemoryBlock& block, const StringPairArray& values) { const int numCues = values.getValue ("NumCuePoints", "0").getIntValue(); if (numCues > 0) { MemoryOutputStream out (block, false); out.writeShortBigEndian ((short) numCues); const int numCueLabels = values.getValue ("NumCueLabels", "0").getIntValue(); const int idOffset = metaDataContainsZeroIdentifiers (values) ? 1 : 0; // can't have zero IDs in AIFF #if JUCE_DEBUG Array<int> identifiers; #endif for (int i = 0; i < numCues; ++i) { const String prefixCue ("Cue" + String (i)); const int identifier = idOffset + values.getValue (prefixCue + "Identifier", "1").getIntValue(); #if JUCE_DEBUG jassert (! identifiers.contains (identifier)); identifiers.add (identifier); #endif const int offset = values.getValue (prefixCue + "Offset", "0").getIntValue(); String label ("CueLabel" + String (i)); for (int labelIndex = 0; labelIndex < numCueLabels; ++labelIndex) { const String prefixLabel ("CueLabel" + String (labelIndex)); const int labelIdentifier = idOffset + values.getValue (prefixLabel + "Identifier", "1").getIntValue(); if (labelIdentifier == identifier) { label = values.getValue (prefixLabel + "Text", label); break; } } out.writeShortBigEndian ((short) identifier); out.writeIntBigEndian (offset); const int labelLength = jmin (254, label.getNumBytesAsUTF8()); // seems to need null terminator even though it's a pstring out.writeByte ((char) labelLength + 1); out.write (label.toUTF8(), labelLength); out.writeByte (0); } if ((out.getDataSize() & 1) != 0) out.writeByte (0); } }
void create (MemoryBlock& block, const StringPairArray& values) { const int numNotes = values.getValue ("NumCueNotes", "0").getIntValue(); if (numNotes > 0) { MemoryOutputStream out (block, false); out.writeShortBigEndian ((short) numNotes); for (int i = 0; i < numNotes; ++i) { const String prefix ("CueNote" + String (i)); out.writeIntBigEndian (values.getValue (prefix + "TimeStamp", "0").getIntValue()); out.writeShortBigEndian ((short) values.getValue (prefix + "Identifier", "0").getIntValue()); const String comment (values.getValue (prefix + "Text", String::empty)); out.write (comment.toUTF8(), jmin (comment.getNumBytesAsUTF8(), 65534)); out.writeByte (0); if ((out.getDataSize() & 1) != 0) out.writeByte (0); } } }