llurlentry.h
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:9k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llurlentry.h
  3.  * @author Martin Reddy
  4.  * @brief Describes the Url types that can be registered in LLUrlRegistry
  5.  *
  6.  * $LicenseInfo:firstyear=2009&license=viewergpl$
  7.  * 
  8.  * Copyright (c) 2009-2010, Linden Research, Inc.
  9.  * 
  10.  * Second Life Viewer Source Code
  11.  * The source code in this file ("Source Code") is provided by Linden Lab
  12.  * to you under the terms of the GNU General Public License, version 2.0
  13.  * ("GPL"), unless you have obtained a separate licensing agreement
  14.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  15.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  16.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  17.  * 
  18.  * There are special exceptions to the terms and conditions of the GPL as
  19.  * it is applied to this Source Code. View the full text of the exception
  20.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  21.  * online at
  22.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  23.  * 
  24.  * By copying, modifying or distributing this software, you acknowledge
  25.  * that you have read and understood your obligations described above,
  26.  * and agree to abide by those obligations.
  27.  * 
  28.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  29.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  30.  * COMPLETENESS OR PERFORMANCE.
  31.  * $/LicenseInfo$
  32.  */
  33. #ifndef LL_LLURLENTRY_H
  34. #define LL_LLURLENTRY_H
  35. #include "lluuid.h"
  36. #include "lluicolor.h"
  37. #include <boost/signals2.hpp>
  38. #include <boost/regex.hpp>
  39. #include <string>
  40. #include <map>
  41. typedef boost::signals2::signal<void (const std::string& url,
  42.   const std::string& label)> LLUrlLabelSignal;
  43. typedef LLUrlLabelSignal::slot_type LLUrlLabelCallback;
  44. ///
  45. /// LLUrlEntryBase is the base class of all Url types registered in the 
  46. /// LLUrlRegistry. Each derived classes provides a regular expression
  47. /// to match the Url type (e.g., http://... or secondlife://...) along
  48. /// with an optional icon to display next to instances of the Url in
  49. /// a text display and a XUI file to use for any context menu popup.
  50. /// Functions are also provided to compute an appropriate label and
  51. /// tooltip/status bar text for the Url.
  52. ///
  53. /// Some derived classes of LLUrlEntryBase may wish to compute an
  54. /// appropriate label for a Url by asking the server for information.
  55. /// You must therefore provide a callback method, so that you can be
  56. /// notified when an updated label has been received from the server.
  57. /// This label should then be used to replace any previous label
  58. /// that you received from getLabel() for the Url in question.
  59. ///
  60. class LLUrlEntryBase
  61. {
  62. public:
  63. LLUrlEntryBase();
  64. virtual ~LLUrlEntryBase();
  65. /// Return the regex pattern that matches this Url 
  66. boost::regex getPattern() const { return mPattern; }
  67. /// Return the url from a string that matched the regex
  68. virtual std::string getUrl(const std::string &string) const;
  69. /// Given a matched Url, return a label for the Url
  70. virtual std::string getLabel(const std::string &url, const LLUrlLabelCallback &cb) { return url; }
  71. /// Return an icon that can be displayed next to Urls of this type
  72. std::string getIcon() const { return mIcon; }
  73. /// Return the color to render the displayed text
  74. LLUIColor getColor() const { return mColor; }
  75. /// Given a matched Url, return a tooltip string for the hyperlink
  76. std::string getTooltip() const { return mTooltip; }
  77. /// Return the name of a XUI file containing the context menu items
  78. std::string getMenuName() const { return mMenuName; }
  79. /// Return the name of a SL location described by this Url, if any
  80. virtual std::string getLocation(const std::string &url) const { return ""; }
  81. /// is this a match for a URL that should not be hyperlinked?
  82. bool isLinkDisabled() const { return mDisabledLink; }
  83. protected:
  84. std::string getIDStringFromUrl(const std::string &url) const;
  85. std::string escapeUrl(const std::string &url) const;
  86. std::string unescapeUrl(const std::string &url) const;
  87. std::string getLabelFromWikiLink(const std::string &url) const;
  88. std::string getUrlFromWikiLink(const std::string &string) const;
  89. void addObserver(const std::string &id, const std::string &url, const LLUrlLabelCallback &cb); 
  90. void callObservers(const std::string &id, const std::string &label);
  91. typedef struct {
  92. std::string url;
  93. LLUrlLabelSignal *signal;
  94. } LLUrlEntryObserver;
  95. boost::regex                                    mPattern;
  96. std::string                                     mIcon;
  97. std::string                                     mMenuName;
  98. std::string                                     mTooltip;
  99. LLUIColor mColor;
  100. std::multimap<std::string, LLUrlEntryObserver> mObservers;
  101. bool                                            mDisabledLink;
  102. };
  103. ///
  104. /// LLUrlEntryHTTP Describes generic http: and https: Urls
  105. ///
  106. class LLUrlEntryHTTP : public LLUrlEntryBase
  107. {
  108. public:
  109. LLUrlEntryHTTP();
  110. /*virtual*/ std::string getLabel(const std::string &url, const LLUrlLabelCallback &cb);
  111. };
  112. ///
  113. /// LLUrlEntryHTTPLabel Describes generic http: and https: Urls with custom labels
  114. ///
  115. class LLUrlEntryHTTPLabel : public LLUrlEntryBase
  116. {
  117. public:
  118. LLUrlEntryHTTPLabel();
  119. /*virtual*/ std::string getLabel(const std::string &url, const LLUrlLabelCallback &cb);
  120. /*virtual*/ std::string getUrl(const std::string &string) const;
  121. };
  122. ///
  123. /// LLUrlEntryHTTPNoProtocol Describes generic Urls like www.google.com
  124. ///
  125. class LLUrlEntryHTTPNoProtocol : public LLUrlEntryBase
  126. {
  127. public:
  128. LLUrlEntryHTTPNoProtocol();
  129. /*virtual*/ std::string getLabel(const std::string &url, const LLUrlLabelCallback &cb);
  130. /*virtual*/ std::string getUrl(const std::string &string) const;
  131. };
  132. ///
  133. /// LLUrlEntrySLURL Describes http://slurl.com/... Urls
  134. ///
  135. class LLUrlEntrySLURL : public LLUrlEntryBase
  136. {
  137. public:
  138. LLUrlEntrySLURL();
  139. /*virtual*/ std::string getLabel(const std::string &url, const LLUrlLabelCallback &cb);
  140. /*virtual*/ std::string getLocation(const std::string &url) const;
  141. };
  142. ///
  143. /// LLUrlEntryAgent Describes a Second Life agent Url, e.g.,
  144. /// secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about
  145. ///
  146. class LLUrlEntryAgent : public LLUrlEntryBase
  147. {
  148. public:
  149. LLUrlEntryAgent();
  150. /*virtual*/ std::string getLabel(const std::string &url, const LLUrlLabelCallback &cb);
  151. private:
  152. void onAgentNameReceived(const LLUUID& id, const std::string& first,
  153.  const std::string& last, BOOL is_group);
  154. };
  155. ///
  156. /// LLUrlEntryGroup Describes a Second Life group Url, e.g.,
  157. /// secondlife:///app/group/00005ff3-4044-c79f-9de8-fb28ae0df991/about
  158. ///
  159. class LLUrlEntryGroup : public LLUrlEntryBase
  160. {
  161. public:
  162. LLUrlEntryGroup();
  163. /*virtual*/ std::string getLabel(const std::string &url, const LLUrlLabelCallback &cb);
  164. private:
  165. void onGroupNameReceived(const LLUUID& id, const std::string& first,
  166.  const std::string& last, BOOL is_group);
  167. };
  168. ///
  169. /// LLUrlEntryInventory Describes a Second Life inventory Url, e.g.,
  170. /// secondlife:///app/inventory/0e346d8b-4433-4d66-a6b0-fd37083abc4c/select
  171. ///
  172. class LLUrlEntryInventory : public LLUrlEntryBase
  173. {
  174. public:
  175. LLUrlEntryInventory();
  176. /*virtual*/ std::string getLabel(const std::string &url, const LLUrlLabelCallback &cb);
  177. private:
  178. };
  179. ///
  180. /// LLUrlEntryParcel Describes a Second Life parcel Url, e.g.,
  181. /// secondlife:///app/parcel/0000060e-4b39-e00b-d0c3-d98b1934e3a8/about
  182. ///
  183. class LLUrlEntryParcel : public LLUrlEntryBase
  184. {
  185. public:
  186. LLUrlEntryParcel();
  187. /*virtual*/ std::string getLabel(const std::string &url, const LLUrlLabelCallback &cb);
  188. };
  189. ///
  190. /// LLUrlEntryPlace Describes a Second Life location Url, e.g.,
  191. /// secondlife://Ahern/50/50/50
  192. ///
  193. class LLUrlEntryPlace : public LLUrlEntryBase
  194. {
  195. public:
  196. LLUrlEntryPlace();
  197. /*virtual*/ std::string getLabel(const std::string &url, const LLUrlLabelCallback &cb);
  198. /*virtual*/ std::string getLocation(const std::string &url) const;
  199. };
  200. ///
  201. /// LLUrlEntryTeleport Describes a Second Life teleport Url, e.g.,
  202. /// secondlife:///app/teleport/Ahern/50/50/50/
  203. ///
  204. class LLUrlEntryTeleport : public LLUrlEntryBase
  205. {
  206. public:
  207. LLUrlEntryTeleport();
  208. /*virtual*/ std::string getLabel(const std::string &url, const LLUrlLabelCallback &cb);
  209. /*virtual*/ std::string getLocation(const std::string &url) const;
  210. };
  211. ///
  212. /// LLUrlEntrySL Describes a generic SLURL, e.g., a Url that starts
  213. /// with secondlife:// (used as a catch-all for cases not matched above)
  214. ///
  215. class LLUrlEntrySL : public LLUrlEntryBase
  216. {
  217. public:
  218. LLUrlEntrySL();
  219. /*virtual*/ std::string getLabel(const std::string &url, const LLUrlLabelCallback &cb);
  220. };
  221. ///
  222. /// LLUrlEntrySLLabel Describes a generic SLURL, e.g., a Url that starts
  223. /// with secondlife:// with the ability to specify a custom label.
  224. ///
  225. class LLUrlEntrySLLabel : public LLUrlEntryBase
  226. {
  227. public:
  228. LLUrlEntrySLLabel();
  229. /*virtual*/ std::string getLabel(const std::string &url, const LLUrlLabelCallback &cb);
  230. /*virtual*/ std::string getUrl(const std::string &string) const;
  231. };
  232. ///
  233. /// LLUrlEntryWorldMap Describes a Second Life worldmap Url, e.g.,
  234. /// secondlife:///app/worldmap/Ahern/50/50/50
  235. ///
  236. class LLUrlEntryWorldMap : public LLUrlEntryBase
  237. {
  238. public:
  239. LLUrlEntryWorldMap();
  240. /*virtual*/ std::string getLabel(const std::string &url, const LLUrlLabelCallback &cb);
  241. /*virtual*/ std::string getLocation(const std::string &url) const;
  242. };
  243. ///
  244. /// LLUrlEntryNoLink lets us turn of URL detection with <nolink>...</nolink> tags
  245. ///
  246. class LLUrlEntryNoLink : public LLUrlEntryBase
  247. {
  248. public:
  249. LLUrlEntryNoLink();
  250. /*virtual*/ std::string getLabel(const std::string &url, const LLUrlLabelCallback &cb);
  251. /*virtual*/ std::string getUrl(const std::string &string) const;
  252. };
  253. #endif