summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--indra/cmake/TemplateCheck.cmake2
-rw-r--r--indra/newview/CMakeLists.txt261
-rw-r--r--indra/newview/llavataractions.cpp9
-rw-r--r--indra/newview/llbottomtray.cpp58
-rw-r--r--indra/newview/llbottomtray.h2
-rw-r--r--indra/newview/llimview.cpp115
-rw-r--r--indra/newview/llimview.h22
-rw-r--r--indra/newview/llnavigationbar.cpp9
-rw-r--r--indra/newview/llpanelpicks.cpp21
-rw-r--r--indra/newview/llpanelpicks.h5
-rw-r--r--indra/newview/llsyswellwindow.cpp18
-rw-r--r--indra/newview/skins/default/xui/en/floater_im_session.xml12
-rw-r--r--indra/newview/skins/default/xui/en/panel_picks.xml7
-rw-r--r--indra/newview/skins/default/xui/en/strings.xml8
-rwxr-xr-xindra/newview/viewer_manifest.py206
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):