demoopentok.lpr 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. program demoopentok;
  2. {$mode objfpc}
  3. uses
  4. JS, Classes, SysUtils, Web, weborworker, libopentok, browserapp;
  5. Type
  6. { TOpenTokApplication }
  7. TOpenTokApplication = Class(TBrowserApplication)
  8. EdtAPIKey : TJSHTMLInputElement;
  9. EdtSession : TJSHTMLInputElement;
  10. EdtToken : TJSHTMLInputElement;
  11. EdtName : TJSHTMLInputElement;
  12. BtnJoin : TJSHTMLButtonElement;
  13. BtnLeave : TJSHTMLButtonElement;
  14. OptionsEl : TJSHTMLElement;
  15. cbPictureInPicture : TJSHTMLInputElement;
  16. VideosEl : TJSHTMLElement;
  17. PublisherEl : TJSHTMLElement;
  18. SubscriberEl : TJSHTMLElement;
  19. private
  20. Fsession : TOTSession;
  21. FPublisher : TOTPublisher;
  22. function CheckInput: Boolean;
  23. function DoJoinClick(aEvent: TJSMouseEvent): boolean;
  24. function DoLeaveClick(aEvent: TJSMouseEvent): boolean;
  25. function DoPictureInPicture(Event: TEventListenerEvent): boolean;
  26. procedure handleError(error: TOTError);
  27. procedure InitElements;
  28. procedure initializeSession;
  29. Protected
  30. Procedure DoRun; override;
  31. end;
  32. { TOpenTokApplication }
  33. procedure TOpenTokApplication.InitElements;
  34. begin
  35. VideosEl:=GetHTMLElement('videos');
  36. PublisherEl:=GetHTMLElement('publisher');
  37. SubscriberEl:=GetHTMLElement('subscriber');
  38. cbPictureInPicture:=TJSHTMLInputElement(GetHTMLElement('cbPictureInPicture'));
  39. EdtAPIKey :=TJSHTMLInputElement(GetHTMLElement('edtAPIKey'));
  40. EdtSession := TJSHTMLInputElement(GetHTMLElement('edtSession'));
  41. EdtToken := TJSHTMLInputElement(GetHTMLElement('edtToken'));
  42. EdtName := TJSHTMLInputElement(GetHTMLElement('edtName'));
  43. BtnJoin := TJSHTMLButtonElement(GetHTMLElement('btnJoin'));
  44. BtnLeave := TJSHTMLButtonElement(GetHTMLElement('btnLeave'));
  45. OptionsEl := GetHTMLElement('Options');
  46. BtnJoin.OnClick:=@DoJoinClick;
  47. BtnLeave.OnClick:=@DoLeaveClick;
  48. cbPictureInPicture.onChange:=@DoPictureInPicture;
  49. end;
  50. procedure TOpenTokApplication.DoRun;
  51. begin
  52. Terminate;
  53. InitElements;
  54. end;
  55. Procedure TOpenTokApplication.handleError(error : TOTError);
  56. begin
  57. if Assigned(error) then
  58. begin
  59. window.alert(error.message);
  60. writeln('Error :',error.message);
  61. end;
  62. end;
  63. function TOpenTokApplication.CheckInput : Boolean;
  64. begin
  65. Result:=(EdtAPIKey.Value<>'') and (EdtSession.Value<>'') and (edtToken.Value<>'');
  66. if not Result then
  67. window.alert('Please fill in APIKey, Session and Token');
  68. end;
  69. function TOpenTokApplication.DoJoinClick(aEvent: TJSMouseEvent): boolean;
  70. begin
  71. Result:=False;
  72. if Not CheckInput then exit;
  73. BtnJoin.disabled:=True;
  74. OptionsEl.style.cssText:='display: none;';
  75. InitializeSession;
  76. BtnLeave.disabled:=False;
  77. end;
  78. function TOpenTokApplication.DoLeaveClick(aEvent: TJSMouseEvent): boolean;
  79. begin
  80. Result:=False;
  81. BtnJoin.disabled:=False;
  82. OptionsEl.style.cssText:='';
  83. FSession.disconnect;
  84. FSession:=Nil;
  85. FPublisher:=Nil;
  86. BtnLeave.disabled:=True;
  87. end;
  88. function TOpenTokApplication.DoPictureInPicture(Event: TEventListenerEvent): boolean;
  89. begin
  90. Result:=False;
  91. if cbPictureInPicture.Checked then
  92. begin
  93. PublisherEl.className:='publisher';
  94. SubscriberEl.className:='subscriber';
  95. end
  96. else
  97. begin
  98. PublisherEl.className:='col-6';
  99. SubscriberEl.className:='col-6';
  100. end
  101. end;
  102. Procedure TOpenTokApplication.initializeSession;
  103. Procedure DoConnect(error : TOTError);
  104. begin
  105. if Assigned(error) then
  106. handleError(error)
  107. else
  108. FSession.publish(FPublisher, @handleError);
  109. end;
  110. procedure DoStreamCreated(event : TJSEvent);
  111. Var
  112. S : TOTStream;
  113. initSub : TOTInitSubscriberOptions;
  114. begin
  115. With TOTStreamEvent(event) do
  116. S:=Stream;
  117. initSub:=TOTInitSubscriberOptions.new;
  118. With initSub do
  119. begin
  120. insertMode:='append';
  121. widthstring:='100%';
  122. heightString:='100%';
  123. end;
  124. FSession.subscribe(S, 'subscriber', InitSub,@HandleError);
  125. end;
  126. var
  127. initPub : TOTInitPublisherOptions;
  128. n : string;
  129. begin
  130. Fsession:=OpenTok.initSession(edtAPIKey.Value, edtSession.Value);
  131. Fsession.on_('streamCreated', @doStreamCreated);
  132. initPub:=TOTInitPublisherOptions.New;
  133. initPub.insertmode:='append';
  134. initPub.widthString:='100%';
  135. initPub.heightString:='100%';
  136. N:=edtName.Value;
  137. if N='' then
  138. N:='You';
  139. initPub.Name:=N;
  140. Fpublisher:=OpenTok.initPublisher('publisher',initPub,@HandleError);
  141. // Connect to the session
  142. Fsession.connect(edtToken.Value, @DoConnect);
  143. end;
  144. begin
  145. With TOpenTokApplication.Create(Nil) do
  146. begin
  147. Title:='OpenTok API Demo';
  148. Initialize;
  149. Run;
  150. end;
  151. end.