bool CResource::CallExportedFunction ( const char * szFunctionName, CLuaArguments& args, CLuaArguments& returns, CResource& caller ) { list < CExportedFunction* > ::iterator iter = m_exportedFunctions.begin (); for ( ; iter != m_exportedFunctions.end (); iter++ ) { if ( strcmp ( (*iter)->GetFunctionName(), szFunctionName ) == 0 ) { if ( args.CallGlobal ( m_pLuaVM, szFunctionName, &returns ) ) { return true; } } } return false; }
ResponseCode CResourceHTMLItem::Request ( HttpRequest * ipoHttpRequest, HttpResponse * ipoHttpResponse, CAccount * account ) { if ( !m_pVM ) Start (); if ( m_bIsBeingRequested ) { ipoHttpResponse->SetBody ( "Busy!", strlen("Busy!") ); return HTTPRESPONSECODE_500_INTERNALSERVERERROR; } m_bIsBeingRequested = true; m_responseCode = HTTPRESPONSECODE_200_OK; if ( !m_bIsRaw ) { ipoHttpResponse->oResponseHeaders [ "content-type" ] = m_strMime; CLuaArguments formData; for ( FormValueMap::iterator iter = ipoHttpRequest->oFormValueMap.begin(); iter != ipoHttpRequest->oFormValueMap.end(); iter++ ) { formData.PushString ( (*iter).first.c_str() ); formData.PushString ( ((FormValue)(*iter).second).sBody.c_str() ); } CLuaArguments cookies; for ( CookieMap::iterator iter = ipoHttpRequest->oCookieMap.begin(); iter != ipoHttpRequest->oCookieMap.end(); iter++ ) { cookies.PushString ( (*iter).first.c_str() ); cookies.PushString ( (*iter).second.c_str() ); } CLuaArguments headers; for ( StringMap::iterator iter = ipoHttpRequest->oRequestHeaders.begin(); iter != ipoHttpRequest->oRequestHeaders.end(); iter++ ) { headers.PushString ( (*iter).first.c_str() ); headers.PushString ( (*iter).second.c_str() ); } m_currentResponse = ipoHttpResponse; CLuaArguments querystring ( formData ); CLuaArguments args; args.PushTable ( &headers ); // requestHeaders args.PushTable ( &formData ); // form args.PushTable ( &cookies ); // cookies args.PushString ( ipoHttpRequest->GetAddress().c_str() ); // hostname args.PushString ( ipoHttpRequest->sOriginalUri.c_str() ); // url args.PushTable ( &querystring ); // querystring args.PushAccount ( account ); // g_pGame->Lock(); // get the mutex (blocking) args.CallGlobal ( m_pVM, "renderPage" ); // g_pGame->Unlock(); // release the mutex ipoHttpResponse->SetBody ( m_strPageBuffer.c_str (), m_strPageBuffer.size () ); m_strPageBuffer.clear (); } else { // its a raw page FILE * file = fopen ( m_strResourceFileName.c_str (), "rb" ); if ( file ) { fseek ( file, 0, SEEK_END ); long lBufferLength = ftell ( file ); char* pBuffer = new char [ lBufferLength ]; rewind ( file ); fread ( pBuffer, 1, lBufferLength, file ); fclose ( file ); ipoHttpResponse->oResponseHeaders [ "content-type" ] = m_strMime; ipoHttpResponse->SetBody ( pBuffer, lBufferLength ); delete[] pBuffer; } else { ipoHttpResponse->SetBody ( "Can't read file!", strlen("Can't read file!") ); } } m_bIsBeingRequested = false; return m_responseCode; }