aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/linden/indra/newview/hippoGridManager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'linden/indra/newview/hippoGridManager.cpp')
-rw-r--r--linden/indra/newview/hippoGridManager.cpp194
1 files changed, 137 insertions, 57 deletions
diff --git a/linden/indra/newview/hippoGridManager.cpp b/linden/indra/newview/hippoGridManager.cpp
index e89e3ff..c9f2549 100644
--- a/linden/indra/newview/hippoGridManager.cpp
+++ b/linden/indra/newview/hippoGridManager.cpp
@@ -1,4 +1,4 @@
1 1// Ported to Imprudence from the Hippo OpenSim Viewer by Jacek Antonelli
2 2
3#include "llviewerprecompiledheaders.h" 3#include "llviewerprecompiledheaders.h"
4 4
@@ -173,11 +173,16 @@ void HippoGridInfo::setPlatform(const std::string &platform)
173 for (unsigned i=0; i<platform.size(); i++) 173 for (unsigned i=0; i<platform.size(); i++)
174 tmp[i] = tolower(tmp[i]); 174 tmp[i] = tolower(tmp[i]);
175 175
176 if (tmp == "opensim") { 176 if (tmp == "opensim")
177 {
177 setPlatform(PLATFORM_OPENSIM); 178 setPlatform(PLATFORM_OPENSIM);
178 } else if (tmp == "secondlife") { 179 }
180 else if (tmp == "secondlife")
181 {
179 setPlatform(PLATFORM_SECONDLIFE); 182 setPlatform(PLATFORM_SECONDLIFE);
180 } else { 183 }
184 else
185 {
181 setPlatform(PLATFORM_OTHER); 186 setPlatform(PLATFORM_OTHER);
182 llwarns << "Unknown platform '" << platform << "'." << llendl; 187 llwarns << "Unknown platform '" << platform << "'." << llendl;
183 } 188 }
@@ -278,13 +283,20 @@ std::string HippoGridInfo::getSearchUrl(SearchType ty, bool is_web) const
278 if (mPlatform == PLATFORM_SECONDLIFE) 283 if (mPlatform == PLATFORM_SECONDLIFE)
279 { 284 {
280 // Second Life defaults 285 // Second Life defaults
281 if (ty == SEARCH_ALL_EMPTY) { 286 if (ty == SEARCH_ALL_EMPTY)
287 {
282 return gSavedSettings.getString("SearchURLDefault"); 288 return gSavedSettings.getString("SearchURLDefault");
283 } else if (ty == SEARCH_ALL_QUERY) { 289 }
290 else if (ty == SEARCH_ALL_QUERY)
291 {
284 return gSavedSettings.getString("SearchURLQuery"); 292 return gSavedSettings.getString("SearchURLQuery");
285 } else if (ty == SEARCH_ALL_TEMPLATE) { 293 }
294 else if (ty == SEARCH_ALL_TEMPLATE)
295 {
286 return gSavedSettings.getString("SearchURLSuffix2"); 296 return gSavedSettings.getString("SearchURLSuffix2");
287 } else { 297 }
298 else
299 {
288 llinfos << "Illegal search URL type " << ty << llendl; 300 llinfos << "Illegal search URL type " << ty << llendl;
289 return ""; 301 return "";
290 } 302 }
@@ -292,13 +304,20 @@ std::string HippoGridInfo::getSearchUrl(SearchType ty, bool is_web) const
292 else 304 else
293 { 305 {
294 // OpenSim and other web search defaults 306 // OpenSim and other web search defaults
295 if (ty == SEARCH_ALL_EMPTY) { 307 if (ty == SEARCH_ALL_EMPTY)
308 {
296 return gSavedSettings.getString("SearchURLDefaultOpenSim"); 309 return gSavedSettings.getString("SearchURLDefaultOpenSim");
297 } else if (ty == SEARCH_ALL_QUERY) { 310 }
311 else if (ty == SEARCH_ALL_QUERY)
312 {
298 return gSavedSettings.getString("SearchURLQueryOpenSim"); 313 return gSavedSettings.getString("SearchURLQueryOpenSim");
299 } else if (ty == SEARCH_ALL_TEMPLATE) { 314 }
315 else if (ty == SEARCH_ALL_TEMPLATE)
316 {
300 return gSavedSettings.getString("SearchURLSuffixOpenSim"); 317 return gSavedSettings.getString("SearchURLSuffixOpenSim");
301 } else { 318 }
319 else
320 {
302 llinfos << "Illegal search URL type " << ty << llendl; 321 llinfos << "Illegal search URL type " << ty << llendl;
303 return ""; 322 return "";
304 } 323 }
@@ -307,13 +326,20 @@ std::string HippoGridInfo::getSearchUrl(SearchType ty, bool is_web) const
307 else 326 else
308 { 327 {
309 // Use the old search all 328 // Use the old search all
310 if (ty == SEARCH_ALL_EMPTY) { 329 if (ty == SEARCH_ALL_EMPTY)
330 {
311 return (mSearchUrl + "panel=All&"); 331 return (mSearchUrl + "panel=All&");
312 } else if (ty == SEARCH_ALL_QUERY) { 332 }
333 else if (ty == SEARCH_ALL_QUERY)
334 {
313 return (mSearchUrl + "q=[QUERY]&s=[COLLECTION]&"); 335 return (mSearchUrl + "q=[QUERY]&s=[COLLECTION]&");
314 } else if (ty == SEARCH_ALL_TEMPLATE) { 336 }
337 else if (ty == SEARCH_ALL_TEMPLATE)
338 {
315 return "lang=[LANG]&m=[MATURE]&t=[TEEN]&region=[REGION]&x=[X]&y=[Y]&z=[Z]&session=[SESSION]"; 339 return "lang=[LANG]&m=[MATURE]&t=[TEEN]&region=[REGION]&x=[X]&y=[Y]&z=[Z]&session=[SESSION]";
316 } else { 340 }
341 else
342 {
317 llinfos << "Illegal search URL type " << ty << llendl; 343 llinfos << "Illegal search URL type " << ty << llendl;
318 return ""; 344 return "";
319 } 345 }
@@ -360,33 +386,38 @@ void HippoGridInfo::onXmlElementEnd(void *userData, const XML_Char *name)
360void HippoGridInfo::onXmlCharacterData(void *userData, const XML_Char *s, int len) 386void HippoGridInfo::onXmlCharacterData(void *userData, const XML_Char *s, int len)
361{ 387{
362 HippoGridInfo *self = (HippoGridInfo*)userData; 388 HippoGridInfo *self = (HippoGridInfo*)userData;
363 switch (self->mXmlState) { 389 switch (self->mXmlState)
364 390 {
365 case XML_GRIDNICK: { 391 case XML_GRIDNICK:
392 {
366 if (self->mGridNick == "") self->mGridNick.assign(s, len); 393 if (self->mGridNick == "") self->mGridNick.assign(s, len);
367 self->mGridNick = sanitizeGridNick(self->mGridNick); 394 self->mGridNick = sanitizeGridNick(self->mGridNick);
368 break; 395 break;
369 } 396 }
370 397
371 case XML_PLATFORM: { 398 case XML_PLATFORM:
399 {
372 std::string platform(s, len); 400 std::string platform(s, len);
373 self->setPlatform(platform); 401 self->setPlatform(platform);
374 break; 402 break;
375 } 403 }
376 404
377 case XML_LOGINURI: { 405 case XML_LOGINURI:
406 {
378 std::string loginuri(s, len); 407 std::string loginuri(s, len);
379 self->mLoginUri = sanitizeUri( loginuri ); 408 self->mLoginUri = sanitizeUri( loginuri );
380 break; 409 break;
381 } 410 }
382 411
383 case XML_HELPERURI: { 412 case XML_HELPERURI:
413 {
384 std::string helperuri(s, len); 414 std::string helperuri(s, len);
385 self->mHelperUri = sanitizeUri( helperuri ); 415 self->mHelperUri = sanitizeUri( helperuri );
386 break; 416 break;
387 } 417 }
388 418
389 case XML_SEARCH: { 419 case XML_SEARCH:
420 {
390 //self->mSearchUrl.assign(s, len); 421 //self->mSearchUrl.assign(s, len);
391 //sanitizeQueryUrl(mSearchUrl); 422 //sanitizeQueryUrl(mSearchUrl);
392 break; 423 break;
@@ -426,7 +457,8 @@ bool HippoGridInfo::retrieveGridInfo()
426 XML_SetElementHandler(parser, onXmlElementStart, onXmlElementEnd); 457 XML_SetElementHandler(parser, onXmlElementStart, onXmlElementEnd);
427 XML_SetCharacterDataHandler(parser, onXmlCharacterData); 458 XML_SetCharacterDataHandler(parser, onXmlCharacterData);
428 mXmlState = XML_VOID; 459 mXmlState = XML_VOID;
429 if (!XML_Parse(parser, reply.data(), reply.size(), TRUE)) { 460 if (!XML_Parse(parser, reply.data(), reply.size(), TRUE))
461 {
430 llwarns << "XML Parse Error: " << XML_ErrorString(XML_GetErrorCode(parser)) << llendl; 462 llwarns << "XML Parse Error: " << XML_ErrorString(XML_GetErrorCode(parser)) << llendl;
431 success = false; 463 success = false;
432 } 464 }
@@ -477,7 +509,8 @@ void HippoGridInfo::formatFee(std::string &fee, int cost, bool showFree) const
477// static 509// static
478const char *HippoGridInfo::getPlatformString(Platform platform) 510const char *HippoGridInfo::getPlatformString(Platform platform)
479{ 511{
480 static const char *platformStrings[PLATFORM_LAST] = { 512 static const char *platformStrings[PLATFORM_LAST] =
513 {
481 "Other", "OpenSim", "SecondLife" 514 "Other", "OpenSim", "SecondLife"
482 }; 515 };
483 516
@@ -492,11 +525,15 @@ std::string HippoGridInfo::sanitizeGridNick(std::string &gridnick)
492{ 525{
493 std::string tmp; 526 std::string tmp;
494 int size = gridnick.size(); 527 int size = gridnick.size();
495 for (int i=0; i<size; i++) { 528 for (int i=0; i<size; i++)
529 {
496 char c = gridnick[i]; 530 char c = gridnick[i];
497 if ((c == '_') || isalnum(c)) { 531 if ((c == '_') || isalnum(c))
532 {
498 tmp += tolower(c); 533 tmp += tolower(c);
499 } else if (isspace(c)) { 534 }
535 else if (isspace(c))
536 {
500 tmp += "_"; 537 tmp += "_";
501 } 538 }
502 } 539 }
@@ -543,7 +580,9 @@ void HippoGridInfo::initFallback()
543 580
544HippoGridManager::HippoGridManager() : 581HippoGridManager::HippoGridManager() :
545 mConnectedGrid(0), 582 mConnectedGrid(0),
546 mDefaultGridsVersion(0) 583 mDefaultGridsVersion(0),
584 mCurrentGrid("osgrid"),
585 mDefaultGrid("osgrid")
547{ 586{
548} 587}
549 588
@@ -556,7 +595,8 @@ HippoGridManager::~HippoGridManager()
556void HippoGridManager::cleanup() 595void HippoGridManager::cleanup()
557{ 596{
558 std::map<std::string, HippoGridInfo*>::iterator it, end = mGridInfo.end(); 597 std::map<std::string, HippoGridInfo*>::iterator it, end = mGridInfo.end();
559 for (it=mGridInfo.begin(); it != end; ++it) { 598 for (it=mGridInfo.begin(); it != end; ++it)
599 {
560 delete it->second; 600 delete it->second;
561 } 601 }
562 mGridInfo.clear(); 602 mGridInfo.clear();
@@ -589,9 +629,12 @@ HippoGridInfo* HippoGridManager::getGrid(const std::string &grid) const
589{ 629{
590 std::map<std::string, HippoGridInfo*>::const_iterator it; 630 std::map<std::string, HippoGridInfo*>::const_iterator it;
591 it = mGridInfo.find(grid); 631 it = mGridInfo.find(grid);
592 if (it != mGridInfo.end()) { 632 if (it != mGridInfo.end())
633 {
593 return it->second; 634 return it->second;
594 } else { 635 }
636 else
637 {
595 return 0; 638 return 0;
596 } 639 }
597} 640}
@@ -606,9 +649,12 @@ HippoGridInfo* HippoGridManager::getConnectedGrid() const
606HippoGridInfo* HippoGridManager::getCurrentGrid() const 649HippoGridInfo* HippoGridManager::getCurrentGrid() const
607{ 650{
608 HippoGridInfo *grid = getGrid(mCurrentGrid); 651 HippoGridInfo *grid = getGrid(mCurrentGrid);
609 if (grid) { 652 if (grid)
653 {
610 return grid; 654 return grid;
611 } else { 655 }
656 else
657 {
612 return &HippoGridInfo::FALLBACK_GRIDINFO; 658 return &HippoGridInfo::FALLBACK_GRIDINFO;
613 } 659 }
614} 660}
@@ -620,6 +666,10 @@ const std::string& HippoGridManager::getDefaultGridNick() const
620 666
621const std::string& HippoGridManager::getCurrentGridNick() const 667const std::string& HippoGridManager::getCurrentGridNick() const
622{ 668{
669 if (mCurrentGrid.empty())
670 {
671 return mDefaultGrid;
672 }
623 return mCurrentGrid; 673 return mCurrentGrid;
624} 674}
625 675
@@ -633,12 +683,14 @@ void HippoGridManager::addGrid(HippoGridInfo *grid)
633{ 683{
634 if (!grid) return; 684 if (!grid) return;
635 const std::string &nick = grid->getGridNick(); 685 const std::string &nick = grid->getGridNick();
636 if (nick == "") { 686 if (nick == "")
687 {
637 llwarns << "Ignoring to try adding grid with empty nick." << llendl; 688 llwarns << "Ignoring to try adding grid with empty nick." << llendl;
638 delete grid; 689 delete grid;
639 return; 690 return;
640 } 691 }
641 if (mGridInfo.find(nick) != mGridInfo.end()) { 692 if (mGridInfo.find(nick) != mGridInfo.end())
693 {
642 llwarns << "Ignoring to try adding existing grid " << nick << '.' << llendl; 694 llwarns << "Ignoring to try adding existing grid " << nick << '.' << llendl;
643 delete grid; 695 delete grid;
644 return; 696 return;
@@ -667,13 +719,20 @@ void HippoGridManager::deleteGrid(const std::string &grid)
667void HippoGridManager::setDefaultGrid(const std::string &grid) 719void HippoGridManager::setDefaultGrid(const std::string &grid)
668{ 720{
669 GridIterator it = mGridInfo.find(grid); 721 GridIterator it = mGridInfo.find(grid);
670 if (it != mGridInfo.end()) { 722 if (it != mGridInfo.end())
723 {
671 mDefaultGrid = grid; 724 mDefaultGrid = grid;
672 } else if (mGridInfo.find("secondlife") != mGridInfo.end()) { 725 }
726 else if (mGridInfo.find("secondlife") != mGridInfo.end())
727 {
673 mDefaultGrid = "secondlife"; 728 mDefaultGrid = "secondlife";
674 } else if (!mGridInfo.empty()) { 729 }
730 else if (!mGridInfo.empty())
731 {
675 mDefaultGrid = mGridInfo.begin()->first; 732 mDefaultGrid = mGridInfo.begin()->first;
676 } else { 733 }
734 else
735 {
677 mDefaultGrid = ""; 736 mDefaultGrid = "";
678 } 737 }
679} 738}
@@ -682,9 +741,12 @@ void HippoGridManager::setDefaultGrid(const std::string &grid)
682void HippoGridManager::setCurrentGrid(const std::string &grid) 741void HippoGridManager::setCurrentGrid(const std::string &grid)
683{ 742{
684 GridIterator it = mGridInfo.find(grid); 743 GridIterator it = mGridInfo.find(grid);
685 if (it != mGridInfo.end()) { 744 if (it != mGridInfo.end())
745 {
686 mCurrentGrid = grid; 746 mCurrentGrid = grid;
687 } else if (!mGridInfo.empty()) { 747 }
748 else if (!mGridInfo.empty())
749 {
688 llwarns << "Unknown grid '" << grid << "'. Setting to default grid." << llendl; 750 llwarns << "Unknown grid '" << grid << "'. Setting to default grid." << llendl;
689 mCurrentGrid = mDefaultGrid; 751 mCurrentGrid = mDefaultGrid;
690 } 752 }
@@ -722,7 +784,8 @@ void HippoGridManager::parseUrl(const char *url, bool mergeIfNewer)
722 784
723 // check response, return on error 785 // check response, return on error
724 S32 status = response["status"].asInteger(); 786 S32 status = response["status"].asInteger();
725 if ((status != 200) || !response["body"].isArray()) { 787 if ((status != 200) || !response["body"].isArray())
788 {
726 llinfos << "GridInfo Update failed (" << status << "): " 789 llinfos << "GridInfo Update failed (" << status << "): "
727 << (response["body"].isString()? response["body"].asString(): "<unknown error>") 790 << (response["body"].isString()? response["body"].asString(): "<unknown error>")
728 << llendl; 791 << llendl;
@@ -737,13 +800,15 @@ void HippoGridManager::parseFile(const std::string &fileName, bool mergeIfNewer)
737{ 800{
738 llifstream infile; 801 llifstream infile;
739 infile.open(fileName.c_str()); 802 infile.open(fileName.c_str());
740 if(!infile.is_open()) { 803 if (!infile.is_open())
804 {
741 llwarns << "Cannot find grid info file " << fileName << " to load." << llendl; 805 llwarns << "Cannot find grid info file " << fileName << " to load." << llendl;
742 return; 806 return;
743 } 807 }
744 808
745 LLSD gridInfo; 809 LLSD gridInfo;
746 if (LLSDSerialize::fromXML(gridInfo, infile) <= 0) { 810 if (LLSDSerialize::fromXML(gridInfo, infile) <= 0)
811 {
747 llwarns << "Unable to parse grid info file " << fileName << '.' << llendl; 812 llwarns << "Unable to parse grid info file " << fileName << '.' << llendl;
748 return; 813 return;
749 } 814 }
@@ -755,17 +820,21 @@ void HippoGridManager::parseFile(const std::string &fileName, bool mergeIfNewer)
755 820
756void HippoGridManager::parseData(LLSD &gridInfo, bool mergeIfNewer) 821void HippoGridManager::parseData(LLSD &gridInfo, bool mergeIfNewer)
757{ 822{
758 if (mergeIfNewer) { 823 if (mergeIfNewer)
824 {
759 LLSD::array_const_iterator it, end = gridInfo.endArray(); 825 LLSD::array_const_iterator it, end = gridInfo.endArray();
760 for (it = gridInfo.beginArray(); it != end; ++it) { 826 for (it = gridInfo.beginArray(); it != end; ++it)
827 {
761 LLSD gridMap = *it; 828 LLSD gridMap = *it;
762 if (gridMap.has("default_grids_version")) { 829 if (gridMap.has("default_grids_version"))
830 {
763 int version = gridMap["default_grids_version"]; 831 int version = gridMap["default_grids_version"];
764 if (version <= mDefaultGridsVersion) return; 832 if (version <= mDefaultGridsVersion) return;
765 else break; 833 else break;
766 } 834 }
767 } 835 }
768 if (it == end) { 836 if (it == end)
837 {
769 llwarns << "Grid data has no version number." << llendl; 838 llwarns << "Grid data has no version number." << llendl;
770 return; 839 return;
771 } 840 }
@@ -774,19 +843,26 @@ void HippoGridManager::parseData(LLSD &gridInfo, bool mergeIfNewer)
774 llinfos << "Loading grid data." << llendl; 843 llinfos << "Loading grid data." << llendl;
775 844
776 LLSD::array_const_iterator it, end = gridInfo.endArray(); 845 LLSD::array_const_iterator it, end = gridInfo.endArray();
777 for (it = gridInfo.beginArray(); it != end; ++it) { 846 for (it = gridInfo.beginArray(); it != end; ++it)
847 {
778 LLSD gridMap = *it; 848 LLSD gridMap = *it;
779 if (gridMap.has("default_grids_version")) { 849 if (gridMap.has("default_grids_version"))
850 {
780 mDefaultGridsVersion = gridMap["default_grids_version"]; 851 mDefaultGridsVersion = gridMap["default_grids_version"];
781 } else if (gridMap.has("gridnick") && gridMap.has("loginuri")) { 852 }
853 else if (gridMap.has("gridnick") && gridMap.has("loginuri"))
854 {
782 std::string gridnick = gridMap["gridnick"]; 855 std::string gridnick = gridMap["gridnick"];
783 HippoGridInfo *grid; 856 HippoGridInfo *grid;
784 GridIterator it = mGridInfo.find(gridnick); 857 GridIterator it = mGridInfo.find(gridnick);
785 bool newGrid = (it == mGridInfo.end()); 858 bool newGrid = (it == mGridInfo.end());
786 if (newGrid) { 859 if (newGrid)
860 {
787 // create new grid info 861 // create new grid info
788 grid = new HippoGridInfo(gridnick); 862 grid = new HippoGridInfo(gridnick);
789 } else { 863 }
864 else
865 {
790 // update existing grid info 866 // update existing grid info
791 grid = it->second; 867 grid = it->second;
792 } 868 }
@@ -822,7 +898,8 @@ void HippoGridManager::saveFile()
822 // add grids 898 // add grids
823 S32 i = 1; 899 S32 i = 1;
824 GridIterator it, end = mGridInfo.end(); 900 GridIterator it, end = mGridInfo.end();
825 for (it = mGridInfo.begin(); it != end; ++it, i++) { 901 for (it = mGridInfo.begin(); it != end; ++it, i++)
902 {
826 HippoGridInfo *grid = it->second; 903 HippoGridInfo *grid = it->second;
827 gridInfo[i]["gridnick"] = grid->getGridNick(); 904 gridInfo[i]["gridnick"] = grid->getGridNick();
828 gridInfo[i]["platform"] = HippoGridInfo::getPlatformString(grid->getPlatform()); 905 gridInfo[i]["platform"] = HippoGridInfo::getPlatformString(grid->getPlatform());
@@ -846,11 +923,14 @@ void HippoGridManager::saveFile()
846 std::string fileName = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "grid_info.xml"); 923 std::string fileName = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "grid_info.xml");
847 llofstream file; 924 llofstream file;
848 file.open(fileName.c_str()); 925 file.open(fileName.c_str());
849 if (file.is_open()) { 926 if (file.is_open())
927 {
850 LLSDSerialize::toPrettyXML(gridInfo, file); 928 LLSDSerialize::toPrettyXML(gridInfo, file);
851 file.close(); 929 file.close();
852 llinfos << "Saved grids to " << fileName << llendl; 930 llinfos << "Saved grids to " << fileName << llendl;
853 } else { 931 }
932 else
933 {
854 llerrs << "Unable to open grid info file: " << fileName << llendl; 934 llerrs << "Unable to open grid info file: " << fileName << llendl;
855 } 935 }
856} 936}