- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
void ArmInterface::dispatchMessage(QString name, QJsonArray args)
{
//флаг того что мы не смогли обработать
bool notCallbacks = true;
//проходим по всем методам( которые кстати можно создать в рантайме )
for( int i = 0; i < metaObject()->methodCount() ; i++ )
{
QMetaMethod method = metaObject()->method( i);
//имя метода подходит под имя под сообщение от сервера? Прекрасно проверяем дальше.
if ( method.name() != name )
{
qWarning() << "method.name() != name" << " -> " <<method.name() << " != " << name;
//так как метод не найден мы просто выйдем отсюда, не дожидаясь ничего плохого
continue;
}
//метод у нас публичный? Если да то можно запускать обработку иначе заявим что низя
if ( method.access() != QMetaMethod::Public )
{
qWarning() << "Method " << method.name()<< " not public!";
#ifdef IGNORE_NOT_PUBLIC_METHOD
continue;
#endif
}
//несовдатает количество аргументов? Хватит это терпеть пишем warning, и если надо выходим из этого диспатчера
int countParams = method.parameterCount();
if ( args.count() != method.parameterCount() )
{
qWarning() << "Method " << method.name() << " params count = " << method.parameterCount() << " and received args params count = " << args.count();
#ifndef IGNORE_METHOD_PARAMS_COUNT
continue;
#endif
//берем наименьшее количество параметров
countParams = countParams > args.count() ? countParams : args.count();
}
//создание валидного QGenericArgument
auto genericArg = [ this, method, args ]( int index ) -> QGenericArgument{
//out of range?
if ( args.count() <= index ||
method.parameterCount() <= index )
return QGenericArgument();
void * data = 0;
//сохраняем временный QVariant для дальнейшей более удобной работы с ним
QVariant temp = args.at( index ).toVariant();
//попытка конвертирования типов. Если что-то не получается, пишем в лог. Мб надо будет сделать преждевременный выход, если сконвертировать не получается.
if ( !temp.convert( method.parameterType( index) ) )
{
qWarning()<< objectName() << " method : " << method.name() <<
" Not convert " << method.parameterNames().at( index ) << args.at( index ).toVariant().typeName() <<
" from " << args.at( index ).toVariant().typeName() <<
" to " << QMetaType::typeName( method.parameterType( index) ) ;
};
//у нас есть такой аргумент? Если нет - то ничего не делаем
if ( args.count() > index )
{
data = QMetaType::create( method.parameterType( index ) , temp.data() );
}
const char * name = 0;
//у нас есть имя аргумента и аргумент в него? Если чего-то нет - то ничего и не будем ничего делать
if ( method.parameterNames().count() > index && data)
name = method.parameterNames().at( index ).data();
return QGenericArgument(
name,
data);
};
//тут можно вызывать!
method.invoke( this,
//генерируем аргументы
genericArg(0),
genericArg(1),
genericArg(2),
genericArg(3),
genericArg(4),
genericArg(5),
genericArg(6),
genericArg(7),
genericArg(8),
genericArg(9));
notCallbacks = false;
//раз вызвали значит нашли подходящий callback, а следовательно искать дальше ненадо. Выходим нафиг.
break;
}
//вызвали что -нить? Если вызвали то не вызываем ничего. А иначе идем в другую функцию - которая разбирается как раз с такими сообщениями.
//Если надо перехватить совершенно все сообщения - перегружать функцию в которой находимся.
if ( !notCallbacks )
dispathUndefinedMessage( name, args );
}
Написал и мучаюсь - гавнокод или все таки нет.
ахда, мне надо выучить русский )
Олсо там есть QMetaObject::indexOfMethod() чтобы херню с циклом не городить...
Только сейчас додумался что надо сначало отфильтровать название методов, вынести их в отдельный список, и по нему уже бегать. Тогда можно вывести warning если метод не перегружен, и не приводятся аргументы к требуемому типу.
Ваще это подготовка к написанию обработчиков в js, а не в python.
Это подготовка для скрещивания динозавра с глупозавром.
вам всем самим-то удобно такое форматирование разглядывать?
>>//проходим по всем методам( которые кстати можно создать в рантайме )
первый раз вижу что бы в коментах к коду хвалились и юзали слово кстати
>> //метод у нас публичный? Если да то можно запускать обработку иначе заявим что низя
инкапсуляция? нет, не слышал
Из ливерпульской гавани всегда по четвергам
Суда уходят в плаванье к далёким берегам...
А хотел ты совсем другого.
Профессиональная деформация сознания.
Суда уходят типа в плаванье кароч нах ну к далёким сука ептить берегам...
We come from the land of the ice and snow,
From the midnight sun where the hot springs flow.
Hammer of the gods will drive our ships to new lands.