LMMS
Loading...
Searching...
No Matches
vstpresetfile.cpp
Go to the documentation of this file.
1//------------------------------------------------------------------------
2// Project : VST SDK
3//
4// Category : Helpers
5// Filename : public.sdk/source/vst/vstpresetfile.cpp
6// Created by : Steinberg, 03/2006
7// Description : VST 3 Preset File Format
8//
9//-----------------------------------------------------------------------------
10// LICENSE
11// (c) 2021, Steinberg Media Technologies GmbH, All Rights Reserved
12//-----------------------------------------------------------------------------
13// Redistribution and use in source and binary forms, with or without modification,
14// are permitted provided that the following conditions are met:
15//
16// * Redistributions of source code must retain the above copyright notice,
17// this list of conditions and the following disclaimer.
18// * Redistributions in binary form must reproduce the above copyright notice,
19// this list of conditions and the following disclaimer in the documentation
20// and/or other materials provided with the distribution.
21// * Neither the name of the Steinberg Media Technologies nor the names of its
22// contributors may be used to endorse or promote products derived from this
23// software without specific prior written permission.
24//
25// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
26// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
27// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
28// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
29// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
30// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
31// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
32// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
33// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
34// OF THE POSSIBILITY OF SUCH DAMAGE.
35//-----------------------------------------------------------------------------
36
37#include "vstpresetfile.h"
38
39#include <algorithm>
40
41
42namespace Steinberg {
43namespace Vst {
44
45//------------------------------------------------------------------------
46// Preset Chunk IDs
47//------------------------------------------------------------------------
49 {'V', 'S', 'T', '3'}, // kHeader
50 {'C', 'o', 'm', 'p'}, // kComponentState
51 {'C', 'o', 'n', 't'}, // kControllerState
52 {'P', 'r', 'o', 'g'}, // kProgramData
53 {'I', 'n', 'f', 'o'}, // kMetaInfo
54 {'L', 'i', 's', 't'} // kChunkList
55};
56
57//------------------------------------------------------------------------
58// Preset Header: header id + version + class id + list offset
59static const int32 kFormatVersion = 1;
60static const int32 kClassIDSize = 32; // ASCII-encoded FUID
61static const int32 kHeaderSize = sizeof (ChunkID) + sizeof (int32) + kClassIDSize + sizeof (TSize);
62static const int32 kListOffsetPos = kHeaderSize - sizeof (TSize);
63
64//------------------------------------------------------------------------
66{
67 return commonChunks[type];
68}
69
70#ifdef verify
71#undef verify
72#endif
73
74//------------------------------------------------------------------------
75inline bool verify (tresult result)
76{
77 return result == kResultOk || result == kNotImplemented;
78}
79
80//------------------------------------------------------------------------
81bool copyStream (IBStream* inStream, IBStream* outStream)
82{
83 if (!inStream || !outStream)
84 return false;
85
86 int8 buffer[8192];
87 int32 read = 0;
88 int32 written = 0;
89 while (inStream->read (buffer, 8192, &read) == kResultTrue && read > 0)
90 {
91 if (outStream->write (buffer, read, &written) != kResultTrue)
92 {
93 return false;
94 }
95 }
96 return true;
97}
98
99//------------------------------------------------------------------------
100// PresetFile
101//------------------------------------------------------------------------
103 IEditController* editController, const char* xmlBuffer, int32 xmlSize)
104{
105 PresetFile pf (stream);
106 pf.setClassID (classID);
107 if (!pf.writeHeader ())
108 return false;
109
110 if (!pf.storeComponentState (component))
111 return false;
112
113 if (editController && !pf.storeControllerState (editController))
114 return false;
115
116 if (xmlBuffer && !pf.writeMetaInfo (xmlBuffer, xmlSize))
117 return false;
118
119 return pf.writeChunkList ();
120}
121
122//------------------------------------------------------------------------
124 IBStream* editStream, const char* xmlBuffer, int32 xmlSize)
125{
126 PresetFile pf (stream);
127 pf.setClassID (classID);
128 if (!pf.writeHeader ())
129 return false;
130
131 if (!pf.storeComponentState (componentStream))
132 return false;
133
134 if (editStream && !pf.storeControllerState (editStream))
135 return false;
136
137 if (xmlBuffer && !pf.writeMetaInfo (xmlBuffer, xmlSize))
138 return false;
139
140 return pf.writeChunkList ();
141}
142
143//------------------------------------------------------------------------
145 IEditController* editController, std::vector<FUID>* otherClassIDArray)
146{
147 PresetFile pf (stream);
148 if (!pf.readChunkList ())
149 return false;
150
151 if (pf.getClassID () != classID)
152 {
153 if (otherClassIDArray)
154 {
155 // continue to load only if found in supported ID else abort load
156 if (std::find (otherClassIDArray->begin (), otherClassIDArray->end (),
157 pf.getClassID ()) == otherClassIDArray->end ())
158 return false;
159 }
160 else
161 return false;
162 }
163
164 if (!pf.restoreComponentState (component))
165 return false;
166
167 if (editController)
168 {
169 // assign component state to controller
170 if (!pf.restoreComponentState (editController))
171 return false;
172
173 // restore controller-only state (if present)
174 if (pf.contains (kControllerState) && !pf.restoreControllerState (editController))
175 return false;
176 }
177 return true;
178}
179
180//------------------------------------------------------------------------
182{
183 memset (entries, 0, sizeof (entries));
184
185 if (stream)
186 stream->addRef ();
187}
188
189//------------------------------------------------------------------------
191{
192 if (stream)
193 stream->release ();
194}
195
196//------------------------------------------------------------------------
198{
199 const ChunkID& id = getChunkID (which);
200 for (int32 i = 0; i < entryCount; i++)
201 if (isEqualID (entries[i].id, id))
202 return &entries[i];
203 return nullptr;
204}
205
206//------------------------------------------------------------------------
208{
209 return entryCount > 0 ? &entries[entryCount - 1] : nullptr;
210}
211
212//------------------------------------------------------------------------
214{
215 int32 numBytesRead = 0;
216 stream->read (id, sizeof (ChunkID), &numBytesRead);
217 return numBytesRead == sizeof (ChunkID);
218}
219
220//------------------------------------------------------------------------
222{
223 int32 numBytesWritten = 0;
224 stream->write ((void*)id, sizeof (ChunkID), &numBytesWritten);
225 return numBytesWritten == sizeof (ChunkID);
226}
227
228//------------------------------------------------------------------------
230{
231 ChunkID temp = {0};
232 return readID (temp) && isEqualID (temp, id);
233}
234
235//------------------------------------------------------------------------
237{
238 int32 numBytesRead = 0;
239 stream->read (&size, sizeof (TSize), &numBytesRead);
240#if BYTEORDER == kBigEndian
241 SWAP_64 (size)
242#endif
243 return numBytesRead == sizeof (TSize);
244}
245
246//------------------------------------------------------------------------
248{
249#if BYTEORDER == kBigEndian
250 SWAP_64 (size)
251#endif
252 int32 numBytesWritten = 0;
253 stream->write (&size, sizeof (TSize), &numBytesWritten);
254 return numBytesWritten == sizeof (TSize);
255}
256
257//------------------------------------------------------------------------
259{
260 int32 numBytesRead = 0;
261 stream->read (&value, sizeof (int32), &numBytesRead);
262#if BYTEORDER == kBigEndian
263 SWAP_32 (value)
264#endif
265 return numBytesRead == sizeof (int32);
266}
267
268//------------------------------------------------------------------------
270{
271#if BYTEORDER == kBigEndian
272 SWAP_32 (value)
273#endif
274 int32 numBytesWritten = 0;
275 stream->write (&value, sizeof (int32), &numBytesWritten);
276 return numBytesWritten == sizeof (int32);
277}
278
279//------------------------------------------------------------------------
281{
282 int64 result = -1;
283 stream->seek (offset, IBStream::kIBSeekSet, &result);
284 return result == offset;
285}
286
287//------------------------------------------------------------------------
289{
290 seekTo (0);
291 entryCount = 0;
292
293 char8 classString[kClassIDSize + 1] = {0};
294
295 // Read header
296 int32 version = 0;
297 TSize listOffset = 0;
299 verify (stream->read (classString, kClassIDSize)) && readSize (listOffset) &&
300 listOffset > 0 && seekTo (listOffset)))
301 return false;
302
303 classID.fromString (classString);
304
305 // Read list
306 int32 count = 0;
308 return false;
309 if (!readInt32 (count))
310 return false;
311
312 if (count > kMaxEntries)
314
315 for (int32 i = 0; i < count; i++)
316 {
317 Entry& e = entries[i];
318 if (!(readID (e.id) && readSize (e.offset) && readSize (e.size)))
319 break;
320
321 entryCount++;
322 }
323
324 return entryCount > 0;
325}
326
327//------------------------------------------------------------------------
329{
330 // header id + version + class id + list offset (unknown yet)
331
332 char8 classString[kClassIDSize + 1] = {0};
333 classID.toString (classString);
334
335 return seekTo (0) && writeID (getChunkID (kHeader)) && writeInt32 (kFormatVersion) &&
336 verify (stream->write (classString, kClassIDSize)) && writeSize (0);
337}
338
339//------------------------------------------------------------------------
341{
342 // Update list offset
343 TSize pos = 0;
344 stream->tell (&pos);
345 if (!(seekTo (kListOffsetPos) && writeSize (pos) && seekTo (pos)))
346 return false;
347
348 // Write list
350 return false;
351 if (!writeInt32 (entryCount))
352 return false;
353
354 for (int32 i = 0; i < entryCount; i++)
355 {
356 Entry& e = entries[i];
357 if (!(writeID (e.id) && writeSize (e.offset) && writeSize (e.size)))
358 return false;
359 }
360 return true;
361}
362
363//------------------------------------------------------------------------
365{
366 if (entryCount >= kMaxEntries)
367 return false;
368
369 const ChunkID& id = getChunkID (which);
370 memcpy (e.id, &id, sizeof (ChunkID));
371 stream->tell (&e.offset);
372 e.size = 0;
373 return true;
374}
375
376//------------------------------------------------------------------------
378{
379 if (entryCount >= kMaxEntries)
380 return false;
381
382 TSize pos = 0;
383 stream->tell (&pos);
384 e.size = pos - e.offset;
385 entries[entryCount++] = e;
386 return true;
387}
388
389//------------------------------------------------------------------------
390bool PresetFile::readMetaInfo (char* xmlBuffer, int32& size)
391{
392 bool result = false;
393 const Entry* e = getEntry (kMetaInfo);
394 if (e)
395 {
396 if (xmlBuffer)
397 {
398 result = seekTo (e->offset) && verify (stream->read (xmlBuffer, size, &size));
399 }
400 else
401 {
402 size = (int32)e->size;
403 result = size > 0;
404 }
405 }
406 return result;
407}
408
409//------------------------------------------------------------------------
410bool PresetFile::writeMetaInfo (const char* xmlBuffer, int32 size, bool forceWriting)
411{
412 if (contains (kMetaInfo)) // already exists!
413 {
414 if (!forceWriting)
415 return false;
416 }
417 if (!prepareMetaInfoUpdate ())
418 return false;
419
420 if (size == -1)
421 size = (int32)strlen (xmlBuffer);
422
423 Entry e = {};
424 return beginChunk (e, kMetaInfo) && verify (stream->write ((void*)xmlBuffer, size)) &&
425 endChunk (e);
426}
427
428//------------------------------------------------------------------------
430{
431 TSize writePos = 0;
432 const Entry* e = getEntry (kMetaInfo);
433 if (e)
434 {
435 // meta info must be the last entry!
436 if (e != getLastEntry ())
437 return false;
438
439 writePos = e->offset;
440 entryCount--;
441 }
442 else
443 {
444 // entries must be sorted ascending by offset!
445 e = getLastEntry ();
446 writePos = e ? e->offset + e->size : kHeaderSize;
447 }
448
449 return seekTo (writePos);
450}
451
452//------------------------------------------------------------------------
454{
455 if (contains (which)) // already exists!
456 return false;
457
458 Entry e = {};
459 return beginChunk (e, which) && verify (stream->write ((void*)data, size)) && endChunk (e);
460}
461
462//------------------------------------------------------------------------
464{
465 const Entry* e = getEntry (kComponentState);
466 return e && seekTo (e->offset);
467}
468
469//------------------------------------------------------------------------
471{
472 if (contains (kComponentState)) // already exists!
473 return false;
474
475 Entry e = {};
476 return beginChunk (e, kComponentState) && verify (component->getState (stream)) && endChunk (e);
477}
478
479//------------------------------------------------------------------------
481{
482 if (contains (kComponentState)) // already exists!
483 return false;
484
485 Entry e = {};
486 return beginChunk (e, kComponentState) && copyStream (componentStream, stream) && endChunk (e);
487}
488
489//------------------------------------------------------------------------
491{
492 const Entry* e = getEntry (kComponentState);
493 if (e)
494 {
495 auto* readOnlyBStream = new ReadOnlyBStream (stream, e->offset, e->size);
496 FReleaser readOnlyBStreamReleaser (readOnlyBStream);
497 return verify (component->setState (readOnlyBStream));
498 }
499 return false;
500}
501
502//------------------------------------------------------------------------
504{
505 const Entry* e = getEntry (kComponentState);
506 if (e)
507 {
508 auto* readOnlyBStream = new ReadOnlyBStream (stream, e->offset, e->size);
509 FReleaser readOnlyBStreamReleaser (readOnlyBStream);
510 return verify (editController->setComponentState (readOnlyBStream));
511 }
512 return false;
513}
514
515//------------------------------------------------------------------------
517{
518 const Entry* e = getEntry (kControllerState);
519 return e && seekTo (e->offset);
520}
521
522//------------------------------------------------------------------------
524{
525 if (contains (kControllerState)) // already exists!
526 return false;
527
528 Entry e = {};
529 return beginChunk (e, kControllerState) && verify (editController->getState (stream)) &&
530 endChunk (e);
531}
532
533//------------------------------------------------------------------------
535{
536 if (contains (kControllerState)) // already exists!
537 return false;
538
539 Entry e = {};
540 return beginChunk (e, kControllerState) && copyStream (editStream, stream) && endChunk (e);
541}
542
543//------------------------------------------------------------------------
545{
546 const Entry* e = getEntry (kControllerState);
547 if (e)
548 {
549 auto* readOnlyBStream = new ReadOnlyBStream (stream, e->offset, e->size);
550 FReleaser readOnlyBStreamReleaser (readOnlyBStream);
551 return verify (editController->setState (readOnlyBStream));
552 }
553 return false;
554}
555
556//------------------------------------------------------------------------
558{
559 if (contains (kProgramData)) // already exists!
560 return false;
561
562 writeHeader ();
563
564 Entry e = {};
566 {
567 if (writeInt32 (listID))
568 {
569 if (!copyStream (inStream, stream))
570 return false;
571
572 return endChunk (e);
573 }
574 }
575 return false;
576}
577
578//------------------------------------------------------------------------
580 int32 programIndex)
581{
582 if (contains (kProgramData)) // already exists!
583 return false;
584
585 writeHeader ();
586
587 Entry e = {};
588 return beginChunk (e, kProgramData) && writeInt32 (listID) &&
589 verify (programListData->getProgramData (listID, programIndex, stream)) && endChunk (e);
590}
591
592//------------------------------------------------------------------------
594 ProgramListID* programListID, int32 programIndex)
595{
596 const Entry* e = getEntry (kProgramData);
597 ProgramListID savedProgramListID = -1;
598 if (e && seekTo (e->offset))
599 {
600 if (readInt32 (savedProgramListID))
601 {
602 if (programListID && *programListID != savedProgramListID)
603 return false;
604
605 int32 alreadyRead = sizeof (int32);
606 auto* readOnlyBStream =
607 new ReadOnlyBStream (stream, e->offset + alreadyRead, e->size - alreadyRead);
608 FReleaser readOnlyBStreamReleaser (readOnlyBStream);
609 return programListData && verify (programListData->setProgramData (
610 savedProgramListID, programIndex, readOnlyBStream));
611 }
612 }
613 return false;
614}
615
616//------------------------------------------------------------------------
618{
619 if (contains (kProgramData)) // already exists!
620 return false;
621
622 writeHeader ();
623
624 Entry e = {};
625 return beginChunk (e, kProgramData) && writeInt32 (unitID) &&
626 verify (unitData->getUnitData (unitID, stream)) && endChunk (e);
627}
628
629//------------------------------------------------------------------------
631{
632 const Entry* e = getEntry (kProgramData);
633 UnitID savedUnitID = -1;
634 if (e && seekTo (e->offset))
635 {
636 if (readInt32 (savedUnitID))
637 {
638 if (unitId && *unitId != savedUnitID)
639 return false;
640
641 int32 alreadyRead = sizeof (int32);
642 auto* readOnlyBStream =
643 new ReadOnlyBStream (stream, e->offset + alreadyRead, e->size - alreadyRead);
644 FReleaser readOnlyStreamReleaser (readOnlyBStream);
645 return (unitData && verify (unitData->setUnitData (savedUnitID, readOnlyBStream)));
646 }
647 }
648 return false;
649}
650
651//------------------------------------------------------------------------
652bool PresetFile::restoreProgramData (IUnitInfo* unitInfo, int32 unitProgramListID,
653 int32 programIndex)
654{
655 const Entry* e = getEntry (kProgramData);
656 int32 savedProgramListID = -1;
657 if (e && seekTo (e->offset))
658 {
659 if (readInt32 (savedProgramListID))
660 {
661 if (unitProgramListID != savedProgramListID)
662 return false;
663
664 int32 alreadyRead = sizeof (int32);
665 auto* readOnlyBStream =
666 new ReadOnlyBStream (stream, e->offset + alreadyRead, e->size - alreadyRead);
667 FReleaser readOnlyStreamReleaser (readOnlyBStream);
668 return (unitInfo && unitInfo->setUnitProgramData (unitProgramListID, programIndex,
669 readOnlyBStream));
670 }
671 }
672 return false;
673}
674
675//------------------------------------------------------------------------
677{
678 const Entry* e = getEntry (kProgramData);
679 if (e && seekTo (e->offset))
680 {
681 if (readInt32 (unitProgramListID))
682 {
683 return true;
684 }
685 }
686 return false;
687}
688
689//------------------------------------------------------------------------
690// FileStream implementation
691//------------------------------------------------------------------------
692IBStream* FileStream::open (const char* filename, const char* mode)
693{
694 FILE* file = fopen (filename, mode);
695 return file ? new FileStream (file) : nullptr;
696}
697
698//------------------------------------------------------------------------
701
702//------------------------------------------------------------------------
704{
705 fclose (file);
707}
708
709//------------------------------------------------------------------------
711
712//------------------------------------------------------------------------
713tresult PLUGIN_API FileStream::read (void* buffer, int32 numBytes, int32* numBytesRead)
714{
715 size_t result = fread (buffer, 1, static_cast<size_t> (numBytes), file);
716 if (numBytesRead)
717 *numBytesRead = (int32)result;
718 return static_cast<int32> (result) == numBytes ? kResultOk : kResultFalse;
719}
720
721//------------------------------------------------------------------------
722tresult PLUGIN_API FileStream::write (void* buffer, int32 numBytes, int32* numBytesWritten)
723{
724 size_t result = fwrite (buffer, 1, static_cast<size_t> (numBytes), file);
725 if (numBytesWritten)
726 *numBytesWritten = (int32)result;
727 return static_cast<int32> (result) == numBytes ? kResultOk : kResultFalse;
728}
729
730//------------------------------------------------------------------------
732{
733 if (fseek (file, (int32)pos, mode) == 0)
734 {
735 if (result)
736 *result = ftell (file);
737 return kResultOk;
738 }
739 return kResultFalse;
740}
741
742//------------------------------------------------------------------------
744{
745 if (pos)
746 *pos = ftell (file);
747 return kResultOk;
748}
749
750//------------------------------------------------------------------------
751// ReadOnlyBStream implementation
752//------------------------------------------------------------------------
754
755//------------------------------------------------------------------------
766
767//------------------------------------------------------------------------
769{
770 if (sourceStream)
771 sourceStream->release ();
772
774}
775
776//------------------------------------------------------------------------
777tresult PLUGIN_API ReadOnlyBStream::queryInterface (const TUID _iid, void** obj)
778{
780}
781
782//------------------------------------------------------------------------
783tresult PLUGIN_API ReadOnlyBStream::read (void* buffer, int32 numBytes, int32* numBytesRead)
784{
785 if (numBytesRead)
786 *numBytesRead = 0;
787
788 if (!sourceStream)
789 return kNotInitialized;
790
791 int32 maxBytesToRead = (int32) (sectionSize - seekPosition);
792 if (numBytes > maxBytesToRead)
793 numBytes = maxBytesToRead;
794 if (numBytes <= 0)
795 return kResultOk;
796
798 if (result != kResultOk)
799 return result;
800
801 int32 numRead = 0;
802 result = sourceStream->read (buffer, numBytes, &numRead);
803
804 if (numRead > 0)
805 seekPosition += numRead;
806 if (numBytesRead)
807 *numBytesRead = numRead;
808
809 return result;
810}
811
812//------------------------------------------------------------------------
813tresult PLUGIN_API ReadOnlyBStream::write (void* /*buffer*/, int32 /*numBytes*/,
814 int32* numBytesWritten)
815{
816 if (numBytesWritten)
817 *numBytesWritten = 0;
818
819 return kNotImplemented;
820}
821
822//------------------------------------------------------------------------
824{
825 switch (mode)
826 {
827 case kIBSeekSet: seekPosition = pos; break;
828
829 case kIBSeekCur: seekPosition += pos; break;
830
831 case kIBSeekEnd: seekPosition = sectionSize + pos; break;
832 }
833
834 if (seekPosition < 0)
835 seekPosition = 0;
838
839 if (result)
841 return kResultOk;
842}
843
844//------------------------------------------------------------------------
846{
847 if (pos)
848 *pos = seekPosition;
849 return kResultOk;
850}
851
852//------------------------------------------------------------------------
853// BufferStream implementation
854//------------------------------------------------------------------------
856
857//------------------------------------------------------------------------
859
860//------------------------------------------------------------------------
862
863//------------------------------------------------------------------------
864tresult PLUGIN_API BufferStream::read (void* buffer, int32 numBytes, int32* numBytesRead)
865{
866 uint32 size = mBuffer.get (buffer, static_cast<uint32> (numBytes));
867 if (numBytesRead)
868 *numBytesRead = static_cast<int32> (size);
869
870 return kResultTrue;
871}
872
873//------------------------------------------------------------------------
874tresult PLUGIN_API BufferStream::write (void* buffer, int32 numBytes, int32* numBytesWritten)
875{
876 bool res = mBuffer.put (buffer, static_cast<uint32> (numBytes));
877 if (numBytesWritten)
878 *numBytesWritten = res ? numBytes : 0;
879
880 return res ? kResultTrue : kResultFalse;
881}
882
883//------------------------------------------------------------------------
885{
886 bool res = false;
887 switch (mode)
888 {
889 //--- -----------------
891 {
892 int64 tmp = pos;
893 if (tmp < 0)
894 tmp = 0;
895 res = mBuffer.setFillSize (static_cast<uint32> (tmp));
896 }
897 break;
898
899 //--- -----------------
901 {
902 int64 tmp = mBuffer.getFillSize () + pos;
903 if (tmp < 0)
904 tmp = 0;
905 res = mBuffer.setFillSize (static_cast<uint32> (tmp));
906 }
907 break;
908
909 //--- -----------------
911 {
912 int64 tmp = mBuffer.getSize () - pos;
913 if (tmp < 0)
914 tmp = 0;
915 res = mBuffer.setFillSize (static_cast<uint32> (tmp));
916 }
917 break;
918 }
919 if (res && result)
920 *result = mBuffer.getFillSize ();
921
922 return res ? kResultTrue : kResultFalse;
923}
924
925//------------------------------------------------------------------------
927{
928 if (pos)
929 *pos = mBuffer.getFillSize ();
930 return pos ? kResultTrue : kResultFalse;
931}
932
933//------------------------------------------------------------------------
934} // namespace Vst
935} // namespace Steinberg
CAdPlugDatabase::CRecord::RecordType type
Definition adplugdb.cpp:93
Definition funknown.h:233
virtual tresult PLUGIN_API queryInterface(const TUID _iid, void **obj)=0
Definition ibstream.h:30
virtual tresult PLUGIN_API read(void *buffer, int32 numBytes, int32 *numBytesRead=nullptr)=0
static const FUID iid
Definition ibstream.h:62
virtual tresult PLUGIN_API write(void *buffer, int32 numBytes, int32 *numBytesWritten=nullptr)=0
@ kIBSeekCur
set seek position relative to current position
Definition ibstream.h:35
@ kIBSeekEnd
set seek position relative to stream end
Definition ibstream.h:36
@ kIBSeekSet
set absolute seek position
Definition ibstream.h:34
Definition vstpresetfile.h:286
tresult PLUGIN_API write(void *buffer, int32 numBytes, int32 *numBytesWritten=nullptr) SMTG_OVERRIDE
Definition vstpresetfile.cpp:874
DECLARE_FUNKNOWN_METHODS tresult PLUGIN_API read(void *buffer, int32 numBytes, int32 *numBytesRead=nullptr) SMTG_OVERRIDE
Definition vstpresetfile.cpp:864
tresult PLUGIN_API tell(int64 *pos) SMTG_OVERRIDE
Definition vstpresetfile.cpp:926
Buffer mBuffer
Definition vstpresetfile.h:301
BufferStream()
Definition vstpresetfile.cpp:858
virtual ~BufferStream()
Definition vstpresetfile.cpp:861
tresult PLUGIN_API seek(int64 pos, int32 mode, int64 *result=nullptr) SMTG_OVERRIDE
Definition vstpresetfile.cpp:884
Definition vstpresetfile.h:233
tresult PLUGIN_API write(void *buffer, int32 numBytes, int32 *numBytesWritten=nullptr) SMTG_OVERRIDE
Definition vstpresetfile.cpp:722
static IBStream * open(const char *filename, const char *mode)
open a stream using stdio function
Definition vstpresetfile.cpp:692
tresult PLUGIN_API seek(int64 pos, int32 mode, int64 *result=nullptr) SMTG_OVERRIDE
Definition vstpresetfile.cpp:731
tresult PLUGIN_API tell(int64 *pos) SMTG_OVERRIDE
Definition vstpresetfile.cpp:743
DECLARE_FUNKNOWN_METHODS tresult PLUGIN_API read(void *buffer, int32 numBytes, int32 *numBytesRead=nullptr) SMTG_OVERRIDE
Definition vstpresetfile.cpp:713
FileStream(FILE *file)
Definition vstpresetfile.cpp:699
FILE * file
Definition vstpresetfile.h:252
virtual ~FileStream()
Definition vstpresetfile.cpp:703
Definition ivstcomponent.h:158
virtual tresult PLUGIN_API setState(IBStream *state)=0
virtual tresult PLUGIN_API getState(IBStream *state)=0
Definition ivsteditcontroller.h:392
virtual tresult PLUGIN_API setState(IBStream *state)=0
virtual tresult PLUGIN_API getState(IBStream *state)=0
virtual tresult PLUGIN_API setComponentState(IBStream *state)=0
Definition ivstunits.h:215
virtual tresult PLUGIN_API getProgramData(ProgramListID listId, int32 programIndex, IBStream *data)=0
virtual tresult PLUGIN_API setProgramData(ProgramListID listId, int32 programIndex, IBStream *data)=0
Definition ivstunits.h:247
virtual tresult PLUGIN_API getUnitData(UnitID unitId, IBStream *data)=0
virtual tresult PLUGIN_API setUnitData(UnitID unitId, IBStream *data)=0
Definition ivstunits.h:145
virtual tresult PLUGIN_API setUnitProgramData(int32 listOrUnitId, int32 programIndex, IBStream *data)=0
const Entry * getEntry(ChunkType which) const
Returns an entry for a given chunk type.
Definition vstpresetfile.cpp:197
static bool loadPreset(IBStream *stream, const FUID &classID, IComponent *component, IEditController *editController=nullptr, std::vector< FUID > *otherClassIDArray=nullptr)
Definition vstpresetfile.cpp:144
bool readSize(TSize &size)
Definition vstpresetfile.cpp:236
void setClassID(const FUID &uid)
Sets the associated classID (component ID: Processor part (not the controller!)).
Definition vstpresetfile.h:130
int32 entryCount
Definition vstpresetfile.h:226
bool writeHeader()
Writes into the stream the main header.
Definition vstpresetfile.cpp:328
bool contains(ChunkType which) const
Checks if a given chunk type exist in the stream.
Definition vstpresetfile.h:136
PresetFile(IBStream *stream)
Constructor of Preset file based on a stream.
Definition vstpresetfile.cpp:181
bool writeMetaInfo(const char *xmlBuffer, int32 size=-1, bool forceWriting=false)
Definition vstpresetfile.cpp:410
bool writeChunk(const void *data, int32 size, ChunkType which=kComponentState)
Definition vstpresetfile.cpp:453
bool readMetaInfo(char *xmlBuffer, int32 &size)
Definition vstpresetfile.cpp:390
bool readEqualID(const ChunkID id)
Definition vstpresetfile.cpp:229
bool endChunk(Entry &e)
Definition vstpresetfile.cpp:377
bool readInt32(int32 &value)
Definition vstpresetfile.cpp:258
bool storeComponentState(IComponent *component)
Stores the component state (only one time).
Definition vstpresetfile.cpp:470
bool readChunkList()
Reads and build the chunk list (including the header chunk).
Definition vstpresetfile.cpp:288
bool beginChunk(Entry &e, ChunkType which)
Definition vstpresetfile.cpp:364
const Entry * getLastEntry() const
Returns the last available entry.
Definition vstpresetfile.cpp:207
const FUID & getClassID() const
Returns the associated classID (component ID: Processor part (not the controller!)).
Definition vstpresetfile.h:129
bool readID(ChunkID id)
Definition vstpresetfile.cpp:213
bool restoreComponentState(IComponent *component)
Restores the component state.
Definition vstpresetfile.cpp:490
@ kMaxEntries
Definition vstpresetfile.h:224
IBStream * stream
Definition vstpresetfile.h:222
bool getUnitProgramListID(int32 &unitProgramListID)
Definition vstpresetfile.cpp:676
bool writeChunkList()
Writes into the stream the chunk list (should be at the end).
Definition vstpresetfile.cpp:340
bool writeID(const ChunkID id)
Definition vstpresetfile.cpp:221
bool seekToControllerState()
Seeks to the begin of the Controller State.
Definition vstpresetfile.cpp:516
bool storeControllerState(IEditController *editController)
Stores the controller state (only one time).
Definition vstpresetfile.cpp:523
bool seekToComponentState()
Seeks to the begin of the Component State.
Definition vstpresetfile.cpp:463
bool writeSize(TSize size)
Definition vstpresetfile.cpp:247
bool prepareMetaInfoUpdate()
checks if meta info chunk is the last one and jump to correct position.
Definition vstpresetfile.cpp:429
FUID classID
classID is the FUID of the component (processor) part
Definition vstpresetfile.h:223
bool seekTo(TSize offset)
Definition vstpresetfile.cpp:280
bool writeInt32(int32 value)
Definition vstpresetfile.cpp:269
bool restoreControllerState(IEditController *editController)
Restores the controller state.
Definition vstpresetfile.cpp:544
virtual ~PresetFile()
Definition vstpresetfile.cpp:190
static bool savePreset(IBStream *stream, const FUID &classID, IComponent *component, IEditController *editController=nullptr, const char *xmlBuffer=nullptr, int32 xmlSize=-1)
Definition vstpresetfile.cpp:102
Entry entries[kMaxEntries]
Definition vstpresetfile.h:225
bool restoreProgramData(IProgramListData *programListData, ProgramListID *programListID=nullptr, int32 programIndex=0)
Definition vstpresetfile.cpp:593
bool storeProgramData(IBStream *inStream, ProgramListID listID)
Definition vstpresetfile.cpp:557
Definition vstpresetfile.h:259
IBStream * sourceStream
Definition vstpresetfile.h:276
TSize sectionSize
Definition vstpresetfile.h:278
DECLARE_FUNKNOWN_METHODS tresult PLUGIN_API read(void *buffer, int32 numBytes, int32 *numBytesRead=nullptr) SMTG_OVERRIDE
Definition vstpresetfile.cpp:783
TSize seekPosition
Definition vstpresetfile.h:279
virtual ~ReadOnlyBStream()
Definition vstpresetfile.cpp:768
ReadOnlyBStream(IBStream *sourceStream, TSize sourceOffset, TSize sectionSize)
Definition vstpresetfile.cpp:756
TSize sourceOffset
Definition vstpresetfile.h:277
tresult PLUGIN_API tell(int64 *pos) SMTG_OVERRIDE
Definition vstpresetfile.cpp:845
tresult PLUGIN_API seek(int64 pos, int32 mode, int64 *result=nullptr) SMTG_OVERRIDE
Definition vstpresetfile.cpp:823
tresult PLUGIN_API write(void *buffer, int32 numBytes, int32 *numBytesWritten=nullptr) SMTG_OVERRIDE
Definition vstpresetfile.cpp:813
* e
Definition inflate.c:1404
register unsigned i
Definition inflate.c:1575
static char filename[]
Definition features.c:5
#define SWAP_32(l)
Definition ftypes.h:144
#define SWAP_64(i)
Definition ftypes.h:154
#define FUNKNOWN_CTOR
Definition funknown.h:122
#define IMPLEMENT_FUNKNOWN_METHODS(ClassName, InterfaceName, ClassIID)
Definition funknown.h:150
#define FUNKNOWN_DTOR
Definition funknown.h:127
#define IMPLEMENT_REFCOUNT(ClassName)
Definition funknown.h:106
static PuglViewHint int value
Definition pugl.h:1708
JSAMPIMAGE data
Definition jpeglib.h:945
int version
Definition jpeglib.h:901
Definition ivstattributes.h:28
static const ChunkID commonChunks[kNumPresetChunks]
Definition vstpresetfile.cpp:48
char[4] ChunkID
Definition vstpresetfile.h:84
bool copyStream(IBStream *inStream, IBStream *outStream)
Definition vstpresetfile.cpp:81
bool isEqualID(const ChunkID id1, const ChunkID id2)
Definition vstpresetfile.h:102
static const int32 kClassIDSize
Definition vstpresetfile.cpp:60
ChunkType
Definition vstpresetfile.h:88
@ kComponentState
Definition vstpresetfile.h:90
@ kNumPresetChunks
Definition vstpresetfile.h:95
@ kHeader
Definition vstpresetfile.h:89
@ kProgramData
Definition vstpresetfile.h:92
@ kChunkList
Definition vstpresetfile.h:94
@ kMetaInfo
Definition vstpresetfile.h:93
@ kControllerState
Definition vstpresetfile.h:91
bool verify(tresult result)
Definition vstpresetfile.cpp:75
static const int32 kListOffsetPos
Definition vstpresetfile.cpp:62
int32 ProgramListID
program list identifier
Definition vsttypes.h:76
const ChunkID & getChunkID(ChunkType type)
Definition vstpresetfile.cpp:65
int32 UnitID
unit identifier
Definition vsttypes.h:73
static const int32 kFormatVersion
Definition vstpresetfile.cpp:59
static const int32 kHeaderSize
Definition vstpresetfile.cpp:61
Definition baseiids.cpp:43
int int32
Definition ftypes.h:50
int64 TSize
Definition ftypes.h:75
char char8
Definition ftypes.h:93
int8 TUID[16]
plain UID type
Definition funknown.h:210
char int8
Definition ftypes.h:39
@ kResultOk
Definition funknown.h:193
@ kNotImplemented
Definition funknown.h:197
@ kResultFalse
Definition funknown.h:195
@ kResultTrue
Definition funknown.h:194
@ kNotInitialized
Definition funknown.h:199
long long int64
Definition ftypes.h:66
int32 tresult
Definition ftypes.h:76
unsigned int uint32
Definition ftypes.h:51
png_structrp int mode
Definition png.h:1139
Definition funknown.h:539
Definition vstpresetfile.h:121
memcpy(hh, h, RAND_HEAD_LEN)
ulg size
Definition extract.c:2350
int result
Definition process.c:1455
read(f, &c, 1)
_WDL_CSTRING_PREFIX void INT_PTR count
Definition wdlcstring.h:263