- 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 );
}
Написал и мучаюсь - гавнокод или все таки нет.
ахда, мне надо выучить русский )
bormand 02.03.2015 19:29 # 0
Олсо там есть QMetaObject::indexOfMethod() чтобы херню с циклом не городить...
bormand 02.03.2015 19:38 # 0
Dart_Sergius 02.03.2015 20:04 # 0
Только сейчас додумался что надо сначало отфильтровать название методов, вынести их в отдельный список, и по нему уже бегать. Тогда можно вывести warning если метод не перегружен, и не приводятся аргументы к требуемому типу.
roman-kashitsyn 02.03.2015 20:17 # 0
Dart_Sergius 02.03.2015 20:22 # 0
Ваще это подготовка к написанию обработчиков в js, а не в python.
Это подготовка для скрещивания динозавра с глупозавром.
roman-kashitsyn 02.03.2015 20:25 # 0
bormand 03.03.2015 06:34 # 0
Dart_Sergius 03.03.2015 12:54 # 0
Fike 02.03.2015 20:44 # +1
вам всем самим-то удобно такое форматирование разглядывать?
Dart_Sergius 02.03.2015 20:53 # 0
Fike 02.03.2015 21:02 # 0
Dart_Sergius 02.03.2015 21:13 # 0
kegdan 02.03.2015 22:21 # +1
>>//проходим по всем методам( которые кстати можно создать в рантайме )
первый раз вижу что бы в коментах к коду хвалились и юзали слово кстати
>> //метод у нас публичный? Если да то можно запускать обработку иначе заявим что низя
инкапсуляция? нет, не слышал
bormand 03.03.2015 06:36 # +1
Из ливерпульской гавани всегда по четвергам
Суда уходят в плаванье к далёким берегам...
kegdan 03.03.2015 06:44 # 0
bormand 03.03.2015 07:43 # +1
kegdan 03.03.2015 12:03 # +1
absolut 03.03.2015 15:02 # 0
А хотел ты совсем другого.
kegdan 03.03.2015 15:23 # 0
3.14159265 03.03.2015 15:25 # +1
Профессиональная деформация сознания.
kegdan 03.03.2015 15:28 # 0
Суда уходят типа в плаванье кароч нах ну к далёким сука ептить берегам...
3.14159265 03.03.2015 15:20 # 0
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.