|
|
@@ -23,6 +23,7 @@ |
|
|
|
|
|
|
|
#include <string> |
|
|
|
|
|
|
|
using juce::MemoryOutputStream; |
|
|
|
using juce::String; |
|
|
|
using juce::XmlElement; |
|
|
|
|
|
|
@@ -31,25 +32,23 @@ CARLA_BACKEND_START_NAMESPACE |
|
|
|
// ----------------------------------------------------------------------- |
|
|
|
// getNewLineSplittedString |
|
|
|
|
|
|
|
static String getNewLineSplittedString(const String& string) |
|
|
|
static void getNewLineSplittedString(MemoryOutputStream& stream, const String& string) |
|
|
|
{ |
|
|
|
static const int kLineWidth = 120; |
|
|
|
|
|
|
|
int i=0; |
|
|
|
const int length=string.length(); |
|
|
|
int i = 0; |
|
|
|
const int length = string.length(); |
|
|
|
const char* const raw = string.toUTF8(); |
|
|
|
|
|
|
|
String newString; |
|
|
|
newString.preallocateBytes(static_cast<size_t>(length + length/120 + 2)); |
|
|
|
stream.preallocate(static_cast<std::size_t>(length + length/kLineWidth + 3)); |
|
|
|
|
|
|
|
for (; i+kLineWidth < length; i += kLineWidth) |
|
|
|
{ |
|
|
|
newString += string.substring(i, i+kLineWidth); |
|
|
|
newString += "\n"; |
|
|
|
stream.write(raw+i, kLineWidth); |
|
|
|
stream.writeByte('\n'); |
|
|
|
} |
|
|
|
|
|
|
|
newString += string.substring(i); |
|
|
|
|
|
|
|
return newString; |
|
|
|
stream << (raw+i); |
|
|
|
} |
|
|
|
|
|
|
|
// ----------------------------------------------------------------------- |
|
|
@@ -479,8 +478,7 @@ bool CarlaStateSave::fillFromXmlElement(const XmlElement* const xmlElement) |
|
|
|
|
|
|
|
else if (tag.equalsIgnoreCase("chunk")) |
|
|
|
{ |
|
|
|
const String nText(text.replace("\n", "")); |
|
|
|
chunk = xmlSafeStringCharDup(nText, false); |
|
|
|
chunk = carla_strdup(text.toRawUTF8()); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
@@ -492,13 +490,12 @@ bool CarlaStateSave::fillFromXmlElement(const XmlElement* const xmlElement) |
|
|
|
// ----------------------------------------------------------------------- |
|
|
|
// fillXmlStringFromStateSave |
|
|
|
|
|
|
|
String CarlaStateSave::toString() const |
|
|
|
void CarlaStateSave::dumpToMemoryStream(MemoryOutputStream& content) const |
|
|
|
{ |
|
|
|
String content; |
|
|
|
|
|
|
|
{ |
|
|
|
String infoXml(" <Info>\n"); |
|
|
|
MemoryOutputStream infoXml; |
|
|
|
|
|
|
|
infoXml << " <Info>\n"; |
|
|
|
infoXml << " <Type>" << String(type != nullptr ? type : "") << "</Type>\n"; |
|
|
|
infoXml << " <Name>" << xmlSafeString(name, true) << "</Name>\n"; |
|
|
|
|
|
|
@@ -512,7 +509,7 @@ String CarlaStateSave::toString() const |
|
|
|
case PLUGIN_LADSPA: |
|
|
|
infoXml << " <Binary>" << xmlSafeString(binary, true) << "</Binary>\n"; |
|
|
|
infoXml << " <Label>" << xmlSafeString(label, true) << "</Label>\n"; |
|
|
|
infoXml << " <UniqueID>" << uniqueId << "</UniqueID>\n"; |
|
|
|
infoXml << " <UniqueID>" << juce::int64(uniqueId) << "</UniqueID>\n"; |
|
|
|
break; |
|
|
|
case PLUGIN_DSSI: |
|
|
|
infoXml << " <Binary>" << xmlSafeString(binary, true) << "</Binary>\n"; |
|
|
@@ -523,7 +520,7 @@ String CarlaStateSave::toString() const |
|
|
|
break; |
|
|
|
case PLUGIN_VST2: |
|
|
|
infoXml << " <Binary>" << xmlSafeString(binary, true) << "</Binary>\n"; |
|
|
|
infoXml << " <UniqueID>" << uniqueId << "</UniqueID>\n"; |
|
|
|
infoXml << " <UniqueID>" << juce::int64(uniqueId) << "</UniqueID>\n"; |
|
|
|
break; |
|
|
|
case PLUGIN_VST3: |
|
|
|
infoXml << " <Binary>" << xmlSafeString(binary, true) << "</Binary>\n"; |
|
|
@@ -551,7 +548,7 @@ String CarlaStateSave::toString() const |
|
|
|
|
|
|
|
#ifndef BUILD_BRIDGE |
|
|
|
{ |
|
|
|
String dataXml; |
|
|
|
MemoryOutputStream dataXml; |
|
|
|
|
|
|
|
dataXml << " <Active>" << (active ? "Yes" : "No") << "</Active>\n"; |
|
|
|
|
|
|
@@ -582,8 +579,10 @@ String CarlaStateSave::toString() const |
|
|
|
Parameter* const stateParameter(it.getValue(nullptr)); |
|
|
|
CARLA_SAFE_ASSERT_CONTINUE(stateParameter != nullptr); |
|
|
|
|
|
|
|
String parameterXml("\n"" <Parameter>\n"); |
|
|
|
MemoryOutputStream parameterXml; |
|
|
|
|
|
|
|
parameterXml << "\n"; |
|
|
|
parameterXml << " <Parameter>\n"; |
|
|
|
parameterXml << " <Index>" << String(stateParameter->index) << "</Index>\n"; |
|
|
|
parameterXml << " <Name>" << xmlSafeString(stateParameter->name, true) << "</Name>\n"; |
|
|
|
|
|
|
@@ -611,7 +610,9 @@ String CarlaStateSave::toString() const |
|
|
|
// ignore 'default' program |
|
|
|
if (currentProgramIndex > 0 || ! String(currentProgramName).equalsIgnoreCase("default")) |
|
|
|
{ |
|
|
|
String programXml("\n"); |
|
|
|
MemoryOutputStream programXml; |
|
|
|
|
|
|
|
programXml << "\n"; |
|
|
|
programXml << " <CurrentProgramIndex>" << currentProgramIndex+1 << "</CurrentProgramIndex>\n"; |
|
|
|
programXml << " <CurrentProgramName>" << xmlSafeString(currentProgramName, true) << "</CurrentProgramName>\n"; |
|
|
|
|
|
|
@@ -621,7 +622,9 @@ String CarlaStateSave::toString() const |
|
|
|
|
|
|
|
if (currentMidiBank >= 0 && currentMidiProgram >= 0) |
|
|
|
{ |
|
|
|
String midiProgramXml("\n"); |
|
|
|
MemoryOutputStream midiProgramXml; |
|
|
|
|
|
|
|
midiProgramXml << "\n"; |
|
|
|
midiProgramXml << " <CurrentMidiBank>" << currentMidiBank+1 << "</CurrentMidiBank>\n"; |
|
|
|
midiProgramXml << " <CurrentMidiProgram>" << currentMidiProgram+1 << "</CurrentMidiProgram>\n"; |
|
|
|
|
|
|
@@ -634,7 +637,10 @@ String CarlaStateSave::toString() const |
|
|
|
CARLA_SAFE_ASSERT_CONTINUE(stateCustomData != nullptr); |
|
|
|
CARLA_SAFE_ASSERT_CONTINUE(stateCustomData->isValid()); |
|
|
|
|
|
|
|
String customDataXml("\n"" <CustomData>\n"); |
|
|
|
MemoryOutputStream customDataXml; |
|
|
|
|
|
|
|
customDataXml << "\n"; |
|
|
|
customDataXml << " <CustomData>\n"; |
|
|
|
customDataXml << " <Type>" << xmlSafeString(stateCustomData->type, true) << "</Type>\n"; |
|
|
|
customDataXml << " <Key>" << xmlSafeString(stateCustomData->key, true) << "</Key>\n"; |
|
|
|
|
|
|
@@ -658,15 +664,17 @@ String CarlaStateSave::toString() const |
|
|
|
|
|
|
|
if (chunk != nullptr && chunk[0] != '\0') |
|
|
|
{ |
|
|
|
String chunkXml("\n"" <Chunk>\n"); |
|
|
|
chunkXml << getNewLineSplittedString(chunk) << "\n </Chunk>\n"; |
|
|
|
MemoryOutputStream chunkXml, chunkSplt; |
|
|
|
getNewLineSplittedString(chunkSplt, chunk); |
|
|
|
|
|
|
|
chunkXml << "\n <Chunk>\n"; |
|
|
|
chunkXml << chunkSplt; |
|
|
|
chunkXml << "\n </Chunk>\n"; |
|
|
|
|
|
|
|
content << chunkXml; |
|
|
|
} |
|
|
|
|
|
|
|
content << " </Data>\n"; |
|
|
|
|
|
|
|
return content; |
|
|
|
} |
|
|
|
|
|
|
|
// ----------------------------------------------------------------------- |
|
|
|