im.h

Go to the documentation of this file.
00001 /*
00002  * im.h
00003  *
00004  * Instant Messaging classes
00005  *
00006  * Open Phone Abstraction Library (OPAL)
00007  *
00008  * Copyright (c) 2008 Post Increment
00009  *
00010  * The contents of this file are subject to the Mozilla Public License
00011  * Version 1.0 (the "License"); you may not use this file except in
00012  * compliance with the License. You may obtain a copy of the License at
00013  * http://www.mozilla.org/MPL/
00014  *
00015  * Software distributed under the License is distributed on an "AS IS"
00016  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
00017  * the License for the specific language governing rights and limitations
00018  * under the License.
00019  *
00020  * The Original Code is Open Phone Abstraction Library.
00021  *
00022  * The Initial Developer of the Original Code is Post Increment
00023  *
00024  * Contributor(s): ______________________________________.
00025  *
00026  * $Revision: 29850 $
00027  * $Author: rjongbloed $
00028  * $Date: 2013-05-31 02:34:06 -0500 (Fri, 31 May 2013) $
00029  */
00030 
00031 #ifndef OPAL_IM_IM_H
00032 #define OPAL_IM_IM_H
00033 
00034 #include <ptlib.h>
00035 #include <opal/buildopts.h>
00036 
00037 #if OPAL_HAS_IM
00038 
00039 #include <ptclib/url.h>
00040 #include <opal//transports.h>
00041 
00042 
00043 class OpalCall;
00044 class OpalMediaFormat;
00045 class OpalIMEndPoint;
00046 
00047 
00049 
00050 #if OPAL_HAS_SIPIM
00051   #define OPAL_SIPIM             "SIP-IM"
00052   #define OpalSIPIM              GetOpalSIPIM()
00053   extern const OpalMediaFormat & GetOpalSIPIM();
00054 #endif
00055 
00056 #if OPAL_HAS_RFC4103
00057   #define OPAL_T140              "T.140"
00058   #define OpalT140               GetOpalT140()
00059   extern const OpalMediaFormat & GetOpalT140();
00060 #endif
00061 
00062 #if OPAL_HAS_MSRP
00063   #define OPAL_MSRP              "MSRP"
00064   #define OpalMSRP               GetOpalMSRP()
00065   extern const OpalMediaFormat & GetOpalMSRP();
00066 #endif
00067 
00068 #define OPAL_IM_MEDIA_TYPE_PREFIX "im-"
00069 
00070 
00072 
00079 class OpalIM : public PObject
00080 {
00081     PCLASSINFO_WITH_CLONE(OpalIM, PObject);
00082   public:
00083     OpalIM();
00084 
00085     PString m_conversationId;         
00086 
00087     PURL                  m_to;       
00088     OpalTransportAddress  m_toAddr;   
00089     PURL                  m_from;     
00090     OpalTransportAddress  m_fromAddr; 
00091     PString               m_fromName; 
00092     PStringToString       m_bodies;   
00093 
00094     PAtomicInteger::IntegerType m_messageId;  
00097     static PAtomicInteger::IntegerType GetNextMessageId();
00098 };
00099 
00100 
00102 
00109 class OpalIMContext : public PSafeObject
00110 {
00111   PCLASSINFO(OpalIMContext, PSafeObject);
00112 
00115   protected:
00117     OpalIMContext();
00118 
00119   public:
00121     ~OpalIMContext();
00122 
00125     struct ConversationInfo
00126     {
00127       ConversationInfo(
00128         const PString & id,
00129         bool opening,
00130         bool byRemote,
00131         const PSafePtr<OpalIMContext> & context
00132       ) : m_conversationId(id)
00133         , m_opening(opening)
00134         , m_byRemote(byRemote)
00135         , m_context(context)
00136       { }
00137 
00138       PString                 m_conversationId; 
00139       bool                    m_opening;        
00140       bool                    m_byRemote;       
00141       PSafePtr<OpalIMContext> m_context;        
00142     };
00143 
00147     virtual bool Open(
00148       bool byRemote   
00149     );
00150 
00154     virtual void Close();
00156 
00157 
00165     P_DECLARE_STREAMABLE_ENUM(MessageDisposition,
00166       DispositionPending,     
00167       DispositionAccepted,    
00168       DeliveryOK,             
00169       DisplayConfirmed,       
00170       ProcessedNotification,  
00171       StorageNotification,    
00172 
00174       DispositionErrors,
00175       GenericError,           
00176       UnacceptableContent,    
00177       InvalidContent,         
00178       DestinationUnknown,     
00179       DestinationUnavailable, 
00180       TransmissionTimeout,    
00181       TransportFailure,       
00182       ConversationClosed,     
00183       UnsupportedFeature,     
00184       DeliveryFailed          
00185     );
00186 
00197     virtual MessageDisposition Send(
00198       OpalIM * message    
00199     );
00200 
00203     struct DispositionInfo {
00204       PString                     m_conversationId; 
00205       PAtomicInteger::IntegerType m_messageId;      
00206       MessageDisposition          m_disposition;    
00207     };
00208 
00212     virtual void OnMessageDisposition(
00213       const DispositionInfo & info    
00214     );
00215 
00217     typedef PNotifierTemplate<DispositionInfo> MessageDispositionNotifier;
00218 
00220     #define PDECLARE_MessageDispositionNotifier(cls, fn) PDECLARE_NOTIFIER2(OpalIMContext, cls, fn, OpalIMContext::DispositionInfo)
00221 
00223     #define PDECLARE_ASYNC_MessageDispositionNotifier(cls, fn) PDECLARE_NOTIFIER2(OpalIMContext, cls, fn, OpalIMContext::DispositionInfo)
00224 
00226     #define PCREATE_MessageDispositionNotifier(fn) PCREATE_NOTIFIER2(fn, OpalIMContext::DispositionInfo)
00227 
00229     void SetMessageDispositionNotifier(
00230       const MessageDispositionNotifier & notifier   
00231     );
00233 
00234 
00242     virtual MessageDisposition OnMessageReceived(
00243       const OpalIM & message    
00244     );
00245 
00247     typedef PNotifierTemplate<OpalIM> MessageReceivedNotifier;
00248 
00250     #define PDECLARE_MessageReceivedNotifier(cls, fn) PDECLARE_NOTIFIER2(OpalIMContext, cls, fn, OpalIM)
00251 
00253     #define PDECLARE_ASYNC_MessageReceivedNotifier(cls, fn) PDECLARE_ASYNC_NOTIFIER2(OpalIMContext, cls, fn, OpalIM)
00254 
00256     #define PCREATE_MessageReceivedNotifier(fn) PCREATE_NOTIFIER2(fn, OpalIM)
00257 
00259     void SetMessageReceivedNotifier(
00260       const MessageReceivedNotifier & notifier   
00261     );
00263 
00264 
00267     static const PCaselessString & CompositionIndicationActive();  
00268     static const PCaselessString & CompositionIndicationIdle();    
00269 
00272     struct CompositionInfo
00273     {
00274       PString m_conversationId; 
00275       PString m_state;          
00276       PString m_contentType;    
00277 
00278       CompositionInfo(
00279         const PString & id,
00280         const PString & state,
00281         const PString & contentType = PString::Empty()
00282       ) : m_conversationId(id)
00283         , m_state(state)
00284         , m_contentType(contentType)
00285       { }
00286     };
00287 
00292     virtual bool SendCompositionIndication(
00293       const CompositionInfo & info  
00294     );
00295 
00299     virtual void OnCompositionIndication(
00300       const CompositionInfo & info     
00301     );
00302 
00304     typedef PNotifierTemplate<CompositionInfo> CompositionIndicationNotifier;
00305 
00307     #define PDECLARE_CompositionIndicationNotifier(cls, fn) PDECLARE_NOTIFIER2(OpalIMContext, cls, fn, OpalIMContext::CompositionInfo)
00308 
00310     #define PDECLARE_ASYNC_CompositionIndicationNotifier(cls, fn) PDECLARE_ASYNC_NOTIFIER2(OpalIMContext, cls, fn, OpalIMContext::CompositionInfo)
00311 
00313     #define PCREATE_CompositionIndicationNotifier(fn) PCREATE_NOTIFIER2(fn, OpalIMContext::CompositionInfo)
00314 
00316     void SetCompositionIndicationNotifier(
00317       const CompositionIndicationNotifier & notifier   
00318     );
00320 
00321 
00324 
00325     virtual bool CheckContentType(
00326       const PString & contentType   
00327     ) const;
00328 
00330     virtual PStringArray GetContentTypes() const;
00331 
00333     static PString CreateKey(const PURL & from, const PURL & to);
00335 
00336 
00339 
00340     const PString & GetID() const          { return m_conversationId; }
00341 
00343     const PString & GetKey() const         { return m_key; }
00344 
00346     const PURL & GetRemoteURL() const      { return m_remoteURL; }
00347 
00349     const PString & GetRemoteName() const  { return m_remoteName; }
00350 
00352     const PURL & GetLocalURL() const       { return m_localURL; }
00353 
00355     const PString & GetLocalName() const    { return m_localName; }
00356 
00358     void SetLocalName(const PString & name) { m_localName = name; }
00359 
00361     PStringOptions & GetAttributes() { return m_attributes; }
00362     const PStringOptions & GetAttributes() const { return m_attributes; }
00364 
00365   protected:
00366     void ResetLastUsed();
00367 
00368     virtual MessageDisposition InternalSend();
00369     virtual MessageDisposition InternalSendOutsideCall(OpalIM & message);
00370     virtual MessageDisposition InternalSendInsideCall(OpalIM & message);
00371     virtual void InternalOnMessageSent(const DispositionInfo & info);
00372 
00373     OpalIMEndPoint * m_endpoint;
00374     PStringOptions   m_attributes;
00375 
00376     PSafePtr<OpalCall> m_call;
00377     bool               m_weStartedCall;
00378 
00379     PMutex                        m_notificationMutex;
00380     MessageDispositionNotifier    m_messageDispositionNotifier;
00381     MessageReceivedNotifier       m_messageReceivedNotifier;
00382     CompositionIndicationNotifier m_compositionIndicationNotifier;
00383 
00384     PMutex         m_outgoingMessagesMutex;
00385     OpalIM       * m_currentOutgoingMessage;
00386     PQueue<OpalIM> m_outgoingMessages;
00387 
00388     PMutex m_lastUsedMutex;
00389     PTime  m_lastUsed;
00390 
00391     PString m_conversationId;
00392     PURL    m_localURL;
00393     PString m_localName;
00394     PURL    m_remoteURL;
00395     PString m_remoteName;
00396     PString m_key;
00397 
00398   friend class OpalIMEndPoint;
00399   friend class OpalIMConnection;
00400 };
00401 
00402 
00403 #endif // OPAL_HAS_IM
00404 
00405 #endif // OPAL_IM_IM_H

Generated on 21 Jun 2013 for OPAL by  doxygen 1.4.7