/* Ċ Ġ* Ġ ĠCopyright Ġ 2 0 1 4 ĠThe ĠWeb RTC ĠProject ĠAuthors . ĠAll Ġrights Ġreserved . Ċ Ġ* Ċ Ġ* Ġ ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġa ĠBSD - style Ġlicense Ċ Ġ* Ġ Ġthat Ġcan Ġbe Ġfound Ġin Ġthe ĠLICENSE Ġfile Ġin Ġthe Ġroot Ġof Ġthe Ġsource Ċ Ġ* Ġ Ġtree . ĠAn Ġadditional Ġintel lectual Ġproperty Ġrights Ġgrant Ġcan Ġbe Ġfound Ċ Ġ* Ġ Ġin Ġthe Ġfile ĠPAT ENTS . Ġ ĠAll Ġcontributing Ġproject Ġauthors Ġmay Ċ Ġ* Ġ Ġbe Ġfound Ġin Ġthe ĠAUTHORS Ġfile Ġin Ġthe Ġroot Ġof Ġthe Ġsource Ġtree . Ċ Ġ*/ Ċ package Ġorg . app spot . app rtc Ċ Ċ import Ġorg . app spot . app rtc . App RTC Client . Signal ing Parameters Ċ import Ġorg . app spot . app rtc . util . Async Http URLConnection Ċ import Ġorg . app spot . app rtc . util . Async Http URLConnection . Async Http Events Ċ import Ġorg . app spot . app rtc . util . toList Ċ import Ġorg . json . JSONArray Ċ import Ġorg . json . JSONException Ċ import Ġorg . json . JSONObject Ċ import Ġorg . webrtc . Ice Candidate Ċ import Ġorg . webrtc . Peer Connection . Ice Server Ċ import Ġorg . webrtc . Session Description Ċ import Ġtim ber . log . Tim ber Ċ import Ġjava . io . IOException Ċ import Ġjava . io . InputStream Ċ import Ġjava . net . Http URLConnection Ċ import Ġjava . net . URL Ċ import Ġjava . util .* Ċ Ċ /** Ċ Ġ* ĠAsync Task Ġthat Ġconverts Ġan ĠApp RTC Ġroom ĠURL Ġinto Ġthe Ġset Ġof Ġsignal ing Ċ Ġ* Ġparameters Ġto Ġuse Ġwith Ġthat Ġroom . Ċ Ġ*/ Ċ class ĠRoom Parameters Fetcher ( ĊĠĠĠ Ġprivate Ġval Ġroom Url : ĠString , ĊĠĠĠ Ġprivate Ġval Ġroom Message : ĠString , ĊĠĠĠ Ġprivate Ġval Ġevents : ĠRoom Parameters Fetcher Events , Ċ ) Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRoom Ġparameters Ġfetch er Ġcallbacks . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinterface ĠRoom Parameters Fetcher Events Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCallback Ġfired Ġonce Ġthe Ġroom 's Ġsignal ing Ġparameters ĊĠĠĠĠĠĠĠĠ Ġ* ĠSignal ing Parameters Ġare Ġextracted . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġon Signal ing Parameters Ready ( params : ĠSignal ing Parameters ) ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCallback Ġfor Ġroom Ġparameters Ġextraction Ġerror . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġon Signal ing Parameters Error ( description : ĠString ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġmake Request () Ġ{ ĊĠĠĠĠĠĠĠ ĠTim ber . d (" Connecting Ġto Ġroom : Ġ% s ", Ġroom Url ) ĊĠĠĠĠĠĠĠ Ġval Ġhttp Connection Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAsync Http URLConnection (" POST ", Ġroom Url , Ġroom Message , Ġobject Ġ: ĠAsync Http Events Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Http Error ( errorMessage : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e (" Room Ġconnection Ġerror : Ġ% s ", ĠerrorMessage ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevents . on Signal ing Parameters Error ( errorMessage ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Http Complete ( response : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroom HttpResponse Parse ( response ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġhttp Connection . send () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġroom HttpResponse Parse ( response : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠTim ber . d (" Room Ġresponse : Ġ% s ", Ġresponse ) ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġice Candidates Ġ= Ġarray ListOf < Ice Candidate >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġoffer S dp : ĠSession Description ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġroom Json Ġ= ĠJSONObject ( response ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġroom Json . getString (" result ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result Ġ!= Ġ" SUCCESS ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevents . on Signal ing Parameters Error (" Room Ġresponse Ġerror : Ġ$ result ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroom Json Ġ= ĠJSONObject ( room Json . getString (" params ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġroom Id Ġ= Ġroom Json . getString (" room _ id ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠclientId Ġ= Ġroom Json . getString (" client _ id ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġw ss Url Ġ= Ġroom Json . getString (" wss _ url ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġw ss Post Url Ġ= Ġroom Json . getString (" wss _ post _ url ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinit iator Ġ= Ġroom Json . getBoolean (" is _ init iator ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! init iator ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessages String Ġ= Ġroom Json . getString (" messages ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessages Ġ= ĠJSONArray ( messages String ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġmessages . length ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage String Ġ= Ġmessages . getString ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= ĠJSONObject ( message String ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage Type Ġ= Ġmessage . getString (" type ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" G AE -> C Ġ#% d Ġ: Ġ% s ", Ġi , Ġmessage String ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( message Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" offer " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoffer S dp Ġ= ĠSession Description ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSession Description . Type . from Canonical Form ( message Type ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage . getString (" sdp ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" candidate " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcandidate Ġ= ĠI ce Candidate ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage . getString (" id "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage . getInt (" label "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage . getString (" candidate ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġice Candidates . add ( candidate ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e (" Unknown Ġmessage : Ġ% s ", Ġmessage String ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Room Id : Ġ% s . ĠClient Id : Ġ% s ", Ġroom Id , ĠclientId ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Init iator : Ġ% b ", Ġinit iator ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" W SS Ġurl : Ġ% s ", Ġw ss Url ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" W SS ĠPOST Ġurl : Ġ% s ", Ġw ss Post Url ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġice Servers Ġ= Ġice Servers From PC Config JSON ( room Json . getString (" pc _ config ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġis Turn Present Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( server Ġin Ġice Servers ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Ice Server : Ġ% s ", Ġserver ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( uri Ġin Ġserver . urls ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( uri . startsWith (" turn :" )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Turn Present Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRequest ĠT URN Ġservers . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is Turn Present Ġ&& Ġroom Json . opt String (" ice _ server _ url "). isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġturn Servers Ġ= Ġrequest Turn Servers ( room Json . getString (" ice _ server _ url ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( turn Server Ġin Ġturn Servers ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Turn Server : Ġ% s ", Ġturn Server ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġice Servers . add ( turn Server ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparams Ġ= ĠSignal ing Parameters ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġice Servers , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinit iator , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠclientId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġw ss Url , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġw ss Post Url , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoffer S dp , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġice Candidates ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevents . on Signal ing Parameters Ready ( params ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠJSON Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevents . on Signal ing Parameters Error (" Room ĠJSON Ġparsing Ġerror : Ġ$ e ") ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevents . on Signal ing Parameters Error (" Room ĠIO Ġerror : Ġ$ e ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠRequests Ġ& Ġreturns Ġa ĠT URN ĠI CE ĠServer Ġbased Ġon Ġa Ġrequest ĠURL . Ġ ĠMust Ġbe Ġrun ĊĠĠĠ Ġ// Ġoff Ġthe Ġmain Ġthread ! ĊĠĠĠ Ġ@ Throws ( IOException :: class , ĠJSON Exception :: class ) ĊĠĠĠ Ġprivate Ġfun Ġrequest Turn Servers ( url : ĠString ): ĠList < Ice Server > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġturn Servers : ĠMutable List < Ice Server > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠArrayList () ĊĠĠĠĠĠĠĠ ĠTim ber . d (" Request ĠT URN Ġfrom : Ġ% s ", Ġurl ) ĊĠĠĠĠĠĠĠ Ġval Ġconnection Ġ= ĠURL ( url ). open Connection () Ġas ĠHttp URLConnection ĊĠĠĠĠĠĠĠ Ġconnection . do Output Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġconnection . setRequest Property (" REFER ER ", Ġ" https :// app r . tc ") ĊĠĠĠĠĠĠĠ Ġconnection . connect Timeout Ġ= ĠT URN _ HTTP _ TIMEOUT _ MS ĊĠĠĠĠĠĠĠ Ġconnection . read Timeout Ġ= ĠT URN _ HTTP _ TIMEOUT _ MS ĊĠĠĠĠĠĠĠ Ġval Ġresponse Code Ġ= Ġconnection . response Code ĊĠĠĠĠĠĠĠ Ġif Ġ( response Code Ġ!= Ġ 2 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIOException ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Non - 2 0 0 Ġresponse Ġwhen Ġrequesting ĠT URN Ġserver Ġfrom Ġ" Ġ+ Ġurl Ġ+ Ġ" Ġ: Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġconnection . getHeader Field ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġresponse Stream Ġ= Ġconnection . inputStream ĊĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġdrain Stream ( response Stream ) ĊĠĠĠĠĠĠĠ Ġconnection . disconnect () ĊĠĠĠĠĠĠĠ ĠTim ber . d (" T URN Ġresponse : Ġ% s ", Ġresponse ) ĊĠĠĠĠĠĠĠ Ġval Ġresponse JSON Ġ= ĠJSONObject ( response ) ĊĠĠĠĠĠĠĠ Ġval Ġice Servers Ġ= Ġresponse JSON . get JSONArray (" ice Servers ") ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġice Servers . length ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġserver Ġ= Ġice Servers . getJSONObject ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġturn Urls Ġ= Ġserver . get JSONArray (" urls ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġusername Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( server . has (" username ")) Ġserver . getString (" username ") Ġelse Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcredential Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( server . has (" credential ")) Ġserver . getString (" credential ") Ġelse Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( j Ġin Ġ 0 Ġuntil Ġturn Urls . length ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġturn Url Ġ= Ġturn Urls . getString ( j ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġturn Server Ġ= ĠI ce Server . builder ( turn Url ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Username ( username ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Password ( credential ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. create Ice Server () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġturn Servers . add ( turn Server ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġturn Servers ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠReturn Ġthe Ġlist Ġof ĠI CE Ġservers Ġdescribed Ġby Ġa ĠWeb RT CP eer Connection ĊĠĠĠ Ġ// Ġconfiguration Ġstring . ĊĠĠĠ Ġ@ Throws ( JSONException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġice Servers From PC Config JSON ( pc Config : ĠString ): ĠMutable List < Ice Server > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġjson Ġ= ĠJSONObject ( pc Config ) ĊĠĠĠĠĠĠĠ Ġreturn Ġjson . get JSONArray (" ice Servers "). toList Ġ{ Ġserver Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġurl Ġ= Ġserver . getString (" urls ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcredential Ġ= Ġif Ġ( server . has (" credential ")) Ġserver . getString (" credential ") Ġelse Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ toList ĠI ce Server . builder ( url ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Password ( credential ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. create Ice Server () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠT URN _ HTTP _ TIMEOUT _ MS Ġ= Ġ 5 0 0 0 ĊĊĠĠĠĠĠĠĠ Ġ// ĠReturn Ġthe Ġcontents Ġof Ġan ĠInputStream Ġas Ġa ĠString . ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġdrain Stream (` in `: ĠInputStream ): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġs Ġ= ĠScanner (` in `. buffered Reader ( Charsets . UTF _ 8 )). use Delimiter ("\\ A ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( s . hasNext ()) Ġs . next () Ġelse Ġ"" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ }