<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.secondlife.com/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Leyla+Linden</id>
	<title>Second Life Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.secondlife.com/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Leyla+Linden"/>
	<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/wiki/Special:Contributions/Leyla_Linden"/>
	<updated>2026-05-25T11:27:23Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LLQtWebKit_Win32_Build_Instructions&amp;diff=874062</id>
		<title>LLQtWebKit Win32 Build Instructions</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LLQtWebKit_Win32_Build_Instructions&amp;diff=874062"/>
		<updated>2010-04-21T23:26:59Z</updated>

		<summary type="html">&lt;p&gt;Leyla Linden: /* Win32GL */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;&amp;lt;&amp;lt; [https://wiki.secondlife.com/wiki/LLQtWebKit Back to LLQtWebKit main page]&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
These are instructions for building the Qt/WebKit library (LLQtWebKit) on Windows as well as the test applications (testGL, uBrowser, QtTestApp, Win32GL). They have been tested using Microsoft Visual Studio 2005 (SP2) on Windows XP Service Pack 3 and Qt 4.6.0. It is not known if the same instructions work using other versions of Windows, Microsoft Visual Studio or Qt.&lt;br /&gt;
&lt;br /&gt;
== Set up ==&lt;br /&gt;
* For clarity, these instructions contain references to example paths and directories. Except where noted, you may replace these with ones of your own choosing although it is generally advisable to choose ones without spaces in them.&lt;br /&gt;
&lt;br /&gt;
== Acquire LLQtWebKit source code ==&lt;br /&gt;
* In a Web browser, navigate to http://hg.secondlife.com/llqtwebkit/&lt;br /&gt;
* Select &amp;quot;get source-&amp;gt;zip&amp;quot; from menu&lt;br /&gt;
* A zip file of the source code will be downloaded&lt;br /&gt;
* Extract the contents of the zip file to &amp;lt;code&amp;gt;C:\llqtwebkit&amp;lt;/code&amp;gt;&lt;br /&gt;
**Note: Different archiving tools have different concepts of &amp;quot;contents&amp;quot; - you should end up with the directories and files in &amp;lt;code&amp;gt;C:\llqtwebkit&amp;lt;/code&amp;gt; and not &amp;lt;code&amp;gt;C:\llqtwebkit\llqtwebkit&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Build the open source OpenSSL library ==&lt;br /&gt;
* Make sure a recent version of &#039;&amp;lt;code&amp;gt;perl&amp;lt;/code&amp;gt;&#039; and &#039;&amp;lt;code&amp;gt;patch&amp;lt;/code&amp;gt;&#039; are available on your system.&lt;br /&gt;
* Download the OpenSSL 0.9.8l tarball from http://openssl.org/source/openssl-0.9.8l.tar.gz&lt;br /&gt;
* Extract the contents to &amp;lt;code&amp;gt;C:\openssl-0.9.8l&amp;lt;/code&amp;gt;&lt;br /&gt;
** Note: Different archive tools have different concepts of &amp;quot;contents&amp;quot; - you should end up with the directories and files in &amp;lt;code&amp;gt;C:\openssl-0.9.8l&amp;lt;/code&amp;gt; and not &amp;lt;code&amp;gt;C:\openssl-0.9.8l\openssl-0.9.8l&amp;lt;/code&amp;gt;&lt;br /&gt;
** Note: Some archive tools (notably 7-Zip) appear to have issues extracting the files correctly - make sure the header files in the &amp;lt;code&amp;gt;C:\openssl-0.9.8l\include\openssl&amp;lt;/code&amp;gt; directory are not zero length before proceeding.&lt;br /&gt;
* Open the &amp;quot;Visual Studio 2005 Command Prompt&amp;quot; (Start Menu-&amp;gt;Microsoft Visual Studio 2005-&amp;gt;Visual Studio Tools-&amp;gt;Visual Studio 2005 Command Prompt)&lt;br /&gt;
* Change to the &amp;lt;code&amp;gt;C:\openssl-0.9.8l&amp;lt;/code&amp;gt; directory &lt;br /&gt;
* Run these commands:&lt;br /&gt;
** &amp;lt;code&amp;gt;perl Configure VC-WIN32&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;ms\do_masm&amp;lt;/code&amp;gt;&lt;br /&gt;
* Patch the &amp;lt;code&amp;gt;ntdll.mak&amp;lt;/code&amp;gt; file generated by the previous steps (this fixes the DLL manifest settings so that they are compatible with the Second Life client build configuration)&lt;br /&gt;
** Copy the patch file &amp;lt;code&amp;gt;020-openssl-disable-manifest.patch&amp;lt;/code&amp;gt; from the &amp;lt;code&amp;gt;C:\llqtwebkit-4.6\patches&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;C:\openssl-0.9.8l&amp;lt;/code&amp;gt;&lt;br /&gt;
** Run this command:&lt;br /&gt;
*** &amp;lt;code&amp;gt;patch -p1 &amp;lt; 020-openssl-disable-manifest.patch&amp;lt;/code&amp;gt;&lt;br /&gt;
* Continue to build &lt;br /&gt;
** &amp;lt;code&amp;gt;nmake -f ms\ntdll.mak&amp;lt;/code&amp;gt;&lt;br /&gt;
* After a few minutes, the libraries &amp;lt;code&amp;gt;libeay32.dll&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;ssleay32.dll&amp;lt;/code&amp;gt; will be built in the &amp;lt;code&amp;gt;C:\openssl-0.9.8l\out32dll&amp;lt;/code&amp;gt; directory - confirm they exist - they will be needed later.&lt;br /&gt;
&lt;br /&gt;
== Build the open source version of Qt 4.6.0 using Microsoft Visual Studio ==&lt;br /&gt;
=== Acquire the Qt 4.6.0 source with our patches ===&lt;br /&gt;
* Our clone of Qt is available here: http://gitorious.org/+lindenqt/qt/lindenqt&lt;br /&gt;
* Download the source by clicking on the &amp;quot;lindenqt&amp;quot; branch under &amp;quot;Branches:&amp;quot; and then using the &amp;quot;Download lindenqt as tar.gz&amp;quot; link on the right hand side of the page&lt;br /&gt;
** It&#039;s a large download - over 100MB - so it may take some time&lt;br /&gt;
** Alternately, if you prefer you can clone the repository with git using the &amp;quot;clone&amp;quot; link on the page -- details of this are left as an exercise to the reader&lt;br /&gt;
* Extract the contents of the tarball into &amp;lt;code&amp;gt;C:\qt-lindenqt&amp;lt;/code&amp;gt;&lt;br /&gt;
* This may take some as the archive contains a lot of files&lt;br /&gt;
** Note: Different tools have different concepts of &amp;quot;contents&amp;quot; - you should end up with the directories and files in &amp;lt;code&amp;gt;C:\qt-lindenqt&amp;lt;/code&amp;gt; and not &amp;lt;code&amp;gt;C:\qt-lindenqt\qt-lindenqt&amp;lt;/code&amp;gt; &lt;br /&gt;
** Note: using Cygwin&#039;s &amp;lt;code&amp;gt;tar&amp;lt;/code&amp;gt; command might not work.  It may result in an &#039;&#039;&#039;Access is Denied&#039;&#039;&#039; error when running configure below. If so, try using WinZip, WinRAR or some other tool instead.&lt;br /&gt;
&lt;br /&gt;
=== Configure Qt ===&lt;br /&gt;
* If it&#039;s not open already, open the &amp;quot;Visual Studio 2005 Command Prompt&amp;quot; (Start Menu-&amp;gt;Microsoft Visual Studio 2005-&amp;gt;Visual Studio Tools-&amp;gt;Visual Studio 2005 Command Prompt)&lt;br /&gt;
* Change to the &amp;lt;code&amp;gt;C:\qt-lindenqt&amp;lt;/code&amp;gt; directory &lt;br /&gt;
* Run this command: &lt;br /&gt;
 &amp;lt;code&amp;gt;configure -debug-and-release -no-qt3support -no-phonon -no-phonon-backend -prefix C:\qt-lindenqt -qt-libjpeg -qt-libpng -openssl-linked -I C:\openssl-0.9.8l\include -L C:\openssl-0.9.8l\out32dll&amp;lt;/code&amp;gt;&lt;br /&gt;
* When you are asked if you want to use the Commercial or Open Source version type &amp;lt;code&amp;gt;o&amp;lt;/code&amp;gt; to select Open Source and press the Enter key&lt;br /&gt;
* When the license agreement appears, if you agree type &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt; the Enter key&lt;br /&gt;
* This operation takes around 10-15 minutes on a typical development system&lt;br /&gt;
&lt;br /&gt;
=== Build Qt ===&lt;br /&gt;
* Change to the &amp;lt;code&amp;gt;C:\qt-lindenqt&amp;lt;/code&amp;gt; directory &lt;br /&gt;
* Run this command:&lt;br /&gt;
 &amp;lt;code&amp;gt;nmake sub-src&amp;lt;/code&amp;gt;&lt;br /&gt;
* This operation takes around 1-2 hours on a typical development system&lt;br /&gt;
* After building Qt, the release and debug libraries and dlls will be in &amp;lt;code&amp;gt;C:\qt-lindenqt\lib&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Configure a Qt runtime environment ===&lt;br /&gt;
* Copy the OpenSSL dynamic libraries (&amp;lt;code&amp;gt;C:\openssl-0.9.8l\out32dll\libeay32.dll&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;C:\openssl-0.9.8l\out32dll\ssleay32.dll&amp;lt;/code&amp;gt;) to the Qt binary directory (&amp;lt;code&amp;gt;C:\qt-lindenqt\bin&amp;lt;/code&amp;gt;)&lt;br /&gt;
* Create the file &amp;lt;code&amp;gt;C:\qt-lindenqt\bin\qt-vars.bat&amp;lt;/code&amp;gt; and put the following in it:&lt;br /&gt;
 @echo off&lt;br /&gt;
 echo Setting up a Qt environment...&lt;br /&gt;
 set QTDIR=C:\qt-lindenqt&lt;br /&gt;
 set PATH=C:\qt-lindenqt\bin;%PATH%&lt;br /&gt;
 set QMAKESPEC=win32-msvc2005&lt;br /&gt;
 call &amp;quot;C:\Program Files\Microsoft Visual Studio 8\Common7\Tools\vsvars32.bat&amp;quot;&lt;br /&gt;
* Make a shortcut to &amp;lt;code&amp;gt;qt-vars.bat&amp;lt;/code&amp;gt; on your desktop&lt;br /&gt;
* Right-click on the shortcut and set the following properties:&lt;br /&gt;
 Target: %COMSPEC% /k &amp;quot;C:\qt-lindenqt\bin\qt-vars.bat&amp;quot;&lt;br /&gt;
 Start in: C:\qt-lindenqt&lt;br /&gt;
* Rename the shortcut to &amp;quot;Qt Linden Command Prompt&amp;quot;.&lt;br /&gt;
* Test it by opening the prompt and typing&lt;br /&gt;
 qmake --version&lt;br /&gt;
* Confirm that the Qt version displayed is 4.6.0&lt;br /&gt;
&lt;br /&gt;
== Build LLQtWebKit ==&lt;br /&gt;
* Launch the Qt command prompt and enter the following in the command prompt:&lt;br /&gt;
 cd C:\llqtwebkit&lt;br /&gt;
 qmake CONFIG-=debug&lt;br /&gt;
 nmake&lt;br /&gt;
* This operation takes just a few seconds on a typical development system&lt;br /&gt;
* If you want to build the debug version of LLQtWebKit, use &amp;lt;code&amp;gt;qmake CONFIG+=debug&amp;lt;/code&amp;gt; instead&lt;br /&gt;
* Now LLQtWebKit is built and can be used in the Second Life viewer. &lt;br /&gt;
* If you want to build the test applications, follow the next steps:&lt;br /&gt;
&lt;br /&gt;
== Acquire test application dependencies == &lt;br /&gt;
=== Glut ===&lt;br /&gt;
* Glut is a cross-platform library that manages OpenGL state and creation/destruction of OpenGL windows&lt;br /&gt;
* The author provides a library and header for Windows so you do not have to build them yourself&lt;br /&gt;
* Download the library and headers from http://www.xmission.com/~nate/glut/glut-3.7.6-bin.zip&lt;br /&gt;
* Extract the contents of the zip to a new folder called &amp;lt;code&amp;gt;C:\llqtwebkit\tests\GL&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GLUI ===&lt;br /&gt;
* Glut is a cross-platform library that renders UI components in the uBrowser test application&lt;br /&gt;
* The author does not provide libraries for Windows so you have to build them yourself.&lt;br /&gt;
* Download the source code from http://sourceforge.net/projects/glui/files/Source/2.36/glui-2.36.zip/download&lt;br /&gt;
* Extract to &amp;lt;code&amp;gt;C:\glui-2.36&amp;lt;/code&amp;gt;&lt;br /&gt;
* Copy &amp;lt;code&amp;gt;glut.h&amp;lt;/code&amp;gt; from &amp;lt;code&amp;gt;C:\llqtwebkit\tests\GL&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;C:\glui-2.36\src\include\GL&amp;lt;/code&amp;gt; as it is required to build GLUI&lt;br /&gt;
* Open &amp;lt;code&amp;gt;C:\glui-2.36\src\msvc\glui.sln&amp;lt;/code&amp;gt; and let Visual Studio convert the project&lt;br /&gt;
* Select &amp;quot;Release&amp;quot; configuration of &amp;quot;_glui library&amp;quot; project and build it as normal&lt;br /&gt;
* Copy the GLUI header (&amp;lt;code&amp;gt;C:\glui-2.36\src\include\GL\glui.h&amp;lt;/code&amp;gt;) to &amp;lt;code&amp;gt;C:\llqtwebkit\tests\GL&amp;lt;/code&amp;gt;&lt;br /&gt;
* Copy the GLUI library you just built (&amp;lt;code&amp;gt;C:\glui-2.36\src\msvc\lib\glui32.lib&amp;lt;/code&amp;gt;) to &amp;lt;code&amp;gt;C:\llqtwebkit\tests\GL&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Build test applications  == &lt;br /&gt;
=== testGL ===&lt;br /&gt;
* Open the Qt command prompt using the shortcut you made and enter the following:&lt;br /&gt;
 cd C:\llqtwebkit\tests\testgl&lt;br /&gt;
 qmake CONFIG-=debug&lt;br /&gt;
 nmake&lt;br /&gt;
 ..\GL\testgl.exe&lt;br /&gt;
* If you want to build the debug version, use &amp;lt;code&amp;gt;qmake CONFIG+=debug&amp;lt;/code&amp;gt; instead and run &amp;lt;code&amp;gt;nmake clean&amp;lt;/code&amp;gt; first&lt;br /&gt;
&lt;br /&gt;
=== uBrowser ===&lt;br /&gt;
* Open the Qt command prompt using the shortcut you made and enter the following: &lt;br /&gt;
 cd C:\llqtwebkit\tests\ubrowser&lt;br /&gt;
 qmake CONFIG-=debug&lt;br /&gt;
 nmake&lt;br /&gt;
 ..\GL\ubrowser.exe&lt;br /&gt;
* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;Important&amp;lt;/font&amp;gt;: &amp;lt;code&amp;gt;glui.h&amp;lt;/code&amp;gt; contains a pragma that forces the build to always link against the release version - &amp;lt;code&amp;gt;glut32.lib&amp;lt;/code&amp;gt; - instead of the debug version. This means building a debug version of uBrowser is currently broken.&lt;br /&gt;
&lt;br /&gt;
=== QtTestApp ===&lt;br /&gt;
* Open the Qt command prompt using the shortcut you made and enter the following: &lt;br /&gt;
 cd C:\llqtwebkit\tests\qttestapp&lt;br /&gt;
 qmake CONFIG-=debug&lt;br /&gt;
 nmake&lt;br /&gt;
 ..\GL\qttestapp.exe&lt;br /&gt;
* If you want to build the debug version, use &amp;lt;code&amp;gt;qmake CONFIG+=debug&amp;lt;/code&amp;gt; instead and run &amp;lt;code&amp;gt;nmake clean&amp;lt;/code&amp;gt; first&lt;br /&gt;
&lt;br /&gt;
=== Win32GL ===&lt;br /&gt;
* Edit the path variables at the top of the &amp;lt;code&amp;gt;C:\llqtwebkit\tests\win32gl\copy_files.bat&amp;lt;/code&amp;gt; directory to reflect the location of your OpenSSL, Qt and LLQtWebKit files.&lt;br /&gt;
* Run the &amp;lt;code&amp;gt;C:\llqtwebkit\tests\win32gl\copy_files.bat&amp;lt;/code&amp;gt;&lt;br /&gt;
* Open the &amp;lt;code&amp;gt;C:\llqtwebkit\tests\win32gl\win32gl.sln&amp;lt;/code&amp;gt; MSVC solution file&lt;br /&gt;
* Select &amp;lt;code&amp;gt;Release&amp;lt;/code&amp;gt; configuration&lt;br /&gt;
* Update &amp;lt;code&amp;gt;home_url&amp;lt;/code&amp;gt; in win32gl.cpp with the correct path to your testpage&lt;br /&gt;
* Build and run as normal&lt;br /&gt;
&lt;br /&gt;
== Win32 Helper batch files ==&lt;br /&gt;
* There are some helper batch files for Windows developers that may prove useful. &lt;br /&gt;
* You will very likely need to configure settings at the top of each one to match the location of the files and directories on your system.&lt;br /&gt;
* They do not do much error checking so make sure you understand the ramifications of any changes you make.&lt;br /&gt;
* A useful pattern is to edit them so they only do what you need at that moment - build release LLQtWebKit and testGL for example - then revert them when you&#039;re finished.&lt;br /&gt;
&lt;br /&gt;
=== Build LLQtWebKit and test apps ===&lt;br /&gt;
* Now you have built LLQtWebKit by hand, I&#039;ll point out this batch file which does it for you.&lt;br /&gt;
* &amp;lt;code&amp;gt;C:\llqtwebkit\make_all.bat&amp;lt;/code&amp;gt; is a very simple batch file that will clean and build release and debug versions of LLQtWebKit and then clean and build release version of the test apps (except Win32GL). &lt;br /&gt;
* You will need to modify the GL_COMPONENT_DIR variable near the top that sets the location of the GLUT and GLUI build files.&lt;br /&gt;
* You almost certainly will want to run this batch file from a Qt command prompt as described above since various Qt directories need to be in the path.&lt;br /&gt;
&lt;br /&gt;
=== Generate a directory tree compatible with the Second Life client build system ===&lt;br /&gt;
* &amp;lt;code&amp;gt;C:\llqtwebkit\copy_llqtwebkit.bat&amp;lt;/code&amp;gt; is a batch file that:&lt;br /&gt;
** Generates a directory tree containing LLQtWebKit header and libraries along with the necessary Qt run time files that are required by the Second Life client.&lt;br /&gt;
** Builds a &amp;lt;code&amp;gt;tar.bz2 &amp;lt;/code&amp;gt; archive and associated MD5 sum that can be used in the LLQtWebKit section of the Second Life client &amp;lt;code&amp;gt;install.xml&amp;lt;/code&amp;gt; configuration file.&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
* To enable a run time console for the test applications add a &amp;lt;code&amp;gt;CONFIG+=console&amp;lt;/code&amp;gt; line to the &amp;lt;code&amp;gt;qmake &amp;lt;/code&amp;gt; line.&lt;br /&gt;
* Make sure all libraries and applications are built as Multi-threaded Dll or Multi-threaded debug dll. In Visual Studio this is in Properties-&amp;gt;configuration-&amp;gt;c/c++-&amp;gt;code generation-&amp;gt;runtime library&lt;br /&gt;
* Make sure you do not mix release and debug versions of libraries and applications&lt;/div&gt;</summary>
		<author><name>Leyla Linden</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LLQtWebKit_Win32_Build_Instructions&amp;diff=874052</id>
		<title>LLQtWebKit Win32 Build Instructions</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LLQtWebKit_Win32_Build_Instructions&amp;diff=874052"/>
		<updated>2010-04-21T23:26:45Z</updated>

		<summary type="html">&lt;p&gt;Leyla Linden: /* Win32GL */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;&amp;lt;&amp;lt; [https://wiki.secondlife.com/wiki/LLQtWebKit Back to LLQtWebKit main page]&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
These are instructions for building the Qt/WebKit library (LLQtWebKit) on Windows as well as the test applications (testGL, uBrowser, QtTestApp, Win32GL). They have been tested using Microsoft Visual Studio 2005 (SP2) on Windows XP Service Pack 3 and Qt 4.6.0. It is not known if the same instructions work using other versions of Windows, Microsoft Visual Studio or Qt.&lt;br /&gt;
&lt;br /&gt;
== Set up ==&lt;br /&gt;
* For clarity, these instructions contain references to example paths and directories. Except where noted, you may replace these with ones of your own choosing although it is generally advisable to choose ones without spaces in them.&lt;br /&gt;
&lt;br /&gt;
== Acquire LLQtWebKit source code ==&lt;br /&gt;
* In a Web browser, navigate to http://hg.secondlife.com/llqtwebkit/&lt;br /&gt;
* Select &amp;quot;get source-&amp;gt;zip&amp;quot; from menu&lt;br /&gt;
* A zip file of the source code will be downloaded&lt;br /&gt;
* Extract the contents of the zip file to &amp;lt;code&amp;gt;C:\llqtwebkit&amp;lt;/code&amp;gt;&lt;br /&gt;
**Note: Different archiving tools have different concepts of &amp;quot;contents&amp;quot; - you should end up with the directories and files in &amp;lt;code&amp;gt;C:\llqtwebkit&amp;lt;/code&amp;gt; and not &amp;lt;code&amp;gt;C:\llqtwebkit\llqtwebkit&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Build the open source OpenSSL library ==&lt;br /&gt;
* Make sure a recent version of &#039;&amp;lt;code&amp;gt;perl&amp;lt;/code&amp;gt;&#039; and &#039;&amp;lt;code&amp;gt;patch&amp;lt;/code&amp;gt;&#039; are available on your system.&lt;br /&gt;
* Download the OpenSSL 0.9.8l tarball from http://openssl.org/source/openssl-0.9.8l.tar.gz&lt;br /&gt;
* Extract the contents to &amp;lt;code&amp;gt;C:\openssl-0.9.8l&amp;lt;/code&amp;gt;&lt;br /&gt;
** Note: Different archive tools have different concepts of &amp;quot;contents&amp;quot; - you should end up with the directories and files in &amp;lt;code&amp;gt;C:\openssl-0.9.8l&amp;lt;/code&amp;gt; and not &amp;lt;code&amp;gt;C:\openssl-0.9.8l\openssl-0.9.8l&amp;lt;/code&amp;gt;&lt;br /&gt;
** Note: Some archive tools (notably 7-Zip) appear to have issues extracting the files correctly - make sure the header files in the &amp;lt;code&amp;gt;C:\openssl-0.9.8l\include\openssl&amp;lt;/code&amp;gt; directory are not zero length before proceeding.&lt;br /&gt;
* Open the &amp;quot;Visual Studio 2005 Command Prompt&amp;quot; (Start Menu-&amp;gt;Microsoft Visual Studio 2005-&amp;gt;Visual Studio Tools-&amp;gt;Visual Studio 2005 Command Prompt)&lt;br /&gt;
* Change to the &amp;lt;code&amp;gt;C:\openssl-0.9.8l&amp;lt;/code&amp;gt; directory &lt;br /&gt;
* Run these commands:&lt;br /&gt;
** &amp;lt;code&amp;gt;perl Configure VC-WIN32&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;ms\do_masm&amp;lt;/code&amp;gt;&lt;br /&gt;
* Patch the &amp;lt;code&amp;gt;ntdll.mak&amp;lt;/code&amp;gt; file generated by the previous steps (this fixes the DLL manifest settings so that they are compatible with the Second Life client build configuration)&lt;br /&gt;
** Copy the patch file &amp;lt;code&amp;gt;020-openssl-disable-manifest.patch&amp;lt;/code&amp;gt; from the &amp;lt;code&amp;gt;C:\llqtwebkit-4.6\patches&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;C:\openssl-0.9.8l&amp;lt;/code&amp;gt;&lt;br /&gt;
** Run this command:&lt;br /&gt;
*** &amp;lt;code&amp;gt;patch -p1 &amp;lt; 020-openssl-disable-manifest.patch&amp;lt;/code&amp;gt;&lt;br /&gt;
* Continue to build &lt;br /&gt;
** &amp;lt;code&amp;gt;nmake -f ms\ntdll.mak&amp;lt;/code&amp;gt;&lt;br /&gt;
* After a few minutes, the libraries &amp;lt;code&amp;gt;libeay32.dll&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;ssleay32.dll&amp;lt;/code&amp;gt; will be built in the &amp;lt;code&amp;gt;C:\openssl-0.9.8l\out32dll&amp;lt;/code&amp;gt; directory - confirm they exist - they will be needed later.&lt;br /&gt;
&lt;br /&gt;
== Build the open source version of Qt 4.6.0 using Microsoft Visual Studio ==&lt;br /&gt;
=== Acquire the Qt 4.6.0 source with our patches ===&lt;br /&gt;
* Our clone of Qt is available here: http://gitorious.org/+lindenqt/qt/lindenqt&lt;br /&gt;
* Download the source by clicking on the &amp;quot;lindenqt&amp;quot; branch under &amp;quot;Branches:&amp;quot; and then using the &amp;quot;Download lindenqt as tar.gz&amp;quot; link on the right hand side of the page&lt;br /&gt;
** It&#039;s a large download - over 100MB - so it may take some time&lt;br /&gt;
** Alternately, if you prefer you can clone the repository with git using the &amp;quot;clone&amp;quot; link on the page -- details of this are left as an exercise to the reader&lt;br /&gt;
* Extract the contents of the tarball into &amp;lt;code&amp;gt;C:\qt-lindenqt&amp;lt;/code&amp;gt;&lt;br /&gt;
* This may take some as the archive contains a lot of files&lt;br /&gt;
** Note: Different tools have different concepts of &amp;quot;contents&amp;quot; - you should end up with the directories and files in &amp;lt;code&amp;gt;C:\qt-lindenqt&amp;lt;/code&amp;gt; and not &amp;lt;code&amp;gt;C:\qt-lindenqt\qt-lindenqt&amp;lt;/code&amp;gt; &lt;br /&gt;
** Note: using Cygwin&#039;s &amp;lt;code&amp;gt;tar&amp;lt;/code&amp;gt; command might not work.  It may result in an &#039;&#039;&#039;Access is Denied&#039;&#039;&#039; error when running configure below. If so, try using WinZip, WinRAR or some other tool instead.&lt;br /&gt;
&lt;br /&gt;
=== Configure Qt ===&lt;br /&gt;
* If it&#039;s not open already, open the &amp;quot;Visual Studio 2005 Command Prompt&amp;quot; (Start Menu-&amp;gt;Microsoft Visual Studio 2005-&amp;gt;Visual Studio Tools-&amp;gt;Visual Studio 2005 Command Prompt)&lt;br /&gt;
* Change to the &amp;lt;code&amp;gt;C:\qt-lindenqt&amp;lt;/code&amp;gt; directory &lt;br /&gt;
* Run this command: &lt;br /&gt;
 &amp;lt;code&amp;gt;configure -debug-and-release -no-qt3support -no-phonon -no-phonon-backend -prefix C:\qt-lindenqt -qt-libjpeg -qt-libpng -openssl-linked -I C:\openssl-0.9.8l\include -L C:\openssl-0.9.8l\out32dll&amp;lt;/code&amp;gt;&lt;br /&gt;
* When you are asked if you want to use the Commercial or Open Source version type &amp;lt;code&amp;gt;o&amp;lt;/code&amp;gt; to select Open Source and press the Enter key&lt;br /&gt;
* When the license agreement appears, if you agree type &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt; the Enter key&lt;br /&gt;
* This operation takes around 10-15 minutes on a typical development system&lt;br /&gt;
&lt;br /&gt;
=== Build Qt ===&lt;br /&gt;
* Change to the &amp;lt;code&amp;gt;C:\qt-lindenqt&amp;lt;/code&amp;gt; directory &lt;br /&gt;
* Run this command:&lt;br /&gt;
 &amp;lt;code&amp;gt;nmake sub-src&amp;lt;/code&amp;gt;&lt;br /&gt;
* This operation takes around 1-2 hours on a typical development system&lt;br /&gt;
* After building Qt, the release and debug libraries and dlls will be in &amp;lt;code&amp;gt;C:\qt-lindenqt\lib&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Configure a Qt runtime environment ===&lt;br /&gt;
* Copy the OpenSSL dynamic libraries (&amp;lt;code&amp;gt;C:\openssl-0.9.8l\out32dll\libeay32.dll&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;C:\openssl-0.9.8l\out32dll\ssleay32.dll&amp;lt;/code&amp;gt;) to the Qt binary directory (&amp;lt;code&amp;gt;C:\qt-lindenqt\bin&amp;lt;/code&amp;gt;)&lt;br /&gt;
* Create the file &amp;lt;code&amp;gt;C:\qt-lindenqt\bin\qt-vars.bat&amp;lt;/code&amp;gt; and put the following in it:&lt;br /&gt;
 @echo off&lt;br /&gt;
 echo Setting up a Qt environment...&lt;br /&gt;
 set QTDIR=C:\qt-lindenqt&lt;br /&gt;
 set PATH=C:\qt-lindenqt\bin;%PATH%&lt;br /&gt;
 set QMAKESPEC=win32-msvc2005&lt;br /&gt;
 call &amp;quot;C:\Program Files\Microsoft Visual Studio 8\Common7\Tools\vsvars32.bat&amp;quot;&lt;br /&gt;
* Make a shortcut to &amp;lt;code&amp;gt;qt-vars.bat&amp;lt;/code&amp;gt; on your desktop&lt;br /&gt;
* Right-click on the shortcut and set the following properties:&lt;br /&gt;
 Target: %COMSPEC% /k &amp;quot;C:\qt-lindenqt\bin\qt-vars.bat&amp;quot;&lt;br /&gt;
 Start in: C:\qt-lindenqt&lt;br /&gt;
* Rename the shortcut to &amp;quot;Qt Linden Command Prompt&amp;quot;.&lt;br /&gt;
* Test it by opening the prompt and typing&lt;br /&gt;
 qmake --version&lt;br /&gt;
* Confirm that the Qt version displayed is 4.6.0&lt;br /&gt;
&lt;br /&gt;
== Build LLQtWebKit ==&lt;br /&gt;
* Launch the Qt command prompt and enter the following in the command prompt:&lt;br /&gt;
 cd C:\llqtwebkit&lt;br /&gt;
 qmake CONFIG-=debug&lt;br /&gt;
 nmake&lt;br /&gt;
* This operation takes just a few seconds on a typical development system&lt;br /&gt;
* If you want to build the debug version of LLQtWebKit, use &amp;lt;code&amp;gt;qmake CONFIG+=debug&amp;lt;/code&amp;gt; instead&lt;br /&gt;
* Now LLQtWebKit is built and can be used in the Second Life viewer. &lt;br /&gt;
* If you want to build the test applications, follow the next steps:&lt;br /&gt;
&lt;br /&gt;
== Acquire test application dependencies == &lt;br /&gt;
=== Glut ===&lt;br /&gt;
* Glut is a cross-platform library that manages OpenGL state and creation/destruction of OpenGL windows&lt;br /&gt;
* The author provides a library and header for Windows so you do not have to build them yourself&lt;br /&gt;
* Download the library and headers from http://www.xmission.com/~nate/glut/glut-3.7.6-bin.zip&lt;br /&gt;
* Extract the contents of the zip to a new folder called &amp;lt;code&amp;gt;C:\llqtwebkit\tests\GL&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GLUI ===&lt;br /&gt;
* Glut is a cross-platform library that renders UI components in the uBrowser test application&lt;br /&gt;
* The author does not provide libraries for Windows so you have to build them yourself.&lt;br /&gt;
* Download the source code from http://sourceforge.net/projects/glui/files/Source/2.36/glui-2.36.zip/download&lt;br /&gt;
* Extract to &amp;lt;code&amp;gt;C:\glui-2.36&amp;lt;/code&amp;gt;&lt;br /&gt;
* Copy &amp;lt;code&amp;gt;glut.h&amp;lt;/code&amp;gt; from &amp;lt;code&amp;gt;C:\llqtwebkit\tests\GL&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;C:\glui-2.36\src\include\GL&amp;lt;/code&amp;gt; as it is required to build GLUI&lt;br /&gt;
* Open &amp;lt;code&amp;gt;C:\glui-2.36\src\msvc\glui.sln&amp;lt;/code&amp;gt; and let Visual Studio convert the project&lt;br /&gt;
* Select &amp;quot;Release&amp;quot; configuration of &amp;quot;_glui library&amp;quot; project and build it as normal&lt;br /&gt;
* Copy the GLUI header (&amp;lt;code&amp;gt;C:\glui-2.36\src\include\GL\glui.h&amp;lt;/code&amp;gt;) to &amp;lt;code&amp;gt;C:\llqtwebkit\tests\GL&amp;lt;/code&amp;gt;&lt;br /&gt;
* Copy the GLUI library you just built (&amp;lt;code&amp;gt;C:\glui-2.36\src\msvc\lib\glui32.lib&amp;lt;/code&amp;gt;) to &amp;lt;code&amp;gt;C:\llqtwebkit\tests\GL&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Build test applications  == &lt;br /&gt;
=== testGL ===&lt;br /&gt;
* Open the Qt command prompt using the shortcut you made and enter the following:&lt;br /&gt;
 cd C:\llqtwebkit\tests\testgl&lt;br /&gt;
 qmake CONFIG-=debug&lt;br /&gt;
 nmake&lt;br /&gt;
 ..\GL\testgl.exe&lt;br /&gt;
* If you want to build the debug version, use &amp;lt;code&amp;gt;qmake CONFIG+=debug&amp;lt;/code&amp;gt; instead and run &amp;lt;code&amp;gt;nmake clean&amp;lt;/code&amp;gt; first&lt;br /&gt;
&lt;br /&gt;
=== uBrowser ===&lt;br /&gt;
* Open the Qt command prompt using the shortcut you made and enter the following: &lt;br /&gt;
 cd C:\llqtwebkit\tests\ubrowser&lt;br /&gt;
 qmake CONFIG-=debug&lt;br /&gt;
 nmake&lt;br /&gt;
 ..\GL\ubrowser.exe&lt;br /&gt;
* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;Important&amp;lt;/font&amp;gt;: &amp;lt;code&amp;gt;glui.h&amp;lt;/code&amp;gt; contains a pragma that forces the build to always link against the release version - &amp;lt;code&amp;gt;glut32.lib&amp;lt;/code&amp;gt; - instead of the debug version. This means building a debug version of uBrowser is currently broken.&lt;br /&gt;
&lt;br /&gt;
=== QtTestApp ===&lt;br /&gt;
* Open the Qt command prompt using the shortcut you made and enter the following: &lt;br /&gt;
 cd C:\llqtwebkit\tests\qttestapp&lt;br /&gt;
 qmake CONFIG-=debug&lt;br /&gt;
 nmake&lt;br /&gt;
 ..\GL\qttestapp.exe&lt;br /&gt;
* If you want to build the debug version, use &amp;lt;code&amp;gt;qmake CONFIG+=debug&amp;lt;/code&amp;gt; instead and run &amp;lt;code&amp;gt;nmake clean&amp;lt;/code&amp;gt; first&lt;br /&gt;
&lt;br /&gt;
=== Win32GL ===&lt;br /&gt;
* Edit the path variables at the top of the &amp;lt;code&amp;gt;C:\llqtwebkit\tests\win32gl\copy_files.bat&amp;lt;/code&amp;gt; directory to reflect the location of your OpenSSL, Qt and LLQtWebKit files.&lt;br /&gt;
* Run the &amp;lt;code&amp;gt;C:\llqtwebkit\tests\win32gl\copy_files.bat&amp;lt;/code&amp;gt;&lt;br /&gt;
* Open the &amp;lt;code&amp;gt;C:\llqtwebkit\tests\win32gl\win32gl.sln&amp;lt;/code&amp;gt; MSVC solution file&lt;br /&gt;
* Select &amp;lt;code&amp;gt;Release&amp;lt;/code&amp;gt; configuration&lt;br /&gt;
* Update &amp;lt;code&amp;gt;home_url&amp;lt;code&amp;gt; in win32gl.cpp with the correct path to your testpage&lt;br /&gt;
* Build and run as normal&lt;br /&gt;
&lt;br /&gt;
== Win32 Helper batch files ==&lt;br /&gt;
* There are some helper batch files for Windows developers that may prove useful. &lt;br /&gt;
* You will very likely need to configure settings at the top of each one to match the location of the files and directories on your system.&lt;br /&gt;
* They do not do much error checking so make sure you understand the ramifications of any changes you make.&lt;br /&gt;
* A useful pattern is to edit them so they only do what you need at that moment - build release LLQtWebKit and testGL for example - then revert them when you&#039;re finished.&lt;br /&gt;
&lt;br /&gt;
=== Build LLQtWebKit and test apps ===&lt;br /&gt;
* Now you have built LLQtWebKit by hand, I&#039;ll point out this batch file which does it for you.&lt;br /&gt;
* &amp;lt;code&amp;gt;C:\llqtwebkit\make_all.bat&amp;lt;/code&amp;gt; is a very simple batch file that will clean and build release and debug versions of LLQtWebKit and then clean and build release version of the test apps (except Win32GL). &lt;br /&gt;
* You will need to modify the GL_COMPONENT_DIR variable near the top that sets the location of the GLUT and GLUI build files.&lt;br /&gt;
* You almost certainly will want to run this batch file from a Qt command prompt as described above since various Qt directories need to be in the path.&lt;br /&gt;
&lt;br /&gt;
=== Generate a directory tree compatible with the Second Life client build system ===&lt;br /&gt;
* &amp;lt;code&amp;gt;C:\llqtwebkit\copy_llqtwebkit.bat&amp;lt;/code&amp;gt; is a batch file that:&lt;br /&gt;
** Generates a directory tree containing LLQtWebKit header and libraries along with the necessary Qt run time files that are required by the Second Life client.&lt;br /&gt;
** Builds a &amp;lt;code&amp;gt;tar.bz2 &amp;lt;/code&amp;gt; archive and associated MD5 sum that can be used in the LLQtWebKit section of the Second Life client &amp;lt;code&amp;gt;install.xml&amp;lt;/code&amp;gt; configuration file.&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
* To enable a run time console for the test applications add a &amp;lt;code&amp;gt;CONFIG+=console&amp;lt;/code&amp;gt; line to the &amp;lt;code&amp;gt;qmake &amp;lt;/code&amp;gt; line.&lt;br /&gt;
* Make sure all libraries and applications are built as Multi-threaded Dll or Multi-threaded debug dll. In Visual Studio this is in Properties-&amp;gt;configuration-&amp;gt;c/c++-&amp;gt;code generation-&amp;gt;runtime library&lt;br /&gt;
* Make sure you do not mix release and debug versions of libraries and applications&lt;/div&gt;</summary>
		<author><name>Leyla Linden</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LLQtWebKit_Win32_Build_Instructions&amp;diff=872772</id>
		<title>LLQtWebKit Win32 Build Instructions</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LLQtWebKit_Win32_Build_Instructions&amp;diff=872772"/>
		<updated>2010-04-20T22:26:10Z</updated>

		<summary type="html">&lt;p&gt;Leyla Linden: /* Build the open source OpenSSL library */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;&amp;lt;&amp;lt; [https://wiki.secondlife.com/wiki/LLQtWebKit Back to LLQtWebKit main page]&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
These are instructions for building the Qt/WebKit library (LLQtWebKit) on Windows as well as the test applications (testGL, uBrowser, QtTestApp, Win32GL). They have been tested using Microsoft Visual Studio 2005 (SP2) on Windows XP Service Pack 3 and Qt 4.6.0. It is not known if the same instructions work using other versions of Windows, Microsoft Visual Studio or Qt.&lt;br /&gt;
&lt;br /&gt;
== Set up ==&lt;br /&gt;
* For clarity, these instructions contain references to example paths and directories. Except where noted, you may replace these with ones of your own choosing although it is generally advisable to choose ones without spaces in them.&lt;br /&gt;
&lt;br /&gt;
== Acquire LLQtWebKit source code ==&lt;br /&gt;
* In a Web browser, navigate to http://hg.secondlife.com/llqtwebkit/&lt;br /&gt;
* Select &amp;quot;get source-&amp;gt;zip&amp;quot; from menu&lt;br /&gt;
* A zip file of the source code will be downloaded&lt;br /&gt;
* Extract the contents of the zip file to &amp;lt;code&amp;gt;C:\llqtwebkit&amp;lt;/code&amp;gt;&lt;br /&gt;
**Note: Different archiving tools have different concepts of &amp;quot;contents&amp;quot; - you should end up with the directories and files in &amp;lt;code&amp;gt;C:\llqtwebkit&amp;lt;/code&amp;gt; and not &amp;lt;code&amp;gt;C:\llqtwebkit\llqtwebkit&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Build the open source OpenSSL library ==&lt;br /&gt;
* Make sure a recent version of &#039;&amp;lt;code&amp;gt;perl&amp;lt;/code&amp;gt;&#039; and &#039;&amp;lt;code&amp;gt;patch&amp;lt;/code&amp;gt;&#039; are available on your system.&lt;br /&gt;
* Download the OpenSSL 0.9.8l tarball from http://openssl.org/source/openssl-0.9.8l.tar.gz&lt;br /&gt;
* Extract the contents to &amp;lt;code&amp;gt;C:\openssl-0.9.8l&amp;lt;/code&amp;gt;&lt;br /&gt;
** Note: Different archive tools have different concepts of &amp;quot;contents&amp;quot; - you should end up with the directories and files in &amp;lt;code&amp;gt;C:\openssl-0.9.8l&amp;lt;/code&amp;gt; and not &amp;lt;code&amp;gt;C:\openssl-0.9.8l\openssl-0.9.8l&amp;lt;/code&amp;gt;&lt;br /&gt;
* Open the &amp;quot;Visual Studio 2005 Command Prompt&amp;quot; (Start Menu-&amp;gt;Microsoft Visual Studio 2005-&amp;gt;Visual Studio Tools-&amp;gt;Visual Studio 2005 Command Prompt)&lt;br /&gt;
* Change to the &amp;lt;code&amp;gt;C:\openssl-0.9.8l&amp;lt;/code&amp;gt; directory &lt;br /&gt;
* Run these commands:&lt;br /&gt;
** &amp;lt;code&amp;gt;perl Configure VC-WIN32&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;ms\do_masm&amp;lt;/code&amp;gt;&lt;br /&gt;
* Patch the &amp;lt;code&amp;gt;ntdll.mak&amp;lt;/code&amp;gt; file generated by the previous steps (this fixes the DLL manifest settings so that they are compatible with the Second Life client build configuration)&lt;br /&gt;
** Copy the patch file &amp;lt;code&amp;gt;020-openssl-disable-manifest.patch&amp;lt;/code&amp;gt; from the &amp;lt;code&amp;gt;C:\llqtwebkit-4.6\patches&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;C:\openssl-0.9.8l&amp;lt;/code&amp;gt;&lt;br /&gt;
** Run this command:&lt;br /&gt;
*** &amp;lt;code&amp;gt;patch -p1 &amp;lt; 020-openssl-disable-manifest.patch&amp;lt;/code&amp;gt;&lt;br /&gt;
* Continue to build &lt;br /&gt;
** &amp;lt;code&amp;gt;nmake -f ms\ntdll.mak&amp;lt;/code&amp;gt;&lt;br /&gt;
* After a few minutes, the libraries &amp;lt;code&amp;gt;libeay32.dll&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;ssleay32.dll&amp;lt;/code&amp;gt; will be built in the &amp;lt;code&amp;gt;C:\openssl-0.9.8l\out32dll&amp;lt;/code&amp;gt; directory - confirm they exist - they will be needed later.&lt;br /&gt;
&lt;br /&gt;
== Build the open source version of Qt 4.6.0 using Microsoft Visual Studio ==&lt;br /&gt;
=== Acquire the Qt 4.6.0 source with our patches ===&lt;br /&gt;
* Our clone of Qt is available here: http://gitorious.org/+lindenqt/qt/lindenqt&lt;br /&gt;
* Download the source by clicking on the &amp;quot;lindenqt&amp;quot; branch under &amp;quot;Branches:&amp;quot; and then using the &amp;quot;Download lindenqt as tar.gz&amp;quot; link on the right hand side of the page&lt;br /&gt;
** It&#039;s a large download - over 100MB - so it may take some time&lt;br /&gt;
** Alternately, if you prefer you can clone the repository with git using the &amp;quot;clone&amp;quot; link on the page -- details of this are left as an exercise to the reader&lt;br /&gt;
* Extract the contents of the tarball into &amp;lt;code&amp;gt;C:\qt-lindenqt&amp;lt;/code&amp;gt;&lt;br /&gt;
* This may take some as the archive contains a lot of files&lt;br /&gt;
** Note: Different tools have different concepts of &amp;quot;contents&amp;quot; - you should end up with the directories and files in &amp;lt;code&amp;gt;C:\qt-lindenqt&amp;lt;/code&amp;gt; and not &amp;lt;code&amp;gt;C:\qt-lindenqt\qt-lindenqt&amp;lt;/code&amp;gt; &lt;br /&gt;
** Note: using Cygwin&#039;s &amp;lt;code&amp;gt;tar&amp;lt;/code&amp;gt; command might not work.  It may result in an &#039;&#039;&#039;Access is Denied&#039;&#039;&#039; error when running configure below. If so, try using WinZip, WinRAR or some other tool instead.&lt;br /&gt;
&lt;br /&gt;
=== Configure Qt ===&lt;br /&gt;
* If it&#039;s not open already, open the &amp;quot;Visual Studio 2005 Command Prompt&amp;quot; (Start Menu-&amp;gt;Microsoft Visual Studio 2005-&amp;gt;Visual Studio Tools-&amp;gt;Visual Studio 2005 Command Prompt)&lt;br /&gt;
* Change to the &amp;lt;code&amp;gt;C:\qt-lindenqt&amp;lt;/code&amp;gt; directory &lt;br /&gt;
* Run this command: &lt;br /&gt;
 &amp;lt;code&amp;gt;configure -debug-and-release -no-qt3support -no-phonon -no-phonon-backend -prefix C:\qt-lindenqt -qt-libjpeg -qt-libpng -openssl-linked -I C:\openssl-0.9.8l\include -L C:\openssl-0.9.8l\out32dll&amp;lt;/code&amp;gt;&lt;br /&gt;
* When you are asked if you want to use the Commercial or Open Source version type &amp;lt;code&amp;gt;o&amp;lt;/code&amp;gt; to select Open Source and press the Enter key&lt;br /&gt;
* When the license agreement appears, if you agree type &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt; the Enter key&lt;br /&gt;
* This operation takes around 10-15 minutes on a typical development system&lt;br /&gt;
&lt;br /&gt;
=== Build Qt ===&lt;br /&gt;
* Change to the &amp;lt;code&amp;gt;C:\qt-lindenqt&amp;lt;/code&amp;gt; directory &lt;br /&gt;
* Run this command:&lt;br /&gt;
 &amp;lt;code&amp;gt;nmake sub-src&amp;lt;/code&amp;gt;&lt;br /&gt;
* This operation takes around 1-2 hours on a typical development system&lt;br /&gt;
* After building Qt, the release and debug libraries and dlls will be in &amp;lt;code&amp;gt;C:\qt-lindenqt\lib&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Configure a Qt runtime environment ===&lt;br /&gt;
* Copy the OpenSSL dynamic libraries (&amp;lt;code&amp;gt;C:\openssl-0.9.8l\out32dll\libeay32.dll&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;C:\openssl-0.9.8l\out32dll\ssleay32.dll&amp;lt;/code&amp;gt;) to the Qt binary directory (&amp;lt;code&amp;gt;C:\qt-lindenqt\bin&amp;lt;/code&amp;gt;)&lt;br /&gt;
* Create the file &amp;lt;code&amp;gt;C:\qt-lindenqt\bin\qt-vars.bat&amp;lt;/code&amp;gt; and put the following in it:&lt;br /&gt;
 @echo off&lt;br /&gt;
 echo Setting up a Qt environment...&lt;br /&gt;
 set QTDIR=C:\qt-lindenqt&lt;br /&gt;
 set PATH=C:\qt-lindenqt\bin;%PATH%&lt;br /&gt;
 set QMAKESPEC=win32-msvc2005&lt;br /&gt;
 call &amp;quot;C:\Program Files\Microsoft Visual Studio 8\Common7\Tools\vsvars32.bat&amp;quot;&lt;br /&gt;
* Make a shortcut to &amp;lt;code&amp;gt;qt-vars.bat&amp;lt;/code&amp;gt; on your desktop&lt;br /&gt;
* Right-click on the shortcut and set the following properties:&lt;br /&gt;
 Target: %COMSPEC% /k &amp;quot;C:\qt-lindenqt\bin\qt-vars.bat&amp;quot;&lt;br /&gt;
 Start in: C:\qt-lindenqt&lt;br /&gt;
* Rename the shortcut to &amp;quot;Qt Linden Command Prompt&amp;quot;.&lt;br /&gt;
* Test it by opening the prompt and typing&lt;br /&gt;
 qmake --version&lt;br /&gt;
* Confirm that the Qt version displayed is 4.6.0&lt;br /&gt;
&lt;br /&gt;
== Build LLQtWebKit ==&lt;br /&gt;
* Launch the Qt command prompt and enter the following in the command prompt:&lt;br /&gt;
 cd C:\llqtwebkit&lt;br /&gt;
 qmake CONFIG-=debug&lt;br /&gt;
 nmake&lt;br /&gt;
* This operation takes just a few seconds on a typical development system&lt;br /&gt;
* If you want to build the debug version of LLQtWebKit, use &amp;lt;code&amp;gt;qmake CONFIG+=debug&amp;lt;/code&amp;gt; instead&lt;br /&gt;
* Now LLQtWebKit is built and can be used in the Second Life viewer. &lt;br /&gt;
* If you want to build the test applications, follow the next steps:&lt;br /&gt;
&lt;br /&gt;
== Acquire test application dependencies == &lt;br /&gt;
=== Glut ===&lt;br /&gt;
* Glut is a cross-platform library that manages OpenGL state and creation/destruction of OpenGL windows&lt;br /&gt;
* The author provides a library and header for Windows so you do not have to build them yourself&lt;br /&gt;
* Download the library and headers from http://www.xmission.com/~nate/glut/glut-3.7.6-bin.zip&lt;br /&gt;
* Extract the contents of the zip to a new folder called &amp;lt;code&amp;gt;C:\llqtwebkit\tests\GL&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GLUI ===&lt;br /&gt;
* Glut is a cross-platform library that renders UI components in the uBrowser test application&lt;br /&gt;
* The author does not provide libraries for Windows so you have to build them yourself.&lt;br /&gt;
* Download the source code from http://sourceforge.net/projects/glui/files/Source/2.36/glui-2.36.zip/download&lt;br /&gt;
* Extract to &amp;lt;code&amp;gt;C:\glui-2.36&amp;lt;/code&amp;gt;&lt;br /&gt;
* Copy &amp;lt;code&amp;gt;glut.h&amp;lt;/code&amp;gt; from &amp;lt;code&amp;gt;C:\llqtwebkit\tests\GL&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;C:\glui-2.36\src\include\GL&amp;lt;/code&amp;gt; as it is required to build GLUI&lt;br /&gt;
* Open &amp;lt;code&amp;gt;C:\glui-2.36\src\msvc\glui.sln&amp;lt;/code&amp;gt; and let Visual Studio convert the project&lt;br /&gt;
* Select &amp;quot;Release&amp;quot; configuration of &amp;quot;_glui library&amp;quot; project and build it as normal&lt;br /&gt;
* Copy the GLUI header (&amp;lt;code&amp;gt;C:\glui-2.36\src\include\GL\glui.h&amp;lt;/code&amp;gt;) to &amp;lt;code&amp;gt;C:\llqtwebkit\tests\GL&amp;lt;/code&amp;gt;&lt;br /&gt;
* Copy the GLUI library you just built (&amp;lt;code&amp;gt;C:\glui-2.36\src\msvc\lib\glui32.lib&amp;lt;/code&amp;gt;) to &amp;lt;code&amp;gt;C:\llqtwebkit\tests\GL&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Build test applications  == &lt;br /&gt;
=== testGL ===&lt;br /&gt;
* Open the Qt command prompt using the shortcut you made and enter the following:&lt;br /&gt;
 cd C:\llqtwebkit\tests\testgl&lt;br /&gt;
 qmake CONFIG-=debug&lt;br /&gt;
 nmake&lt;br /&gt;
 ..\GL\testgl.exe&lt;br /&gt;
* If you want to build the debug version, use &amp;lt;code&amp;gt;qmake CONFIG+=debug&amp;lt;/code&amp;gt; instead and run &amp;lt;code&amp;gt;nmake clean&amp;lt;/code&amp;gt; first&lt;br /&gt;
&lt;br /&gt;
=== uBrowser ===&lt;br /&gt;
* Open the Qt command prompt using the shortcut you made and enter the following: &lt;br /&gt;
 cd C:\llqtwebkit\tests\ubrowser&lt;br /&gt;
 qmake CONFIG-=debug&lt;br /&gt;
 nmake&lt;br /&gt;
 ..\GL\ubrowser.exe&lt;br /&gt;
* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;Important&amp;lt;/font&amp;gt;: &amp;lt;code&amp;gt;glui.h&amp;lt;/code&amp;gt; contains a pragma that forces the build to always link against the release version - &amp;lt;code&amp;gt;glut32.lib&amp;lt;/code&amp;gt; - instead of the debug version. This means building a debug version of uBrowser is currently broken.&lt;br /&gt;
&lt;br /&gt;
=== QtTestApp ===&lt;br /&gt;
* Open the Qt command prompt using the shortcut you made and enter the following: &lt;br /&gt;
 cd C:\llqtwebkit\tests\qttestapp&lt;br /&gt;
 qmake CONFIG-=debug&lt;br /&gt;
 nmake&lt;br /&gt;
 ..\GL\qttestapp.exe&lt;br /&gt;
* If you want to build the debug version, use &amp;lt;code&amp;gt;qmake CONFIG+=debug&amp;lt;/code&amp;gt; instead and run &amp;lt;code&amp;gt;nmake clean&amp;lt;/code&amp;gt; first&lt;br /&gt;
&lt;br /&gt;
=== Win32GL ===&lt;br /&gt;
* Edit the path variables at the top of the &amp;lt;code&amp;gt;C:\llqtwebkit\tests\win32gl\copy_files.bat&amp;lt;/code&amp;gt; directory to reflect the location of your OpenSSL, Qt and LLQtWebKit files.&lt;br /&gt;
* Run the &amp;lt;code&amp;gt;C:\llqtwebkit\tests\win32gl\copy_files.bat&amp;lt;/code&amp;gt;&lt;br /&gt;
* Open the &amp;lt;code&amp;gt;C:\llqtwebkit\tests\win32gl\win32gl.sln&amp;lt;/code&amp;gt; MSVC solution file&lt;br /&gt;
* Select &amp;lt;code&amp;gt;Release&amp;lt;/code&amp;gt; configuration&lt;br /&gt;
* Build and run as normal&lt;br /&gt;
&lt;br /&gt;
== Win32 Helper batch files ==&lt;br /&gt;
* There are some helper batch files for Windows developers that may prove useful. &lt;br /&gt;
* You will very likely need to configure settings at the top of each one to match the location of the files and directories on your system.&lt;br /&gt;
* They do not do much error checking so make sure you understand the ramifications of any changes you make.&lt;br /&gt;
* A useful pattern is to edit them so they only do what you need at that moment - build release LLQtWebKit and testGL for example - then revert them when you&#039;re finished.&lt;br /&gt;
&lt;br /&gt;
=== Build LLQtWebKit and test apps ===&lt;br /&gt;
* Now you have built LLQtWebKit by hand, I&#039;ll point out this batch file which does it for you.&lt;br /&gt;
* &amp;lt;code&amp;gt;C:\llqtwebkit\make_all.bat&amp;lt;/code&amp;gt; is a very simple batch file that will clean and build release and debug versions of LLQtWebKit and then clean and build release version of the test apps (except Win32GL). &lt;br /&gt;
* You will need to modify the GL_COMPONENT_DIR variable near the top that sets the location of the GLUT and GLUI build files.&lt;br /&gt;
* You almost certainly will want to run this batch file from a Qt command prompt as described above since various Qt directories need to be in the path.&lt;br /&gt;
&lt;br /&gt;
=== Generate a directory tree compatible with the Second Life client build system ===&lt;br /&gt;
* &amp;lt;code&amp;gt;C:\llqtwebkit\copy_llqtwebkit.bat&amp;lt;/code&amp;gt; is a batch file that:&lt;br /&gt;
** Generates a directory tree containing LLQtWebKit header and libraries along with the necessary Qt run time files that are required by the Second Life client.&lt;br /&gt;
** Builds a &amp;lt;code&amp;gt;tar.bz2 &amp;lt;/code&amp;gt; archive and associated MD5 sum that can be used in the LLQtWebKit section of the Second Life client &amp;lt;code&amp;gt;install.xml&amp;lt;/code&amp;gt; configuration file.&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
* To enable a run time console for the test applications add a &amp;lt;code&amp;gt;CONFIG+=console&amp;lt;/code&amp;gt; line to the &amp;lt;code&amp;gt;qmake &amp;lt;/code&amp;gt; line.&lt;br /&gt;
* Make sure all libraries and applications are built as Multi-threaded Dll or Multi-threaded debug dll. In Visual Studio this is in Properties-&amp;gt;configuration-&amp;gt;c/c++-&amp;gt;code generation-&amp;gt;runtime library&lt;br /&gt;
* Make sure you do not mix release and debug versions of libraries and applications&lt;/div&gt;</summary>
		<author><name>Leyla Linden</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Open_Grid_Public_Beta/Teleport_How_To&amp;diff=81772</id>
		<title>Open Grid Public Beta/Teleport How To</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Open_Grid_Public_Beta/Teleport_How_To&amp;diff=81772"/>
		<updated>2008-07-31T17:43:17Z</updated>

		<summary type="html">&lt;p&gt;Leyla Linden: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Download and Install Open Grid Viewer ==&lt;br /&gt;
&lt;br /&gt;
# Download the viewer from (url tbd).&lt;br /&gt;
# The viewer is named &amp;quot;Open Grid&amp;quot; so you can install it without conflict with your existing Second Life viewer.&lt;br /&gt;
# Launch the viewer.&lt;br /&gt;
&lt;br /&gt;
[[Image:Ogpb_teleport_howto_1.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Log In ==&lt;br /&gt;
&lt;br /&gt;
# Note the new field, &amp;quot;Region URL&amp;quot; in the lower right hand pane of the splash/login screen.&lt;br /&gt;
# Enter &amp;quot;[http://sim1.vaak.lindenlab.com:13000 http://sim1.vaak.lindenlab.com:13000]&amp;quot;, without quotes and without a trailing slash (see [https://jira.secondlife.com/browse/VWR-8382 VWR-8382] )&lt;br /&gt;
# Enter your user name and password, and press connect.&lt;br /&gt;
&lt;br /&gt;
[[Image:Ogpb_teleport_howto_2.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* When you login, you will be &#039;ruthed&#039;.&lt;br /&gt;
* The system may also ask if you want your avatar to be male or female.&lt;br /&gt;
&lt;br /&gt;
[[Image:Ogpb_teleport_howto_3.jpg]]&lt;br /&gt;
&lt;br /&gt;
* Note that you will not have access to your inventory.&lt;br /&gt;
&lt;br /&gt;
[[Image:Ogpb_teleport_howto_4.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Teleporting to an Open Sim Region ==&lt;br /&gt;
&lt;br /&gt;
* From the &amp;quot;World&amp;quot; menu, select &amp;quot;Teleport Region&amp;quot;.&lt;br /&gt;
** The teleport floater will only display if you originally logged in with a Region URL.&lt;br /&gt;
&lt;br /&gt;
[[Image:Ogpb_teleport_howto_5.jpg]]&lt;br /&gt;
&lt;br /&gt;
# Enter the URL of your patched OpenSim region.&lt;br /&gt;
# Press teleport.&lt;br /&gt;
&lt;br /&gt;
[[Image:Ogpb_teleport_howto_6.jpg]]&lt;br /&gt;
&lt;br /&gt;
* You will rez, once again, &#039;ruthed&#039; on your OpenSim region.&lt;br /&gt;
&lt;br /&gt;
[[Image:Ogpb_teleport_howto_7.jpg]]&lt;br /&gt;
&lt;br /&gt;
* You can check &amp;quot;Help&amp;quot; &amp;gt; &amp;quot;About&amp;quot; from the menu to confirm that you are on your OpenSim region.&lt;br /&gt;
&lt;br /&gt;
[[Image:Ogpb_teleport_howto_8.jpg]]&lt;br /&gt;
&lt;br /&gt;
Congratulations! Gridnaut. You&#039;ve Teleported Across The Grid!&lt;br /&gt;
&lt;br /&gt;
Send a screenshot of your avatar (with nametag) and the about screen to the gridnauts list for your special Gridnaut bear.&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
* If you see the not in gridnauts message when logging into the Open Grid viewer, please check your account on the beta grid with a release viewer to confirm you are in the gridnauts group.&lt;br /&gt;
&lt;br /&gt;
[[Image:Ogpb_teleport_howto_9.jpg]]&lt;br /&gt;
&lt;br /&gt;
* You may see a &amp;quot;you do not have access to that teleport destination&amp;quot; message, even if you successfully teleported.&lt;br /&gt;
&lt;br /&gt;
[[Image:Ogpb_teleport_howto_10.jpg]]&lt;br /&gt;
&lt;br /&gt;
* If you get an invalid region error when you attempt to teleport, check your OpenSim&#039;s bin/Regions/default.xml&lt;br /&gt;
** The attributes sim_location_x, and sim_location_y should not conflict with coordinates on the Second Life grid.&lt;br /&gt;
** Check the page [[Open_Grid_Public_Beta/Map_Locations]] and claim a non-conflicting set of coordinates.&lt;br /&gt;
&lt;br /&gt;
[[Image:Ogpb_teleport_howto_11.jpg]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Open_Grid_Public_Beta]]&lt;/div&gt;</summary>
		<author><name>Leyla Linden</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=SLGOGP_Teleport_Strawman&amp;diff=81407</id>
		<title>SLGOGP Teleport Strawman</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=SLGOGP_Teleport_Strawman&amp;diff=81407"/>
		<updated>2008-07-29T23:44:05Z</updated>

		<summary type="html">&lt;p&gt;Leyla Linden: /* Response */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This strawman represents a possible open teleport protocol. The sequencing is described first, which also introduces the major players: Client, Agent Domain, Simulator/Region Domain A, Simulator/Region Domain B. For perspective, the current Second Life Grid teleport flow is also included. Following that are the draft specifications for the two main pieces, called rezAvatar and derezAvatar on the agent domain. The simulator side portions of this protocol have been tentatively dubbed &amp;quot;teleport_avatar&amp;quot; and &amp;quot;give_up_av_to_pipe&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Teleport Flow =&lt;br /&gt;
&lt;br /&gt;
Here is the basic flow for current SL teleports:&lt;br /&gt;
[[Image:Old teleport.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Fine tuning the proposed protocol and cap names after discussion with AWG groupies resulted in a unified approach for Login, Teleport, and Logout, diagrammed below:&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Login ==&lt;br /&gt;
[[Image:Strawman-login-flowchart.png]]&lt;br /&gt;
[[Image:Open grid login.png]]&lt;br /&gt;
&lt;br /&gt;
== Teleport ==&lt;br /&gt;
[[Image:Open Grid Teleport.png | 760px]]&lt;br /&gt;
&lt;br /&gt;
== Logout ==&lt;br /&gt;
[[Image:Open Grid Logout.png]]&lt;br /&gt;
&lt;br /&gt;
= Authentication =&lt;br /&gt;
&lt;br /&gt;
*In order to get the agent host seed capability, credentials must first be posted to http://login.aditi.lindenlab.com/cgi-bin/auth.cgi&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Request: viewer -&amp;gt; auth.cgi ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Required Parameters ===&lt;br /&gt;
 {&lt;br /&gt;
     &#039;firstname&#039;:  &amp;lt;string&amp;gt;,&lt;br /&gt;
     &#039;lastname&#039;:   &amp;lt;string&amp;gt;,&lt;br /&gt;
     &#039;password&#039;:   &amp;lt;string&amp;gt;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
or &lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
     &#039;firstname&#039;:    &amp;lt;string&amp;gt;,&lt;br /&gt;
     &#039;lastname&#039;:     &amp;lt;string&amp;gt;,&lt;br /&gt;
     &#039;md5-password&#039;: &amp;lt;string&amp;gt;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Optional Parameters ===&lt;br /&gt;
 {&lt;br /&gt;
     &#039;agree_to_tos&#039; : &amp;lt;bool&amp;gt;,&lt;br /&gt;
     &#039;read_critical&#039;: &amp;lt;bool&amp;gt;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Response == &lt;br /&gt;
&lt;br /&gt;
=== Successful === &lt;br /&gt;
&lt;br /&gt;
  status:  302 &lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
     &#039;authenticated&#039;: true&lt;br /&gt;
     &#039;location&#039;     : &amp;lt;agent host seed capability url&amp;gt; &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
* Note: the 302 status code will be changed to 200 status in the future&lt;br /&gt;
&lt;br /&gt;
=== Unsuccessful ===&lt;br /&gt;
&lt;br /&gt;
  status:  4xx - login was unsuccessful&lt;br /&gt;
  status:  5xx - server error&lt;br /&gt;
&lt;br /&gt;
  { &lt;br /&gt;
     &#039;authenticated&#039; : false&lt;br /&gt;
     &#039;reason&#039;        : &amp;lt;one word identifier&amp;gt;&lt;br /&gt;
     &#039;message&#039;       : &amp;lt;error description&amp;gt;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
*Non-transport/server errors will be changed to 200 status in the future&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Terms of Service&lt;br /&gt;
&lt;br /&gt;
  { &lt;br /&gt;
     &#039;authenticated&#039; : false&lt;br /&gt;
     &#039;reason&#039;        : &#039;tos&#039;&lt;br /&gt;
     &#039;message&#039;       : &amp;lt;terms of service text&amp;gt;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
*Once user agrees to terms of service call authenticate again with { &#039;agreed_to_tos&#039; : true }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Critical Message&lt;br /&gt;
&lt;br /&gt;
  { &lt;br /&gt;
     &#039;authenticated&#039; : false&lt;br /&gt;
     &#039;reason&#039;        : &#039;critical&#039;&lt;br /&gt;
     &#039;message&#039;       : &amp;lt;critical message text&amp;gt;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
*Once user has read the message call authenticate again with { &#039;read_critical&#039; : true }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Miscellaneous Reason&lt;br /&gt;
&lt;br /&gt;
* data - bad input or server side data fetch failed&lt;br /&gt;
* key - bad password&lt;br /&gt;
* god, restricted, ban, suspend, disabled  - denied based on account details&lt;br /&gt;
&lt;br /&gt;
= Agent Information =&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&lt;br /&gt;
Agent Information &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Name &lt;br /&gt;
|&lt;br /&gt;
agent/info&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
URL &lt;br /&gt;
|&lt;br /&gt;
capability from agent domain &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Verb &lt;br /&gt;
|&lt;br /&gt;
GET &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Response &lt;br /&gt;
|&lt;br /&gt;
{ agent_id: &amp;lt;uuid&amp;gt;, circuit_code: &amp;lt;int&amp;gt;, session_id: &amp;lt;uuid&amp;gt;, secure_session_id: &amp;lt;uuid&amp;gt;, presence: { status : online|offline, region_url: &amp;lt;url&amp;gt; } &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
 &lt;br /&gt;
|&lt;br /&gt;
a map of agent information for this session &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= rez_avatar/place =&lt;br /&gt;
* Once the viewer acquires the cap for place_avatar, it requests it from the agent domain&lt;br /&gt;
* The viewer can also invoke place_avatar for teleport&lt;br /&gt;
== Request: viewer -&amp;gt; agentd ==&lt;br /&gt;
 {&lt;br /&gt;
     &#039;region_url&#039;: &amp;lt;r_url&amp;gt;&lt;br /&gt;
     &#039;position&#039;:  [x, y, z]&lt;br /&gt;
 }&lt;br /&gt;
== Response ==&lt;br /&gt;
 {&lt;br /&gt;
   &#039;seed_capability&#039;: uri string&lt;br /&gt;
   &#039;look_at&#039; : [f32, f32, f32]&lt;br /&gt;
   &#039;sim_ip&#039;: ip string&lt;br /&gt;
   &#039;sim_port&#039;: int&lt;br /&gt;
   &#039;region_x&#039;: int&lt;br /&gt;
   &#039;region_y&#039;: int&lt;br /&gt;
   &#039;region_id&#039; : uuid&lt;br /&gt;
   &#039;sim_access&#039; : &amp;lt;PG/Mature&amp;gt;&lt;br /&gt;
   &#039;connect&#039;: bool&lt;br /&gt;
   &#039;position&#039;: [f32, f32, f32]&lt;br /&gt;
 // The above are the same as response to rez_avatar&lt;br /&gt;
 // The following are only returned on login, not over teleport&lt;br /&gt;
    &#039;session_id&#039;:&amp;lt;uuid&amp;gt;&lt;br /&gt;
    &#039;secure_session_id&#039;:&amp;lt;uuid&amp;gt;&lt;br /&gt;
    &#039;circuit_code&#039;:&amp;lt;int&amp;gt;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
= rez_avatar/request =&lt;br /&gt;
== Request: agentd -&amp;gt; simulator ==&lt;br /&gt;
 {&lt;br /&gt;
    &#039;agent_id&#039; : &amp;lt;uuid&amp;gt;,&lt;br /&gt;
    &#039;first_name&#039;: &amp;lt;string&amp;gt;,&lt;br /&gt;
    &#039;last_name&#039;: &amp;lt;string&amp;gt;,&lt;br /&gt;
    &#039;age_verified&#039; : &amp;lt;boolean&amp;gt;,&lt;br /&gt;
    &#039;agent_access&#039; : &amp;lt;boolean&amp;gt;,&lt;br /&gt;
    &#039;allow_redirect: &amp;lt;boolean&amp;gt;,&lt;br /&gt;
    &#039;god_level&#039;:  &amp;lt;int&amp;gt;,&lt;br /&gt;
    &#039;identified&#039;:  &amp;lt;bool&amp;gt;,&lt;br /&gt;
    &#039;transacted&#039;: &amp;lt;bool&amp;gt;,&lt;br /&gt;
    &#039;limited_to_estate&#039;: &amp;lt;int&amp;gt;&lt;br /&gt;
     &#039;sim_access&#039; : &amp;lt;PG/Mature&amp;gt;,&lt;br /&gt;
    &#039;granters&#039;: []&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Example: (hard coded) ==&lt;br /&gt;
 {&lt;br /&gt;
   &#039;agent_id&#039; : &amp;lt;uuid&amp;gt;,&lt;br /&gt;
   &#039;first_name&#039;: &amp;lt;string&amp;gt;,&lt;br /&gt;
   &#039;last_name&#039;: &amp;lt;string&amp;gt;,&lt;br /&gt;
   &#039;age_verified&#039; : false, &lt;br /&gt;
   &#039;agent_access&#039; : false,&lt;br /&gt;
   &#039;allow_redirect: 1,&lt;br /&gt;
   &#039;god_level&#039;:  0,&lt;br /&gt;
   &#039;identified&#039;:  false,&lt;br /&gt;
   &#039;transacted&#039;: false,&lt;br /&gt;
   &#039;limited_to_estate&#039;: 1&lt;br /&gt;
   &#039;sim_access&#039; : &#039;PG&#039;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Response to request_rez_avatar ==&lt;br /&gt;
 {&lt;br /&gt;
    &#039;connect&#039;:True&lt;br /&gt;
    &#039;rez_avatar/rez&#039;:&amp;lt;cap&amp;gt;&lt;br /&gt;
    &#039;sim_ip&#039;: ip string&lt;br /&gt;
    &#039;sim_port&#039;: int&lt;br /&gt;
    &#039;region_x&#039;: int&lt;br /&gt;
    &#039;region_y&#039;: int&lt;br /&gt;
    &#039;region_id&#039; : uuid&lt;br /&gt;
    &#039;sim_access&#039; : &amp;lt;PG/Mature&amp;gt;&lt;br /&gt;
    &#039;seed_capability&#039;: uri string&lt;br /&gt;
Optional params for Second Life regions only:&lt;br /&gt;
    &#039;src_can_see_mainland&#039;:&amp;lt;bool&amp;gt;,&lt;br /&gt;
    &#039;src_estate_id&#039;:&amp;lt;int&amp;gt;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Failed request.&lt;br /&gt;
 {&lt;br /&gt;
    &#039;connect&#039;:False&lt;br /&gt;
    &#039;redirect&#039;:False&lt;br /&gt;
    &#039;resethome&#039;:False&lt;br /&gt;
    &#039;message&#039;: string&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Failed request.  Need to reset home location.&lt;br /&gt;
 {&lt;br /&gt;
    &#039;connect&#039;:False&lt;br /&gt;
    &#039;redirect&#039;:False&lt;br /&gt;
    &#039;resethome&#039;:True&lt;br /&gt;
    &#039;message&#039;: string&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Failed request.  Need to redirect to new location&lt;br /&gt;
 {&lt;br /&gt;
    &#039;connect&#039;:False&lt;br /&gt;
    &#039;redirect&#039;:True&lt;br /&gt;
    &#039;resethome&#039;:False&lt;br /&gt;
    &#039;message&#039;: &amp;quot;You have been redirected to a telehub.&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
= rez_avatar/rez =&lt;br /&gt;
== Request: agentd -&amp;gt; simulator OR simulator a -&amp;gt; simulator b via derez_avatar ==&lt;br /&gt;
* For login, the agent domain then invokes rez_avatar on the simulator at the given region_url&lt;br /&gt;
* For teleport, the agent domain invokes derez_avatar on simulator a, which invokes rez_avatar on simulator b&lt;br /&gt;
 {&lt;br /&gt;
    &#039;circuit_code&#039;: &amp;lt;int&amp;gt;,&lt;br /&gt;
    &#039;god_overide&#039;:   &amp;lt;bool&amp;gt;,&lt;br /&gt;
    &#039;position&#039;: [x, y, z],&lt;br /&gt;
    &#039;secure_session_id&#039;:  &amp;lt;uuid&amp;gt;,&lt;br /&gt;
    &#039;session_id&#039;:  &amp;lt;uuid&amp;gt;,&lt;br /&gt;
    &#039;inventory_host&#039;:  &amp;lt;uri string&amp;gt;, // not really here!&lt;br /&gt;
    &#039;voice_password&#039;: &amp;lt;string&amp;gt; // what to do?&lt;br /&gt;
&lt;br /&gt;
    // The following are only sent from simulator a -&amp;gt; simulator b via derez_avatar&lt;br /&gt;
    // Note: No assets are actually being sent through when going from SL -&amp;gt; non-SL regions&lt;br /&gt;
    &#039;attachment_data&#039;: [ {&#039;attachment_point&#039;:&amp;lt;int&amp;gt;, &#039;item_id&#039;:&amp;lt;uuid&amp;gt;, &#039;asset_id&#039;:&amp;lt;uuid&amp;gt; | &#039;asset_data&#039;:&amp;lt;binary&amp;gt;}...]&lt;br /&gt;
    &#039;baked_texture_data&#039;: [ {&#039;texture_id&#039;:&amp;lt;uuid&amp;gt;, &#039;asset_host_name&#039;:&amp;lt;host?????&amp;gt;}...]&lt;br /&gt;
    &#039;texture_data&#039;: [ &amp;lt;uuid&amp;gt;...]&lt;br /&gt;
    &#039;animations&#039;:[{&#039;state&#039;:&amp;lt;uuid&amp;gt;, &#039;source&#039;:&amp;lt;uuid&amp;gt;, &#039;sequence&#039;:&amp;lt;int&amp;gt;}...]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Response: simulator -&amp;gt; agentd ==&lt;br /&gt;
* The simulator then returns the actual region (in case it might be different from requested) and the seed cap.&lt;br /&gt;
 {&lt;br /&gt;
    &#039;look_at&#039; : [f32, f32, f32]&lt;br /&gt;
    &#039;position&#039;: [f32, f32, f32]&lt;br /&gt;
 // Extra stuff&lt;br /&gt;
    &#039;connect&#039;: &amp;lt;bool&amp;gt;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= rez_avatar/derez =&lt;br /&gt;
== Request: agentd -&amp;gt; simulator a ==&lt;br /&gt;
 {&lt;br /&gt;
     &#039;rez_avatar/rez&#039;: &amp;lt;url&amp;gt;&lt;br /&gt;
     &#039;position&#039;:  [x, y, z]&lt;br /&gt;
 }&lt;br /&gt;
Response: simulator a -&amp;gt; agentd&lt;br /&gt;
&lt;br /&gt;
== Response: simulator -&amp;gt; agentd ==&lt;br /&gt;
 {&lt;br /&gt;
    &#039;look_at&#039; : [f32, f32, f32]&lt;br /&gt;
    &#039;position&#039;: [f32, f32, f32]&lt;br /&gt;
 // Extra stuff&lt;br /&gt;
    &#039;connect&#039;: &amp;lt;bool&amp;gt;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Maintenance =&lt;br /&gt;
&lt;br /&gt;
OGP Maintenance refers to an extension of the existing OGP Login protocol to support per-user maintenance tasks when an agent &amp;quot;logs in.&amp;quot; Per-user, login-time maintenance is considered &amp;quot;better&amp;quot; in some cases than universal maintenance because:&lt;br /&gt;
&lt;br /&gt;
# it reduces the requirement for system-wide downtime&lt;br /&gt;
# assuming that all agents do not &amp;quot;log in&amp;quot; simultaneously, it distributes the load of maintenance across time&lt;br /&gt;
# and, it consumes system resources only for those agents who actually &amp;quot;log in.&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
It is not, however, without disadvantages:&lt;br /&gt;
&lt;br /&gt;
# performing per-user maintenance can lead to more complex systems&lt;br /&gt;
# agents who do not &amp;quot;log in&amp;quot; frequently will experience delays as pending maintenance is performed.&lt;br /&gt;
&lt;br /&gt;
== Dramatis Personae ==&lt;br /&gt;
&lt;br /&gt;
* the user   : the human or automated service on whose behalf interaction with the grid is initiated&lt;br /&gt;
* an account : an administrative convenience maintained by the agent domain on behalf of the user &amp;quot;containing&amp;quot; one or more agents&lt;br /&gt;
* the agent  : a specific actor on the grid, identified uniquely by a name, a UUID and a credential&lt;br /&gt;
* the client : the software component participating in the protocol with the agent domain and optionally (hopefully) a region&lt;br /&gt;
* the agent domain : a collection of systems that respond to OGP and report and manipulate agent related information&lt;br /&gt;
* the credential   : a syndrome of a shared secret presented by the client to the agent domain on behalf of the user&lt;br /&gt;
* a maintenance token : an opaque data structure representing maintenance being done by the agent domain on the user&#039;s behalf&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
* Maintenance must occur subsequent to authentication&lt;br /&gt;
* The client must be alerted that maintenance is occurring&lt;br /&gt;
* The agent domain must not require a client to re-authenticate themselves in order to check on the status of ongoing maintenance, once the client has been informed that maintenance is occurring (subject to reasonable limitation on the validity period of the credential)&lt;br /&gt;
* The agent domain must use the initial authentication (that started the maintenance process) to continue the login process (subject to reasonable limitation on the validity period of the credential)&lt;br /&gt;
* (reasonable limitation on the validity period of a credential)&lt;br /&gt;
** In situations where a credential has a validity period (X.509, OpenID, etc.) the agent domain must not depend on an authenticator after it&#039;s validity period is expired.&lt;br /&gt;
** An agent domain may choose a &amp;quot;reasonable&amp;quot; validity period for credentials that do not have an explicit validity period (shared secret, SRP, etc.)&lt;br /&gt;
* The agent domain should give the client an estimate on how long maintenance should last&lt;br /&gt;
* If a user &amp;quot;logs in&amp;quot; using two distinct clients with the same agent, the agent domain should provide the same maintenance token to both clients&lt;br /&gt;
* The agent domain must expose an interface allowing the client to use the maintenance token to retrieve status information regarding ongoing maintenance&lt;br /&gt;
    &lt;br /&gt;
== A Few Comments ==&lt;br /&gt;
&lt;br /&gt;
* If the agent domain has a good estimate for how long maintenance will take, it may choose to delay responding to maintenance caps for some period of time.&lt;br /&gt;
** This has the benefit of discouraging clients from repeatedly querying for status updates. &lt;br /&gt;
* If the agent domain does not have a good estimate for how long maintenance will take, it may choose to insert a smaller delay in responding to maintenance caps.&lt;br /&gt;
** This will allow the client to retrieve progressively more accurate estimates of maintenance lengths.&lt;br /&gt;
        &lt;br /&gt;
== How it maps to the existing implementation ==&lt;br /&gt;
&lt;br /&gt;
* the &amp;quot;maintenance token&amp;quot; is a &amp;quot;maintenance cap&amp;quot;&lt;br /&gt;
* when auth.py determines that a transform must be applied, it:&lt;br /&gt;
** checks to see if maintenance is under way. If it is not, it:&lt;br /&gt;
*** queries ??? for a new maintenance cap&lt;br /&gt;
*** updates the user_transformation table to include the current maintenance cap that is executing&lt;br /&gt;
*** tells ??? to start performing transforms&lt;br /&gt;
** then returns the current maintenance cap&lt;br /&gt;
        &lt;br /&gt;
== Open Questions ==&lt;br /&gt;
&lt;br /&gt;
* it&#039;s possible for an agent to have several transformations to be applied (denoted as several rows in the user_transformation table), so:&lt;br /&gt;
** do we use the same maintenance cap for each transformation, or do we create a new cap for each transform?&lt;br /&gt;
&lt;br /&gt;
== Maintenance / Transform ideas ==&lt;br /&gt;
&lt;br /&gt;
Current Maintenance Flow:&lt;br /&gt;
    * next_url -&amp;gt; transform.cgi&lt;br /&gt;
    * viewer POST credentials again to transform.cgi (not okay for protocol)&lt;br /&gt;
&lt;br /&gt;
OGP Maintenance&lt;br /&gt;
    * next_url is a cap&lt;br /&gt;
    * Need expiry/lifetime of cap -&amp;gt; connect to user.transform_until&lt;br /&gt;
    * If transform_until: give back same cap for next_url&lt;br /&gt;
&lt;br /&gt;
credential is { password | openid url }&lt;br /&gt;
&lt;br /&gt;
Viewer                Auth.py&lt;br /&gt;
(name,credential) ==&amp;gt;&lt;br /&gt;
                   * do authentication&lt;br /&gt;
                   * is a transform currently being performed?&lt;br /&gt;
                     * return transform cap&lt;br /&gt;
                   * is there a transform?&lt;br /&gt;
                   * get cap for transform&lt;br /&gt;
                   (name,transform type) ==&amp;gt;&lt;br /&gt;
                  &amp;lt;== (cap)OGP Maintenance&lt;br /&gt;
&lt;br /&gt;
[[Category:Grid_Interoperability]]&lt;br /&gt;
[[Category: Pyogp]]&lt;/div&gt;</summary>
		<author><name>Leyla Linden</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=SLGOGP_Teleport_Strawman&amp;diff=81169</id>
		<title>SLGOGP Teleport Strawman</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=SLGOGP_Teleport_Strawman&amp;diff=81169"/>
		<updated>2008-07-28T23:27:39Z</updated>

		<summary type="html">&lt;p&gt;Leyla Linden: /* Unsuccessful */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This strawman represents a possible open teleport protocol. The sequencing is described first, which also introduces the major players: Client, Agent Domain, Simulator/Region Domain A, Simulator/Region Domain B. For perspective, the current Second Life Grid teleport flow is also included. Following that are the draft specifications for the two main pieces, called rezAvatar and derezAvatar on the agent domain. The simulator side portions of this protocol have been tentatively dubbed &amp;quot;teleport_avatar&amp;quot; and &amp;quot;give_up_av_to_pipe&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Teleport Flow =&lt;br /&gt;
&lt;br /&gt;
Here is the basic flow for current SL teleports:&lt;br /&gt;
[[Image:Old teleport.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Fine tuning the proposed protocol and cap names after discussion with AWG groupies resulted in a unified approach for Login, Teleport, and Logout, diagrammed below:&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Login ==&lt;br /&gt;
[[Image:Strawman-login-flowchart.png]]&lt;br /&gt;
[[Image:Open grid login.png]]&lt;br /&gt;
&lt;br /&gt;
== Teleport ==&lt;br /&gt;
[[Image:Open Grid Teleport.png | 760px]]&lt;br /&gt;
&lt;br /&gt;
== Logout ==&lt;br /&gt;
[[Image:Open Grid Logout.png]]&lt;br /&gt;
&lt;br /&gt;
= Authentication =&lt;br /&gt;
&lt;br /&gt;
*In order to get the agent host seed capability, credentials must first be posted to http://login.aditi.lindenlab.com/cgi-bin/auth.cgi&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Request: viewer -&amp;gt; auth.cgi ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Required Parameters ===&lt;br /&gt;
 {&lt;br /&gt;
     &#039;firstname&#039;:  &amp;lt;string&amp;gt;,&lt;br /&gt;
     &#039;lastname&#039;:   &amp;lt;string&amp;gt;,&lt;br /&gt;
     &#039;password&#039;:   &amp;lt;string&amp;gt;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
or &lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
     &#039;firstname&#039;:    &amp;lt;string&amp;gt;,&lt;br /&gt;
     &#039;lastname&#039;:     &amp;lt;string&amp;gt;,&lt;br /&gt;
     &#039;md5-password&#039;: &amp;lt;string&amp;gt;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Optional Parameters ===&lt;br /&gt;
 {&lt;br /&gt;
     &#039;agree_to_tos&#039; : &amp;lt;bool&amp;gt;,&lt;br /&gt;
     &#039;read_critical&#039;: &amp;lt;bool&amp;gt;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Response == &lt;br /&gt;
&lt;br /&gt;
=== Successful === &lt;br /&gt;
&lt;br /&gt;
  status:  302 &lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
     &#039;authenticated&#039;: true&lt;br /&gt;
     &#039;location&#039;     : &amp;lt;agent host seed capability url&amp;gt; &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
* Note: the 302 status code will be changed to 200 status in the future&lt;br /&gt;
&lt;br /&gt;
=== Unsuccessful ===&lt;br /&gt;
&lt;br /&gt;
  status:  4xx - login was unsuccessful&lt;br /&gt;
  status:  5xx - server error&lt;br /&gt;
&lt;br /&gt;
  { &lt;br /&gt;
     &#039;authenticated&#039; : false&lt;br /&gt;
     &#039;reason&#039;        : &amp;lt;one word identifier&amp;gt;&lt;br /&gt;
     &#039;message&#039;       : &amp;lt;error description&amp;gt;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
*Non-transport/server errors will be changed to 200 status in the future&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Terms of Service&lt;br /&gt;
&lt;br /&gt;
  { &lt;br /&gt;
     &#039;authenticated&#039; : false&lt;br /&gt;
     &#039;reason&#039;        : &#039;tos&#039;&lt;br /&gt;
     &#039;message&#039;       : &amp;lt;terms of service text&amp;gt;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
*Once user agrees to terms of service call authenticate again with { &#039;agreed_to_tos&#039; : true }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Critical Message&lt;br /&gt;
&lt;br /&gt;
  { &lt;br /&gt;
     &#039;authenticated&#039; : false&lt;br /&gt;
     &#039;reason&#039;        : &#039;critical&#039;&lt;br /&gt;
     &#039;message&#039;       : &amp;lt;critical message text&amp;gt;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
*Once user has read the message call authenticate again with { &#039;read_critical&#039; : true }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Miscellaneous Reason&lt;br /&gt;
&lt;br /&gt;
* data - bad input or server side data fetch failed&lt;br /&gt;
* key - bad password&lt;br /&gt;
* god, restricted, ban, suspend, disabled  - denied based on account details&lt;br /&gt;
&lt;br /&gt;
= Agent Information =&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&lt;br /&gt;
Agent Information &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Name &lt;br /&gt;
|&lt;br /&gt;
agent/info&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
URL &lt;br /&gt;
|&lt;br /&gt;
capability from agent domain &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Verb &lt;br /&gt;
|&lt;br /&gt;
GET &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Response &lt;br /&gt;
|&lt;br /&gt;
{ agent_id: &amp;lt;uuid&amp;gt;, circuit_code: &amp;lt;int&amp;gt;, session_id: &amp;lt;uuid&amp;gt;, secure_session_id: &amp;lt;uuid&amp;gt;, presence: { status : online|offline, region_url: &amp;lt;url&amp;gt; } &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
 &lt;br /&gt;
|&lt;br /&gt;
a map of agent information for this session &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= rez_avatar/place =&lt;br /&gt;
* Once the viewer acquires the cap for place_avatar, it requests it from the agent domain&lt;br /&gt;
* The viewer can also invoke place_avatar for teleport&lt;br /&gt;
== Request: viewer -&amp;gt; agentd ==&lt;br /&gt;
 {&lt;br /&gt;
     &#039;region_url&#039;: &amp;lt;r_url&amp;gt;&lt;br /&gt;
     &#039;position&#039;:  [x, y, z]&lt;br /&gt;
 }&lt;br /&gt;
== Response ==&lt;br /&gt;
 {&lt;br /&gt;
   &#039;seed_capability&#039;: uri string&lt;br /&gt;
   &#039;look_at&#039; : [f32, f32, f32]&lt;br /&gt;
   &#039;sim_ip&#039;: ip string&lt;br /&gt;
   &#039;sim_port&#039;: int&lt;br /&gt;
   &#039;region_x&#039;: int&lt;br /&gt;
   &#039;region_y&#039;: int&lt;br /&gt;
   &#039;region_id&#039; : uuid&lt;br /&gt;
   &#039;sim_access&#039; : &amp;lt;PG/Mature&amp;gt;&lt;br /&gt;
   &#039;connect&#039;: bool&lt;br /&gt;
   &#039;position&#039;: [f32, f32, f32]&lt;br /&gt;
 // The above are the same as response to rez_avatar&lt;br /&gt;
 // The following are only returned on login, not over teleport&lt;br /&gt;
    &#039;session_id&#039;:&amp;lt;uuid&amp;gt;&lt;br /&gt;
    &#039;secure_session_id&#039;:&amp;lt;uuid&amp;gt;&lt;br /&gt;
    &#039;circuit_code&#039;:&amp;lt;int&amp;gt;&lt;br /&gt;
 // Extra stuff&lt;br /&gt;
    &#039;connect&#039;: &amp;lt;bool&amp;gt;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= rez_avatar/request =&lt;br /&gt;
== Request: agentd -&amp;gt; simulator ==&lt;br /&gt;
 {&lt;br /&gt;
    &#039;agent_id&#039; : &amp;lt;uuid&amp;gt;,&lt;br /&gt;
    &#039;first_name&#039;: &amp;lt;string&amp;gt;,&lt;br /&gt;
    &#039;last_name&#039;: &amp;lt;string&amp;gt;,&lt;br /&gt;
    &#039;age_verified&#039; : &amp;lt;boolean&amp;gt;,&lt;br /&gt;
    &#039;agent_access&#039; : &amp;lt;boolean&amp;gt;,&lt;br /&gt;
    &#039;allow_redirect: &amp;lt;boolean&amp;gt;,&lt;br /&gt;
    &#039;god_level&#039;:  &amp;lt;int&amp;gt;,&lt;br /&gt;
    &#039;identified&#039;:  &amp;lt;bool&amp;gt;,&lt;br /&gt;
    &#039;transacted&#039;: &amp;lt;bool&amp;gt;,&lt;br /&gt;
    &#039;limited_to_estate&#039;: &amp;lt;int&amp;gt;&lt;br /&gt;
     &#039;sim_access&#039; : &amp;lt;PG/Mature&amp;gt;,&lt;br /&gt;
    &#039;granters&#039;: []&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Example: (hard coded) ==&lt;br /&gt;
 {&lt;br /&gt;
   &#039;agent_id&#039; : &amp;lt;uuid&amp;gt;,&lt;br /&gt;
   &#039;first_name&#039;: &amp;lt;string&amp;gt;,&lt;br /&gt;
   &#039;last_name&#039;: &amp;lt;string&amp;gt;,&lt;br /&gt;
   &#039;age_verified&#039; : false, &lt;br /&gt;
   &#039;agent_access&#039; : false,&lt;br /&gt;
   &#039;allow_redirect: 1,&lt;br /&gt;
   &#039;god_level&#039;:  0,&lt;br /&gt;
   &#039;identified&#039;:  false,&lt;br /&gt;
   &#039;transacted&#039;: false,&lt;br /&gt;
   &#039;limited_to_estate&#039;: 1&lt;br /&gt;
   &#039;sim_access&#039; : &#039;PG&#039;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Response to request_rez_avatar ==&lt;br /&gt;
 {&lt;br /&gt;
    &#039;connect&#039;:True&lt;br /&gt;
    &#039;rez_avatar/rez&#039;:&amp;lt;cap&amp;gt;&lt;br /&gt;
    &#039;sim_ip&#039;: ip string&lt;br /&gt;
    &#039;sim_port&#039;: int&lt;br /&gt;
    &#039;region_x&#039;: int&lt;br /&gt;
    &#039;region_y&#039;: int&lt;br /&gt;
    &#039;region_id&#039; : uuid&lt;br /&gt;
    &#039;sim_access&#039; : &amp;lt;PG/Mature&amp;gt;&lt;br /&gt;
    &#039;seed_capability&#039;: uri string&lt;br /&gt;
Optional params for Second Life regions only:&lt;br /&gt;
    &#039;src_can_see_mainland&#039;:&amp;lt;bool&amp;gt;,&lt;br /&gt;
    &#039;src_estate_id&#039;:&amp;lt;int&amp;gt;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Failed request.&lt;br /&gt;
 {&lt;br /&gt;
    &#039;connect&#039;:False&lt;br /&gt;
    &#039;redirect&#039;:False&lt;br /&gt;
    &#039;resethome&#039;:False&lt;br /&gt;
    &#039;message&#039;: string&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Failed request.  Need to reset home location.&lt;br /&gt;
 {&lt;br /&gt;
    &#039;connect&#039;:False&lt;br /&gt;
    &#039;redirect&#039;:False&lt;br /&gt;
    &#039;resethome&#039;:True&lt;br /&gt;
    &#039;message&#039;: string&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Failed request.  Need to redirect to new location&lt;br /&gt;
 {&lt;br /&gt;
    &#039;connect&#039;:False&lt;br /&gt;
    &#039;redirect&#039;:True&lt;br /&gt;
    &#039;resethome&#039;:False&lt;br /&gt;
    &#039;message&#039;: &amp;quot;You have been redirected to a telehub.&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
= rez_avatar/rez =&lt;br /&gt;
== Request: agentd -&amp;gt; simulator OR simulator a -&amp;gt; simulator b via derez_avatar ==&lt;br /&gt;
* For login, the agent domain then invokes rez_avatar on the simulator at the given region_url&lt;br /&gt;
* For teleport, the agent domain invokes derez_avatar on simulator a, which invokes rez_avatar on simulator b&lt;br /&gt;
 {&lt;br /&gt;
    &#039;circuit_code&#039;: &amp;lt;int&amp;gt;,&lt;br /&gt;
    &#039;god_overide&#039;:   &amp;lt;bool&amp;gt;,&lt;br /&gt;
    &#039;position&#039;: [x, y, z],&lt;br /&gt;
    &#039;secure_session_id&#039;:  &amp;lt;uuid&amp;gt;,&lt;br /&gt;
    &#039;session_id&#039;:  &amp;lt;uuid&amp;gt;,&lt;br /&gt;
    &#039;inventory_host&#039;:  &amp;lt;uri string&amp;gt;, // not really here!&lt;br /&gt;
    &#039;voice_password&#039;: &amp;lt;string&amp;gt; // what to do?&lt;br /&gt;
&lt;br /&gt;
    // The following are only sent from simulator a -&amp;gt; simulator b via derez_avatar&lt;br /&gt;
    // Note: No assets are actually being sent through when going from SL -&amp;gt; non-SL regions&lt;br /&gt;
    &#039;attachment_data&#039;: [ {&#039;attachment_point&#039;:&amp;lt;int&amp;gt;, &#039;item_id&#039;:&amp;lt;uuid&amp;gt;, &#039;asset_id&#039;:&amp;lt;uuid&amp;gt; | &#039;asset_data&#039;:&amp;lt;binary&amp;gt;}...]&lt;br /&gt;
    &#039;baked_texture_data&#039;: [ {&#039;texture_id&#039;:&amp;lt;uuid&amp;gt;, &#039;asset_host_name&#039;:&amp;lt;host?????&amp;gt;}...]&lt;br /&gt;
    &#039;texture_data&#039;: [ &amp;lt;uuid&amp;gt;...]&lt;br /&gt;
    &#039;animations&#039;:[{&#039;state&#039;:&amp;lt;uuid&amp;gt;, &#039;source&#039;:&amp;lt;uuid&amp;gt;, &#039;sequence&#039;:&amp;lt;int&amp;gt;}...]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Response: simulator -&amp;gt; agentd ==&lt;br /&gt;
* The simulator then returns the actual region (in case it might be different from requested) and the seed cap.&lt;br /&gt;
 {&lt;br /&gt;
    &#039;look_at&#039; : [f32, f32, f32]&lt;br /&gt;
    &#039;position&#039;: [f32, f32, f32]&lt;br /&gt;
 // Extra stuff&lt;br /&gt;
    &#039;connect&#039;: &amp;lt;bool&amp;gt;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= rez_avatar/derez =&lt;br /&gt;
== Request: agentd -&amp;gt; simulator a ==&lt;br /&gt;
 {&lt;br /&gt;
     &#039;rez_avatar/rez&#039;: &amp;lt;url&amp;gt;&lt;br /&gt;
     &#039;position&#039;:  [x, y, z]&lt;br /&gt;
 }&lt;br /&gt;
Response: simulator a -&amp;gt; agentd&lt;br /&gt;
&lt;br /&gt;
== Response: simulator -&amp;gt; agentd ==&lt;br /&gt;
 {&lt;br /&gt;
    &#039;look_at&#039; : [f32, f32, f32]&lt;br /&gt;
    &#039;position&#039;: [f32, f32, f32]&lt;br /&gt;
 // Extra stuff&lt;br /&gt;
    &#039;connect&#039;: &amp;lt;bool&amp;gt;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category: Pyogp]]&lt;/div&gt;</summary>
		<author><name>Leyla Linden</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=SLGOGP_Teleport_Strawman&amp;diff=81167</id>
		<title>SLGOGP Teleport Strawman</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=SLGOGP_Teleport_Strawman&amp;diff=81167"/>
		<updated>2008-07-28T22:57:23Z</updated>

		<summary type="html">&lt;p&gt;Leyla Linden: /* Successful */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This strawman represents a possible open teleport protocol. The sequencing is described first, which also introduces the major players: Client, Agent Domain, Simulator/Region Domain A, Simulator/Region Domain B. For perspective, the current Second Life Grid teleport flow is also included. Following that are the draft specifications for the two main pieces, called rezAvatar and derezAvatar on the agent domain. The simulator side portions of this protocol have been tentatively dubbed &amp;quot;teleport_avatar&amp;quot; and &amp;quot;give_up_av_to_pipe&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Teleport Flow =&lt;br /&gt;
&lt;br /&gt;
Here is the basic flow for current SL teleports:&lt;br /&gt;
[[Image:Old teleport.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Fine tuning the proposed protocol and cap names after discussion with AWG groupies resulted in a unified approach for Login, Teleport, and Logout, diagrammed below:&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Login ==&lt;br /&gt;
[[Image:Strawman-login-flowchart.png]]&lt;br /&gt;
[[Image:Open grid login.png]]&lt;br /&gt;
&lt;br /&gt;
== Teleport ==&lt;br /&gt;
[[Image:Open Grid Teleport.png | 760px]]&lt;br /&gt;
&lt;br /&gt;
== Logout ==&lt;br /&gt;
[[Image:Open Grid Logout.png]]&lt;br /&gt;
&lt;br /&gt;
= Authentication =&lt;br /&gt;
&lt;br /&gt;
*In order to get the agent host seed capability, credentials must first be posted to http://login.aditi.lindenlab.com/cgi-bin/auth.cgi&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Request: viewer -&amp;gt; auth.cgi ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Required Parameters ===&lt;br /&gt;
 {&lt;br /&gt;
     &#039;firstname&#039;:  &amp;lt;string&amp;gt;,&lt;br /&gt;
     &#039;lastname&#039;:   &amp;lt;string&amp;gt;,&lt;br /&gt;
     &#039;password&#039;:   &amp;lt;string&amp;gt;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
or &lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
     &#039;firstname&#039;:    &amp;lt;string&amp;gt;,&lt;br /&gt;
     &#039;lastname&#039;:     &amp;lt;string&amp;gt;,&lt;br /&gt;
     &#039;md5-password&#039;: &amp;lt;string&amp;gt;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Optional Parameters ===&lt;br /&gt;
 {&lt;br /&gt;
     &#039;agree_to_tos&#039; : &amp;lt;bool&amp;gt;,&lt;br /&gt;
     &#039;read_critical&#039;: &amp;lt;bool&amp;gt;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Response == &lt;br /&gt;
&lt;br /&gt;
=== Successful === &lt;br /&gt;
&lt;br /&gt;
  status:  302 &lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
     &#039;authenticated&#039;: true&lt;br /&gt;
     &#039;location&#039;     : &amp;lt;agent host seed capability url&amp;gt; &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
* Note: the 302 status code will be changed to 200 status in the future&lt;br /&gt;
&lt;br /&gt;
=== Unsuccessful ===&lt;br /&gt;
&lt;br /&gt;
  status:  4xx - login was unsuccessful&lt;br /&gt;
  status:  5xx - server error&lt;br /&gt;
&lt;br /&gt;
  { &lt;br /&gt;
     &#039;authenticated&#039; : false&lt;br /&gt;
     &#039;reason&#039;        : &amp;lt;one word identifier&amp;gt;&lt;br /&gt;
     &#039;message&#039;       : &amp;lt;error description&amp;gt;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
*Non-transport/server errors will be changed to 200 status in the future&lt;br /&gt;
&lt;br /&gt;
= Agent Information =&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&lt;br /&gt;
Agent Information &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Name &lt;br /&gt;
|&lt;br /&gt;
agent/info&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
URL &lt;br /&gt;
|&lt;br /&gt;
capability from agent domain &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Verb &lt;br /&gt;
|&lt;br /&gt;
GET &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Response &lt;br /&gt;
|&lt;br /&gt;
{ agent_id: &amp;lt;uuid&amp;gt;, circuit_code: &amp;lt;int&amp;gt;, session_id: &amp;lt;uuid&amp;gt;, secure_session_id: &amp;lt;uuid&amp;gt;, presence: { status : online|offline, region_url: &amp;lt;url&amp;gt; } &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
 &lt;br /&gt;
|&lt;br /&gt;
a map of agent information for this session &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= rez_avatar/place =&lt;br /&gt;
* Once the viewer acquires the cap for place_avatar, it requests it from the agent domain&lt;br /&gt;
* The viewer can also invoke place_avatar for teleport&lt;br /&gt;
== Request: viewer -&amp;gt; agentd ==&lt;br /&gt;
 {&lt;br /&gt;
     &#039;region_url&#039;: &amp;lt;r_url&amp;gt;&lt;br /&gt;
     &#039;position&#039;:  [x, y, z]&lt;br /&gt;
 }&lt;br /&gt;
== Response ==&lt;br /&gt;
 {&lt;br /&gt;
   &#039;seed_capability&#039;: uri string&lt;br /&gt;
   &#039;look_at&#039; : [f32, f32, f32]&lt;br /&gt;
   &#039;sim_ip&#039;: ip string&lt;br /&gt;
   &#039;sim_port&#039;: int&lt;br /&gt;
   &#039;region_x&#039;: int&lt;br /&gt;
   &#039;region_y&#039;: int&lt;br /&gt;
   &#039;region_id&#039; : uuid&lt;br /&gt;
   &#039;sim_access&#039; : &amp;lt;PG/Mature&amp;gt;&lt;br /&gt;
   &#039;connect&#039;: bool&lt;br /&gt;
   &#039;position&#039;: [f32, f32, f32]&lt;br /&gt;
 // The above are the same as response to rez_avatar&lt;br /&gt;
 // The following are only returned on login, not over teleport&lt;br /&gt;
    &#039;session_id&#039;:&amp;lt;uuid&amp;gt;&lt;br /&gt;
    &#039;secure_session_id&#039;:&amp;lt;uuid&amp;gt;&lt;br /&gt;
    &#039;circuit_code&#039;:&amp;lt;int&amp;gt;&lt;br /&gt;
 // Extra stuff&lt;br /&gt;
    &#039;connect&#039;: &amp;lt;bool&amp;gt;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= rez_avatar/request =&lt;br /&gt;
== Request: agentd -&amp;gt; simulator ==&lt;br /&gt;
 {&lt;br /&gt;
    &#039;agent_id&#039; : &amp;lt;uuid&amp;gt;,&lt;br /&gt;
    &#039;first_name&#039;: &amp;lt;string&amp;gt;,&lt;br /&gt;
    &#039;last_name&#039;: &amp;lt;string&amp;gt;,&lt;br /&gt;
    &#039;age_verified&#039; : &amp;lt;boolean&amp;gt;,&lt;br /&gt;
    &#039;agent_access&#039; : &amp;lt;boolean&amp;gt;,&lt;br /&gt;
    &#039;allow_redirect: &amp;lt;boolean&amp;gt;,&lt;br /&gt;
    &#039;god_level&#039;:  &amp;lt;int&amp;gt;,&lt;br /&gt;
    &#039;identified&#039;:  &amp;lt;bool&amp;gt;,&lt;br /&gt;
    &#039;transacted&#039;: &amp;lt;bool&amp;gt;,&lt;br /&gt;
    &#039;limited_to_estate&#039;: &amp;lt;int&amp;gt;&lt;br /&gt;
     &#039;sim_access&#039; : &amp;lt;PG/Mature&amp;gt;,&lt;br /&gt;
    &#039;granters&#039;: []&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Example: (hard coded) ==&lt;br /&gt;
 {&lt;br /&gt;
   &#039;agent_id&#039; : &amp;lt;uuid&amp;gt;,&lt;br /&gt;
   &#039;first_name&#039;: &amp;lt;string&amp;gt;,&lt;br /&gt;
   &#039;last_name&#039;: &amp;lt;string&amp;gt;,&lt;br /&gt;
   &#039;age_verified&#039; : false, &lt;br /&gt;
   &#039;agent_access&#039; : false,&lt;br /&gt;
   &#039;allow_redirect: 1,&lt;br /&gt;
   &#039;god_level&#039;:  0,&lt;br /&gt;
   &#039;identified&#039;:  false,&lt;br /&gt;
   &#039;transacted&#039;: false,&lt;br /&gt;
   &#039;limited_to_estate&#039;: 1&lt;br /&gt;
   &#039;sim_access&#039; : &#039;PG&#039;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Response to request_rez_avatar ==&lt;br /&gt;
 {&lt;br /&gt;
    &#039;connect&#039;:True&lt;br /&gt;
    &#039;rez_avatar/rez&#039;:&amp;lt;cap&amp;gt;&lt;br /&gt;
    &#039;sim_ip&#039;: ip string&lt;br /&gt;
    &#039;sim_port&#039;: int&lt;br /&gt;
    &#039;region_x&#039;: int&lt;br /&gt;
    &#039;region_y&#039;: int&lt;br /&gt;
    &#039;region_id&#039; : uuid&lt;br /&gt;
    &#039;sim_access&#039; : &amp;lt;PG/Mature&amp;gt;&lt;br /&gt;
    &#039;seed_capability&#039;: uri string&lt;br /&gt;
Optional params for Second Life regions only:&lt;br /&gt;
    &#039;src_can_see_mainland&#039;:&amp;lt;bool&amp;gt;,&lt;br /&gt;
    &#039;src_estate_id&#039;:&amp;lt;int&amp;gt;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Failed request.&lt;br /&gt;
 {&lt;br /&gt;
    &#039;connect&#039;:False&lt;br /&gt;
    &#039;redirect&#039;:False&lt;br /&gt;
    &#039;resethome&#039;:False&lt;br /&gt;
    &#039;message&#039;: string&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Failed request.  Need to reset home location.&lt;br /&gt;
 {&lt;br /&gt;
    &#039;connect&#039;:False&lt;br /&gt;
    &#039;redirect&#039;:False&lt;br /&gt;
    &#039;resethome&#039;:True&lt;br /&gt;
    &#039;message&#039;: string&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Failed request.  Need to redirect to new location&lt;br /&gt;
 {&lt;br /&gt;
    &#039;connect&#039;:False&lt;br /&gt;
    &#039;redirect&#039;:True&lt;br /&gt;
    &#039;resethome&#039;:False&lt;br /&gt;
    &#039;message&#039;: &amp;quot;You have been redirected to a telehub.&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
= rez_avatar/rez =&lt;br /&gt;
== Request: agentd -&amp;gt; simulator OR simulator a -&amp;gt; simulator b via derez_avatar ==&lt;br /&gt;
* For login, the agent domain then invokes rez_avatar on the simulator at the given region_url&lt;br /&gt;
* For teleport, the agent domain invokes derez_avatar on simulator a, which invokes rez_avatar on simulator b&lt;br /&gt;
 {&lt;br /&gt;
    &#039;circuit_code&#039;: &amp;lt;int&amp;gt;,&lt;br /&gt;
    &#039;god_overide&#039;:   &amp;lt;bool&amp;gt;,&lt;br /&gt;
    &#039;position&#039;: [x, y, z],&lt;br /&gt;
    &#039;secure_session_id&#039;:  &amp;lt;uuid&amp;gt;,&lt;br /&gt;
    &#039;session_id&#039;:  &amp;lt;uuid&amp;gt;,&lt;br /&gt;
    &#039;inventory_host&#039;:  &amp;lt;uri string&amp;gt;, // not really here!&lt;br /&gt;
    &#039;voice_password&#039;: &amp;lt;string&amp;gt; // what to do?&lt;br /&gt;
&lt;br /&gt;
    // The following are only sent from simulator a -&amp;gt; simulator b via derez_avatar&lt;br /&gt;
    // Note: No assets are actually being sent through when going from SL -&amp;gt; non-SL regions&lt;br /&gt;
    &#039;attachment_data&#039;: [ {&#039;attachment_point&#039;:&amp;lt;int&amp;gt;, &#039;item_id&#039;:&amp;lt;uuid&amp;gt;, &#039;asset_id&#039;:&amp;lt;uuid&amp;gt; | &#039;asset_data&#039;:&amp;lt;binary&amp;gt;}...]&lt;br /&gt;
    &#039;baked_texture_data&#039;: [ {&#039;texture_id&#039;:&amp;lt;uuid&amp;gt;, &#039;asset_host_name&#039;:&amp;lt;host?????&amp;gt;}...]&lt;br /&gt;
    &#039;texture_data&#039;: [ &amp;lt;uuid&amp;gt;...]&lt;br /&gt;
    &#039;animations&#039;:[{&#039;state&#039;:&amp;lt;uuid&amp;gt;, &#039;source&#039;:&amp;lt;uuid&amp;gt;, &#039;sequence&#039;:&amp;lt;int&amp;gt;}...]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Response: simulator -&amp;gt; agentd ==&lt;br /&gt;
* The simulator then returns the actual region (in case it might be different from requested) and the seed cap.&lt;br /&gt;
 {&lt;br /&gt;
    &#039;look_at&#039; : [f32, f32, f32]&lt;br /&gt;
    &#039;position&#039;: [f32, f32, f32]&lt;br /&gt;
 // Extra stuff&lt;br /&gt;
    &#039;connect&#039;: &amp;lt;bool&amp;gt;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= rez_avatar/derez =&lt;br /&gt;
== Request: agentd -&amp;gt; simulator a ==&lt;br /&gt;
 {&lt;br /&gt;
     &#039;rez_avatar/rez&#039;: &amp;lt;url&amp;gt;&lt;br /&gt;
     &#039;position&#039;:  [x, y, z]&lt;br /&gt;
 }&lt;br /&gt;
Response: simulator a -&amp;gt; agentd&lt;br /&gt;
&lt;br /&gt;
== Response: simulator -&amp;gt; agentd ==&lt;br /&gt;
 {&lt;br /&gt;
    &#039;look_at&#039; : [f32, f32, f32]&lt;br /&gt;
    &#039;position&#039;: [f32, f32, f32]&lt;br /&gt;
 // Extra stuff&lt;br /&gt;
    &#039;connect&#039;: &amp;lt;bool&amp;gt;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category: Pyogp]]&lt;/div&gt;</summary>
		<author><name>Leyla Linden</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=SLGOGP_Teleport_Strawman&amp;diff=81166</id>
		<title>SLGOGP Teleport Strawman</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=SLGOGP_Teleport_Strawman&amp;diff=81166"/>
		<updated>2008-07-28T22:56:50Z</updated>

		<summary type="html">&lt;p&gt;Leyla Linden: /* Unsuccessful */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This strawman represents a possible open teleport protocol. The sequencing is described first, which also introduces the major players: Client, Agent Domain, Simulator/Region Domain A, Simulator/Region Domain B. For perspective, the current Second Life Grid teleport flow is also included. Following that are the draft specifications for the two main pieces, called rezAvatar and derezAvatar on the agent domain. The simulator side portions of this protocol have been tentatively dubbed &amp;quot;teleport_avatar&amp;quot; and &amp;quot;give_up_av_to_pipe&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Teleport Flow =&lt;br /&gt;
&lt;br /&gt;
Here is the basic flow for current SL teleports:&lt;br /&gt;
[[Image:Old teleport.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Fine tuning the proposed protocol and cap names after discussion with AWG groupies resulted in a unified approach for Login, Teleport, and Logout, diagrammed below:&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Login ==&lt;br /&gt;
[[Image:Strawman-login-flowchart.png]]&lt;br /&gt;
[[Image:Open grid login.png]]&lt;br /&gt;
&lt;br /&gt;
== Teleport ==&lt;br /&gt;
[[Image:Open Grid Teleport.png | 760px]]&lt;br /&gt;
&lt;br /&gt;
== Logout ==&lt;br /&gt;
[[Image:Open Grid Logout.png]]&lt;br /&gt;
&lt;br /&gt;
= Authentication =&lt;br /&gt;
&lt;br /&gt;
*In order to get the agent host seed capability, credentials must first be posted to http://login.aditi.lindenlab.com/cgi-bin/auth.cgi&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Request: viewer -&amp;gt; auth.cgi ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Required Parameters ===&lt;br /&gt;
 {&lt;br /&gt;
     &#039;firstname&#039;:  &amp;lt;string&amp;gt;,&lt;br /&gt;
     &#039;lastname&#039;:   &amp;lt;string&amp;gt;,&lt;br /&gt;
     &#039;password&#039;:   &amp;lt;string&amp;gt;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
or &lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
     &#039;firstname&#039;:    &amp;lt;string&amp;gt;,&lt;br /&gt;
     &#039;lastname&#039;:     &amp;lt;string&amp;gt;,&lt;br /&gt;
     &#039;md5-password&#039;: &amp;lt;string&amp;gt;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Optional Parameters ===&lt;br /&gt;
 {&lt;br /&gt;
     &#039;agree_to_tos&#039; : &amp;lt;bool&amp;gt;,&lt;br /&gt;
     &#039;read_critical&#039;: &amp;lt;bool&amp;gt;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Response == &lt;br /&gt;
&lt;br /&gt;
=== Successful === &lt;br /&gt;
&lt;br /&gt;
  status:  302 &lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
     &#039;authenticated&#039;: true&lt;br /&gt;
     &#039;location&#039;     : &amp;lt;agent host seed capability url&amp;gt; &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
* Note: the 302 status code will be changed to a 200 in the future&lt;br /&gt;
&lt;br /&gt;
=== Unsuccessful ===&lt;br /&gt;
&lt;br /&gt;
  status:  4xx - login was unsuccessful&lt;br /&gt;
  status:  5xx - server error&lt;br /&gt;
&lt;br /&gt;
  { &lt;br /&gt;
     &#039;authenticated&#039; : false&lt;br /&gt;
     &#039;reason&#039;        : &amp;lt;one word identifier&amp;gt;&lt;br /&gt;
     &#039;message&#039;       : &amp;lt;error description&amp;gt;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
*Non-transport/server errors will be changed to 200 status in the future&lt;br /&gt;
&lt;br /&gt;
= Agent Information =&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&lt;br /&gt;
Agent Information &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Name &lt;br /&gt;
|&lt;br /&gt;
agent/info&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
URL &lt;br /&gt;
|&lt;br /&gt;
capability from agent domain &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Verb &lt;br /&gt;
|&lt;br /&gt;
GET &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Response &lt;br /&gt;
|&lt;br /&gt;
{ agent_id: &amp;lt;uuid&amp;gt;, circuit_code: &amp;lt;int&amp;gt;, session_id: &amp;lt;uuid&amp;gt;, secure_session_id: &amp;lt;uuid&amp;gt;, presence: { status : online|offline, region_url: &amp;lt;url&amp;gt; } &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
 &lt;br /&gt;
|&lt;br /&gt;
a map of agent information for this session &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= rez_avatar/place =&lt;br /&gt;
* Once the viewer acquires the cap for place_avatar, it requests it from the agent domain&lt;br /&gt;
* The viewer can also invoke place_avatar for teleport&lt;br /&gt;
== Request: viewer -&amp;gt; agentd ==&lt;br /&gt;
 {&lt;br /&gt;
     &#039;region_url&#039;: &amp;lt;r_url&amp;gt;&lt;br /&gt;
     &#039;position&#039;:  [x, y, z]&lt;br /&gt;
 }&lt;br /&gt;
== Response ==&lt;br /&gt;
 {&lt;br /&gt;
   &#039;seed_capability&#039;: uri string&lt;br /&gt;
   &#039;look_at&#039; : [f32, f32, f32]&lt;br /&gt;
   &#039;sim_ip&#039;: ip string&lt;br /&gt;
   &#039;sim_port&#039;: int&lt;br /&gt;
   &#039;region_x&#039;: int&lt;br /&gt;
   &#039;region_y&#039;: int&lt;br /&gt;
   &#039;region_id&#039; : uuid&lt;br /&gt;
   &#039;sim_access&#039; : &amp;lt;PG/Mature&amp;gt;&lt;br /&gt;
   &#039;connect&#039;: bool&lt;br /&gt;
   &#039;position&#039;: [f32, f32, f32]&lt;br /&gt;
 // The above are the same as response to rez_avatar&lt;br /&gt;
 // The following are only returned on login, not over teleport&lt;br /&gt;
    &#039;session_id&#039;:&amp;lt;uuid&amp;gt;&lt;br /&gt;
    &#039;secure_session_id&#039;:&amp;lt;uuid&amp;gt;&lt;br /&gt;
    &#039;circuit_code&#039;:&amp;lt;int&amp;gt;&lt;br /&gt;
 // Extra stuff&lt;br /&gt;
    &#039;connect&#039;: &amp;lt;bool&amp;gt;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= rez_avatar/request =&lt;br /&gt;
== Request: agentd -&amp;gt; simulator ==&lt;br /&gt;
 {&lt;br /&gt;
    &#039;agent_id&#039; : &amp;lt;uuid&amp;gt;,&lt;br /&gt;
    &#039;first_name&#039;: &amp;lt;string&amp;gt;,&lt;br /&gt;
    &#039;last_name&#039;: &amp;lt;string&amp;gt;,&lt;br /&gt;
    &#039;age_verified&#039; : &amp;lt;boolean&amp;gt;,&lt;br /&gt;
    &#039;agent_access&#039; : &amp;lt;boolean&amp;gt;,&lt;br /&gt;
    &#039;allow_redirect: &amp;lt;boolean&amp;gt;,&lt;br /&gt;
    &#039;god_level&#039;:  &amp;lt;int&amp;gt;,&lt;br /&gt;
    &#039;identified&#039;:  &amp;lt;bool&amp;gt;,&lt;br /&gt;
    &#039;transacted&#039;: &amp;lt;bool&amp;gt;,&lt;br /&gt;
    &#039;limited_to_estate&#039;: &amp;lt;int&amp;gt;&lt;br /&gt;
     &#039;sim_access&#039; : &amp;lt;PG/Mature&amp;gt;,&lt;br /&gt;
    &#039;granters&#039;: []&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Example: (hard coded) ==&lt;br /&gt;
 {&lt;br /&gt;
   &#039;agent_id&#039; : &amp;lt;uuid&amp;gt;,&lt;br /&gt;
   &#039;first_name&#039;: &amp;lt;string&amp;gt;,&lt;br /&gt;
   &#039;last_name&#039;: &amp;lt;string&amp;gt;,&lt;br /&gt;
   &#039;age_verified&#039; : false, &lt;br /&gt;
   &#039;agent_access&#039; : false,&lt;br /&gt;
   &#039;allow_redirect: 1,&lt;br /&gt;
   &#039;god_level&#039;:  0,&lt;br /&gt;
   &#039;identified&#039;:  false,&lt;br /&gt;
   &#039;transacted&#039;: false,&lt;br /&gt;
   &#039;limited_to_estate&#039;: 1&lt;br /&gt;
   &#039;sim_access&#039; : &#039;PG&#039;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Response to request_rez_avatar ==&lt;br /&gt;
 {&lt;br /&gt;
    &#039;connect&#039;:True&lt;br /&gt;
    &#039;rez_avatar/rez&#039;:&amp;lt;cap&amp;gt;&lt;br /&gt;
    &#039;sim_ip&#039;: ip string&lt;br /&gt;
    &#039;sim_port&#039;: int&lt;br /&gt;
    &#039;region_x&#039;: int&lt;br /&gt;
    &#039;region_y&#039;: int&lt;br /&gt;
    &#039;region_id&#039; : uuid&lt;br /&gt;
    &#039;sim_access&#039; : &amp;lt;PG/Mature&amp;gt;&lt;br /&gt;
    &#039;seed_capability&#039;: uri string&lt;br /&gt;
Optional params for Second Life regions only:&lt;br /&gt;
    &#039;src_can_see_mainland&#039;:&amp;lt;bool&amp;gt;,&lt;br /&gt;
    &#039;src_estate_id&#039;:&amp;lt;int&amp;gt;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Failed request.&lt;br /&gt;
 {&lt;br /&gt;
    &#039;connect&#039;:False&lt;br /&gt;
    &#039;redirect&#039;:False&lt;br /&gt;
    &#039;resethome&#039;:False&lt;br /&gt;
    &#039;message&#039;: string&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Failed request.  Need to reset home location.&lt;br /&gt;
 {&lt;br /&gt;
    &#039;connect&#039;:False&lt;br /&gt;
    &#039;redirect&#039;:False&lt;br /&gt;
    &#039;resethome&#039;:True&lt;br /&gt;
    &#039;message&#039;: string&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Failed request.  Need to redirect to new location&lt;br /&gt;
 {&lt;br /&gt;
    &#039;connect&#039;:False&lt;br /&gt;
    &#039;redirect&#039;:True&lt;br /&gt;
    &#039;resethome&#039;:False&lt;br /&gt;
    &#039;message&#039;: &amp;quot;You have been redirected to a telehub.&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
= rez_avatar/rez =&lt;br /&gt;
== Request: agentd -&amp;gt; simulator OR simulator a -&amp;gt; simulator b via derez_avatar ==&lt;br /&gt;
* For login, the agent domain then invokes rez_avatar on the simulator at the given region_url&lt;br /&gt;
* For teleport, the agent domain invokes derez_avatar on simulator a, which invokes rez_avatar on simulator b&lt;br /&gt;
 {&lt;br /&gt;
    &#039;circuit_code&#039;: &amp;lt;int&amp;gt;,&lt;br /&gt;
    &#039;god_overide&#039;:   &amp;lt;bool&amp;gt;,&lt;br /&gt;
    &#039;position&#039;: [x, y, z],&lt;br /&gt;
    &#039;secure_session_id&#039;:  &amp;lt;uuid&amp;gt;,&lt;br /&gt;
    &#039;session_id&#039;:  &amp;lt;uuid&amp;gt;,&lt;br /&gt;
    &#039;inventory_host&#039;:  &amp;lt;uri string&amp;gt;, // not really here!&lt;br /&gt;
    &#039;voice_password&#039;: &amp;lt;string&amp;gt; // what to do?&lt;br /&gt;
&lt;br /&gt;
    // The following are only sent from simulator a -&amp;gt; simulator b via derez_avatar&lt;br /&gt;
    // Note: No assets are actually being sent through when going from SL -&amp;gt; non-SL regions&lt;br /&gt;
    &#039;attachment_data&#039;: [ {&#039;attachment_point&#039;:&amp;lt;int&amp;gt;, &#039;item_id&#039;:&amp;lt;uuid&amp;gt;, &#039;asset_id&#039;:&amp;lt;uuid&amp;gt; | &#039;asset_data&#039;:&amp;lt;binary&amp;gt;}...]&lt;br /&gt;
    &#039;baked_texture_data&#039;: [ {&#039;texture_id&#039;:&amp;lt;uuid&amp;gt;, &#039;asset_host_name&#039;:&amp;lt;host?????&amp;gt;}...]&lt;br /&gt;
    &#039;texture_data&#039;: [ &amp;lt;uuid&amp;gt;...]&lt;br /&gt;
    &#039;animations&#039;:[{&#039;state&#039;:&amp;lt;uuid&amp;gt;, &#039;source&#039;:&amp;lt;uuid&amp;gt;, &#039;sequence&#039;:&amp;lt;int&amp;gt;}...]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Response: simulator -&amp;gt; agentd ==&lt;br /&gt;
* The simulator then returns the actual region (in case it might be different from requested) and the seed cap.&lt;br /&gt;
 {&lt;br /&gt;
    &#039;look_at&#039; : [f32, f32, f32]&lt;br /&gt;
    &#039;position&#039;: [f32, f32, f32]&lt;br /&gt;
 // Extra stuff&lt;br /&gt;
    &#039;connect&#039;: &amp;lt;bool&amp;gt;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= rez_avatar/derez =&lt;br /&gt;
== Request: agentd -&amp;gt; simulator a ==&lt;br /&gt;
 {&lt;br /&gt;
     &#039;rez_avatar/rez&#039;: &amp;lt;url&amp;gt;&lt;br /&gt;
     &#039;position&#039;:  [x, y, z]&lt;br /&gt;
 }&lt;br /&gt;
Response: simulator a -&amp;gt; agentd&lt;br /&gt;
&lt;br /&gt;
== Response: simulator -&amp;gt; agentd ==&lt;br /&gt;
 {&lt;br /&gt;
    &#039;look_at&#039; : [f32, f32, f32]&lt;br /&gt;
    &#039;position&#039;: [f32, f32, f32]&lt;br /&gt;
 // Extra stuff&lt;br /&gt;
    &#039;connect&#039;: &amp;lt;bool&amp;gt;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category: Pyogp]]&lt;/div&gt;</summary>
		<author><name>Leyla Linden</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=SLGOGP_Teleport_Strawman&amp;diff=81164</id>
		<title>SLGOGP Teleport Strawman</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=SLGOGP_Teleport_Strawman&amp;diff=81164"/>
		<updated>2008-07-28T22:54:10Z</updated>

		<summary type="html">&lt;p&gt;Leyla Linden: /* Authentication */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This strawman represents a possible open teleport protocol. The sequencing is described first, which also introduces the major players: Client, Agent Domain, Simulator/Region Domain A, Simulator/Region Domain B. For perspective, the current Second Life Grid teleport flow is also included. Following that are the draft specifications for the two main pieces, called rezAvatar and derezAvatar on the agent domain. The simulator side portions of this protocol have been tentatively dubbed &amp;quot;teleport_avatar&amp;quot; and &amp;quot;give_up_av_to_pipe&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Teleport Flow =&lt;br /&gt;
&lt;br /&gt;
Here is the basic flow for current SL teleports:&lt;br /&gt;
[[Image:Old teleport.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Fine tuning the proposed protocol and cap names after discussion with AWG groupies resulted in a unified approach for Login, Teleport, and Logout, diagrammed below:&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Login ==&lt;br /&gt;
[[Image:Strawman-login-flowchart.png]]&lt;br /&gt;
[[Image:Open grid login.png]]&lt;br /&gt;
&lt;br /&gt;
== Teleport ==&lt;br /&gt;
[[Image:Open Grid Teleport.png | 760px]]&lt;br /&gt;
&lt;br /&gt;
== Logout ==&lt;br /&gt;
[[Image:Open Grid Logout.png]]&lt;br /&gt;
&lt;br /&gt;
= Authentication =&lt;br /&gt;
&lt;br /&gt;
*In order to get the agent host seed capability, credentials must first be posted to http://login.aditi.lindenlab.com/cgi-bin/auth.cgi&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Request: viewer -&amp;gt; auth.cgi ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Required Parameters ===&lt;br /&gt;
 {&lt;br /&gt;
     &#039;firstname&#039;:  &amp;lt;string&amp;gt;,&lt;br /&gt;
     &#039;lastname&#039;:   &amp;lt;string&amp;gt;,&lt;br /&gt;
     &#039;password&#039;:   &amp;lt;string&amp;gt;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
or &lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
     &#039;firstname&#039;:    &amp;lt;string&amp;gt;,&lt;br /&gt;
     &#039;lastname&#039;:     &amp;lt;string&amp;gt;,&lt;br /&gt;
     &#039;md5-password&#039;: &amp;lt;string&amp;gt;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Optional Parameters ===&lt;br /&gt;
 {&lt;br /&gt;
     &#039;agree_to_tos&#039; : &amp;lt;bool&amp;gt;,&lt;br /&gt;
     &#039;read_critical&#039;: &amp;lt;bool&amp;gt;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Response == &lt;br /&gt;
&lt;br /&gt;
=== Successful === &lt;br /&gt;
&lt;br /&gt;
  status:  302 &lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
     &#039;authenticated&#039;: true&lt;br /&gt;
     &#039;location&#039;     : &amp;lt;agent host seed capability url&amp;gt; &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
* Note: the 302 status code will be changed to a 200 in the future&lt;br /&gt;
&lt;br /&gt;
=== Unsuccessful ===&lt;br /&gt;
&lt;br /&gt;
  status:  4xx - login was unsuccessful&lt;br /&gt;
  status:  5xx - server error&lt;br /&gt;
&lt;br /&gt;
  { &lt;br /&gt;
     &#039;authenticated&#039; : false&lt;br /&gt;
     &#039;reason&#039;        : &amp;lt;one word identifier&amp;gt;&lt;br /&gt;
     &#039;message&#039;       : &amp;lt;error description&amp;gt;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
= Agent Information =&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&lt;br /&gt;
Agent Information &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Name &lt;br /&gt;
|&lt;br /&gt;
agent/info&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
URL &lt;br /&gt;
|&lt;br /&gt;
capability from agent domain &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Verb &lt;br /&gt;
|&lt;br /&gt;
GET &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Response &lt;br /&gt;
|&lt;br /&gt;
{ agent_id: &amp;lt;uuid&amp;gt;, circuit_code: &amp;lt;int&amp;gt;, session_id: &amp;lt;uuid&amp;gt;, secure_session_id: &amp;lt;uuid&amp;gt;, presence: { status : online|offline, region_url: &amp;lt;url&amp;gt; } &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
 &lt;br /&gt;
|&lt;br /&gt;
a map of agent information for this session &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= rez_avatar/place =&lt;br /&gt;
* Once the viewer acquires the cap for place_avatar, it requests it from the agent domain&lt;br /&gt;
* The viewer can also invoke place_avatar for teleport&lt;br /&gt;
== Request: viewer -&amp;gt; agentd ==&lt;br /&gt;
 {&lt;br /&gt;
     &#039;region_url&#039;: &amp;lt;r_url&amp;gt;&lt;br /&gt;
     &#039;position&#039;:  [x, y, z]&lt;br /&gt;
 }&lt;br /&gt;
== Response ==&lt;br /&gt;
 {&lt;br /&gt;
   &#039;seed_capability&#039;: uri string&lt;br /&gt;
   &#039;look_at&#039; : [f32, f32, f32]&lt;br /&gt;
   &#039;sim_ip&#039;: ip string&lt;br /&gt;
   &#039;sim_port&#039;: int&lt;br /&gt;
   &#039;region_x&#039;: int&lt;br /&gt;
   &#039;region_y&#039;: int&lt;br /&gt;
   &#039;region_id&#039; : uuid&lt;br /&gt;
   &#039;sim_access&#039; : &amp;lt;PG/Mature&amp;gt;&lt;br /&gt;
   &#039;connect&#039;: bool&lt;br /&gt;
   &#039;position&#039;: [f32, f32, f32]&lt;br /&gt;
 // The above are the same as response to rez_avatar&lt;br /&gt;
 // The following are only returned on login, not over teleport&lt;br /&gt;
    &#039;session_id&#039;:&amp;lt;uuid&amp;gt;&lt;br /&gt;
    &#039;secure_session_id&#039;:&amp;lt;uuid&amp;gt;&lt;br /&gt;
    &#039;circuit_code&#039;:&amp;lt;int&amp;gt;&lt;br /&gt;
 // Extra stuff&lt;br /&gt;
    &#039;connect&#039;: &amp;lt;bool&amp;gt;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= rez_avatar/request =&lt;br /&gt;
== Request: agentd -&amp;gt; simulator ==&lt;br /&gt;
 {&lt;br /&gt;
    &#039;agent_id&#039; : &amp;lt;uuid&amp;gt;,&lt;br /&gt;
    &#039;first_name&#039;: &amp;lt;string&amp;gt;,&lt;br /&gt;
    &#039;last_name&#039;: &amp;lt;string&amp;gt;,&lt;br /&gt;
    &#039;age_verified&#039; : &amp;lt;boolean&amp;gt;,&lt;br /&gt;
    &#039;agent_access&#039; : &amp;lt;boolean&amp;gt;,&lt;br /&gt;
    &#039;allow_redirect: &amp;lt;boolean&amp;gt;,&lt;br /&gt;
    &#039;god_level&#039;:  &amp;lt;int&amp;gt;,&lt;br /&gt;
    &#039;identified&#039;:  &amp;lt;bool&amp;gt;,&lt;br /&gt;
    &#039;transacted&#039;: &amp;lt;bool&amp;gt;,&lt;br /&gt;
    &#039;limited_to_estate&#039;: &amp;lt;int&amp;gt;&lt;br /&gt;
     &#039;sim_access&#039; : &amp;lt;PG/Mature&amp;gt;,&lt;br /&gt;
    &#039;granters&#039;: []&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Example: (hard coded) ==&lt;br /&gt;
 {&lt;br /&gt;
   &#039;agent_id&#039; : &amp;lt;uuid&amp;gt;,&lt;br /&gt;
   &#039;first_name&#039;: &amp;lt;string&amp;gt;,&lt;br /&gt;
   &#039;last_name&#039;: &amp;lt;string&amp;gt;,&lt;br /&gt;
   &#039;age_verified&#039; : false, &lt;br /&gt;
   &#039;agent_access&#039; : false,&lt;br /&gt;
   &#039;allow_redirect: 1,&lt;br /&gt;
   &#039;god_level&#039;:  0,&lt;br /&gt;
   &#039;identified&#039;:  false,&lt;br /&gt;
   &#039;transacted&#039;: false,&lt;br /&gt;
   &#039;limited_to_estate&#039;: 1&lt;br /&gt;
   &#039;sim_access&#039; : &#039;PG&#039;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Response to request_rez_avatar ==&lt;br /&gt;
 {&lt;br /&gt;
    &#039;connect&#039;:True&lt;br /&gt;
    &#039;rez_avatar/rez&#039;:&amp;lt;cap&amp;gt;&lt;br /&gt;
    &#039;sim_ip&#039;: ip string&lt;br /&gt;
    &#039;sim_port&#039;: int&lt;br /&gt;
    &#039;region_x&#039;: int&lt;br /&gt;
    &#039;region_y&#039;: int&lt;br /&gt;
    &#039;region_id&#039; : uuid&lt;br /&gt;
    &#039;sim_access&#039; : &amp;lt;PG/Mature&amp;gt;&lt;br /&gt;
    &#039;seed_capability&#039;: uri string&lt;br /&gt;
Optional params for Second Life regions only:&lt;br /&gt;
    &#039;src_can_see_mainland&#039;:&amp;lt;bool&amp;gt;,&lt;br /&gt;
    &#039;src_estate_id&#039;:&amp;lt;int&amp;gt;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Failed request.&lt;br /&gt;
 {&lt;br /&gt;
    &#039;connect&#039;:False&lt;br /&gt;
    &#039;redirect&#039;:False&lt;br /&gt;
    &#039;resethome&#039;:False&lt;br /&gt;
    &#039;message&#039;: string&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Failed request.  Need to reset home location.&lt;br /&gt;
 {&lt;br /&gt;
    &#039;connect&#039;:False&lt;br /&gt;
    &#039;redirect&#039;:False&lt;br /&gt;
    &#039;resethome&#039;:True&lt;br /&gt;
    &#039;message&#039;: string&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Failed request.  Need to redirect to new location&lt;br /&gt;
 {&lt;br /&gt;
    &#039;connect&#039;:False&lt;br /&gt;
    &#039;redirect&#039;:True&lt;br /&gt;
    &#039;resethome&#039;:False&lt;br /&gt;
    &#039;message&#039;: &amp;quot;You have been redirected to a telehub.&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
= rez_avatar/rez =&lt;br /&gt;
== Request: agentd -&amp;gt; simulator OR simulator a -&amp;gt; simulator b via derez_avatar ==&lt;br /&gt;
* For login, the agent domain then invokes rez_avatar on the simulator at the given region_url&lt;br /&gt;
* For teleport, the agent domain invokes derez_avatar on simulator a, which invokes rez_avatar on simulator b&lt;br /&gt;
 {&lt;br /&gt;
    &#039;circuit_code&#039;: &amp;lt;int&amp;gt;,&lt;br /&gt;
    &#039;god_overide&#039;:   &amp;lt;bool&amp;gt;,&lt;br /&gt;
    &#039;position&#039;: [x, y, z],&lt;br /&gt;
    &#039;secure_session_id&#039;:  &amp;lt;uuid&amp;gt;,&lt;br /&gt;
    &#039;session_id&#039;:  &amp;lt;uuid&amp;gt;,&lt;br /&gt;
    &#039;inventory_host&#039;:  &amp;lt;uri string&amp;gt;, // not really here!&lt;br /&gt;
    &#039;voice_password&#039;: &amp;lt;string&amp;gt; // what to do?&lt;br /&gt;
&lt;br /&gt;
    // The following are only sent from simulator a -&amp;gt; simulator b via derez_avatar&lt;br /&gt;
    // Note: No assets are actually being sent through when going from SL -&amp;gt; non-SL regions&lt;br /&gt;
    &#039;attachment_data&#039;: [ {&#039;attachment_point&#039;:&amp;lt;int&amp;gt;, &#039;item_id&#039;:&amp;lt;uuid&amp;gt;, &#039;asset_id&#039;:&amp;lt;uuid&amp;gt; | &#039;asset_data&#039;:&amp;lt;binary&amp;gt;}...]&lt;br /&gt;
    &#039;baked_texture_data&#039;: [ {&#039;texture_id&#039;:&amp;lt;uuid&amp;gt;, &#039;asset_host_name&#039;:&amp;lt;host?????&amp;gt;}...]&lt;br /&gt;
    &#039;texture_data&#039;: [ &amp;lt;uuid&amp;gt;...]&lt;br /&gt;
    &#039;animations&#039;:[{&#039;state&#039;:&amp;lt;uuid&amp;gt;, &#039;source&#039;:&amp;lt;uuid&amp;gt;, &#039;sequence&#039;:&amp;lt;int&amp;gt;}...]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Response: simulator -&amp;gt; agentd ==&lt;br /&gt;
* The simulator then returns the actual region (in case it might be different from requested) and the seed cap.&lt;br /&gt;
 {&lt;br /&gt;
    &#039;look_at&#039; : [f32, f32, f32]&lt;br /&gt;
    &#039;position&#039;: [f32, f32, f32]&lt;br /&gt;
 // Extra stuff&lt;br /&gt;
    &#039;connect&#039;: &amp;lt;bool&amp;gt;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= rez_avatar/derez =&lt;br /&gt;
== Request: agentd -&amp;gt; simulator a ==&lt;br /&gt;
 {&lt;br /&gt;
     &#039;rez_avatar/rez&#039;: &amp;lt;url&amp;gt;&lt;br /&gt;
     &#039;position&#039;:  [x, y, z]&lt;br /&gt;
 }&lt;br /&gt;
Response: simulator a -&amp;gt; agentd&lt;br /&gt;
&lt;br /&gt;
== Response: simulator -&amp;gt; agentd ==&lt;br /&gt;
 {&lt;br /&gt;
    &#039;look_at&#039; : [f32, f32, f32]&lt;br /&gt;
    &#039;position&#039;: [f32, f32, f32]&lt;br /&gt;
 // Extra stuff&lt;br /&gt;
    &#039;connect&#039;: &amp;lt;bool&amp;gt;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category: Pyogp]]&lt;/div&gt;</summary>
		<author><name>Leyla Linden</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=SLGOGP_Teleport_Strawman&amp;diff=81163</id>
		<title>SLGOGP Teleport Strawman</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=SLGOGP_Teleport_Strawman&amp;diff=81163"/>
		<updated>2008-07-28T22:49:51Z</updated>

		<summary type="html">&lt;p&gt;Leyla Linden: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This strawman represents a possible open teleport protocol. The sequencing is described first, which also introduces the major players: Client, Agent Domain, Simulator/Region Domain A, Simulator/Region Domain B. For perspective, the current Second Life Grid teleport flow is also included. Following that are the draft specifications for the two main pieces, called rezAvatar and derezAvatar on the agent domain. The simulator side portions of this protocol have been tentatively dubbed &amp;quot;teleport_avatar&amp;quot; and &amp;quot;give_up_av_to_pipe&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Teleport Flow =&lt;br /&gt;
&lt;br /&gt;
Here is the basic flow for current SL teleports:&lt;br /&gt;
[[Image:Old teleport.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Fine tuning the proposed protocol and cap names after discussion with AWG groupies resulted in a unified approach for Login, Teleport, and Logout, diagrammed below:&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Login ==&lt;br /&gt;
[[Image:Strawman-login-flowchart.png]]&lt;br /&gt;
[[Image:Open grid login.png]]&lt;br /&gt;
&lt;br /&gt;
== Teleport ==&lt;br /&gt;
[[Image:Open Grid Teleport.png | 760px]]&lt;br /&gt;
&lt;br /&gt;
== Logout ==&lt;br /&gt;
[[Image:Open Grid Logout.png]]&lt;br /&gt;
&lt;br /&gt;
= Authentication =&lt;br /&gt;
&lt;br /&gt;
*In order to get the agent host seed capability, credentials must first be posted to http://login.aditi.lindenlab.com/cgi-bin/auth.cgi&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Request: viewer -&amp;gt; auth.cgi ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Required Parameters ===&lt;br /&gt;
 {&lt;br /&gt;
     &#039;firstname&#039;:  &amp;lt;string&amp;gt;,&lt;br /&gt;
     &#039;lastname&#039;:   &amp;lt;string&amp;gt;,&lt;br /&gt;
     &#039;password&#039;:   &amp;lt;string&amp;gt;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
or &lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
     &#039;firstname&#039;:    &amp;lt;string&amp;gt;,&lt;br /&gt;
     &#039;lastname&#039;:     &amp;lt;string&amp;gt;,&lt;br /&gt;
     &#039;md5-password&#039;: &amp;lt;string&amp;gt;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Optional Parameters ===&lt;br /&gt;
 {&lt;br /&gt;
     &#039;agree_to_tos&#039; : &amp;lt;bool&amp;gt;,&lt;br /&gt;
     &#039;read_critical&#039;: &amp;lt;bool&amp;gt;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Response == &lt;br /&gt;
&lt;br /&gt;
=== Successful === &lt;br /&gt;
&lt;br /&gt;
  status:  302 &lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
     &#039;authenticated&#039;: true&lt;br /&gt;
     &#039;location&#039;     : &amp;lt;agent host seed capability url&amp;gt; &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
* Note: the 302 status code will be changed to a 200 in the future&lt;br /&gt;
&lt;br /&gt;
=== Unsuccessful === &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Agent Information =&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&lt;br /&gt;
Agent Information &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Name &lt;br /&gt;
|&lt;br /&gt;
agent/info&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
URL &lt;br /&gt;
|&lt;br /&gt;
capability from agent domain &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Verb &lt;br /&gt;
|&lt;br /&gt;
GET &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Response &lt;br /&gt;
|&lt;br /&gt;
{ agent_id: &amp;lt;uuid&amp;gt;, circuit_code: &amp;lt;int&amp;gt;, session_id: &amp;lt;uuid&amp;gt;, secure_session_id: &amp;lt;uuid&amp;gt;, presence: { status : online|offline, region_url: &amp;lt;url&amp;gt; } &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
 &lt;br /&gt;
|&lt;br /&gt;
a map of agent information for this session &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= rez_avatar/place =&lt;br /&gt;
* Once the viewer acquires the cap for place_avatar, it requests it from the agent domain&lt;br /&gt;
* The viewer can also invoke place_avatar for teleport&lt;br /&gt;
== Request: viewer -&amp;gt; agentd ==&lt;br /&gt;
 {&lt;br /&gt;
     &#039;region_url&#039;: &amp;lt;r_url&amp;gt;&lt;br /&gt;
     &#039;position&#039;:  [x, y, z]&lt;br /&gt;
 }&lt;br /&gt;
== Response ==&lt;br /&gt;
 {&lt;br /&gt;
   &#039;seed_capability&#039;: uri string&lt;br /&gt;
   &#039;look_at&#039; : [f32, f32, f32]&lt;br /&gt;
   &#039;sim_ip&#039;: ip string&lt;br /&gt;
   &#039;sim_port&#039;: int&lt;br /&gt;
   &#039;region_x&#039;: int&lt;br /&gt;
   &#039;region_y&#039;: int&lt;br /&gt;
   &#039;region_id&#039; : uuid&lt;br /&gt;
   &#039;sim_access&#039; : &amp;lt;PG/Mature&amp;gt;&lt;br /&gt;
   &#039;connect&#039;: bool&lt;br /&gt;
   &#039;position&#039;: [f32, f32, f32]&lt;br /&gt;
 // The above are the same as response to rez_avatar&lt;br /&gt;
 // The following are only returned on login, not over teleport&lt;br /&gt;
    &#039;session_id&#039;:&amp;lt;uuid&amp;gt;&lt;br /&gt;
    &#039;secure_session_id&#039;:&amp;lt;uuid&amp;gt;&lt;br /&gt;
    &#039;circuit_code&#039;:&amp;lt;int&amp;gt;&lt;br /&gt;
 // Extra stuff&lt;br /&gt;
    &#039;connect&#039;: &amp;lt;bool&amp;gt;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= rez_avatar/request =&lt;br /&gt;
== Request: agentd -&amp;gt; simulator ==&lt;br /&gt;
 {&lt;br /&gt;
    &#039;agent_id&#039; : &amp;lt;uuid&amp;gt;,&lt;br /&gt;
    &#039;first_name&#039;: &amp;lt;string&amp;gt;,&lt;br /&gt;
    &#039;last_name&#039;: &amp;lt;string&amp;gt;,&lt;br /&gt;
    &#039;age_verified&#039; : &amp;lt;boolean&amp;gt;,&lt;br /&gt;
    &#039;agent_access&#039; : &amp;lt;boolean&amp;gt;,&lt;br /&gt;
    &#039;allow_redirect: &amp;lt;boolean&amp;gt;,&lt;br /&gt;
    &#039;god_level&#039;:  &amp;lt;int&amp;gt;,&lt;br /&gt;
    &#039;identified&#039;:  &amp;lt;bool&amp;gt;,&lt;br /&gt;
    &#039;transacted&#039;: &amp;lt;bool&amp;gt;,&lt;br /&gt;
    &#039;limited_to_estate&#039;: &amp;lt;int&amp;gt;&lt;br /&gt;
     &#039;sim_access&#039; : &amp;lt;PG/Mature&amp;gt;,&lt;br /&gt;
    &#039;granters&#039;: []&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Example: (hard coded) ==&lt;br /&gt;
 {&lt;br /&gt;
   &#039;agent_id&#039; : &amp;lt;uuid&amp;gt;,&lt;br /&gt;
   &#039;first_name&#039;: &amp;lt;string&amp;gt;,&lt;br /&gt;
   &#039;last_name&#039;: &amp;lt;string&amp;gt;,&lt;br /&gt;
   &#039;age_verified&#039; : false, &lt;br /&gt;
   &#039;agent_access&#039; : false,&lt;br /&gt;
   &#039;allow_redirect: 1,&lt;br /&gt;
   &#039;god_level&#039;:  0,&lt;br /&gt;
   &#039;identified&#039;:  false,&lt;br /&gt;
   &#039;transacted&#039;: false,&lt;br /&gt;
   &#039;limited_to_estate&#039;: 1&lt;br /&gt;
   &#039;sim_access&#039; : &#039;PG&#039;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Response to request_rez_avatar ==&lt;br /&gt;
 {&lt;br /&gt;
    &#039;connect&#039;:True&lt;br /&gt;
    &#039;rez_avatar/rez&#039;:&amp;lt;cap&amp;gt;&lt;br /&gt;
    &#039;sim_ip&#039;: ip string&lt;br /&gt;
    &#039;sim_port&#039;: int&lt;br /&gt;
    &#039;region_x&#039;: int&lt;br /&gt;
    &#039;region_y&#039;: int&lt;br /&gt;
    &#039;region_id&#039; : uuid&lt;br /&gt;
    &#039;sim_access&#039; : &amp;lt;PG/Mature&amp;gt;&lt;br /&gt;
    &#039;seed_capability&#039;: uri string&lt;br /&gt;
Optional params for Second Life regions only:&lt;br /&gt;
    &#039;src_can_see_mainland&#039;:&amp;lt;bool&amp;gt;,&lt;br /&gt;
    &#039;src_estate_id&#039;:&amp;lt;int&amp;gt;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Failed request.&lt;br /&gt;
 {&lt;br /&gt;
    &#039;connect&#039;:False&lt;br /&gt;
    &#039;redirect&#039;:False&lt;br /&gt;
    &#039;resethome&#039;:False&lt;br /&gt;
    &#039;message&#039;: string&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Failed request.  Need to reset home location.&lt;br /&gt;
 {&lt;br /&gt;
    &#039;connect&#039;:False&lt;br /&gt;
    &#039;redirect&#039;:False&lt;br /&gt;
    &#039;resethome&#039;:True&lt;br /&gt;
    &#039;message&#039;: string&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Failed request.  Need to redirect to new location&lt;br /&gt;
 {&lt;br /&gt;
    &#039;connect&#039;:False&lt;br /&gt;
    &#039;redirect&#039;:True&lt;br /&gt;
    &#039;resethome&#039;:False&lt;br /&gt;
    &#039;message&#039;: &amp;quot;You have been redirected to a telehub.&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
= rez_avatar/rez =&lt;br /&gt;
== Request: agentd -&amp;gt; simulator OR simulator a -&amp;gt; simulator b via derez_avatar ==&lt;br /&gt;
* For login, the agent domain then invokes rez_avatar on the simulator at the given region_url&lt;br /&gt;
* For teleport, the agent domain invokes derez_avatar on simulator a, which invokes rez_avatar on simulator b&lt;br /&gt;
 {&lt;br /&gt;
    &#039;circuit_code&#039;: &amp;lt;int&amp;gt;,&lt;br /&gt;
    &#039;god_overide&#039;:   &amp;lt;bool&amp;gt;,&lt;br /&gt;
    &#039;position&#039;: [x, y, z],&lt;br /&gt;
    &#039;secure_session_id&#039;:  &amp;lt;uuid&amp;gt;,&lt;br /&gt;
    &#039;session_id&#039;:  &amp;lt;uuid&amp;gt;,&lt;br /&gt;
    &#039;inventory_host&#039;:  &amp;lt;uri string&amp;gt;, // not really here!&lt;br /&gt;
    &#039;voice_password&#039;: &amp;lt;string&amp;gt; // what to do?&lt;br /&gt;
&lt;br /&gt;
    // The following are only sent from simulator a -&amp;gt; simulator b via derez_avatar&lt;br /&gt;
    // Note: No assets are actually being sent through when going from SL -&amp;gt; non-SL regions&lt;br /&gt;
    &#039;attachment_data&#039;: [ {&#039;attachment_point&#039;:&amp;lt;int&amp;gt;, &#039;item_id&#039;:&amp;lt;uuid&amp;gt;, &#039;asset_id&#039;:&amp;lt;uuid&amp;gt; | &#039;asset_data&#039;:&amp;lt;binary&amp;gt;}...]&lt;br /&gt;
    &#039;baked_texture_data&#039;: [ {&#039;texture_id&#039;:&amp;lt;uuid&amp;gt;, &#039;asset_host_name&#039;:&amp;lt;host?????&amp;gt;}...]&lt;br /&gt;
    &#039;texture_data&#039;: [ &amp;lt;uuid&amp;gt;...]&lt;br /&gt;
    &#039;animations&#039;:[{&#039;state&#039;:&amp;lt;uuid&amp;gt;, &#039;source&#039;:&amp;lt;uuid&amp;gt;, &#039;sequence&#039;:&amp;lt;int&amp;gt;}...]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Response: simulator -&amp;gt; agentd ==&lt;br /&gt;
* The simulator then returns the actual region (in case it might be different from requested) and the seed cap.&lt;br /&gt;
 {&lt;br /&gt;
    &#039;look_at&#039; : [f32, f32, f32]&lt;br /&gt;
    &#039;position&#039;: [f32, f32, f32]&lt;br /&gt;
 // Extra stuff&lt;br /&gt;
    &#039;connect&#039;: &amp;lt;bool&amp;gt;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= rez_avatar/derez =&lt;br /&gt;
== Request: agentd -&amp;gt; simulator a ==&lt;br /&gt;
 {&lt;br /&gt;
     &#039;rez_avatar/rez&#039;: &amp;lt;url&amp;gt;&lt;br /&gt;
     &#039;position&#039;:  [x, y, z]&lt;br /&gt;
 }&lt;br /&gt;
Response: simulator a -&amp;gt; agentd&lt;br /&gt;
&lt;br /&gt;
== Response: simulator -&amp;gt; agentd ==&lt;br /&gt;
 {&lt;br /&gt;
    &#039;look_at&#039; : [f32, f32, f32]&lt;br /&gt;
    &#039;position&#039;: [f32, f32, f32]&lt;br /&gt;
 // Extra stuff&lt;br /&gt;
    &#039;connect&#039;: &amp;lt;bool&amp;gt;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category: Pyogp]]&lt;/div&gt;</summary>
		<author><name>Leyla Linden</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Second_Life_Login_API_Strawman&amp;diff=71180</id>
		<title>Second Life Login API Strawman</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Second_Life_Login_API_Strawman&amp;diff=71180"/>
		<updated>2008-06-11T22:54:18Z</updated>

		<summary type="html">&lt;p&gt;Leyla Linden: /* Response */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{multi-lang}}&lt;br /&gt;
&amp;lt;strong&amp;gt; This page is now deprecated. It is retained in the wiki for transparency and for the discussion. The login protocol is now a part of the [[SLGOGP_Draft_1 | SL Grid Open Grid Protocol]] doc and should be referenced there&amp;lt;/strong&amp;gt;&lt;br /&gt;
= Second Life Login API Strawman =&lt;br /&gt;
This is a work in progress.  Also see a similar Strawman by AWG: [[AWG_flows_login]]&lt;br /&gt;
Innitial meeting with AWG to request feedback on protocol: [[AWGroupies-2008-02-19|Feedback Chat-log, 19 Feb 2008]]&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
This page attempts to merge [[Authentication_Flow]] with [[Current_login_protocols]] and adds additional protocol   changes to fit with [[Agent_Domain#How_login_works]].  The goal is to expose a protocol allowing login to a separate region domain while making incremental, small changes to the current protocol.&lt;br /&gt;
&lt;br /&gt;
== Summary ==&lt;br /&gt;
# *Viewer sends credentials to the Login Service [[#Login_Web_Service]]&lt;br /&gt;
# Login Service authenticates and sets up and queries for presence:&lt;br /&gt;
#* Queries the agent data from the Agent Store.&lt;br /&gt;
#* Finds an agent host, POST&#039;s agent presence checking for already online&lt;br /&gt;
#* grants seed capability, which lives on an agent host&lt;br /&gt;
# *Viewer requests capabilities needed for login via received seed capability. [[#Seed_Capability]]&lt;br /&gt;
# *(future) Viewer Polls Agent Host for messages via long-poll [[#poll_for_messages_Capability]]&lt;br /&gt;
# *(future) Viewer can send instant messages before being in world. [[#instant_message_Capability]]&lt;br /&gt;
# *Viewer invokes legacy_login capability [[#legacy_login_Capability]]&lt;br /&gt;
#* Initialization data returned by login&lt;br /&gt;
#* Sets up agent presence&lt;br /&gt;
#* Forwards location request to region domain, finding a region to rez the avatar&lt;br /&gt;
#* Establishes session with region host, which gives back a (region domain) seed capability to the client&lt;br /&gt;
# *Viewer invokes region seed capability&lt;br /&gt;
&lt;br /&gt;
== Definitions ==&lt;br /&gt;
=== Seed Capability ===&lt;br /&gt;
The current Login Seed Capability is a [[Capabilities|Capability]] associated with the simulator you are logging into. It should not be confused with the [[#Agent_Seed_Capability]] proposed for the new protocols.&lt;br /&gt;
&lt;br /&gt;
=== Agent Seed Capability ===&lt;br /&gt;
This is a newly introduced capability associated with the agent host as part of the agent domain.  &lt;br /&gt;
This is different from the previously mentioned seed-capability, which associates with the sim host as part of the region domain.&lt;br /&gt;
&lt;br /&gt;
== Conventions ==&lt;br /&gt;
On this page the following conventions are used:&lt;br /&gt;
&lt;br /&gt;
:&amp;quot;--&amp;quot; followed by text, indicates a comment until the end of line, ala the C++ &amp;quot;//&amp;quot; style comments.&lt;br /&gt;
:&amp;lt; represents a value which can be substituted by an appropriate string described inside &amp;gt; &lt;br /&gt;
:&amp;lt; represents a list of choices | separated by a vertical bar &amp;gt;&lt;br /&gt;
:&amp;quot;...&amp;quot; ellipses indicates an unknown list of similar values follow&lt;br /&gt;
:&amp;quot;&amp;lt;int&amp;gt;&amp;quot; represents an [[integer]] value&lt;br /&gt;
:&amp;quot;&amp;lt;uuid&amp;gt;&amp;quot; represents a [[UUID]] value, e.g., &#039;c5853f4c-855f-4013-ce92-aabc59f1b9d8&#039;&lt;br /&gt;
:The remaining syntax follows (very roughly) that of Python data structures:&lt;br /&gt;
::&amp;quot;in quotes is a literal string&amp;quot;&lt;br /&gt;
::{ &amp;lt;represents a map or dictionary of one or more key&amp;gt;:&amp;lt;value pairs&amp;gt; }  -- separated by commas &lt;br /&gt;
::[ represents an array, of elements, separated by commas ]&lt;br /&gt;
::&#039;represents a string that must be quoted, but how will be implementation specific&#039; for example in LSL &amp;quot;&amp;quot; denotes a string and &amp;quot; will be used in place of the single quote (&#039;).&lt;br /&gt;
::+ means to concatenate the two parts, though how will be implementation specific, for example + can be used to concatenate strings.&lt;br /&gt;
&lt;br /&gt;
== Login Web Service ==&lt;br /&gt;
Client --&amp;gt; public Login Server: &amp;quot;Here is my credential, and optional agent identity desired&amp;quot;&lt;br /&gt;
Second Life Login Server: https://login.agni.secondlife.com/app/login/&lt;br /&gt;
&lt;br /&gt;
The login will be done using standard http/1.1 POST and the default format for all parameters in POST and RESPONSE will likely be &amp;quot;content-type&amp;quot; = &amp;quot;application/xml&amp;quot; and the actual xml format will be the [[LLSD#Example_XML_Output|text serialization of Linden Lab&#039;s XML-LLSD format]]. Future formats will be negotiated using [http://www.w3.org/Protocols/rfc2616/rfc2616-sec12.html#sec12| standard http/1.1 Content Negotiation].&lt;br /&gt;
=== Required Parameters ===&lt;br /&gt;
    { &#039;credential&#039;: { &#039;type&#039;: &#039;agent&#039;,&lt;br /&gt;
                      &#039;first_name&#039;: &amp;lt;first&amp;gt;,&lt;br /&gt;
                      &#039;last_name&#039;: &amp;lt;last&amp;gt;,&lt;br /&gt;
                      &#039;password&#039;: &#039;$1$&#039; + &amp;lt;passwd_md5&amp;gt; } }&lt;br /&gt;
OR (future)&lt;br /&gt;
    { &#039;credential&#039;: { &#039;type&#039;: &#039;account&#039;,&lt;br /&gt;
                      &#039;account_name&#039;: &amp;lt;IBM&amp;gt;,&lt;br /&gt;
                      &#039;password&#039;: &#039;$1$&#039; + &amp;lt;passwd_md5&amp;gt; } }&lt;br /&gt;
OR (future)&lt;br /&gt;
    { &#039;credential&#039;: { &#039;type&#039;: &#039;openid&#039;,&lt;br /&gt;
                      &#039;url&#039;: &amp;lt;URL&amp;gt; } }&lt;br /&gt;
&lt;br /&gt;
OR (future)&lt;br /&gt;
    { &#039;credential&#039;: { &#039;type&#039;: &#039;agent&#039;,&lt;br /&gt;
                      &#039;first_name&#039;: &amp;lt;first&amp;gt;,&lt;br /&gt;
                      &#039;last_name&#039;: &amp;lt;last&amp;gt;}}&lt;br /&gt;
which will need to a challenge from the auth system.&lt;br /&gt;
&lt;br /&gt;
== Optional Parameters ==&lt;br /&gt;
Optionally, specify which account you want this credential to log you into&lt;br /&gt;
    { &#039;credential&#039;: { &#039;type&#039;: &#039;agent&#039;,&lt;br /&gt;
                      &#039;first_name&#039;: &amp;lt;first&amp;gt;,&lt;br /&gt;
                      &#039;last_name&#039;: &amp;lt;last&amp;gt;,&lt;br /&gt;
                      &#039;password&#039;: &#039;$1$&#039; + &amp;lt;passwd_md5&amp;gt; },&lt;br /&gt;
      &#039;first_name&#039;: &amp;lt;first&amp;gt;,&lt;br /&gt;
      &#039;last_name&#039;: &amp;lt;last&amp;gt; }&lt;br /&gt;
=== Response ===&lt;br /&gt;
Response Codes : Response&lt;br /&gt;
200 : Successful authentication.&lt;br /&gt;
    { &#039;agent seed-capability&#039; : &amp;lt;url&amp;gt; -- agent domain seed capability] }&lt;br /&gt;
4xx : If this credential has more than one account linked to it, and no specific account was specified in the optional parameters, the response will list a set of accounts to choose from.&lt;br /&gt;
    { &#039;reason&#039;: &#039;select account&#039;,  -- reason why authentication failed&lt;br /&gt;
      &#039;accounts&#039; : [ { &#039;first_name&#039; : &amp;lt;first&amp;gt;, &#039;last_name&#039; : &amp;lt;last&amp;gt; },&lt;br /&gt;
                     { &#039;first_name&#039; : &amp;lt;first&amp;gt;, &#039;last_name&#039; : &amp;lt;last&amp;gt; },&lt;br /&gt;
                     ... ] }&lt;br /&gt;
4xx : Unsuccessful authentication due to need for more information.&lt;br /&gt;
    { &#039;reason&#039;: &amp;lt;&#039;tos&#039;|&#039;critical&#039;|&#039;more info&#039;&amp;gt;,  -- reason why authentication failed&lt;br /&gt;
      &#039;redirect&#039; : &amp;lt;url&amp;gt;  } -- URL to visit to get more information on how to proceed&lt;br /&gt;
Other reasons:&lt;br /&gt;
    * no agent - 404&lt;br /&gt;
    * bad identity and authentication information - 403&lt;br /&gt;
    * agent not enabled (banned) - 403&lt;br /&gt;
5xx : Server unavailable.&lt;br /&gt;
    { &#039;reason&#039;: &#039;generic&#039; }&lt;br /&gt;
&lt;br /&gt;
== Seed Capability ==&lt;br /&gt;
Client -&amp;gt; Agent Host (via seed cap): &amp;quot;I want cap X&amp;quot;&lt;br /&gt;
* This service supports named capabilities for the agent domain requested by the client&lt;br /&gt;
=== Required Parameters ===&lt;br /&gt;
Map of named capabilities to Options&lt;br /&gt;
    { &#039;caps&#039;: {&amp;lt;capability name&amp;gt; : { &#039;enabled&#039; : &amp;lt;&#039;true&#039; | &#039;false&#039;&amp;gt; },&lt;br /&gt;
      &amp;lt;capability name&amp;gt; : { &#039;enabled&#039; : &amp;lt;&#039;true&#039; | &#039;false&#039;&amp;gt; },&lt;br /&gt;
      ... }&lt;br /&gt;
    }&lt;br /&gt;
    &amp;lt;- Ok, here&#039;s the cap to do X&lt;br /&gt;
    -or-&lt;br /&gt;
    &amp;lt;- Bzzzp, you don&#039;t get to do X&lt;br /&gt;
&lt;br /&gt;
=== Response ===&lt;br /&gt;
Map of capability name to capability URL:&lt;br /&gt;
    { &#039;caps&#039;: {&amp;lt;capability name&amp;gt; : &amp;lt;url&amp;gt;, &amp;lt;capability name&amp;gt; : &amp;lt;url&amp;gt;, ... }}&lt;br /&gt;
&lt;br /&gt;
=== Example: Basic Login Capabilities ===&lt;br /&gt;
POST data:&lt;br /&gt;
    { &#039;establish_presence&#039; : { &#039;enabled&#039; : &#039;true&#039; },&lt;br /&gt;
      &#039;inventory&#039; : { &#039;enabled&#039; : &#039;true&#039; },&lt;br /&gt;
      &#039;non_existent_cap&#039; : { &#039;enabled&#039; : &#039;false&#039; },&lt;br /&gt;
      &#039;be_in_world&#039; : { &#039;enabled&#039; : &#039;true&#039; } }&lt;br /&gt;
Response value:&lt;br /&gt;
    { &#039;establish_presence&#039; : &amp;lt;cap GO&amp;gt;, &#039;inventory&#039; : &amp;lt;cap I&amp;gt;, &#039;be_in_world&#039; : &amp;lt;cap CTR&amp;gt; }&lt;br /&gt;
&lt;br /&gt;
== RezAvatar Capability ==&lt;br /&gt;
This is the hypothetical proposed protocol for the future with many region domains.&lt;br /&gt;
&lt;br /&gt;
RezAvatar agent host service&lt;br /&gt;
    {&#039;region_url&#039;: &amp;lt;r_url&amp;gt;, &#039;position&#039;:  [x, y, z]}&lt;br /&gt;
-&amp;gt;&lt;br /&gt;
    {&#039;session_id&#039;: &amp;lt;s_id&amp;gt;, &#039;secure_session_id&#039;: &amp;lt;ssid&amp;gt;, &#039;circuit_code&#039;: &amp;lt;cc&amp;gt;,&lt;br /&gt;
    &#039;seed_cap&#039;: &amp;lt;s_cap&amp;gt;, &#039;ip_address&#039;: &amp;lt;ip_address&amp;gt;, &#039;udp_port&#039;: &amp;lt;udp_port&amp;gt;, &#039;look_at&#039;: [lx, ly, lz]}&lt;br /&gt;
&lt;br /&gt;
The RezAvatar agent host service invokes the RezAvatar region host service on behalf of the client.&lt;br /&gt;
&lt;br /&gt;
RezAvatar region host service&lt;br /&gt;
    {&#039;avatar_id&#039;: &amp;lt;a_id&amp;gt;, ..., &#039;position&#039;: [x, y, z]}&lt;br /&gt;
-&amp;gt;&lt;br /&gt;
    {&#039;seed_cap&#039;: &amp;lt;s_cap&amp;gt;, &#039;ip_address&#039;: &amp;lt;ip_address&amp;gt;, &#039;udp_port&#039;: &amp;lt;upd port&amp;gt;, &#039;circuit_code&#039;: &amp;lt;cc&amp;gt;, &#039;session_id&#039;: &amp;lt;s_id&amp;gt;, &#039;secure_session_id&#039;: &amp;lt;ssid&amp;gt;, &#039;look_at&#039;: [lx, ly, lz]}&lt;br /&gt;
or&lt;br /&gt;
    403 Forbidden&lt;br /&gt;
&lt;br /&gt;
== legacy_login Capability ==&lt;br /&gt;
This is for connecting to an existing sim.&lt;br /&gt;
&lt;br /&gt;
* Viewer -&amp;gt; Agent Host (via cap LL): &amp;quot;I&#039;d like to log in using the legacy login protocols&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Required Parameters ===&lt;br /&gt;
    { &#039;start&#039;: &amp;lt;&amp;quot;first&amp;quot; | &amp;quot;last&amp;quot; | &amp;lt;uri&amp;gt; &amp;gt;,&lt;br /&gt;
      &amp;quot;channel&amp;quot;: &amp;lt;channel&amp;gt;,&lt;br /&gt;
      &amp;quot;version&amp;quot;: &amp;lt;client version&amp;gt;,&lt;br /&gt;
      &amp;quot;platform&amp;quot;: &amp;lt;&amp;quot;Lin&amp;quot; | &amp;quot;Mac&amp;quot; | &amp;quot;Win&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;quot;mac&amp;quot;: &amp;lt;MAC Address&amp;gt;,&lt;br /&gt;
      &amp;quot;options&amp;quot;: &amp;lt;array of strings&amp;gt;,&lt;br /&gt;
      &amp;quot;id0&amp;quot;: &amp;lt;uuid&amp;gt;,&lt;br /&gt;
      &amp;quot;agree_to_tos&amp;quot;: &amp;lt;&amp;quot;true&amp;quot; | &amp;quot;false&amp;quot; | &amp;quot;&amp;quot;&amp;gt;,&lt;br /&gt;
      &amp;quot;read_critical&amp;quot;: &amp;lt;&amp;quot;true&amp;quot; | &amp;quot;false&amp;quot; | &amp;quot;&amp;quot;&amp;gt;,&lt;br /&gt;
      &amp;quot;viewer_digest&amp;quot;: &amp;lt;uuid&amp;gt;,&lt;br /&gt;
      &amp;quot;options&amp;quot; : [array of strings] }&lt;br /&gt;
&#039;&#039;&#039;start&#039;&#039;&#039; check for trust against region domain, attempt to log in to this region. If it is full or not available, or the agent is not allowed, invoke region domain service to select another. &amp;quot;First&amp;quot; means home location. If home is filled then the grid will try last. If last is filled and home is set, the grid will try home. If neither works, region domain will find a region to put you on.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;channel&#039;&#039;&#039; the name of the client. Used to differentiate official viewers from third party clients.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;options&#039;&#039;&#039; See [[Second_Life_Login_API_Strawman#Optional Parameters|Optional Parameters]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;id0&#039;&#039;&#039; hardware hash (based on the serial number of the first hard drive in Windows) used for uniquely identifying computers.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;viewer_digest&#039;&#039;&#039; MD5 hash of the viewer executable, only relevant when the channel is set to an official Second Life viewer.&lt;br /&gt;
&lt;br /&gt;
=== Optional Parameters ===&lt;br /&gt;
The &amp;quot;options&amp;quot; key points to an array of optional options.  Zero or more of the  following character strings may appear in any order in the array:&lt;br /&gt;
    { &#039;options&#039; : &amp;lt;&amp;quot;inventory-root&amp;quot; | &amp;quot;inventory-skeleton&amp;quot; | &amp;quot;inventory-lib-root&amp;quot; |&lt;br /&gt;
      &amp;quot;inventory-lib-owner&amp;quot; | &amp;quot;inventory-skel-lib&amp;quot; | &amp;quot;gestures&amp;quot; | &amp;quot;event_categories&amp;quot; |&lt;br /&gt;
      &amp;quot;event_notifications&amp;quot; | &amp;quot;classified_categories&amp;quot; | &amp;quot;buddy_list&amp;quot; | &amp;quot;ui-config&amp;quot; | &lt;br /&gt;
      &amp;quot;login-flags&amp;quot; | &amp;quot;global-textures&amp;quot;&amp;gt;* }&lt;br /&gt;
See [[Second_Life_Login_API_Strawman#Optional Response|Optional Response]] for descriptions of information returned from these options&lt;br /&gt;
&lt;br /&gt;
=== Required Response ===&lt;br /&gt;
&lt;br /&gt;
The valid (non-error) value returned by the login call is in standard xmlrpc name, value format. The most important of these is the [[Current_login_protocols#Login_Seed-Capability|&amp;quot;Login Seed-Capability&amp;quot;]] discussed below (not to be confused with the new &amp;quot;seed capability&amp;quot; for the new login procedure):&lt;br /&gt;
     { &amp;quot;last_name&amp;quot; : lastname ,&lt;br /&gt;
      &amp;quot;sim_ip&amp;quot; : 64.129.40.58 ,&lt;br /&gt;
      &amp;quot;start_location&amp;quot; : last ,&lt;br /&gt;
      &amp;quot;seconds_since_epoch&amp;quot; : 1195447316 ,&lt;br /&gt;
      &amp;quot;message&amp;quot; : -=- http://blog.secondlife.com -=- Visit the Official Linden Blog for the latest world status updates! ,&lt;br /&gt;
      &amp;quot;first_name&amp;quot; : first_name ,&lt;br /&gt;
      &amp;quot;circuit_code&amp;quot; : 245160577 ,&lt;br /&gt;
      &amp;quot;sim_port&amp;quot; : 13005 ,&lt;br /&gt;
      &amp;quot;secure_session_id&amp;quot; : fdb501ca-22f1-4470-b515-2650f54b8117 ,&lt;br /&gt;
      &amp;quot;look_at&amp;quot; : [r-0.85717299999999996274,r0.51502899999999995906,r0] ,&lt;br /&gt;
      &amp;quot;agent_id&amp;quot; : d5f403c7-7981-425d-a0b5-c65a3d0a4693 ,&lt;br /&gt;
      &amp;quot;inventory_host&amp;quot; : inv12-mysql ,&lt;br /&gt;
      &amp;quot;region_y&amp;quot; : 244992 ,&lt;br /&gt;
      &amp;quot;region_x&amp;quot; : 247808 ,&lt;br /&gt;
      &amp;quot;seed_capability&amp;quot; : https://sim2054.agni.lindenlab.com:12043/cap/d373fdc9-d275-e484-3ad2-4a9b231f4e34 ,&lt;br /&gt;
      &amp;quot;agent_access&amp;quot; : M ,&lt;br /&gt;
      &amp;quot;session_id&amp;quot; : 65a7213a-723a-4fcf-baca-7b247c4b43c5 ,&lt;br /&gt;
      &amp;quot;login&amp;quot; : true }&lt;br /&gt;
&lt;br /&gt;
=== Optional Response ===&lt;br /&gt;
:Note: all return values are in &amp;quot;name: value&amp;quot; format as used in [http://docs.python.org/lib/typesmapping.html Python 2.5 dictionaries] unless otherwise noted.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;inventory-root&#039;&#039;&#039; &lt;br /&gt;
:UUID of the agent’s root inventory folder.&lt;br /&gt;
{ &#039;inventory-root&#039;: [{&#039;folder_id&#039;: &amp;lt;uuid&amp;gt;}] }  &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;inventory-skeleton&#039;&#039;&#039; &lt;br /&gt;
:Initial list of folders in agent’s inventory. Returned as an array of five-entry dictionaries. Each dictionary element describes a folder with its name, version, type, its UUID, and the UUID of the containing folder.&lt;br /&gt;
{&#039;inventory-skeleton&#039;: [{&#039;parent_id&#039;: &amp;lt;uuid&amp;gt;, &#039;version&#039;: &amp;lt;int&amp;gt;, &#039;name&#039;: &amp;lt;name&amp;gt;, &#039;type_default&#039;: &amp;lt;int&amp;gt;, &#039;folder_id&#039;: &amp;lt;uuid&amp;gt;},  .... ]}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;inventory-lib-root&#039;&#039;&#039; &lt;br /&gt;
:folder_id of library root inventory folder.&lt;br /&gt;
{ &#039;inventory-lib-root&#039;: [{&#039;folder_id&#039;: &amp;lt;uuid&amp;gt;}] }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;inventory-lib-owner&#039;&#039;&#039; &lt;br /&gt;
:agent_id of owner for inventory lib.   &lt;br /&gt;
{ &#039;inventory-lib-owner&#039;: [{&#039;agent_id&#039;: &amp;lt;uuid&amp;gt;}] }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;inventory-skel-lib&#039;&#039;&#039; &lt;br /&gt;
:Initial list of folders in agent’s inventory. Returned as an array of five element dictionaires. Each dictionary describes a folder with its name, its UUID, the UUID of the containing folder, its type, its version.&lt;br /&gt;
{&#039;inventory-skeleton&#039;:  [{&#039;parent_id&#039;: &amp;lt;uuid&amp;gt;, &#039;version&#039;: &amp;lt;int&amp;gt;, &#039;name&#039;: &amp;lt;name&amp;gt;, &#039;type_default&#039;: &amp;lt;int&amp;gt;, &#039;folder_id&#039;: &amp;lt;uuid&amp;gt;},... ]}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gestures&#039;&#039;&#039; &lt;br /&gt;
:List of active gestures. An array of two element dictionaries with the inventory item uuid and the asset uuid.&lt;br /&gt;
{ &#039;gestures&#039;:  [{&#039;item_id&#039;: &amp;lt;uuid&amp;gt;, &#039;asset_id&#039;: &amp;lt;uuid&amp;gt;},...] }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;event_categories&#039;&#039;&#039;  &lt;br /&gt;
:List of different event categories, mapping category id (an integer) to a category name. Returned as an array of two element dictionaries. Each dictionary describes a category’s id and it’s name.&lt;br /&gt;
{ &#039;event_categories&#039;: [{&#039;category_id&#039;: &amp;lt;int&amp;gt;, &#039;category_name&#039;: &amp;lt;name&amp;gt;},...] }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;event_notifications&#039;&#039;&#039; &lt;br /&gt;
:List of events for which the agent has pending notifications. An array of eight-element dictionaries containing: event_id, event_name, event_desc, event_date, grid_x, grid_y, x_region, y_region.&lt;br /&gt;
{&#039;events&#039;: [{&amp;quot;event_id&amp;quot;:&amp;lt;uuid&amp;gt;, &amp;quot;event_name&amp;quot;&amp;lt;name&amp;gt;,&amp;quot;event_desc&amp;quot;:&amp;lt;string&amp;gt;, &amp;quot;event_date&amp;quot;:&amp;lt;date&amp;gt;, &amp;quot;grid_x&amp;quot;:&amp;lt;float&amp;gt;, &amp;quot;grid_y&amp;quot;:&amp;lt;float&amp;gt;, &amp;quot;x_region&amp;quot;:&amp;lt;float&amp;gt;, &amp;quot;y_region&amp;quot;:&amp;lt;float&amp;gt;}, ...]}&lt;br /&gt;
                  &lt;br /&gt;
&#039;&#039;&#039;classified_categories&amp;quot;&#039;&#039;&#039; &lt;br /&gt;
:List of classifieds categories, mapping category id (an integer) to a category. Returned as an array of two element dictionaries with a category’s id and it’s name.&lt;br /&gt;
{ &#039;event_categories&#039;: [{&#039;category_id&#039;: &amp;lt;int&amp;gt;, &#039;category_name&#039;: &amp;lt;name&amp;gt;},...] }&lt;br /&gt;
           &lt;br /&gt;
&#039;&#039;&#039;buddy-list&#039;&#039;&#039;&lt;br /&gt;
:List of friends with granted and given rights masks. Returned as an array  of three-element dictionaries with riend’s agent id, granted rights mask, given rights mask. &lt;br /&gt;
{ &#039;buddy-list&#039;:[{&#039;buddy_id&#039;: &amp;lt;uuid&amp;gt;&#039;, &#039;buddy_rights_given&#039;: &amp;lt;int&amp;gt;, &#039;buddy_rights_has&#039;: &amp;lt;int&amp;gt;}, ....] }&lt;br /&gt;
            &lt;br /&gt;
&#039;&#039;&#039;ui-config&#039;&#039;&#039; &lt;br /&gt;
:list of UI enabled/disabled states, currently: allow_first_life (&#039;Y&#039; or &#039;N&#039;) for teens.   &lt;br /&gt;
{ &#039;ui-config&#039;: {&#039;allow_first_life&#039;: if allow first life} }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;login-flags&#039;&#039;&#039;  &lt;br /&gt;
:Several flags about the state of the agent.&lt;br /&gt;
{ &#039;login-flags&#039;: {&#039;stipend_since_login&#039;: &amp;lt;&#039;Y&#039;|&#039;N&#039;&amp;gt;,  &#039;ever_logged_in&#039;: &amp;lt;&#039;Y&#039;|&#039;N&#039;&amp;gt;, &#039;gendered&#039;: &amp;lt;&#039;Y&#039;|&#039;N&#039;&amp;gt;, &#039;daylight_savings&#039;: &amp;lt;&#039;Y&#039;|&#039;N&#039;&amp;gt;} }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;global-textures&#039;&#039;&#039; &lt;br /&gt;
:The asset ids of several global textures.&lt;br /&gt;
{ &#039;global-textures&#039;: {&#039;sun_texture_id&#039;: &amp;lt;uuid&amp;gt;, &#039;moon_texture_id&#039;: &amp;lt;uuid&amp;gt;, &#039;cloud_texture_id&#039;: &amp;lt;uuid&amp;gt;} }&lt;br /&gt;
&lt;br /&gt;
[[Category: AW Groupies]]&lt;/div&gt;</summary>
		<author><name>Leyla Linden</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Talk:SLGOGP_Draft_1&amp;diff=60230</id>
		<title>Talk:SLGOGP Draft 1</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Talk:SLGOGP_Draft_1&amp;diff=60230"/>
		<updated>2008-03-27T21:56:00Z</updated>

		<summary type="html">&lt;p&gt;Leyla Linden: moved transforms discussion into the legacy login discussion section&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== wiki-typo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;::&amp;lt;small&amp;gt;All contributions to this document must be contributed under the Second Life Project Contribution Agreement. See http://wiki.secondlife.com/wiki/Project:Contribution_Agreementfor details &amp;lt;/small&amp;gt;&amp;lt;/nowiki&amp;gt; should be &amp;lt;nowiki&amp;gt;::&amp;lt;small&amp;gt;All contributions to this document must be contributed under the [[Project:Contribution Agreement|Second Life Project Contribution Agreement]].&amp;lt;/small&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[User:SignpostMarv Martin|SignpostMarv Martin]] 11:05, 11 March 2008 (PDT)&lt;br /&gt;
&lt;br /&gt;
How does this take into account Open Avatar efforts?&lt;br /&gt;
--[[User:Destiny Niles|Destiny Niles]] 12:09, 11 March 2008 (PDT)&lt;br /&gt;
&lt;br /&gt;
Wiki content licensing is specified in the footer of every page, including this one.  It can&#039;t be changed arbitrarily either, unless new content avoids reusing old content which is under [http://creativecommons.org/licenses/by-sa/2.5/ CCAS] license, which would be pretty silly.  This is a wiki after all.  Its very purpose is unhindered cooperation and building upon the work of others. [[User:Morgaine Dinova|Morgaine Dinova]] 14:52, 11 March 2008 (PDT)&lt;/div&gt;</summary>
		<author><name>Leyla Linden</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=SLGOGP_Draft_1/Discuss_3-2_Legacy_Login&amp;diff=60229</id>
		<title>SLGOGP Draft 1/Discuss 3-2 Legacy Login</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=SLGOGP_Draft_1/Discuss_3-2_Legacy_Login&amp;diff=60229"/>
		<updated>2008-03-27T21:54:30Z</updated>

		<summary type="html">&lt;p&gt;Leyla Linden: New page: == Legacy Login Transforms ==  Occasionally an agent will have one or more transforms in the database.  These include things like changing estates or moving inventory that happen on login....&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Legacy Login Transforms ==&lt;br /&gt;
&lt;br /&gt;
Occasionally an agent will have one or more transforms in the database.  These include things like changing estates or moving inventory that happen on login.  In this case the response of legacy login will not have &lt;br /&gt;
 &lt;br /&gt;
&amp;lt;code&amp;gt;{ login: true }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
but will instead include&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;{ login: indeterminate, next_url: &#039;&#039;transform_url&#039;&#039;, next_method: transform, message: &#039;&#039;a status update&#039;&#039; }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In this case the client needs to post everything it posted to the legacy login resource to the next_url in the response.  The response from that may come back as another transform or if there no more transforms left the response will include&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;{ login: true, next_url: &#039;&#039;login_url&#039;&#039;, next_method: login_to_simulator }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
at which point the next_url will be the legacy login resource and posting to it as we did before should result in the successful legacy login resource response.&lt;br /&gt;
&lt;br /&gt;
[[User:Leyla Linden|Leyla Linden]] 17:17, 26 March 2008 (PDT)&lt;/div&gt;</summary>
		<author><name>Leyla Linden</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Talk:SLGOGP_Draft_1&amp;diff=60181</id>
		<title>Talk:SLGOGP Draft 1</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Talk:SLGOGP_Draft_1&amp;diff=60181"/>
		<updated>2008-03-27T00:17:29Z</updated>

		<summary type="html">&lt;p&gt;Leyla Linden: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== wiki-typo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;::&amp;lt;small&amp;gt;All contributions to this document must be contributed under the Second Life Project Contribution Agreement. See http://wiki.secondlife.com/wiki/Project:Contribution_Agreementfor details &amp;lt;/small&amp;gt;&amp;lt;/nowiki&amp;gt; should be &amp;lt;nowiki&amp;gt;::&amp;lt;small&amp;gt;All contributions to this document must be contributed under the [[Project:Contribution Agreement|Second Life Project Contribution Agreement]].&amp;lt;/small&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[User:SignpostMarv Martin|SignpostMarv Martin]] 11:05, 11 March 2008 (PDT)&lt;br /&gt;
&lt;br /&gt;
How does this take into account Open Avatar efforts?&lt;br /&gt;
--[[User:Destiny Niles|Destiny Niles]] 12:09, 11 March 2008 (PDT)&lt;br /&gt;
&lt;br /&gt;
Wiki content licensing is specified in the footer of every page, including this one.  It can&#039;t be changed arbitrarily either, unless new content avoids reusing old content which is under [http://creativecommons.org/licenses/by-sa/2.5/ CCAS] license, which would be pretty silly.  This is a wiki after all.  Its very purpose is unhindered cooperation and building upon the work of others. [[User:Morgaine Dinova|Morgaine Dinova]] 14:52, 11 March 2008 (PDT)&lt;br /&gt;
&lt;br /&gt;
== Legacy Login Transforms ==&lt;br /&gt;
&lt;br /&gt;
Occasionally an agent will have one or more transforms in the database.  These include things like changing estates or moving inventory that happen on login.  In this case the response of legacy login will not have &lt;br /&gt;
 &lt;br /&gt;
&amp;lt;code&amp;gt;{ login: true }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
but will instead include&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;{ login: indeterminate, next_url: &#039;&#039;transform_url&#039;&#039;, next_method: transform, message: &#039;&#039;a status update&#039;&#039; }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In this case the client needs to post everything it posted to the legacy login resource to the next_url in the response.  The response from that may come back as another transform or if there no more transforms left the response will include&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;{ login: true, next_url: &#039;&#039;login_url&#039;&#039;, next_method: login_to_simulator }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
at which point the next_url will be the legacy login resource and posting to it as we did before should result in the successful legacy login resource response.&lt;br /&gt;
&lt;br /&gt;
[[User:Leyla Linden|Leyla Linden]] 17:17, 26 March 2008 (PDT)&lt;/div&gt;</summary>
		<author><name>Leyla Linden</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Talk:SLGOGP_Draft_1&amp;diff=60180</id>
		<title>Talk:SLGOGP Draft 1</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Talk:SLGOGP_Draft_1&amp;diff=60180"/>
		<updated>2008-03-27T00:15:54Z</updated>

		<summary type="html">&lt;p&gt;Leyla Linden: New section: Legacy Login Transforms&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== wiki-typo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;::&amp;lt;small&amp;gt;All contributions to this document must be contributed under the Second Life Project Contribution Agreement. See http://wiki.secondlife.com/wiki/Project:Contribution_Agreementfor details &amp;lt;/small&amp;gt;&amp;lt;/nowiki&amp;gt; should be &amp;lt;nowiki&amp;gt;::&amp;lt;small&amp;gt;All contributions to this document must be contributed under the [[Project:Contribution Agreement|Second Life Project Contribution Agreement]].&amp;lt;/small&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[User:SignpostMarv Martin|SignpostMarv Martin]] 11:05, 11 March 2008 (PDT)&lt;br /&gt;
&lt;br /&gt;
How does this take into account Open Avatar efforts?&lt;br /&gt;
--[[User:Destiny Niles|Destiny Niles]] 12:09, 11 March 2008 (PDT)&lt;br /&gt;
&lt;br /&gt;
Wiki content licensing is specified in the footer of every page, including this one.  It can&#039;t be changed arbitrarily either, unless new content avoids reusing old content which is under [http://creativecommons.org/licenses/by-sa/2.5/ CCAS] license, which would be pretty silly.  This is a wiki after all.  Its very purpose is unhindered cooperation and building upon the work of others. [[User:Morgaine Dinova|Morgaine Dinova]] 14:52, 11 March 2008 (PDT)&lt;br /&gt;
&lt;br /&gt;
== Legacy Login Transforms ==&lt;br /&gt;
&lt;br /&gt;
Occasionally an agent will have one or more transforms in the database.  These include things like changing estates or moving inventory that happen on login.  In this case the response of legacy login will not have &lt;br /&gt;
 &lt;br /&gt;
&amp;lt;code&amp;gt;{ login: true }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
but will instead include&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;{ login: indeterminate, next_url: &#039;&#039;transform_url&#039;&#039;, next_method: transform, message: &#039;&#039;a status update&#039;&#039; }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In this case the client needs to post everything it posted to the legacy login resource to the next_url in the response.  The response from that may come back as another transform or if there no more transforms left the response will include&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;{ login: true, next_url: &#039;&#039;login_url&#039;&#039;, next_method: login_to_simulator }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
at which point the next_url will be the legacy login resource and posting to it as we did before should result in the successful legacy login resource response.&lt;/div&gt;</summary>
		<author><name>Leyla Linden</name></author>
	</entry>
</feed>