OPAL  Version 3.18.8
lyncep.h
Go to the documentation of this file.
1 /*
2  * lyncep.h
3  *
4  * Header file for Lync (UCMA) interface
5  *
6  * Copyright (C) 2016 Vox Lucida Pty. Ltd.
7  *
8  * The contents of this file are subject to the Mozilla Public License
9  * Version 1.0 (the "License"); you may not use this file except in
10  * compliance with the License. You may obtain a copy of the License at
11  * http://www.mozilla.org/MPL/
12  *
13  * Software distributed under the License is distributed on an "AS IS"
14  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
15  * the License for the specific language governing rights and limitations
16  * under the License.
17  *
18  * The Original Code is Portable Windows Library.
19  *
20  * The Initial Developer of the Original Code is Equivalence Pty. Ltd.
21  *
22  * Contributor(s): ______________________________________.
23  */
24 
25 #ifndef OPAL_EP_LYNCEP_H
26 #define OPAL_EP_LYNCEP_H
27 
28 #include <opal_config.h>
29 
30 #if OPAL_LYNC
31 
32 #include <string>
33 
34 /* Class to hide Lync UCMA Managed code
35  This odd arrangement is so when compiling the shim and we include this header
36  file, we do not get all the PTLib stuff which interferes with the managed
37  code interfacing.
38  */
39 class OpalLyncShim
40 {
41  public:
42  OpalLyncShim();
43  ~OpalLyncShim();
44 
45  struct Platform;
46  struct PlatformParams {
47  std::string m_localHost;
48  unsigned m_localPort;
49  std::string m_GRUU;
50  std::string m_certificateFriendlyName;
51  PlatformParams() : m_localPort(5061) { }
52  };
53  Platform * CreatePlatform(const char * userAgent, const PlatformParams & params);
54  Platform * CreatePlatform(const char * userAgent, const char * provisioningID);
55  Platform * CreatePlatform(const char * userAgent);
56  bool DestroyPlatform(Platform * & platform);
57 
58  struct ApplicationEndpoint;
59  struct ApplicationParams {
60  std::string m_ownerURI;
61  std::string m_proxyHost;
62  unsigned m_proxyPort;
63  bool m_defaultRoutingEndpoint;
64  bool m_publicisePresence;
65  ApplicationParams() : m_proxyPort(0), m_defaultRoutingEndpoint(false), m_publicisePresence(true) { }
66  };
67  ApplicationEndpoint * CreateApplicationEndpoint(Platform & platform, const ApplicationParams & params);
68  void DestroyApplicationEndpoint(ApplicationEndpoint * & app);
69 
70  struct UserEndpoint;
71  UserEndpoint * CreateUserEndpoint(Platform & platform,
72  const char * uri,
73  const char * password,
74  const char * authID,
75  const char * domain);
76  void DestroyUserEndpoint(UserEndpoint * & user);
77 
78  struct Conversation;
79  Conversation * CreateConversation(ApplicationEndpoint & aep, const char * uri, const char * phone, const char * display);
80  Conversation * CreateConversation(UserEndpoint & uep);
81  void DestroyConversation(Conversation * & conv);
82 
83  struct AudioVideoCall;
84  AudioVideoCall * CreateAudioVideoCall(Conversation & conv, const char * uri);
85  bool AcceptAudioVideoCall(AudioVideoCall & call);
86  bool ForwardAudioVideoCall(AudioVideoCall & call, const char * targetURI);
87  bool TransferAudioVideoCall(AudioVideoCall & call, const char * targetURI);
88  bool TransferAudioVideoCall(AudioVideoCall & call, AudioVideoCall & target, int delayMillis);
89  void DestroyAudioVideoCall(AudioVideoCall * & call);
90 
91  struct AudioVideoFlow;
92  AudioVideoFlow * CreateAudioVideoFlow(AudioVideoCall & call);
93  void DestroyAudioVideoFlow(AudioVideoFlow * & flow);
94 
95  struct SpeechRecognitionConnector;
96  SpeechRecognitionConnector * CreateSpeechRecognitionConnector(AudioVideoFlow & flow);
97  void DestroySpeechRecognitionConnector(SpeechRecognitionConnector * & connector);
98 
99  struct ToneController;
100  ToneController * CreateToneController(AudioVideoFlow & flow);
101  bool SendTone(ToneController & toneController, int toneId);
102  void DestroyToneController(ToneController * & toneController);
103 
104  struct SpeechSynthesisConnector;
105  SpeechSynthesisConnector * CreateSpeechSynthesisConnector(AudioVideoFlow & flow);
106  void DestroySpeechSynthesisConnector(SpeechSynthesisConnector * & connector);
107 
108  struct AudioVideoStream;
109  AudioVideoStream * CreateAudioVideoStream(SpeechRecognitionConnector & connector);
110  AudioVideoStream * CreateAudioVideoStream(SpeechSynthesisConnector & connector);
111  int ReadAudioVideoStream(AudioVideoStream & stream, unsigned char * data, int size);
112  int WriteAudioVideoStream(AudioVideoStream & stream, const unsigned char * data, int length);
113  void DestroyAudioVideoStream(SpeechRecognitionConnector & connector, AudioVideoStream * & stream);
114  void DestroyAudioVideoStream(SpeechSynthesisConnector & connector, AudioVideoStream * & stream);
115 
116  static int const CallStateEstablishing;
117  static int const CallStateEstablished;
118  static int const CallStateTerminating;
119 #if PTRACING
120  static std::string GetCallStateName(int callState);
121  static std::string GetTransferStateName(int transferState);
122  static std::string GetToneIdName(int toneId);
123 #endif
124 
125  static int const MediaFlowActive;
126 #if PTRACING
127  static std::string GetMediaFlowName(int mediaFlow);
128 #endif
129 
130  struct IncomingLyncCallInfo {
131  AudioVideoCall * m_call;
132  const char * m_remoteUri;
133  const char * m_displayName;
134  const char * m_destinationUri;
135  const char * m_transferredBy;
136  };
137  virtual void OnIncomingLyncCall(const IncomingLyncCallInfo & /*info*/) { }
138  virtual void OnLyncCallStateChanged(int /*previousState*/, int /*newState*/) { }
139  virtual void OnLyncCallEstablished() { }
140  virtual void OnLyncCallFailed(const std::string & /*error*/) { }
141  virtual void OnLyncCallTransferReceived(const std::string & /*TransferDestination*/, const std::string & /*TransferredBy*/) { }
142  virtual void OnLyncCallTransferStateChanged(int /*previousState*/, int /*newState*/) { }
143  virtual void OnLyncCallToneReceived(int /*toneId*/, float /* volume */) { }
144  virtual void OnLyncCallIncomingFaxDetected() { }
145  virtual void OnMediaFlowStateChanged(int /*previousState*/, int /*newState*/) { }
146  virtual bool OnApplicationProvisioning(ApplicationEndpoint * aep);
147 
148  const std::string & GetLastError() const { return m_lastError; }
149 
150  protected:
151 #if PTRACING
152  virtual void OnTraceOutput(unsigned level, const char * file, unsigned line, const char * out) = 0;
153 #endif
154 
155  private:
156  struct Notifications;
157  Notifications * m_allocatedNotifications;
158  Notifications & m_notifications;
159  std::string m_lastError;
160 };
161 
162 
163 #ifndef OPAL_LYNC_SHIM
164 
165 #include <opal/endpoint.h>
166 #include <opal/connection.h>
167 
168 
170 
171 class OpalLyncConnection;
172 
173 #if PTRACING
174  class OpalLyncShimBase : public OpalLyncShim
175  {
176  protected:
177  virtual void OnTraceOutput(unsigned level, const char * file, unsigned line, const char * out) override;
178  };
179 #else
180  typedef OpalLyncShim OpalLyncShimBase;
181 #endif
182 
183 
186 class OpalLyncEndPoint : public OpalEndPoint, public OpalLyncShimBase
187 {
188  PCLASSINFO(OpalLyncEndPoint, OpalEndPoint);
189  public:
194  OpalLyncEndPoint(
195  OpalManager & manager,
196  const char *prefix = "lync"
197  );
198 
201  virtual ~OpalLyncEndPoint();
203 
210  virtual void ShutDown();
211 
219  virtual OpalMediaFormatList GetMediaFormats() const;
220 
248  virtual PSafePtr<OpalConnection> MakeConnection(
249  OpalCall & call,
250  const PString & party,
251  void * userData,
252  unsigned int options,
253  OpalConnection::StringOptions * stringOptions
254  );
255 
259  virtual PBoolean GarbageCollection();
261 
264  bool Register(
266  const PString & provisioningID
267  );
268 
270  bool RegisterApplication(
271  const PlatformParams & platformParams,
272  const ApplicationParams & appParams
273  );
274 
276  ApplicationEndpoint * GetRegisteredApplication() const { return m_applicationRegistration; }
277 
278  struct UserParams
279  {
280  PString m_uri;
281  PString m_authID;
282  PString m_password;
283  PString m_domain;
284  };
285 
289  PString RegisterUser(
290  const UserParams & info
291  );
292 
294  bool UnregisterUser(
295  const PString & uri
296  );
297 
299  UserEndpoint * GetRegisteredUser(
300  const PString & uri
301  ) const;
302 
304  PStringArray GetRegisteredUsers() const;
306 
311  virtual OpalLyncConnection * CreateConnection(
312  OpalCall & call,
313  void * userData,
314  unsigned int options,
315  OpalConnection::StringOptions * stringOptions
316  );
318 
319  void AdjustLyncURI(PString & uri);
320 
322  const PTimeInterval & GetTransferDelay() const { return m_transferDelay; }
323 
324  protected:
325  virtual bool OnApplicationProvisioning(ApplicationEndpoint * aep);
326  virtual void OnIncomingLyncCall(const IncomingLyncCallInfo & info) override;
327 
328  Platform * m_platform;
329  ApplicationEndpoint * m_applicationRegistration;
330 
331  typedef std::map<PString, UserEndpoint *> RegistrationMap;
332  RegistrationMap m_registrations;
333  PDECLARE_MUTEX( m_registrationMutex);
334 
335  PTimeInterval m_transferDelay;
336 };
337 
338 
341 class OpalLyncConnection : public OpalConnection, public OpalLyncShimBase
342 {
343  PCLASSINFO(OpalLyncConnection, OpalConnection);
344  public:
349  OpalLyncConnection(
350  OpalCall & call,
351  OpalLyncEndPoint & ep,
352  void * userData,
353  unsigned options,
354  OpalConnection::StringOptions * stringOptions
355  );
357 
368  virtual bool IsNetworkConnection() const { return true; }
369 
374  virtual PBoolean SetUpConnection();
375 
391  virtual void OnReleased();
392 
397  virtual OpalMediaFormatList GetMediaFormats() const;
398 
407  virtual PBoolean SetAlerting(
408  const PString & calleeName,
409  PBoolean withMedia
410  );
411 
414  virtual PBoolean SetConnected();
415 
425  virtual PBoolean ForwardCall(
426  const PString & forwardParty
427  );
428 
435  virtual bool TransferConnection(
436  const PString & remoteParty
437  );
438 
450  virtual PBoolean SendUserInputTone(
451  char tone,
452  unsigned duration = 0
453  );
454 
468  const OpalMediaFormat & mediaFormat,
469  unsigned sessionID,
470  PBoolean isSource
471  );
473 
474  void SetUpIncomingLyncCall(const IncomingLyncCallInfo & info);
475 
476  protected:
477  OpalLyncEndPoint & m_endpoint;
478 
479  Conversation * m_conversation;
480  AudioVideoCall * m_audioVideoCall;
481  AudioVideoFlow * m_flow;
482  ToneController * m_toneController;
483  bool m_mediaActive;
484 
485  virtual void OnLyncCallStateChanged(int previousState, int newState) override;
486  virtual void OnLyncCallEstablished() override;
487  virtual void OnLyncCallFailed(const std::string & error) override;
488  virtual void OnLyncCallTransferReceived(const std::string & transferDestination, const std::string & tansferredBy) override;
489  virtual void OnLyncCallTransferStateChanged(int previousState, int newState) override;
490  virtual void OnLyncCallToneReceived(int toneId, float volume) override;
491  virtual void OnLyncCallIncomingFaxDetected() override;
492  virtual void OnMediaFlowStateChanged(int previousState, int newState) override;
493 
494  PString InternalConvertLyncURI(const PString & uri) const;
495 
496  friend class OpalLyncMediaStream;
497 };
498 
499 
502 class OpalLyncMediaStream : public OpalMediaStream, public OpalLyncShimBase
503 {
504  PCLASSINFO(OpalLyncMediaStream, OpalMediaStream);
505  public:
510  OpalLyncMediaStream(
511  OpalLyncConnection & conn,
512  const OpalMediaFormat & mediaFormat,
513  unsigned sessionID,
514  bool isSource
515  );
517 
518  ~OpalLyncMediaStream();
519 
520 
528  virtual PBoolean Open();
529 
532  virtual bool IsEstablished() const;
533 
537  virtual PBoolean ReadData(
538  BYTE * data,
539  PINDEX size,
540  PINDEX & length
541  );
542 
546  virtual PBoolean WriteData(
547  const BYTE * data,
548  PINDEX length,
549  PINDEX & written
550  );
551 
555  virtual PBoolean IsSynchronous() const;
557 
558  protected:
559  virtual void InternalClose();
560 
561  OpalLyncConnection & m_connection;
562  SpeechRecognitionConnector * m_inputConnector;
563  SpeechSynthesisConnector * m_outputConnector;
564  AudioVideoStream * m_avStream;
565  PBYTEArray m_silence;
566  bool m_closing;
567 };
568 
569 
570 #endif // OPAL_LYNC_INTERNAL
571 
572 #endif // OPAL_LYNC
573 
574 #endif // OPAL_EP_LYNCEP_H
575 
576 
577 // End of File ///////////////////////////////////////////////////////////////
virtual void OnReleased()
virtual OpalMediaFormatList GetMediaFormats() const =0
Definition: manager.h:150
virtual PBoolean IsSynchronous() const =0
Definition: endpoint.h:65
virtual OpalMediaStream * CreateMediaStream(const OpalMediaFormat &mediaFormat, unsigned sessionID, PBoolean isSource)
virtual PBoolean ForwardCall(const PString &forwardParty)
virtual PBoolean SendUserInputTone(char tone, unsigned duration=0)
virtual PBoolean ReadData(BYTE *data, PINDEX size, PINDEX &length)
virtual PBoolean Open()
virtual PBoolean SetConnected()
virtual PSafePtr< OpalConnection > MakeConnection(OpalCall &call, const PString &party, void *userData=NULL, unsigned int options=0, OpalConnection::StringOptions *stringOptions=NULL)=0
Definition: mediafmt.h:112
OpalEndPoint & m_endpoint
Definition: connection.h:1961
Definition: connection.h:530
virtual bool TransferConnection(const PString &remoteParty)
virtual PBoolean SetAlerting(const PString &calleeName, PBoolean withMedia)
Definition: mediafmt.h:806
virtual PBoolean SetUpConnection()
Definition: call.h:62
virtual void InternalClose()=0
virtual void ShutDown()
virtual PBoolean WriteData(const BYTE *data, PINDEX length, PINDEX &written)
OpalConnection & m_connection
Definition: mediastrm.h:463
virtual bool IsNetworkConnection() const =0
Definition: mediastrm.h:110
Definition: connection.h:415
virtual PBoolean GarbageCollection()
virtual OpalMediaFormatList GetMediaFormats() const
virtual bool IsEstablished() const