master
dolphin@dolphin-THINK.lindenlab.com 2012-11-14 14:12:25 -08:00
commit 723ab8b108
13 changed files with 846 additions and 1 deletions

View File

@ -38,6 +38,7 @@ set(llmessage_SOURCE_FILES
llcurl.cpp
lldatapacker.cpp
lldispatcher.cpp
llexperiencecache.cpp
llfiltersd2xmlrpc.cpp
llhost.cpp
llhttpassetstorage.cpp
@ -128,6 +129,7 @@ set(llmessage_HEADER_FILES
lldbstrings.h
lldispatcher.h
lleventflags.h
llexperiencecache.h
llfiltersd2xmlrpc.h
llfollowcamparams.h
llhost.h

View File

@ -0,0 +1,195 @@
/**
* @file llexperiencecache.cpp
* @brief llexperiencecache and related class definitions
*
* $LicenseInfo:firstyear=2012&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2012, Linden Research, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License only.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
#include "linden_common.h"
#include "llframetimer.h"
#include "llhttpclient.h"
#include <set>
#include <map>
#include "llexperiencecache.h"
class LLExperienceData
{
public:
std::string mDisplayName;
};
namespace LLExperienceCache
{
bool sRunning = true;
std::string sLookupURL;
typedef std::set<LLUUID> ask_queue_t;
ask_queue_t sAskQueue;
typedef std::map<LLUUID, F64> pending_queue_t;
pending_queue_t sPendingQueue;
typedef std::map<LLUUID, LLExperienceData> cache_t;
cache_t sCache;
LLFrameTimer sRequestTimer;
class LLExperienceResponder : public LLHTTPClient::Responder
{
public:
LLExperienceResponder(std::vector<LLUUID> agent_ids)
{
}
};
void requestExperiences()
{
if(sAskQueue.empty())
return;
F64 now = LLFrameTimer::getTotalSeconds();
const U32 NAME_URL_MAX = 4096;
const U32 NAME_URL_SEND_THRESHOLD = 3000;
std::string url;
url.reserve(NAME_URL_MAX);
std::vector<LLUUID> agent_ids;
agent_ids.reserve(128);
url += sLookupURL;
std::string arg="?ids=";
for(ask_queue_t::const_iterator it = sAskQueue.begin(); it != sAskQueue.end() ; ++it)
{
const LLUUID& agent_id = *it;
url += arg;
url += agent_id.asString();
agent_ids.push_back(agent_id);
sPendingQueue[agent_id] = now;
arg[0]='&';
if(url.size() > NAME_URL_SEND_THRESHOLD)
{
LLHTTPClient::get(url, new LLExperienceResponder(agent_ids));
url = sLookupURL;
arg[0]='?';
agent_ids.clear();
}
}
if(url.size() > sLookupURL.size())
{
LLHTTPClient::get(url, new LLExperienceResponder(agent_ids));
}
sAskQueue.clear();
}
bool isRequestPending(const LLUUID& agent_id)
{
bool isPending = false;
const F64 PENDING_TIMEOUT_SECS = 5.0 * 60.0;
pending_queue_t::const_iterator it = sPendingQueue.find(agent_id);
if(it != sPendingQueue.end())
{
F64 expire_time = LLFrameTimer::getTotalSeconds() - PENDING_TIMEOUT_SECS;
isPending = (it->second > expire_time);
}
return isPending;
}
void setLookupURL( const std::string& lookup_url )
{
sLookupURL = lookup_url;
}
bool hasLookupURL()
{
return !sLookupURL.empty();
}
void idle()
{
sRunning = true;
if(!sAskQueue.empty())
{
requestExperiences();
}
}
void erase( const LLUUID& agent_id )
{
sCache.erase(agent_id);
}
void fetch( const LLUUID& agent_id )
{
LL_DEBUGS("ExperienceCache") << __FUNCTION__ << "queue request for agent" << agent_id << LL_ENDL ;
sAskQueue.insert(agent_id);
}
void insert( const LLUUID& agent_id, const LLExperienceData& experience_data )
{
sCache[agent_id]=experience_data;
}
bool get( const LLUUID& agent_id, LLExperienceData* experience_data )
{
if(!sRunning)
{
cache_t::const_iterator it = sCache.find(agent_id);
if (it != sCache.end())
{
llassert(experience_data);
*experience_data = it->second;
return true;
}
}
if(!isRequestPending(agent_id))
{
fetch(agent_id);
}
return false;
}
}

View File

@ -0,0 +1,52 @@
/**
* @file llexperiencecache.h
* @brief Caches information relating to experience keys
*
* $LicenseInfo:firstyear=2012&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2012, Linden Research, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License only.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
#ifndef LL_LLEXPERIENCECACHE_H
#define LL_LLEXPERIENCECACHE_H
#include <string>
class LLUUID;
class LLExperienceData;
namespace LLExperienceCache
{
void setLookupURL(const std::string& lookup_url);
bool hasLookupURL();
void idle();
void erase(const LLUUID& agent_id);
void fetch(const LLUUID& agent_id);
void insert(const LLUUID& agent_id, const LLExperienceData& experience_data);
bool get(const LLUUID& agent_id, LLExperienceData* experience_data);
};
#endif // LL_LLEXPERIENCECACHE_H

View File

@ -202,6 +202,7 @@ set(viewer_SOURCE_FILES
llfloatereditwater.cpp
llfloaterenvironmentsettings.cpp
llfloaterevent.cpp
llfloaterexperiences.cpp
llfloaterfonttest.cpp
llfloatergesture.cpp
llfloatergodtools.cpp
@ -370,6 +371,7 @@ set(viewer_SOURCE_FILES
llpanelclassified.cpp
llpanelcontents.cpp
llpaneleditwearable.cpp
llpanelexperiences.cpp
llpanelface.cpp
llpanelgenerictip.cpp
llpanelgroup.cpp
@ -779,6 +781,7 @@ set(viewer_HEADER_FILES
llfloatereditwater.h
llfloaterenvironmentsettings.h
llfloaterevent.h
llfloaterexperiences.h
llfloaterfonttest.h
llfloatergesture.h
llfloatergodtools.h
@ -941,6 +944,7 @@ set(viewer_HEADER_FILES
llpanelclassified.h
llpanelcontents.h
llpaneleditwearable.h
llpanelexperiences.h
llpanelface.h
llpanelgenerictip.h
llpanelgroup.h

View File

@ -0,0 +1,14 @@
#include "llviewerprecompiledheaders.h"
#include "llpanelexperiences.h"
#include "llfloaterexperiences.h"
LLFloaterExperiences::LLFloaterExperiences(const LLSD& data)
:LLFloater(data)
{
}
BOOL LLFloaterExperiences::postBuild()
{
return TRUE;
}

View File

@ -0,0 +1,45 @@
/**
* @file llfloaterexperiences.h
* @brief LLFloaterExperiences class definition
*
* $LicenseInfo:firstyear=2012&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2012, Linden Research, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License only.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
#ifndef LL_LLFLOATEREXPERIENCES_H
#define LL_LLFLOATEREXPERIENCES_H
#include "llfloater.h"
class LLFloaterExperiences :
public LLFloater
{
public:
LLFloaterExperiences(const LLSD& data);
protected:
/*virtual*/ BOOL postBuild();
private:
};
#endif //LL_LLFLOATEREXPERIENCES_H

View File

@ -0,0 +1,251 @@
#include "llviewerprecompiledheaders.h"
#include "llpanelprofile.h"
#include "lluictrlfactory.h"
#include "llpanelexperiences.h"
static LLRegisterPanelClassWrapper<LLPanelExperiences> register_experiences_panel("experiences_panel");
LLPanelExperiences::LLPanelExperiences( )
: mExperiencesList(NULL),
mExperiencesAccTab(NULL),
mProfilePanel(NULL),
mPanelExperienceInfo(NULL),
mNoExperiences(false)
{
}
void* LLPanelExperiences::create( void* data )
{
return new LLPanelExperiences();
}
BOOL LLPanelExperiences::postBuild( void )
{
mExperiencesList = getChild<LLFlatListView>("experiences_list");
if(hasString("no_experiences"))
{
mExperiencesList->setNoItemsCommentText(getString("no_experiences"));
}
LLExperienceItem* item = new LLExperienceItem();
item->setExperienceName("experience 1");
item->setExperienceDescription("hey, I\'m an experience!");
mExperiencesList->addItem(item);
item = new LLExperienceItem();
item->setExperienceName("experience 2");
item->setExperienceDescription("hey, I\'m another experience!");
mExperiencesList->addItem(item);
mExperiencesAccTab = getChild<LLAccordionCtrlTab>("tab_experiences");
mExperiencesAccTab->setDropDownStateChangedCallback(boost::bind(&LLPanelExperiences::onAccordionStateChanged, this, mExperiencesAccTab));
mExperiencesAccTab->setDisplayChildren(true);
return TRUE;
}
void LLPanelExperiences::onOpen( const LLSD& key )
{
LLPanel::onOpen(key);
}
void LLPanelExperiences::onClosePanel()
{
if (mPanelExperienceInfo)
{
onPanelExperienceClose(mPanelExperienceInfo);
}
}
void LLPanelExperiences::updateData()
{
if(isDirty())
{
mNoExperiences = false;
/*
mNoItemsLabel->setValue(LLTrans::getString("PicksClassifiedsLoadingText"));
mNoItemsLabel->setVisible(TRUE);
mPicksList->clear();
LLAvatarPropertiesProcessor::getInstance()->sendAvatarPicksRequest(getAvatarId());
mClassifiedsList->clear();
LLAvatarPropertiesProcessor::getInstance()->sendAvatarClassifiedsRequest(getAvatarId());
*/
}
}
LLExperienceItem* LLPanelExperiences::getSelectedExperienceItem()
{
LLPanel* selected_item = mExperiencesList->getSelectedItem();
if (!selected_item) return NULL;
return dynamic_cast<LLExperienceItem*>(selected_item);
}
void LLPanelExperiences::setProfilePanel( LLPanelProfile* profile_panel )
{
mProfilePanel = profile_panel;
}
void LLPanelExperiences::onListCommit( const LLFlatListView* f_list )
{
if(f_list == mExperiencesList)
{
mExperiencesList->resetSelection(true);
}
else
{
llwarns << "Unknown list" << llendl;
}
//updateButtons();
}
void LLPanelExperiences::onAccordionStateChanged( const LLAccordionCtrlTab* acc_tab )
{
if(!mExperiencesAccTab->getDisplayChildren())
{
mExperiencesList->resetSelection(true);
}
}
void LLPanelExperiences::openExperienceInfo()
{
LLSD selected_value = mExperiencesList->getSelectedValue();
if(selected_value.isUndefined())
{
return;
}
LLExperienceItem* experience = (LLExperienceItem*)mExperiencesList->getSelectedItem();
createExperienceInfoPanel();
LLSD params;
params["experience_name"] = experience->getExperienceName();
params["experience_desc"] = experience->getExperienceDescription();
getProfilePanel()->openPanel(mPanelExperienceInfo, params);
}
void LLPanelExperiences::createExperienceInfoPanel()
{
if(!mPanelExperienceInfo)
{
mPanelExperienceInfo = LLPanelExperienceInfo::create();
mPanelExperienceInfo->setExitCallback(boost::bind(&LLPanelExperiences::onPanelExperienceClose, this, mPanelExperienceInfo));
mPanelExperienceInfo->setVisible(FALSE);
}
}
void LLPanelExperiences::onPanelExperienceClose( LLPanel* panel )
{
getProfilePanel()->closePanel(panel);
}
LLPanelProfile* LLPanelExperiences::getProfilePanel()
{
llassert_always(NULL != mProfilePanel);
return mProfilePanel;
}
LLExperienceItem::LLExperienceItem()
{
buildFromFile("panel_experience_info.xml");
}
void LLExperienceItem::init( LLExperienceData* experience_data )
{
}
void LLExperienceItem::setExperienceDescription( const std::string& val )
{
mExperienceDescription = val;
getChild<LLUICtrl>("experience_desc")->setValue(val);
}
void LLExperienceItem::setExperienceName( const std::string& val )
{
mExperienceName = val;
getChild<LLUICtrl>("experience_name")->setValue(val);
}
BOOL LLExperienceItem::postBuild()
{
return TRUE;
}
void LLExperienceItem::update()
{
}
void LLExperienceItem::processProperties( void* data, EAvatarProcessorType type )
{
}
LLExperienceItem::~LLExperienceItem()
{
}
void LLPanelExperienceInfo::setExperienceName( const std::string& name )
{
getChild<LLUICtrl>("experience_name")->setValue(name);
}
void LLPanelExperienceInfo::setExperienceDesc( const std::string& desc )
{
getChild<LLUICtrl>("experience_desc")->setValue(desc);
}
void LLPanelExperienceInfo::onOpen( const LLSD& key )
{
setExperienceName(key["experience_name"]);
setExperienceDesc(key["experience_desc"]);
/*
LLAvatarPropertiesProcessor::getInstance()->addObserver(
getAvatarId(), this);
LLAvatarPropertiesProcessor::getInstance()->sendPickInfoRequest(
getAvatarId(), getPickId());
*/
}
LLPanelExperienceInfo* LLPanelExperienceInfo::create()
{
LLPanelExperienceInfo* panel = new LLPanelExperienceInfo();
panel->buildFromFile("panel_experience_info.xml");
return panel;
}
void LLPanelExperienceInfo::setExitCallback( const commit_callback_t& cb )
{
getChild<LLButton>("back_btn")->setClickedCallback(cb);
}

View File

@ -0,0 +1,124 @@
/**
* @file llpanelpicks.h
* @brief LLPanelPicks and related class definitions
*
* $LicenseInfo:firstyear=2012&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2012, Linden Research, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License only.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
#ifndef LL_LLPANELEXPERIENCES_H
#define LL_LLPANELEXPERIENCES_H
#include "llaccordionctrltab.h"
#include "llflatlistview.h"
#include "llpanelavatar.h"
class LLExperienceItem;
class LLPanelProfile;
class LLPanelExperienceInfo
: public LLPanel
{
public:
static LLPanelExperienceInfo* create();
void onOpen(const LLSD& key);
void setExperienceName( const std::string& name );
void setExperienceDesc( const std::string& desc );
virtual void setExitCallback(const commit_callback_t& cb);
};
class LLPanelExperiences
: public LLPanel /*LLPanelProfileTab*/
{
public:
LLPanelExperiences();
static void* create(void* data);
/*virtual*/ BOOL postBuild(void);
/*virtual*/ void onOpen(const LLSD& key);
/*virtual*/ void onClosePanel();
void updateData();
LLExperienceItem* getSelectedExperienceItem();
void setProfilePanel(LLPanelProfile* profile_panel);
protected:
void onListCommit(const LLFlatListView* f_list);
void onAccordionStateChanged(const LLAccordionCtrlTab* acc_tab);
void openExperienceInfo();
void createExperienceInfoPanel();
void onPanelExperienceClose(LLPanel* panel);
LLPanelProfile* getProfilePanel();
private:
LLFlatListView* mExperiencesList;
LLAccordionCtrlTab* mExperiencesAccTab;
LLPanelProfile* mProfilePanel;
LLPanelExperienceInfo* mPanelExperienceInfo;
bool mNoExperiences;
};
struct LLExperienceData
{
std::string name;
std::string desc;
};
class LLExperienceItem
: public LLPanel
//, public LLAvatarPropertiesObserver
{
public:
LLExperienceItem();
~LLExperienceItem();
void init(LLExperienceData* experience_data);
/*virtual*/ BOOL postBuild();
void update();
/*virtual*/ void processProperties(void* data, EAvatarProcessorType type);
void setCreatorID(const LLUUID& val) { mCreatorID = val; }
void setExperienceDescription(const std::string& val);
void setExperienceName(const std::string& val);
const LLUUID& getCreatorID() const { return mCreatorID; }
const std::string& getExperienceName() const { return mExperienceName; }
const std::string& getExperienceDescription() const { return mExperienceDescription; }
protected:
LLUUID mCreatorID;
std::string mExperienceName;
std::string mExperienceDescription;
};
#endif // LL_LLPANELEXPERIENCES_H

View File

@ -56,6 +56,7 @@
#include "llfloatereditsky.h"
#include "llfloatereditwater.h"
#include "llfloaterenvironmentsettings.h"
#include "llfloaterexperiences.h"
#include "llfloaterevent.h"
#include "llfloaterdestinations.h"
#include "llfloaterfonttest.h"
@ -204,7 +205,8 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("env_edit_day_cycle", "floater_edit_day_cycle.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterEditDayCycle>);
LLFloaterReg::add("event", "floater_event.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterEvent>);
LLFloaterReg::add("experiences", "floater_experiences.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterExperiences>);
LLFloaterReg::add("font_test", "floater_font_test.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterFontTest>);
LLFloaterReg::add("gestures", "floater_gesture.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterGesture>);

View File

@ -0,0 +1,29 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<floater
positioning="cascading"
can_close="true"
can_resize="true"
height="400"
help_topic="sidebar_experiences"
min_height="300"
min_width="300"
layout="topleft"
name="floater_experiences"
save_rect="false"
single_instance="true"
reuse_instance="false"
title="EXPERIENCES"
width="400">
<panel
top="3"
left="3"
layout="topleft"
right="-3"
follows="all"
height="300"
class="experiences_panel"
filename="panel_experiences.xml"
>
</panel>
</floater>

View File

@ -52,6 +52,14 @@
function="Inventory.NewWindow"
parameter="" />
</menu_item_call>
<menu_item_call
label="Experiences..."
name="Experiences"
shortcut="control|E">
<menu_item_call.on_click
function="Floater.ToggleOrBringToFront"
parameter="experiences"/>
</menu_item_call>
<menu_item_call
label="Places..."
name="Places">

View File

@ -0,0 +1,79 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
bg_opaque_color="DkGray2"
background_visible="true"
background_opaque="true"
fit_parent="true"
follows="all"
height="120"
label="Experiences"
layout="topleft"
left="0"
name="panel_experience_info"
top_pad="0">
<text
follows="top|left|right"
font="SansSerifHugeBold"
height="26"
layout="topleft"
left_pad="4"
name="title"
text_color="White"
top="2"
value="Experience Info"
use_ellipses="true"
right="-3"/>
<text
follows="top|left|right"
font="SansSerifBig"
height="20"
layout="topleft"
left_pad="4"
name="name_label"
text_color="White"
left="8"
top_delta="28"
value="Name"
use_ellipses="true"
right="-3" />
<text
follows="top|left|right"
font="SansSerif"
height="20"
layout="topleft"
left_pad="8"
name="experience_name"
text_color="White"
left="16"
top_delta="22"
value="[loading...]"
use_ellipses="true"
right="-3" />
<text
follows="top|left|right"
font="SansSerifBig"
height="20"
left="8"
layout="topleft"
left_pad="4"
name="desc_label"
text_color="White"
top_delta="22"
value="Description"
use_ellipses="true"
right="-3" />
<expandable_text
follows="top|left|right"
font="SansSerif"
height="20"
layout="topleft"
left_pad="8"
name="experience_desc"
text_color="White"
left="16"
top_delta="22"
value="[loading...]"
use_ellipses="true"
right="-3"
word_wrap="true" />
</panel>

View File

@ -0,0 +1,40 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
layout="topleft"
top="3"
left="3"
right="-3"
bottom="-3"
label="Experiences"
follows="all">
<string
name="no_experiences"
value="No experiences."/>
<accordion
fit_parent="true"
layout="topleft"
top="0"
left="3"
right="-3"
bottom="-3"
single_expansion="true"
follows="all">
<accordion_tab
name="tab_experiences"
layout="topleft"
top="0"
left="0"
right="-3"
title="Experiences"
follows="all">
<flat_list_view
name="experiences_list"
layout="topleft"
top="0"
left="0"
follows="all"/>
</accordion_tab>
</accordion>
</panel>