QVariantMap convertToVariant(const QStringMap &val) { QVariantMap ret; for(const QString &k : val.keys()) { ret[k] = val[k]; } return ret; }
QVariant MethodInfo::Invoke( Service *pService, const QStringMap &reqParams ) { HttpRedirectException exception; bool bExceptionThrown = false; QStringMap lowerParams; if (!pService) throw; // Change params to lower case for case-insensitive comparison QStringMap::const_iterator it = reqParams.begin(); for (; it != reqParams.end(); ++it) { lowerParams[it.key().toLower()] = *it; } // -------------------------------------------------------------- // Provide actual parameters received to method // -------------------------------------------------------------- pService->m_parsedParams = lowerParams.keys(); QList<QByteArray> paramNames = m_oMethod.parameterNames(); QList<QByteArray> paramTypes = m_oMethod.parameterTypes(); // ---------------------------------------------------------------------- // Create Parameter array (Can't have more than _MAX_PARAMS parameters).... // switched to static array for performance. // ---------------------------------------------------------------------- void *param[ _MAX_PARAMS ]; int types[ _MAX_PARAMS ]; memset( param, 0, _MAX_PARAMS * sizeof(void *)); memset( types, 0, _MAX_PARAMS * sizeof(int)); try { // -------------------------------------------------------------- // Add a place for the Return value // -------------------------------------------------------------- int nRetIdx = QMetaType::type( m_oMethod.typeName() ); if (nRetIdx != 0) { param[ 0 ] = QMetaType::create( nRetIdx ); types[ 0 ] = nRetIdx; } else { param[ 0 ] = nullptr; types[ 0 ] = 0; } // -------------------------------------------------------------- // Fill in parameters from request values // -------------------------------------------------------------- for( int nIdx = 0; nIdx < paramNames.length(); nIdx++ ) { QString sValue = lowerParams[ paramNames[ nIdx ].toLower() ]; QString sParamType = paramTypes[ nIdx ]; int nId = QMetaType::type( paramTypes[ nIdx ] ); void *pParam = nullptr; if (nId != 0) { pParam = QMetaType::create( nId ); } else { LOG(VB_GENERAL, LOG_ERR, QString("MethodInfo::Invoke - Type unknown '%1'") .arg(sParamType)); } types[nIdx+1] = nId; param[nIdx+1] = pService->ConvertToParameterPtr( nId, sParamType, pParam, sValue ); } #if 0 QThread *currentThread = QThread::currentThread(); QThread *objectThread = pService->thread(); if (currentThread == objectThread) LOG(VB_HTTP, LOG_DEBUG, "*** Threads are same ***"); else LOG(VB_HTTP, LOG_DEBUG, "*** Threads are Different!!! ***"); #endif pService->qt_metacall( QMetaObject::InvokeMetaMethod, m_nMethodIndex, param ); // -------------------------------------------------------------- // Delete param array, skip return parameter since not dynamically // created. // -------------------------------------------------------------- for (int nIdx=1; nIdx < paramNames.length()+1; nIdx++) { if ((types[ nIdx ] != 0) && (param[ nIdx ] != nullptr)) QMetaType::destroy( types[ nIdx ], param[ nIdx ] ); } } catch (QString &sMsg) { LOG(VB_GENERAL, LOG_ERR, QString("MethodInfo::Invoke - An Exception Occurred: %1") .arg(sMsg)); if ((types[ 0 ] != 0) && (param[ 0 ] != nullptr )) QMetaType::destroy( types[ 0 ], param[ 0 ] ); throw; } catch (HttpRedirectException &ex) { bExceptionThrown = true; exception = ex; } catch (...) { LOG(VB_GENERAL, LOG_INFO, "MethodInfo::Invoke - An Exception Occurred" ); } // -------------------------------------------------------------- // return the result after converting to a QVariant // -------------------------------------------------------------- QVariant vReturn; if ( param[ 0 ] != nullptr) { vReturn = pService->ConvertToVariant( types[ 0 ], param[ 0 ] ); if (types[ 0 ] != 0) QMetaType::destroy( types[ 0 ], param[ 0 ] ); } // -------------------------------------------------------------- // Re-throw exception if needed. // -------------------------------------------------------------- if (bExceptionThrown) throw exception; return vReturn; }