[vlmc-devel] [PATCH 1/4] Settings: Use Base64 to save QByteArray

yikei lu luyikei.qmltu at gmail.com
Sun May 1 05:48:20 CEST 2016


"QByteArray QMainWindow::saveState(int version = 0) const" is. It will
always start with \0 in my case, which makes QJsonValue mistakenly
recognizes it as null.
Also, saveGeometry() doesn't work since there must be \0 anywhere in
the QByteArray.
So you can see that unless the patch be applied, you can't save and
restore the mainwindow's state/geometry.

You can confirm this with vlmc.conf

2016-05-01 2:03 GMT+09:00 Hugo Beauzée-Luyssen <hugo at beauzee.fr>:
> On 04/29/2016 10:05 AM, Yikai Lu wrote:
>> "Note: A QByteArray can store any byte values including '\0's, but most functions that take char * arguments assume that the data ends at the first '\0' they encounter."
>>
>> Because of the above, we can't save QByteArray directly.
>> ---
>>  src/Settings/Settings.cpp | 13 +++++++++++--
>>  1 file changed, 11 insertions(+), 2 deletions(-)
>>
>> diff --git a/src/Settings/Settings.cpp b/src/Settings/Settings.cpp
>> index b8cef75..2092d59 100644
>> --- a/src/Settings/Settings.cpp
>> +++ b/src/Settings/Settings.cpp
>> @@ -159,8 +159,14 @@ Settings::loadJsonFrom( const QJsonObject &object )
>>          if ( isChildSettings == true )
>>              continue;
>>
>> -        if ( setValue( it.key(), (*it).toVariant() ) == false )
>> +        SettingValue* val = value( it.key() );
>> +        if ( val == nullptr )
>>              vlmcWarning() << "Loaded invalid project setting:" << it.key();
>> +
>> +        if ( val->type() == SettingValue::ByteArray )
>> +            val->set( QByteArray::fromBase64( (*it).toVariant().toByteArray() ) );
>> +        else
>> +            val->set( (*it).toVariant() );
>>      }
>>      emit postLoad();
>>  }
>> @@ -173,7 +179,10 @@ Settings::saveJsonTo( QJsonObject &object )
>>      {
>>          if ( ( val->flags() & SettingValue::Runtime ) != 0 )
>>              continue ;
>> -        object.insert( val->key(), QJsonValue::fromVariant( val->get() ) );
>> +        if ( val->type() == SettingValue::ByteArray )
>> +            object.insert( val->key(), QJsonValue( QString( val->get().toByteArray().toBase64() ) ) );
>> +        else
>> +            object.insert( val->key(), QJsonValue::fromVariant( val->get() ) );
>>      }
>>  }
>>
>>
> Is there a specific case where this would be an issue?
>
> --
> Hugo Beauzée-Luyssen
> www.beauzee.fr
> _______________________________________________
> Vlmc-devel mailing list
> Vlmc-devel at videolan.org
> https://mailman.videolan.org/listinfo/vlmc-devel


More information about the Vlmc-devel mailing list