diff options
-rw-r--r-- | indra/cmake/TemplateCheck.cmake | 2 | ||||
-rw-r--r-- | indra/newview/CMakeLists.txt | 261 | ||||
-rw-r--r-- | indra/newview/llavataractions.cpp | 9 | ||||
-rw-r--r-- | indra/newview/llbottomtray.cpp | 58 | ||||
-rw-r--r-- | indra/newview/llbottomtray.h | 2 | ||||
-rw-r--r-- | indra/newview/llimview.cpp | 115 | ||||
-rw-r--r-- | indra/newview/llimview.h | 22 | ||||
-rw-r--r-- | indra/newview/llnavigationbar.cpp | 9 | ||||
-rw-r--r-- | indra/newview/llpanelpicks.cpp | 21 | ||||
-rw-r--r-- | indra/newview/llpanelpicks.h | 5 | ||||
-rw-r--r-- | indra/newview/llsyswellwindow.cpp | 18 | ||||
-rw-r--r-- | indra/newview/skins/default/xui/en/floater_im_session.xml | 12 | ||||
-rw-r--r-- | indra/newview/skins/default/xui/en/panel_picks.xml | 7 | ||||
-rw-r--r-- | indra/newview/skins/default/xui/en/strings.xml | 8 | ||||
-rwxr-xr-x | indra/newview/viewer_manifest.py | 206 |
15 files changed, 405 insertions, 350 deletions
diff --git a/indra/cmake/TemplateCheck.cmake b/indra/cmake/TemplateCheck.cmake index 3b73dc82df..fa4e387dd5 100644 --- a/indra/cmake/TemplateCheck.cmake +++ b/indra/cmake/TemplateCheck.cmake @@ -5,7 +5,7 @@ include(Python) macro (check_message_template _target) add_custom_command( TARGET ${_target} - PRE_LINK + POST_BUILD COMMAND ${PYTHON_EXECUTABLE} ARGS ${SCRIPTS_DIR}/template_verifier.py --mode=development --cache_master diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 293faa7b70..3ecc35cc8e 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -1353,7 +1353,6 @@ add_executable(${VIEWER_BINARY_NAME} MACOSX_BUNDLE ${viewer_SOURCE_FILES} ) -check_message_template(${VIEWER_BINARY_NAME}) if (LLKDU_LIBRARY) add_dependencies(${VIEWER_BINARY_NAME} ${LLKDU_LIBRARY}) @@ -1390,45 +1389,82 @@ if (WINDOWS) ) endif(USE_PRECOMPILED_HEADERS) - # sets the 'working directory' for debugging from visual studio. - if (NOT UNATTENDED) - add_custom_command( - TARGET ${VIEWER_BINARY_NAME} POST_BUILD - COMMAND ${CMAKE_SOURCE_DIR}/tools/vstool/vstool.exe - ARGS - --solution - ${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}.sln - --workingdir - ${VIEWER_BINARY_NAME} - "${CMAKE_CURRENT_SOURCE_DIR}" - COMMENT "Setting the ${VIEWER_BINARY_NAME} working directory for debugging." - ) - endif (NOT UNATTENDED) - - add_custom_command( - TARGET ${VIEWER_BINARY_NAME} PRE_BUILD - COMMAND ${CMAKE_COMMAND} - ARGS - -E - copy_if_different - ${CMAKE_CURRENT_SOURCE_DIR}/../../scripts/messages/message_template.msg - ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/app_settings/message_template.msg - COMMENT "Copying message_template.msg to the runtime folder." - ) - - add_custom_command( - TARGET ${VIEWER_BINARY_NAME} PRE_BUILD - COMMAND ${CMAKE_COMMAND} - ARGS - -E - copy_if_different - ${CMAKE_CURRENT_SOURCE_DIR}/../../etc/message.xml - ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/app_settings/message.xml - COMMENT "Copying message.xml to the runtime folder." + # If adding a file to viewer_manifest.py in the WindowsManifest.construct() method, be sure to add the dependency + # here. + # *NOTE:Mani - This is a crappy hack to have important dependecies for the viewer_manifest copy action + # be met. I'm looking forward to a source-code split-up project next year that will address this kind of thing. + # In the meantime, if you have any ideas on how to easily maintain one list, either here or in viewer_manifest.py + # and have the build deps get tracked *please* tell me about it. + set(COPY_INPUT_DEPENDECIES + # The following commented dependencies are determined at variably at build time. Can't do this here. + #llkdu.dll => llkdu.dll + #${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/libtcmalloc_minimal.dll => None ... Skipping libtcmalloc_minimal.dll + ${CMAKE_SOURCE_DIR}/../etc/message.xml + ${CMAKE_SOURCE_DIR}/../scripts/messages/message_template.msg + ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/llcommon.dll + ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/libapr-1.dll + ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/libaprutil-1.dll + ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/libapriconv-1.dll + ${SHARED_LIB_STAGING_DIR}/Release/openjpeg.dll + ${SHARED_LIB_STAGING_DIR}/RelWithDebInfo/openjpeg.dll + ${SHARED_LIB_STAGING_DIR}/Debug/openjpegd.dll + ${SHARED_LIB_STAGING_DIR}/Release/msvcr80.dll + ${SHARED_LIB_STAGING_DIR}/Release/msvcp80.dll + ${SHARED_LIB_STAGING_DIR}/Release/Microsoft.VC80.CRT.manifest + ${SHARED_LIB_STAGING_DIR}/RelWithDebInfo/msvcr80.dll + ${SHARED_LIB_STAGING_DIR}/RelWithDebInfo/msvcp80.dll + ${SHARED_LIB_STAGING_DIR}/RelWithDebInfo/Microsoft.VC80.CRT.manifest + ${SHARED_LIB_STAGING_DIR}/Debug/msvcr80d.dll + ${SHARED_LIB_STAGING_DIR}/Debug/msvcp80d.dll + ${SHARED_LIB_STAGING_DIR}/Debug/Microsoft.VC80.DebugCRT.manifest + ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/SLVoice.exe + ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/vivoxsdk.dll + ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/ortp.dll + ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/libsndfile-1.dll + ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/zlib1.dll + ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/vivoxplatform.dll + ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/vivoxoal.dll + ${CMAKE_CURRENT_SOURCE_DIR}/licenses-win32.txt + ${CMAKE_CURRENT_SOURCE_DIR}/featuretable.txt + ${CMAKE_CURRENT_SOURCE_DIR}/dbghelp.dll + ${CMAKE_CURRENT_SOURCE_DIR}/fmod.dll + ${CMAKE_BINARY_DIR}/media_plugins/quicktime/${CMAKE_CFG_INTDIR}/media_plugin_quicktime.dll + ${CMAKE_BINARY_DIR}/media_plugins/quicktime/${CMAKE_CFG_INTDIR}/media_plugin_webkit.dll + ${ARCH_PREBUILT_DIRS_RELEASE}/libeay32.dll + ${ARCH_PREBUILT_DIRS_RELEASE}/qtcore4.dll + ${ARCH_PREBUILT_DIRS_RELEASE}/qtgui4.dll + ${ARCH_PREBUILT_DIRS_RELEASE}/qtnetwork4.dll + ${ARCH_PREBUILT_DIRS_RELEASE}/qtopengl4.dll + ${ARCH_PREBUILT_DIRS_RELEASE}/qtwebkit4.dll + ${ARCH_PREBUILT_DIRS_RELEASE}/ssleay32.dll + ${ARCH_PREBUILT_DIRS_RELEASE}/imageformats/qgif4.dll + ${ARCH_PREBUILT_DIRS_RELEASE}/imageformats/qico4.dll + ${ARCH_PREBUILT_DIRS_RELEASE}/imageformats/qjpeg4.dll + ${ARCH_PREBUILT_DIRS_RELEASE}/imageformats/qmng4.dll + ${ARCH_PREBUILT_DIRS_RELEASE}/imageformats/qsvg4.dll + ${ARCH_PREBUILT_DIRS_RELEASE}/imageformats/qtiff4.dll + ${ARCH_PREBUILT_DIRS_DEBUG}/libeay32.dll + ${ARCH_PREBUILT_DIRS_DEBUG}/qtcored4.dll + ${ARCH_PREBUILT_DIRS_DEBUG}/qtguid4.dll + ${ARCH_PREBUILT_DIRS_DEBUG}/qtnetworkd4.dll + ${ARCH_PREBUILT_DIRS_DEBUG}/qtopengld4.dll + ${ARCH_PREBUILT_DIRS_DEBUG}/qtwebkitd4.dll + ${ARCH_PREBUILT_DIRS_DEBUG}/ssleay32.dll + ${ARCH_PREBUILT_DIRS_DEBUG}/imageformats/qgifd4.dll + ${ARCH_PREBUILT_DIRS_DEBUG}/imageformats/qicod4.dll + ${ARCH_PREBUILT_DIRS_DEBUG}/imageformats/qjpegd4.dll + ${ARCH_PREBUILT_DIRS_DEBUG}/imageformats/qmngd4.dll + ${ARCH_PREBUILT_DIRS_DEBUG}/imageformats/qsvgd4.dll + ${ARCH_PREBUILT_DIRS_DEBUG}/imageformats/qtiffd4.dll + SLPlugin + media_plugin_quicktime + media_plugin_webkit + windows-crash-logger + windows-updater ) - + add_custom_command( - TARGET ${VIEWER_BINARY_NAME} POST_BUILD + OUTPUT ${CMAKE_CFG_INTDIR}/copy_touched.bat COMMAND ${PYTHON_EXECUTABLE} ARGS ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py @@ -1439,11 +1475,17 @@ if (WINDOWS) --dest=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR} --grid=${GRID} --source=${CMAKE_CURRENT_SOURCE_DIR} - DEPENDS ${VIEWER_BINARY_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py + --touch=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/copy_touched.bat + DEPENDS + ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py + stage_third_party_libs + ${COPY_INPUT_DEPENDECIES} COMMENT "Performing viewer_manifest copy" ) + + add_custom_target(copy_w_viewer_manifest ALL DEPENDS ${CMAKE_CFG_INTDIR}/copy_touched.bat) - add_dependencies(${VIEWER_BINARY_NAME} stage_third_party_libs llcommon) + add_dependencies(${VIEWER_BINARY_NAME} stage_third_party_libs llcommon copy_w_viewer_manifest) if(LLKDU_LIBRARY) # kdu may not exist! @@ -1462,6 +1504,21 @@ if (WINDOWS) windows-crash-logger ) + # sets the 'working directory' for debugging from visual studio. + if (NOT UNATTENDED) + add_custom_command( + TARGET ${VIEWER_BINARY_NAME} POST_BUILD + COMMAND ${CMAKE_SOURCE_DIR}/tools/vstool/vstool.exe + ARGS + --solution + ${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}.sln + --workingdir + ${VIEWER_BINARY_NAME} + "${CMAKE_CURRENT_SOURCE_DIR}" + COMMENT "Setting the ${VIEWER_BINARY_NAME} working directory for debugging." + ) + endif (NOT UNATTENDED) + if (PACKAGE) add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/event_host.tar.bz2 @@ -1476,7 +1533,7 @@ if (WINDOWS) ${EVENT_HOST_SCRIPTS} ${CMAKE_CURRENT_SOURCE_DIR}/event_host_manifest.py ) - + add_custom_command( OUTPUT ${CMAKE_CFG_INTDIR}/touched.bat COMMAND ${PYTHON_EXECUTABLE} @@ -1499,6 +1556,8 @@ if (WINDOWS) # sorted out on the parabuild cluster... #${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/event_host.tar.bz2) + check_message_template(package) + endif (PACKAGE) endif (WINDOWS) @@ -1580,6 +1639,7 @@ if (LINUX) add_custom_target(package ALL DEPENDS ${product}.tar.bz2) add_dependencies(package linux-crash-logger-strip-target) add_dependencies(package linux-updater-strip-target) + check_message_template(package) endif (NOT INSTALL) endif (LINUX) @@ -1618,6 +1678,7 @@ if (DARWIN) if (PACKAGE) add_custom_target(package ALL DEPENDS ${VIEWER_BINARY_NAME}) + check_message_template(package) add_dependencies(package mac-updater mac-crash-logger) add_custom_command( @@ -1721,121 +1782,3 @@ if (LL_TESTS) endif (LL_TESTS) -# Don't do these for DARWIN or LINUX here -- they're taken care of by viewer_manifest.py -if (WINDOWS) - add_custom_command( - TARGET ${VIEWER_BINARY_NAME} POST_BUILD - COMMAND ${CMAKE_COMMAND} - ARGS - -E - make_directory - ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/llplugin - COMMENT "Creating llplugin dir." - ) - - get_target_property(BUILT_SLPLUGIN SLPlugin LOCATION) - add_custom_command( - TARGET ${VIEWER_BINARY_NAME} POST_BUILD - COMMAND ${CMAKE_COMMAND} - ARGS - -E - copy_if_different - ${BUILT_SLPLUGIN} - ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR} - COMMENT "Copying SLPlugin executable to the runtime folder." - ) - - get_target_property(BUILT_WEBKIT_PLUGIN media_plugin_webkit LOCATION) - add_custom_command( - TARGET ${VIEWER_BINARY_NAME} POST_BUILD - COMMAND ${CMAKE_COMMAND} - ARGS - -E - copy_if_different - ${BUILT_WEBKIT_PLUGIN} - ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/llplugin - COMMENT "Copying WebKit Plugin to the runtime folder." - ) - - get_target_property(BUILT_QUICKTIME_PLUGIN media_plugin_quicktime LOCATION) - add_custom_command( - TARGET ${VIEWER_BINARY_NAME} POST_BUILD - COMMAND ${CMAKE_COMMAND} - ARGS - -E - copy_if_different - ${BUILT_QUICKTIME_PLUGIN} - ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/llplugin - COMMENT "Copying Quicktime Plugin to the runtime folder." - ) - - #******************************* - # Copy media plugin support dlls - # Debug config runtime files required for the plugins - set(plugins_debug_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-win32/lib/debug") - set(plugins_debug_files - libeay32.dll - qtcored4.dll - qtguid4.dll - qtnetworkd4.dll - qtopengld4.dll - qtwebkitd4.dll - qtxmlpatternsd4.dll - ssleay32.dll - ) - copy_if_different( - ${plugins_debug_src_dir} - "${CMAKE_CURRENT_BINARY_DIR}/Debug/llplugin" - out_targets - ${plugins_debug_files} - ) - set(media_plugin_targets ${media_plugin_targets} ${out_targets}) - - # Release & ReleaseDebInfo config runtime files required for the plugins - set(plugins_release_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-win32/lib/release") - set(plugins_release_files - libeay32.dll - qtcore4.dll - qtgui4.dll - qtnetwork4.dll - qtopengl4.dll - qtwebkit4.dll - qtxmlpatterns4.dll - ssleay32.dll - ) - copy_if_different( - ${plugins_release_src_dir} - "${CMAKE_CURRENT_BINARY_DIR}/Release/llplugin" - out_targets - ${plugins_release_files} - ) - set(media_plugin_targets ${media_plugin_targets} ${out_targets}) - - copy_if_different( - ${plugins_release_src_dir} - "${CMAKE_CURRENT_BINARY_DIR}/RelWithDebInfo/llplugin" - out_targets - ${plugins_release_files} - ) - set(media_plugin_targets ${media_plugin_targets} ${out_targets}) - - add_custom_target(copy_media_plugin_libs ALL - DEPENDS - ${media_plugin_targets} - ) - - add_custom_command( - TARGET ${VIEWER_BINARY_NAME} POST_BUILD - COMMAND ${CMAKE_COMMAND} - ARGS - -E - copy_directory - ${CMAKE_BINARY_DIR}/test_apps/llplugintest/${CMAKE_CFG_INTDIR}/imageformats - ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/llplugin/imageformats - COMMENT "Copying llpluging imageformat libs." - ) - - add_dependencies(${VIEWER_BINARY_NAME} llmediaplugintest copy_media_plugin_libs) - -endif (WINDOWS) - diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp index 33dc7ee2c8..636b1de4d4 100644 --- a/indra/newview/llavataractions.cpp +++ b/indra/newview/llavataractions.cpp @@ -211,11 +211,9 @@ void LLAvatarActions::startCall(const LLUUID& id) std::string name; gCacheName->getFullName(id, name); - LLUUID session_id = gIMMgr->addSession(name, IM_NOTHING_SPECIAL, id); + LLUUID session_id = gIMMgr->addSession(name, IM_NOTHING_SPECIAL, id, true); if (session_id != LLUUID::null) { - // always open IM window when connecting to voice - LLIMFloater::show(session_id); gIMMgr->startCall(session_id); } make_ui_sound("UISndStartIM"); @@ -239,15 +237,12 @@ void LLAvatarActions::startAdhocCall(const std::vector<LLUUID>& ids) // create the new ad hoc voice session const std::string title = LLTrans::getString("conference-title"); LLUUID session_id = gIMMgr->addSession(title, IM_SESSION_CONFERENCE_START, - ids[0], id_array); + ids[0], id_array, true); if (session_id == LLUUID::null) { return; } - // always open IM window when connecting to voice - LLIMFloater::show(session_id); - // start the call once the session has fully initialized gIMMgr->autoStartCallOnStartup(session_id); diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp index 8c793873f4..8389895479 100644 --- a/indra/newview/llbottomtray.cpp +++ b/indra/newview/llbottomtray.cpp @@ -78,6 +78,9 @@ LLBottomTray::LLBottomTray(const LLSD&) LLUICtrl::CommitCallbackRegistry::defaultRegistrar().add("CameraPresets.ChangeView", boost::bind(&LLFloaterCamera::onClickCameraPresets, _2)); LLIMMgr::getInstance()->addSessionObserver(this); + //managing chiclets for voice calls + LLIMModel::getInstance()->addNewMsgCallback(boost::bind(&LLBottomTray::onNewIM, this, _1)); + //this is to fix a crash that occurs because LLBottomTray is a singleton //and thus is deleted at the end of the viewers lifetime, but to be cleanly //destroyed LLBottomTray requires some subsystems that are long gone @@ -143,25 +146,22 @@ LLIMChiclet* LLBottomTray::createIMChiclet(const LLUUID& session_id) //virtual void LLBottomTray::sessionAdded(const LLUUID& session_id, const std::string& name, const LLUUID& other_participant_id) { - if(getChicletPanel()) - { - if(getChicletPanel()->findChiclet<LLChiclet>(session_id)) - { + if (!getChicletPanel()) return; - } - else - { - LLIMChiclet* chiclet = createIMChiclet(session_id); - if(chiclet) - { - chiclet->setIMSessionName(name); - chiclet->setOtherParticipantId(other_participant_id); - } - else - { - llerrs << "Could not create chiclet" << llendl; - } - } + if (getChicletPanel()->findChiclet<LLChiclet>(session_id)) return; + + // For im sessions started as voice call chiclet gets created on the first incoming message + if (gIMMgr->isVoiceCall(session_id)) return; + + LLIMChiclet* chiclet = createIMChiclet(session_id); + if(chiclet) + { + chiclet->setIMSessionName(name); + chiclet->setOtherParticipantId(other_participant_id); + } + else + { + llerrs << "Could not create chiclet" << llendl; } } @@ -194,6 +194,28 @@ void LLBottomTray::sessionIDUpdated(const LLUUID& old_session_id, const LLUUID& } } +void LLBottomTray::onNewIM(const LLSD& data) +{ + LLUUID from_id = data["from_id"]; + if (from_id.isNull() || gAgentID == from_id) return; + + LLUUID session_id = data["session_id"]; + if (session_id.isNull()) return; + + if (!gIMMgr->isVoiceCall(session_id)) return; + + if (getChicletPanel()->findChiclet<LLChiclet>(session_id)) return; + + //first real message, time to create chiclet + LLIMChiclet* chiclet = createIMChiclet(session_id); + if(chiclet) + { + chiclet->setIMSessionName(LLIMModel::getInstance()->getName(session_id)); + chiclet->setOtherParticipantId(LLIMModel::getInstance()->getOtherParticipantID(session_id)); + } +} + + // virtual void LLBottomTray::onChange(EStatusType status, const std::string &channelURI, bool proximal) { diff --git a/indra/newview/llbottomtray.h b/indra/newview/llbottomtray.h index fa204ee9ea..1adea24ee4 100644 --- a/indra/newview/llbottomtray.h +++ b/indra/newview/llbottomtray.h @@ -75,6 +75,8 @@ public: virtual void sessionRemoved(const LLUUID& session_id); void sessionIDUpdated(const LLUUID& old_session_id, const LLUUID& new_session_id); + void onNewIM(const LLSD& data); + virtual void reshape(S32 width, S32 height, BOOL called_from_parent); virtual void onFocusLost(); diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index b50d4674f7..1d56fc0cab 100644 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -153,7 +153,7 @@ LLIMModel::LLIMModel() addNewMsgCallback(toast_callback); } -LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string& name, const EInstantMessage& type, const LLUUID& other_participant_id, const std::vector<LLUUID>& ids) +LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string& name, const EInstantMessage& type, const LLUUID& other_participant_id, const std::vector<LLUUID>& ids, bool voice) : mSessionID(session_id), mName(name), mType(type), @@ -167,7 +167,8 @@ LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string& mCallBackEnabled(true), mTextIMPossible(true), mOtherParticipantIsAvatar(true), - mStartCallOnInitialize(false) + mStartCallOnInitialize(false), + mStartedAsIMCall(voice) { // set P2P type by default mSessionType = P2P_SESSION; @@ -236,24 +237,25 @@ LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string& void LLIMModel::LLIMSession::onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state, const LLVoiceChannel::EDirection& direction) { - // *TODO: remove hardcoded string!!!!!!!!!!! - bool is_p2p_session = dynamic_cast<LLVoiceChannelP2P*>(mVoiceChannel); std::string other_avatar_name; if(is_p2p_session) { gCacheName->getFullName(mOtherParticipantID, other_avatar_name); + std::string you = LLTrans::getString("You"); + std::string started_call = LLTrans::getString("started_call"); + std::string joined_call = LLTrans::getString("joined_call"); if(direction == LLVoiceChannel::INCOMING_CALL) { switch(new_state) { case LLVoiceChannel::STATE_CALL_STARTED : - LLIMModel::getInstance()->addMessage(mSessionID, other_avatar_name, mOtherParticipantID, "Started a voice call"); + LLIMModel::getInstance()->addMessageSilently(mSessionID, other_avatar_name, mOtherParticipantID, started_call); break; case LLVoiceChannel::STATE_CONNECTED : - LLIMModel::getInstance()->addMessage(mSessionID, "You", gAgent.getID(), "Joined the voice call"); + LLIMModel::getInstance()->addMessageSilently(mSessionID, you, gAgent.getID(), joined_call); default: break; } @@ -263,10 +265,10 @@ void LLIMModel::LLIMSession::onVoiceChannelStateChanged(const LLVoiceChannel::ES switch(new_state) { case LLVoiceChannel::STATE_CALL_STARTED : - LLIMModel::getInstance()->addMessage(mSessionID, "You", gAgent.getID(), "Started a voice call"); + LLIMModel::getInstance()->addMessageSilently(mSessionID, you, gAgent.getID(), started_call); break; case LLVoiceChannel::STATE_CONNECTED : - LLIMModel::getInstance()->addMessage(mSessionID, other_avatar_name, mOtherParticipantID, "Joined the voice call"); + LLIMModel::getInstance()->addMessageSilently(mSessionID, other_avatar_name, mOtherParticipantID, joined_call); default: break; } @@ -452,7 +454,7 @@ void LLIMModel::testMessages() //session name should not be empty bool LLIMModel::newSession(const LLUUID& session_id, const std::string& name, const EInstantMessage& type, - const LLUUID& other_participant_id, const std::vector<LLUUID>& ids) + const LLUUID& other_participant_id, const std::vector<LLUUID>& ids, bool voice) { if (name.empty()) { @@ -466,7 +468,7 @@ bool LLIMModel::newSession(const LLUUID& session_id, const std::string& name, co return false; } - LLIMSession* session = new LLIMSession(session_id, name, type, other_participant_id, ids); + LLIMSession* session = new LLIMSession(session_id, name, type, other_participant_id, ids, voice); mId2SessionMap[session_id] = session; LLIMMgr::getInstance()->notifyObserverSessionAdded(session_id, name, other_participant_id); @@ -475,6 +477,12 @@ bool LLIMModel::newSession(const LLUUID& session_id, const std::string& name, co } +bool LLIMModel::newSession(const LLUUID& session_id, const std::string& name, const EInstantMessage& type, const LLUUID& other_participant_id, bool voice) +{ + std::vector<LLUUID> no_ids; + return newSession(session_id, name, type, other_participant_id, no_ids, voice); +} + bool LLIMModel::clearSession(const LLUUID& session_id) { if (mId2SessionMap.find(session_id) == mId2SessionMap.end()) return false; @@ -574,12 +582,33 @@ bool LLIMModel::proccessOnlineOfflineNotification( bool LLIMModel::addMessage(const LLUUID& session_id, const std::string& from, const LLUUID& from_id, const std::string& utf8_text, bool log2file /* = true */) { + + LLIMSession* session = addMessageSilently(session_id, from, from_id, utf8_text, log2file); + if (!session) return false; + + // notify listeners + LLSD arg; + arg["session_id"] = session_id; + arg["num_unread"] = session->mNumUnread; + arg["participant_unread"] = session->mParticipantUnreadMessageCount; + arg["message"] = utf8_text; + arg["from"] = from; + arg["from_id"] = from_id; + arg["time"] = LLLogChat::timestamp(false); + mNewMsgSignal(arg); + + return true; +} + +LLIMModel::LLIMSession* LLIMModel::addMessageSilently(const LLUUID& session_id, const std::string& from, const LLUUID& from_id, + const std::string& utf8_text, bool log2file /* = true */) +{ LLIMSession* session = findIMSession(session_id); if (!session) { llwarns << "session " << session_id << "does not exist " << llendl; - return false; + return NULL; } addToHistory(session_id, from, from_id, utf8_text); @@ -593,19 +622,7 @@ bool LLIMModel::addMessage(const LLUUID& session_id, const std::string& from, co ++(session->mParticipantUnreadMessageCount); } - - // notify listeners - LLSD arg; - arg["session_id"] = session_id; - arg["num_unread"] = session->mNumUnread; - arg["participant_unread"] = session->mParticipantUnreadMessageCount; - arg["message"] = utf8_text; - arg["from"] = from; - arg["from_id"] = from_id; - arg["time"] = LLLogChat::timestamp(false); - mNewMsgSignal(arg); - - return true; + return session; } @@ -1056,8 +1073,8 @@ public: || mInvitiationType == LLIMMgr::INVITATION_TYPE_IMMEDIATE) && LLIMModel::getInstance()->findIMSession(mSessionID)) { - // always open IM window when connecting to voice - LLIMFloater::show(mSessionID); + // TODO remove in 2010, for voice calls we do not open an IM window + //LLIMFloater::show(mSessionID); } gIMMgr->clearPendingAgentListUpdates(mSessionID); @@ -1582,11 +1599,7 @@ void LLIncomingCallDialog::processCallResponse(S32 response) if (voice) { - if (gIMMgr->startCall(session_id, LLVoiceChannel::INCOMING_CALL)) - { - // always open IM window when connecting to voice - LLIMFloater::show(session_id); - } + gIMMgr->startCall(session_id, LLVoiceChannel::INCOMING_CALL); } gIMMgr->clearPendingAgentListUpdates(session_id); @@ -1625,11 +1638,7 @@ void LLIncomingCallDialog::processCallResponse(S32 response) } } - LLUUID new_session_id = gIMMgr->addSession(correct_session_name, type, session_id); - if (new_session_id != LLUUID::null) - { - LLIMFloater::show(new_session_id); - } + LLUUID new_session_id = gIMMgr->addSession(correct_session_name, type, session_id, true); std::string url = gAgent.getRegion()->getCapability( "ChatSessionRequest"); @@ -1705,11 +1714,7 @@ bool inviteUserResponse(const LLSD& notification, const LLSD& response) payload["session_handle"].asString(), payload["session_uri"].asString()); - if (gIMMgr->startCall(session_id)) - { - // always open IM window when connecting to voice - LLIMFloater::show(session_id); - } + gIMMgr->startCall(session_id); gIMMgr->clearPendingAgentListUpdates(session_id); gIMMgr->clearPendingInvitation(session_id); @@ -1719,11 +1724,7 @@ bool inviteUserResponse(const LLSD& notification, const LLSD& response) LLUUID new_session_id = gIMMgr->addSession( payload["session_name"].asString(), type, - session_id); - if (new_session_id != LLUUID::null) - { - LLIMFloater::show(new_session_id); - } + session_id, true); std::string url = gAgent.getRegion()->getCapability( "ChatSessionRequest"); @@ -2018,11 +2019,7 @@ LLUUID LLIMMgr::addP2PSession(const std::string& name, const std::string& voice_session_handle, const std::string& caller_uri) { - LLUUID session_id = addSession(name, IM_NOTHING_SPECIAL, other_participant_id); - if (session_id != LLUUID::null) - { - LLIMFloater::show(session_id); - } + LLUUID session_id = addSession(name, IM_NOTHING_SPECIAL, other_participant_id, true); LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(session_id); if (speaker_mgr) @@ -2043,11 +2040,11 @@ LLUUID LLIMMgr::addP2PSession(const std::string& name, LLUUID LLIMMgr::addSession( const std::string& name, EInstantMessage dialog, - const LLUUID& other_participant_id) + const LLUUID& other_participant_id, bool voice) { LLDynamicArray<LLUUID> ids; ids.put(other_participant_id); - return addSession(name, dialog, other_participant_id, ids); + return addSession(name, dialog, other_participant_id, ids, voice); } // Adds a session using the given session_id. If the session already exists @@ -2056,7 +2053,7 @@ LLUUID LLIMMgr::addSession( const std::string& name, EInstantMessage dialog, const LLUUID& other_participant_id, - const LLDynamicArray<LLUUID>& ids) + const LLDynamicArray<LLUUID>& ids, bool voice) { if (0 == ids.getLength()) { @@ -2075,7 +2072,7 @@ LLUUID LLIMMgr::addSession( if (new_session) { - LLIMModel::getInstance()->newSession(session_id, name, dialog, other_participant_id, ids); + LLIMModel::getInstance()->newSession(session_id, name, dialog, other_participant_id, ids, voice); } @@ -2454,6 +2451,14 @@ bool LLIMMgr::endCall(const LLUUID& session_id) return true; } +bool LLIMMgr::isVoiceCall(const LLUUID& session_id) +{ + LLIMModel::LLIMSession* im_session = LLIMModel::getInstance()->findIMSession(session_id); + if (!im_session) return false; + + return im_session->mStartedAsIMCall; +} + // create a floater and update internal representation for // consistency. Returns the pointer, caller (the class instance since // it is a private method) is not responsible for deleting the diff --git a/indra/newview/llimview.h b/indra/newview/llimview.h index e2fcd63e28..6eb3f3d07f 100644 --- a/indra/newview/llimview.h +++ b/indra/newview/llimview.h @@ -65,7 +65,7 @@ public: } SType; LLIMSession(const LLUUID& session_id, const std::string& name, - const EInstantMessage& type, const LLUUID& other_participant_id, const std::vector<LLUUID>& ids); + const EInstantMessage& type, const LLUUID& other_participant_id, const std::vector<LLUUID>& ids, bool voice); virtual ~LLIMSession(); void sessionInitReplyReceived(const LLUUID& new_session_id); @@ -104,6 +104,9 @@ public: bool mTextIMPossible; bool mOtherParticipantIsAvatar; bool mStartCallOnInitialize; + + //if IM session is created for a voice call + bool mStartedAsIMCall; }; @@ -143,7 +146,10 @@ public: * @param name session name should not be empty, will return false if empty */ bool newSession(const LLUUID& session_id, const std::string& name, const EInstantMessage& type, const LLUUID& other_participant_id, - const std::vector<LLUUID>& ids = std::vector<LLUUID>()); + const std::vector<LLUUID>& ids, bool voice = false); + + bool newSession(const LLUUID& session_id, const std::string& name, const EInstantMessage& type, + const LLUUID& other_participant_id, bool voice = false); /** * Remove all session data associated with a session specified by session_id @@ -163,6 +169,12 @@ public: bool addMessage(const LLUUID& session_id, const std::string& from, const LLUUID& other_participant_id, const std::string& utf8_text, bool log2file = true); /** + * Similar to addMessage(...) above but won't send a signal about a new message added + */ + LLIMModel::LLIMSession* addMessageSilently(const LLUUID& session_id, const std::string& from, const LLUUID& from_id, + const std::string& utf8_text, bool log2file = true); + + /** * Add a system message to an IM Model */ bool proccessOnlineOfflineNotification(const LLUUID& session_id, const std::string& utf8_text); @@ -284,14 +296,14 @@ public: // session. LLUUID addSession(const std::string& name, EInstantMessage dialog, - const LLUUID& other_participant_id); + const LLUUID& other_participant_id, bool voice = false); // Adds a session using a specific group of starting agents // the dialog type is assumed correct. Returns the uuid of the session. LLUUID addSession(const std::string& name, EInstantMessage dialog, const LLUUID& other_participant_id, - const LLDynamicArray<LLUUID>& ids); + const LLDynamicArray<LLUUID>& ids, bool voice = false); /** * Creates a P2P session with the requisite handle for responding to voice calls. @@ -391,6 +403,8 @@ public: **/ bool endCall(const LLUUID& session_id); + bool isVoiceCall(const LLUUID& session_id); + private: /** diff --git a/indra/newview/llnavigationbar.cpp b/indra/newview/llnavigationbar.cpp index cdab3b2310..6210151d1b 100644 --- a/indra/newview/llnavigationbar.cpp +++ b/indra/newview/llnavigationbar.cpp @@ -261,9 +261,14 @@ BOOL LLNavigationBar::postBuild() void LLNavigationBar::setVisible(BOOL visible) { // change visibility of grandparent layout_panel to animate in and out - if (getParent() && getParent()->getParent()) + if (getParent()) { - getParent()->getParent()->setVisible(visible); + //to avoid some mysterious bugs like EXT-3352, at least try to log an incorrect parent to ping about a problem. + if(getParent()->getName() != "nav_bar_container") + { + LL_WARNS("LLNavigationBar")<<"NavigationBar has an unknown name of the parent: "<<getParent()->getName()<< LL_ENDL; + } + getParent()->setVisible(visible); } } diff --git a/indra/newview/llpanelpicks.cpp b/indra/newview/llpanelpicks.cpp index 0a13180c73..4d22d96072 100644 --- a/indra/newview/llpanelpicks.cpp +++ b/indra/newview/llpanelpicks.cpp @@ -45,6 +45,7 @@ #include "llnotificationsutil.h" #include "lltexturectrl.h" #include "lltoggleablemenu.h" +#include "lltrans.h" #include "llviewergenericmessage.h" // send_generic_message #include "llmenugl.h" #include "llviewermenu.h" @@ -216,7 +217,9 @@ LLPanelPicks::LLPanelPicks() mClassifiedsAccTab(NULL), mPanelClassifiedInfo(NULL), mPanelClassifiedEdit(NULL), - mClickThroughDisp(NULL) + mClickThroughDisp(NULL), + mNoClassifieds(false), + mNoPicks(false) { mClickThroughDisp = new LLClassifiedClickThrough(); gGenericDispatcher.addHandler("classifiedclickthrough", mClickThroughDisp); @@ -242,6 +245,11 @@ void LLPanelPicks::updateData() // Send Picks request only when we need to, not on every onOpen(during tab switch). if(isDirty()) { + mNoPicks = false; + mNoClassifieds = false; + + childSetValue("picks_panel_text", LLTrans::getString("PicksClassifiedsLoadingText")); + mPicksList->clear(); LLAvatarPropertiesProcessor::getInstance()->sendAvatarPicksRequest(getAvatarId()); @@ -302,6 +310,8 @@ void LLPanelPicks::processProperties(void* data, EAvatarProcessorType type) resetDirty(); updateButtons(); } + + mNoPicks = !mPicksList->size(); } else if(APT_CLASSIFIEDS == type) { @@ -335,9 +345,14 @@ void LLPanelPicks::processProperties(void* data, EAvatarProcessorType type) resetDirty(); updateButtons(); } + + mNoClassifieds = !mClassifiedsList->size(); + } + + if (mNoPicks && mNoClassifieds) + { + childSetValue("picks_panel_text", LLTrans::getString("NoPicksClassifiedsText")); } - if(!mPicksList->size() && !mClassifiedsList->size()) - childSetVisible("empty_picks_panel_text", true); } LLPickItem* LLPanelPicks::getSelectedPickItem() diff --git a/indra/newview/llpanelpicks.h b/indra/newview/llpanelpicks.h index 0ebf9e26dd..fd8a9e6938 100644 --- a/indra/newview/llpanelpicks.h +++ b/indra/newview/llpanelpicks.h @@ -157,6 +157,11 @@ private: LLAccordionCtrlTab* mClassifiedsAccTab; LLClassifiedClickThrough* mClickThroughDisp; + + //true if picks list is empty after processing picks + bool mNoPicks; + //true if classifieds list is empty after processing classifieds + bool mNoClassifieds; }; class LLPickItem : public LLPanel, public LLAvatarPropertiesObserver diff --git a/indra/newview/llsyswellwindow.cpp b/indra/newview/llsyswellwindow.cpp index ea49f9c32e..f49e7ef0da 100644 --- a/indra/newview/llsyswellwindow.cpp +++ b/indra/newview/llsyswellwindow.cpp @@ -709,15 +709,15 @@ BOOL LLIMWellWindow::postBuild() void LLIMWellWindow::sessionAdded(const LLUUID& session_id, const std::string& name, const LLUUID& other_participant_id) { - if (mMessageList->getItemByValue(session_id) == NULL) - { - S32 chicletCounter = LLIMModel::getInstance()->getNumUnread(session_id); - if (chicletCounter > -1) - { - addIMRow(session_id, chicletCounter, name, other_participant_id); - reshapeWindow(); - } - } + if (!mMessageList->getItemByValue(session_id)) return; + + // For im sessions started as voice call chiclet gets created on the first incoming message + if (gIMMgr->isVoiceCall(session_id)) return; + + if (!gIMMgr->hasSession(session_id)) return; + + addIMRow(session_id, 0, name, other_participant_id); + reshapeWindow(); } //virtual diff --git a/indra/newview/skins/default/xui/en/floater_im_session.xml b/indra/newview/skins/default/xui/en/floater_im_session.xml index 645c2973d8..a4ade9d0df 100644 --- a/indra/newview/skins/default/xui/en/floater_im_session.xml +++ b/indra/newview/skins/default/xui/en/floater_im_session.xml @@ -12,14 +12,14 @@ can_dock="false" can_minimize="false" visible="true" - width="300" + width="360" can_resize="true" - min_width="300" + min_width="360" min_height="350"> <layout_stack follows="all" height="320" - width="300" + width="360" layout="topleft" orientation="horizontal" name="im_panels" @@ -36,7 +36,7 @@ left="0" top="0" height="200" - width="185" + width="245" user_resize="false"> <button height="20" @@ -63,7 +63,7 @@ parse_highlights="true" allow_html="true" left="1" - width="180"> + width="240"> </chat_history> <line_editor bottom="0" @@ -73,7 +73,7 @@ label="To" layout="bottomleft" name="chat_editor" - width="180"> + width="240"> </line_editor> </layout_panel> </layout_stack> diff --git a/indra/newview/skins/default/xui/en/panel_picks.xml b/indra/newview/skins/default/xui/en/panel_picks.xml index 4facedc7ea..2230229b14 100644 --- a/indra/newview/skins/default/xui/en/panel_picks.xml +++ b/indra/newview/skins/default/xui/en/panel_picks.xml @@ -20,12 +20,9 @@ height="535" layout="topleft" left="6" - name="empty_picks_panel_text" + name="picks_panel_text" top="10" - visible="false" - width="313"> - There are no picks/classifieds here - </text> + width="313"/> <accordion fit_parent="true" follows="all" diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index 2f50c5ee6c..ec4723bd55 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -2074,6 +2074,10 @@ this texture in your inventory <!-- panel classified --> <string name="ClassifiedClicksTxt">Clicks: [TELEPORT] teleport, [MAP] map, [PROFILE] profile</string> <string name="ClassifiedUpdateAfterPublish">(will update after publish)</string> + + <!-- panel picks --> + <string name="NoPicksClassifiedsText">There are no picks/classifieds here</string> + <string name="PicksClassifiedsLoadingText">Loading...</string> <!-- Multi Preview Floater --> <string name="MultiPreviewTitle">Preview</string> @@ -2842,6 +2846,10 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. <string name="IM_to_label">To</string> <string name="IM_moderator_label">(Moderator)</string> + <!-- voice calls --> + <string name="started_call">Started a voice call</string> + <string name="joined_call">Joined the voice call</string> + <string name="ringing-im"> Joining Voice Chat... </string> diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 2373ebe813..d69a771bbb 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -40,67 +40,73 @@ sys.path.append(os.path.join(viewer_dir, '../lib/python/indra/util')) from llmanifest import LLManifest, main, proper_windows_path, path_ancestors class ViewerManifest(LLManifest): + def is_packaging_viewer(self): + # This is overridden by the WindowsManifest sub-class, + # which has different behavior if it is not packaging the viewer. + return True + def construct(self): super(ViewerManifest, self).construct() self.exclude("*.svn*") self.path(src="../../scripts/messages/message_template.msg", dst="app_settings/message_template.msg") self.path(src="../../etc/message.xml", dst="app_settings/message.xml") - if self.prefix(src="app_settings"): - self.exclude("logcontrol.xml") - self.exclude("logcontrol-dev.xml") - self.path("*.pem") - self.path("*.ini") - self.path("*.xml") - self.path("*.db2") - - # include the entire shaders directory recursively - self.path("shaders") - # ... and the entire windlight directory - self.path("windlight") - self.end_prefix("app_settings") - - if self.prefix(src="character"): - self.path("*.llm") - self.path("*.xml") - self.path("*.tga") - self.end_prefix("character") - - # Include our fonts - if self.prefix(src="fonts"): - self.path("*.ttf") - self.path("*.txt") - self.end_prefix("fonts") - - # skins - if self.prefix(src="skins"): - self.path("paths.xml") - # include the entire textures directory recursively - if self.prefix(src="*/textures"): - self.path("*/*.tga") - self.path("*/*.j2c") - self.path("*/*.jpg") - self.path("*/*.png") - self.path("*.tga") - self.path("*.j2c") - self.path("*.jpg") - self.path("*.png") - self.path("textures.xml") - self.end_prefix("*/textures") - self.path("*/xui/*/*.xml") - self.path("*/xui/*/widgets/*.xml") - self.path("*/*.xml") - - # Local HTML files (e.g. loading screen) - if self.prefix(src="*/html"): - self.path("*.png") - self.path("*/*/*.html") - self.path("*/*/*.gif") - self.end_prefix("*/html") - self.end_prefix("skins") - - # Files in the newview/ directory - self.path("gpu_table.txt") + if self.is_packaging_viewer(): + if self.prefix(src="app_settings"): + self.exclude("logcontrol.xml") + self.exclude("logcontrol-dev.xml") + self.path("*.pem") + self.path("*.ini") + self.path("*.xml") + self.path("*.db2") + + # include the entire shaders directory recursively + self.path("shaders") + # ... and the entire windlight directory + self.path("windlight") + self.end_prefix("app_settings") + + if self.prefix(src="character"): + self.path("*.llm") + self.path("*.xml") + self.path("*.tga") + self.end_prefix("character") + + # Include our fonts + if self.prefix(src="fonts"): + self.path("*.ttf") + self.path("*.txt") + self.end_prefix("fonts") + + # skins + if self.prefix(src="skins"): + self.path("paths.xml") + # include the entire textures directory recursively + if self.prefix(src="*/textures"): + self.path("*/*.tga") + self.path("*/*.j2c") + self.path("*/*.jpg") + self.path("*/*.png") + self.path("*.tga") + self.path("*.j2c") + self.path("*.jpg") + self.path("*.png") + self.path("textures.xml") + self.end_prefix("*/textures") + self.path("*/xui/*/*.xml") + self.path("*/xui/*/widgets/*.xml") + self.path("*/*.xml") + + # Local HTML files (e.g. loading screen) + if self.prefix(src="*/html"): + self.path("*.png") + self.path("*/*/*.html") + self.path("*/*/*.gif") + self.end_prefix("*/html") + self.end_prefix("skins") + + # Files in the newview/ directory + self.path("gpu_table.txt") def login_channel(self): """Channel reported for login and upgrade purposes ONLY; @@ -163,6 +169,12 @@ class WindowsManifest(ViewerManifest): else: return ''.join(self.channel().split()) + '.exe' + def is_packaging_viewer(self): + # Some commands, files will only be included + # if we are packaging the viewer on windows. + # This manifest is also used to copy + # files during the build. + return 'package' in self.args['actions'] def test_msvcrt_and_copy_action(self, src, dst): # This is used to test a dll manifest. @@ -211,22 +223,25 @@ class WindowsManifest(ViewerManifest): print "Doesn't exist:", src def enable_crt_manifest_check(self): - WindowsManifest.copy_action = WindowsManifest.test_msvcrt_and_copy_action + if self.is_packaging_viewer(): + WindowsManifest.copy_action = WindowsManifest.test_msvcrt_and_copy_action def enable_no_crt_manifest_check(self): - WindowsManifest.copy_action = WindowsManifest.test_for_no_msvcrt_manifest_and_copy_action + if self.is_packaging_viewer(): + WindowsManifest.copy_action = WindowsManifest.test_for_no_msvcrt_manifest_and_copy_action def disable_manifest_check(self): - del WindowsManifest.copy_action + if self.is_packaging_viewer(): + del WindowsManifest.copy_action def construct(self): super(WindowsManifest, self).construct() self.enable_crt_manifest_check() - # Find secondlife-bin.exe in the 'configuration' dir, then rename it to the result of final_exe. - self.path(src='%s/secondlife-bin.exe' % self.args['configuration'], dst=self.final_exe()) - + if self.is_packaging_viewer(): + # Find secondlife-bin.exe in the 'configuration' dir, then rename it to the result of final_exe. + self.path(src='%s/secondlife-bin.exe' % self.args['configuration'], dst=self.final_exe()) # Plugin host application self.path(os.path.join(os.pardir, @@ -316,27 +331,53 @@ class WindowsManifest(ViewerManifest): if self.prefix(src='../media_plugins/webkit/%s' % self.args['configuration'], dst="llplugin"): self.path("media_plugin_webkit.dll") self.end_prefix() - - if self.prefix(src="../../libraries/i686-win32/lib/release", dst="llplugin"): - self.path("libeay32.dll") - self.path("qtcore4.dll") - self.path("qtgui4.dll") - self.path("qtnetwork4.dll") - self.path("qtopengl4.dll") - self.path("qtwebkit4.dll") - self.path("qtxmlpatterns4.dll") - self.path("ssleay32.dll") - self.end_prefix() - # For WebKit/Qt plugin runtimes (image format plugins) - if self.prefix(src="../../libraries/i686-win32/lib/release/imageformats", dst="llplugin/imageformats"): - self.path("qgif4.dll") - self.path("qico4.dll") - self.path("qjpeg4.dll") - self.path("qmng4.dll") - self.path("qsvg4.dll") - self.path("qtiff4.dll") - self.end_prefix() + if self.args['configuration'].lower() == 'debug': + if self.prefix(src=os.path.join(os.pardir, os.pardir, 'libraries', 'i686-win32', 'lib', 'debug'), + dst="llplugin"): + self.path("libeay32.dll") + self.path("qtcored4.dll") + self.path("qtguid4.dll") + self.path("qtnetworkd4.dll") + self.path("qtopengld4.dll") + self.path("qtwebkitd4.dll") + self.path("qtxmlpatternsd4.dll") + self.path("ssleay32.dll") + + # For WebKit/Qt plugin runtimes (image format plugins) + if self.prefix(src="imageformats", dst="llplugin/imageformats"): + self.path("qgifd4.dll") + self.path("qicod4.dll") + self.path("qjpegd4.dll") + self.path("qmngd4.dll") + self.path("qsvgd4.dll") + self.path("qtiffd4.dll") + self.end_prefix() + + self.end_prefix() + else: + if self.prefix(src=os.path.join(os.pardir, os.pardir, 'libraries', 'i686-win32', 'lib', 'release'), + dst="llplugin"): + self.path("libeay32.dll") + self.path("qtcore4.dll") + self.path("qtgui4.dll") + self.path("qtnetwork4.dll") + self.path("qtopengl4.dll") + self.path("qtwebkit4.dll") + self.path("qtxmlpatterns4.dll") + self.path("ssleay32.dll") + + # For WebKit/Qt plugin runtimes (image format plugins) + if self.prefix(src="imageformats", dst="llplugin/imageformats"): + self.path("qgif4.dll") + self.path("qico4.dll") + self.path("qjpeg4.dll") + self.path("qmng4.dll") + self.path("qsvg4.dll") + self.path("qtiff4.dll") + self.end_prefix() + + self.end_prefix() self.disable_manifest_check() @@ -347,6 +388,9 @@ class WindowsManifest(ViewerManifest): self.path(src='../win_updater/%s/windows-updater.exe' % self.args['configuration'], dst="updater.exe") + if not self.is_packaging_viewer(): + self.package_file = "copied_deps" + def nsi_file_commands(self, install=True): def wpath(path): if path.endswith('/') or path.endswith(os.path.sep): |