4.1 Simple Join
A standard call flow sequence is shown in the following figure. The sequence shown is based on the protocol sequence described in section 3.2.
Figure 12: Standard call flow sequence
When user "Bob" initiates a Simple Join by clicking on the conferencing join web URL, Bob’s browser, which is Internet Explorer in this case, sends an HTTP request to the Join Manager as shown in the following example:
-
GET /meet/bob/MJMVY7RF HTTP/1.1 Accept: image/gif, image/jpeg, image/pjpeg, application/x-ms-application, application/vnd.ms-xpsdocument, application/xaml+xml, application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-shockwave-flash Accept-Language: en-us User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; GTB6;; CWADS32; SLCC1; .NET CLR 2.0.50727; Tablet PC 2.0; .NET CLR 1.1.4322; InfoPath.2; .NET CLR 3.5.21022; MS-RTC LM 8; .NET CLR 3.5.30729; .NET CLR 3.0.30618) Accept-Encoding: gzip, deflate Host: www.fabrikam.com Connection: Keep-Alive Cookie: MC1=GUID=a0e6a97cda7641a496b14ca0665f35a7&HASH=a0e6&LV=20099&V=3; WT_FPC=id=131.107.0.106-1797821888.30059372:lv=1265936990571:ss=1265936990571
The Join Manager parses the conferencing join web URL, creates the ocsmeet XML document string, and sends an HTTP response with embedded script to Bob’s browser, as shown in the following example:
-
HTTP/1.1 200 OK Cache-Control: private Content-Type: text/html; charset=utf-8 Server: Microsoft-IIS/7.5 X-AspNet-Version: 4.0.30319 X-Powered-By: ASP.NET Date: Tue, 01 Jan 2013 00:38:58 GMT Content-Length: 12272 <!--NOTE: If DOCTYPE element is present, it causes the iFrame to be displayed in a small--> <!--portion of the browser window instead of occupying the full browser window.--> <html xmlns="http://www.w3.org/1999/xhtml" class="reachJoinHtml"> <head> <meta http-equiv="X-UA-Compatible" content="IE=10; IE=9; IE=8;"/> <meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0; user-scalable=0;" /> <title>Microsoft Lync</title> <script type="text/javascript"> var reachURL = "https://lyncb.lyncweb.fabrikam.com/lwa/WebPages/LwaClient.aspx?legacy=RmFsc2U!&xml=PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48Y29uZi1pbmZvIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL3J0Yy8yMDA5LzA1L3NpbXBsZWpvaW5jb25mZG9jIj48Y29uZi11cmk-c2lwOnJwdXJpQG1pY3Jvc29mdC5jb207Z3J1dTtvcGFxdWU9YXBwOmNvbmY6Zm9jdXM6aWQ6ODFRTU5TRTg8L2NvbmYtdXJpPjxzZXJ2ZXItdGltZT4xNDc8L3NlcnZlci10aW1lPjxvcmlnaW5hbC1pbmNvbWluZy11cmw-aHR0cHM6Ly9qb2luLm1pY3Jvc29mdC5jb20vbWVldC9ycHVyaS84MVFNTlNFODwvb3JpZ2luYWwtaW5jb21pbmctdXJsPjxjb25mLWtleT44MVFNTlNFODwvY29uZi1rZXk-PGZhbGxiYWNrLXVybD5odHRwczovL2pvaW4ubWljcm9zb2Z0LmNvbS9tZWV0L3JwdXJpLzgxUU1OU0U4P3NsPTwvZmFsbGJhY2stdXJsPjx1Y3dhLXVybD5odHRwczovL2x5bmMwYi5seW5jd2ViLm1pY3Jvc29mdC5jb20vdWN3YS92MS9hcHBsaWNhdGlvbnM8L3Vjd2EtdXJsPjx1Y3dhLWV4dC11cmw-aHR0cHM6Ly9seW5jMGIubHluY3dlYi5taWNyb3NvZnQuY29tL3Vjd2EvdjEvYXBwbGljYXRpb25zPC91Y3dhLWV4dC11cmw-PHVjd2EtaW50LXVybD5odHRwczovLzAwMGR0azVsNTB3ZWIucmVkbW9uZC5jb3JwLm1pY3Jvc29mdC5jb20vdWN3YS92MS9hcHBsaWNhdGlvbnM8L3Vjd2EtaW50LXVybD48dGVsZW1ldHJ5LWlkPmExZGZhMjc5LTA4NTktNDhlYi1hZGE0LTMwZDJlOWY3MGRhODwvdGVsZW1ldHJ5LWlkPjwvY29uZi1pbmZvPg!!"; var escapedXML = "\x3c\x3fxml version\x3d\x221.0\x22 encoding\x3d\x22utf-8\x22\x3f\x3e\x3cconf-info xmlns\x3axsd\x3d\x22http\x3a\x2f\x2fwww.w3.org\x2f2001\x2fXMLSchema\x22 xmlns\x3axsi\x3d\x22http\x3a\x2f\x2fwww.w3.org\x2f2001\x2fXMLSchema-instance\x22 xmlns\x3d\x22http\x3a\x2f\x2fschemas.microsoft.com\x2frtc\x2f2009\x2f05\x2fsimplejoinconfdoc\x22\x3e\x3cconf-uri\x3esip\x3abob\x40fabrikam.com\x3bgruu\x3bopaque\x3dapp\x3aconf\x3afocus\x3aid\x3aMJMVY7RF\x3c\x2fconf-uri\x3e\x3cserver-time\x3e147\x3c\x2fserver-time\x3e\x3coriginal-incoming-url\x3ehttps\x3a\x2f\x2fjoin.fabrikam.com\x2fmeet\x2fbob\x2fMJMVY7RF\x3c\x2foriginal-incoming-url\x3e\x3cconf-key\x3eMJMVY7RF\x3c\x2fconf-key\x3e\x3cfallback-url\x3ehttps\x3a\x2f\x2fjoin.fabrikam.com\x2fmeet\x2fbob\x2fMJMVY7RF\x3fsl\x3d\x3c\x2ffallback-url\x3e\x3cucwa-url\x3ehttps\x3a\x2f\x2flyncb.lyncweb.fabrikam.com\x2fucwa\x2fv1\x2fapplications\x3c\x2fucwa-url\x3e\x3cucwa-ext-url\x3ehttps\x3a\x2f\x2flyncb.lyncweb.fabrikam.com\x2fucwa\x2fv1\x2fapplications\x3c\x2fucwa-ext-url\x3e\x3cucwa-int-url\x3ehttps\x3a\x2f\x2fServer57c.corp.fabrikam.com\x2fucwa\x2fv1\x2fapplications\x3c\x2fucwa-int-url\x3e\x3ctelemetry-id\x3ea1dfa279-0859-48eb-ada4-30d2e9f70da8\x3c\x2ftelemetry-id\x3e\x3c\x2fconf-info\x3e"; var validMeeting = "True"; var reachClientRequested = "False"; var htmlLwaClientRequested = "False"; var currentLanguage = "en-US"; var reachClientProductName = "Lync Web App"; var blockPreCU2Clients = "False"; var isNokia = "False"; var isAndroid = "False"; var isWinPhone = "False"; var isIPhone = "False"; var isIPad = "False"; var isMobile = "False"; var isUnsupported = "False"; var domainOwnerJoinLauncherUrl = ""; var lyncLaunchLink = "conf:sip:bob@fabrikam.com;gruu;opaque=app:conf:focus:id:MJMVY7RF%3Frequired-media=audio"; var diagInfo = "Machine\x3aServer58ABrowserId\x3aMozilla\x2f5.0 \x28compatible\x3b MSIE 10.0\x3b Windows NT 6.2\x3b WOW64\x3b Trident\x2f6.0\x29Join attempted at\x28UTC\x29\x3a1\x2f1\x2f2013 12\x3a38\x3a58 AMTelemetryId\x3aa1dfa279-0859-48eb-ada4-30d2e9f70da8Incoming URL\x3ahttps\x3a\x2f\x2fjoin.fabrikam.com\x2fmeet\x2fbob\x2fMJMVY7RF"; var userExperience = "1500"; var isLwaEnabled = "True"; var escalateToDesktop = "False"; var resourceUrl = "/meet/JavaScriptResourceHandler.ashx?lcs_w15_cu15.0.8308.168&language="; var telemetryId = "a1dfa279-0859-48eb-ada4-30d2e9f70da8"; var errorCode = "-1"; var reachClientTitleString = "Microsoft Lync Web App"; var mobileW1ProtocolHandler = "lync://"; var mobileW2ProtocolHandler = "lync15://"; var lync15CommonProtocolHandler = "lync15:"; var lync15ClassicProtocolHandler = "lync15classic:"; var mlxProtocolHandler = "lync15mlx:"; togglediag = function () { if (userExperience.toLowerCase() != defaultExperienceVersion) { if (document.getElementById("diagInfoText15").style.display == "none") { document.getElementById("diagInfoText15").style.display = "block"; document.getElementById("diagLabel215").style.display = "block"; } else { document.getElementById("diagLabel215").style.display = "none"; document.getElementById("diagInfoText15").style.display = "none"; } } else { // 1400 beahavior if (isMobile.toLowerCase() == "true") { if (document.getElementById("diagInfoTextMobile").style.display == "none") { document.getElementById("diagInfoTextMobile").style.display = "block"; document.getElementById("diagLabel2Mobile").style.display = "block"; } else { document.getElementById("diagLabel2Mobile").style.display = "none"; document.getElementById("diagInfoTextMobile").style.display = "none"; } } else { if (document.getElementById("diagInfoText").style.display == "none") { document.getElementById("diagInfoText").style.display = "block"; document.getElementById("diagLabel2").style.display = "block"; } else { document.getElementById("diagLabel2").style.display = "none"; document.getElementById("diagInfoText").style.display = "none"; } } } } </script> <script type="text/javascript" src="/meet/JavaScript/Utilities.js?lcs_w15_cu15.0.8308.168"></script> <script type="text/javascript" src="/meet/JavaScript/PluginLoader.js?lcs_w15_cu15.0.8308.168"></script> <script type="text/javascript" src="/meet/JavaScript/Launch.js?lcs_w15_cu15.0.8308.168"></script> <link rel="Stylesheet" type="text/css" href="/meet/Resources/ReachClient.css?lcs_w15_cu15.0.8308.168" /> </head> <body onload="mainWindow.OnLoad();" class="reachJoinBody"> /* HTML BODY */ </body> </html>
Bob’s browser receives the response, the script is executed on the computer starting from the OnLoad() method in the Launch.js file, does the necessary checks, loads the ActiveX Controls or Firefox Plug-ins, and eventually calls into a method into the ActiveX Control or Firefox Plug-in. The API then writes the content of the ocsmeet XML document to a file in the temporary location on the computer, defined by the GetTempFolder() Windows API, which is accessible to that user, and eventually calls ShellExecute() on that file path to start the client on Bob’s computer.