[vlmc-devel] [PATCH 1/4] Settings: Use Base64 to save QByteArray
yikei lu
luyikei.qmltu at gmail.com
Sun May 1 05:56:06 CEST 2016
FYI, saveGeometry() will create a byte array like
"\001ÙÐË\000\002\000\000ÿÿþu\000\000\000L\000\000\003R\000\000\002¾ÿÿþv\000\000\000f\000\000\003Q\000\000\002½\000\000\000\000\000\000\000\000\007\200"
saveState():
"\000\000\000ÿ\000\000\000\000ý\000\000\000\001\000\000\000\002\000\000\004Ü\000\000\001\004ü\001\000\000\000\005û\000\000\000\030\000M\000e\000d\000i\000a\000L\000i\000b\000r\000a\000r\000y\001\000\000\000\000\000\000\001\030\000\000\001\030\000ÿÿÿû\000\000\000\030\000E\000f\000f\000e\000c\000t\000s\000
\000L"... (327)
A LOT OF \0 !!!
2016-05-01 12:48 GMT+09:00 yikei lu <luyikei.qmltu at gmail.com>:
> "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