Click here to Skip to main content
15,894,540 members
Articles / Desktop Programming / Win32

Outlook add-in integrating Skype

Rate me:
Please Sign up or sign in to vote.
4.93/5 (32 votes)
28 May 2015CPOL20 min read 68.9K   2.4K   54  
Outlook add-in integration for Skype IM: Skype events, Outlook Skype ribbon, and more.
#ifndef Addin_H
#define Addin_H

    #include "_IDTExtensibility2.h"

    #include "IRibbonUI.h"
    #include "IRibbonExtensibility.h"
    #include "IRibbonControl.h"

    #include "RibbonElements.h"

    #include "AppEvents.h"
    #include "ExplorersEvents.h"
    #include "InspectorsEvents.h"

    #include "Thread.h"

    #include "SkypeDefs.h"

    //  addin methods (must not overlap with ribbon DISPIDs)
    #define DISPID_ADDIN_BASE                   (DISPID_RIBBONCALLBACK_LAST + 0x00000001)
    #define DISPID_ADDIN_SETAPISTATUS           (DISPID_ADDIN_BASE + 0x00000001)
    #define DISPID_ADDIN_PROCESSSKYPEMESSAGE    (DISPID_ADDIN_BASE + 0x00000002)

    #define DISPID_ADDIN_FIRST                  (DISPID_ADDIN_SETAPISTATUS)
    #define DISPID_ADDIN_LAST                   (DISPID_ADDIN_PROCESSSKYPEMESSAGE)

    //  call contexts for sending messages to Skype 
    //  this is used to identify response (which message type corresponds to)
    //  mainly is used when an error occur
    #define SKYPE_CALLCONTEXT_BASE              (0x00000000)
    #define SKYPE_CALLCONTEXT_NONE              (SKYPE_CALLCONTEXT_BASE + 0x00000000)
    #define SKYPE_CALLCONTEXT_GETSKYPEVERSION   (SKYPE_CALLCONTEXT_BASE + 0x00000001)
    #define SKYPE_CALLCONTEXT_GET_AVATAR        (SKYPE_CALLCONTEXT_BASE + 0x00000002)

    typedef struct tagCOPYDATASTRUCT_CTX {
        DWORD_PTR   dwContext;
        ULONG_PTR   dwData;
        DWORD       cbData;
        PVOID       lpData;
    } COPYDATASTRUCT_CTX, *PCOPYDATASTRUCT_CTX;



    typedef struct XAddin   XAddin;
    struct XAddin {
        //  interfaces
        _IDTExtensibility2      iAddin;
        IRibbonExtensibility    iRibbonX;

        //  events
        XAppEvents              *AppEvents;
        XExplorersEvents        *ExplorersEvents;
        XInspectorsEvents       *InspectorsEvents;

        //  convenient IUnknown helpers 
        HRESULT (NDAPI *QueryInterface)(
            XAddin              *pAddin,
            REFIID              riid,
            void                **ppvObject
            );
        ULONG (NDAPI *AddRef)( 
            XAddin              *pAddin
            );
        ULONG (NDAPI *Release)( 
            XAddin              *pAddin
            );

        //  Outlook event handlers
        VOID  (NDAPI *OnQuit)( 
            XAddin              *pAddin
            );
        VOID  (NDAPI *OnNewExplorer)( 
            XAddin              *pAddin, 
            IDispatch           *pNewExplorer
            );
        VOID  (NDAPI *OnNewInspector)( 
            XAddin              *pAddin, 
            IDispatch           *pNewInspector
            );

        //  ribbon handlers
        HRESULT (NDAPI *GetCustomUI)( 
            XAddin              *pAddin, 
            BSTR                RibbonID, 
            BSTR                *RibbonXML
            );
        HRESULT (NDAPI *OnLoad)(
            XAddin              *pAddin, 
            IDispatch           *RibbonControl
            );
        HRESULT (NDAPI *GetControlProperty)(
            XAddin              *pAddin, 
            IDispatch           *RibbonControl, 
            DISPID              DispID, 
            VARIANT             *Value
            );
        HRESULT (NDAPI *Action)(
            XAddin              *pAddin, 
            IDispatch           *RibbonControl 
            );
        HRESULT (NDAPI *Action2)(
            XAddin              *pAddin, 
            IDispatch           *RibbonControl, 
            BOOL                Pressed
            );
        HRESULT (NDAPI *OnChange)(
            XAddin              *pAddin, 
            IDispatch           *RibbonControl, 
            BSTR                Text
            );

        HRESULT (NDAPI *InvalidateRibbon)(
            XAddin              *pAddin
            );
        HRESULT (NDAPI *InvalidateAll)(
            XAddin              *pAddin
            );
        HRESULT (NDAPI *InvalidateRibbonControl)(
            XAddin              *pAddin, 
            BSTR                ControlID
            );

        //  Skype handlers
        BOOL  (NDAPI *IsSkypeRunning)(
            XAddin              *pAddin
            );
        PVOID (NDAPI *SendSkypeMessage)(
            XAddin              *pAddin, 
            LPCSTR              SkypeMessage,
            PVOID               Value, 
            enum VARENUM        Type, 
            DWORD_PTR           Context
            );
        LPCWSTR (NDAPI *GetSkypePropertySzW)(
            XAddin              *pAddin, 
            LPCSTR              SkypeMessage, 
            LPWSTR              Value, 
            DWORD_PTR           Context
            );
        BOOL (NDAPI *GetSkypePropertyBool)(
            XAddin              *pAddin, 
            LPCSTR              SkypeMessage, 
            BOOL                *Value, 
            DWORD_PTR           Context
            );

        VOID  (NDAPI *SetSkypeApiStatus)(
            XAddin              *pAddin, 
            SKYPE_API_STATUS    ApiStatus
            );
        VOID  (NDAPI *SetSkypeApiHWND)(
            XAddin              *pAddin, 
            HWND                ApiHWND
            );
        VOID  (NDAPI *ProcessSkypeMessage)(
            XAddin              *pAddin, 
            PCOPYDATASTRUCT     pCDS
            );

        LPCWSTR (NDAPI *GetSkypeVersion)(
            XAddin              *pAddin
            );
        VOID  (NDAPI *SetSkypePresenceStatus)(
            XAddin              *pAddin, 
            SKYPE_PRESENCE      Presence
            );
        LPCWSTR (NDAPI *GetSkypeLoggedOnUser)(
            XAddin              *pAddin
            );
        BOOL    (NDAPI *GetPCSpeaker)(
            XAddin              *pAddin
            );
        VOID    (NDAPI *SetPCSpeaker)(
            XAddin              *pAddin, 
            BOOL                Value
            );
        BOOL    (NDAPI *GetRingtone)(
            XAddin              *pAddin
            );
        LPCWSTR (NDAPI *GetRingtoneFile)(
            XAddin              *pAddin
            );
        VOID    (NDAPI *SetRingtone)(
            XAddin              *pAddin, 
            BOOL                Value
            );
        LPCWSTR (NDAPI *GetAvatar)(
            XAddin              *pAddin
            );
        LPCWSTR (NDAPI *GetBalance)(
            XAddin              *pAddin
            );
        LPCWSTR (NDAPI *GetCurrency)(
            XAddin              *pAddin
            );
        LPCWSTR (NDAPI *GetFullName)(
            XAddin              *pAddin
            );
        VOID    (NDAPI *SetFullName)(
            XAddin              *pAddin, 
            LPCWSTR             Value
            );
        LPCWSTR (NDAPI *GetBirthday)(
            XAddin              *pAddin
            );
        LPCWSTR (NDAPI *GetSex)(
            XAddin              *pAddin
            );
        LPCWSTR (NDAPI *GetLanguages)(
            XAddin              *pAddin
            );
        LPCWSTR (NDAPI *GetCountry)(
            XAddin              *pAddin
            );
        LPCWSTR (NDAPI *GetIPCountry)(
            XAddin              *pAddin
            );
        LPCWSTR (NDAPI *GetProvince)(
            XAddin              *pAddin
            );
        LPCWSTR (NDAPI *GetCity)(
            XAddin              *pAddin
            );
        LPCWSTR (NDAPI *GetPhoneHome)(
            XAddin              *pAddin
            );
        LPCWSTR (NDAPI *GetPhoneOffice)(
            XAddin              *pAddin
            );
        LPCWSTR (NDAPI *GetPhoneMobile)(
            XAddin              *pAddin
            );
        LPCWSTR (NDAPI *GetHomepage)(
            XAddin              *pAddin
            );
        LPCWSTR (NDAPI *GetAbout)(
            XAddin              *pAddin
            );
        LPCWSTR (NDAPI *GetMoodText)(
            XAddin              *pAddin
            );
        LPCWSTR (NDAPI *GetRichMoodText)(
            XAddin              *pAddin
            );
        LPCWSTR (NDAPI *GetTimezone)(
            XAddin              *pAddin
            );
        LPCWSTR (NDAPI *GetCallApplyCF)(
            XAddin              *pAddin
            );
        LPCWSTR (NDAPI *GetCallNoAnswerTimeout)(
            XAddin              *pAddin
            );
        LPCWSTR (NDAPI *GetCallForwardRules)(
            XAddin              *pAddin
            );
        LPCWSTR (NDAPI *GetCallSendToVoicemail)(
            XAddin              *pAddin
            );
        LPCWSTR (NDAPI *GetSMSValidatedNumbers)(
            XAddin              *pAddin
            );

        //  Contact
        LPCWSTR (NDAPI *GetSkypeID)(
            XAddin              *pAddin
            );
        VOID    (NDAPI *SetSkypeID)(
            XAddin              *pAddin, 
            LPCWSTR             Value
            );
        LPCWSTR (NDAPI *GetSkypeDisplayName)(
            XAddin              *pAddin
            );
        VOID    (NDAPI *SetSkypeDisplayName)(
            XAddin              *pAddin, 
            LPCWSTR             Value
            );

        //  data members
        ULONG				    Ref;

        DWORD                   ThreadID;

        BOOL                    MTAAvailable;
        LPSTREAM                pstmAddin;

        ext_ConnectMode         ConnectMode;
        LONG                    MajorVersion;
        BOOL                    FastShutdown;
		BOOL					RequireShutdownNotification;

        IDispatch               *Application;
        IDispatch               *Explorers;
        IDispatch               *Inspectors;

        IRibbonUI               *RibbonUI;

        RibbonElement           *RibbonElements;

        //  Skype runtime informations
		struct SkypeInfo {
            //  program information
			LPWSTR                  Path; 
			HICON                   Icon;
			HICON                   IconSm;

            //  Skype running instance
            SKYPE_API_STATUS        ApiStatus;
            LPWSTR                  SzApiStatus;
            HWND                    ApiHWND;

			LPWSTR                  Version;
            LPWSTR                  UserStatus;
            LPWSTR                  LoggedOnUser;
            SKYPE_PRESENCE          Presence;
            SKYPE_CONNECTION_STATUS ConnStatus;
            LPWSTR                  SzConnStatus;

            //  Properties
            BOOL                    PCSpeaker;
            BOOL                    Ringtone;
            LPWSTR                  RingtoneFile;
            LPWSTR                  Avatar;

            //  Profile
            LPWSTR                  Balance;
            LPWSTR                  Currency;
            LPWSTR                  FullName;
            LPWSTR                  Birthday;
            LPWSTR                  Sex;
            LPWSTR                  Languages;
            LPWSTR                  Country;
            LPWSTR                  IPCountry;
            LPWSTR                  Province;
            LPWSTR                  City;
            LPWSTR                  PhoneHome;
            LPWSTR                  PhoneOffice;
            LPWSTR                  PhoneMobile;
            LPWSTR                  Homepage;
            LPWSTR                  About;
            LPWSTR                  MoodText;
            LPWSTR                  RichMoodText;
            LPWSTR                  Timezone;
            LPWSTR                  CallApplyCF;
            LPWSTR                  CallNoAnswerTimeout;
            LPWSTR                  CallForwardRules;
            LPWSTR                  CallSendToVoicemail;
            LPWSTR                  SMSValidatedNumbers;

            //  Assets
                //  Skype
            HBITMAP                 BmpSkypeApp;
                //  Presence
            HBITMAP                 BmpPresenceOnline;
            HBITMAP                 BmpPresenceOffline;
            HBITMAP                 BmpPresenceAway;
            HBITMAP                 BmpPresenceDoNotDisturb;
            HBITMAP                 BmpPresenceInvisible;
                //  dynamic
            HBITMAP                 BmpAvatar;
		} SkypeInfo;

        //  threads
        Thread                  *SkypeWatchThread;
    };

    HRESULT
    NDAPI
    XAddin_Create(
        XAddin** ppAddin
    );

    //  macros
    #define Addin_QueryInterface(This, riid, ppv) \
        ((((This)->lpVtbl)->QueryInterface)((This), (riid), (ppv)))
    #define Addin_AddRef(This) \
        ((((This)->lpVtbl)->AddRef)(This))
    #define Addin_Release(This) \
        ((((This)->lpVtbl)->Release)(This))
    #define Addin_GetTypeInfoCount(This, pctinfo) \
        ((((This)->lpVtbl)->GetTypeInfoCount)((This), (pctinfo)))
    #define Addin_GetTypeInfo(This, iTInfo, lcid, ppTInfo) \
        ((((This)->lpVtbl)->GetTypeInfo)((This), (iTInfo), (lcid), (pctinfo)))
    #define Addin_GetIDsOfNames(This, riid, rgszNames, cNames, lcid, rgDispId) \
        ((((This)->lpVtbl)->GetIDsOfNames)((This), (riid), (rgszNames), (cNames), (lcid), (rgDispId)))
    #define Addin_Invoke(This, dispIdMember, riid, lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr) \
        ((((This)->lpVtbl)->Invoke)((This), (riid), (lcid), (wFlags), (pDispParams), (pVarResult), (pExcepInfo), (puArgErr)))
    #define Addin_OnConnection(This, Application, ConnectMode, AddInInst, custom) \
        ((((This)->lpVtbl)->OnConnection)((This), (Application), (ConnectMode), (AddInInst), (custom)))
    #define Addin_OnDisconnection(This, RemoveMode, custom) \
        ((((This)->lpVtbl)->OnDisconnection)((This), (RemoveMode), (custom)))
    #define Addin_OnAddInsUpdate(This, custom) \
        ((((This)->lpVtbl)->OnAddInsUpdate)((This), (custom)))
    #define Addin_OnStartupComplete(This, custom) \
        ((((This)->lpVtbl)->OnStartupComplete)((This), (custom)))
    #define Addin_OnBeginShutdown(This, custom) \
        ((((This)->lpVtbl)->OnBeginShutdown)((This), (custom)))

#endif  //  Addin_H

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Team Leader BitDefender
Romania Romania
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions