summaryrefslogtreecommitdiff
path: root/shell/inc/spsupp/COMOpenDocuments.hpp
blob: e6c1f22c59e46c9b7ddb9ef4ab3f52c2238d9efb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/

#ifndef INCLUDED_SHELL_INC_SPSUPP_COMOPENDOCUMENTS_HPP
#define INCLUDED_SHELL_INC_SPSUPP_COMOPENDOCUMENTS_HPP

#if defined __clang__
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wnon-virtual-dtor"
#endif
#include "spsupp_h.h"
#if defined __clang__
#pragma clang diagnostic pop
#endif
#include "COMRefCounted.hpp"
#include "Objsafe.h"
#include "assert.h"

class COMOpenDocuments : public COMRefCounted<IOWSNewDocument3>
{
public:

    class Error {
    public:
        Error(HRESULT syserr) : m_nErr(syserr) {}
        HRESULT val() const { return m_nErr; }
    private:
        HRESULT m_nErr;
    };

    COMOpenDocuments();
    virtual ~COMOpenDocuments() override;

    // IUnknown methods

    HRESULT STDMETHODCALLTYPE QueryInterface(
        REFIID riid,
        void **ppvObject) override;

    // IDispatch methods

    HRESULT STDMETHODCALLTYPE GetTypeInfoCount(
        UINT *pctinfo) override;

    HRESULT STDMETHODCALLTYPE GetTypeInfo(
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo) override;

    HRESULT STDMETHODCALLTYPE GetIDsOfNames(
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId) override;

    HRESULT STDMETHODCALLTYPE Invoke(
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr) override;

    // IOWSNewDocument methods https://msdn.microsoft.com/en-us/library/cc264316

    HRESULT STDMETHODCALLTYPE CreateNewDocument(
        BSTR bstrTemplateLocation,
        BSTR bstrDefaultSaveLocation,
        VARIANT_BOOL *pbResult) override;

    HRESULT STDMETHODCALLTYPE EditDocument(
        BSTR bstrDocumentLocation,
        VARIANT varProgID,
        VARIANT_BOOL *pbResult) override;

    // IOWSNewDocument2 methods

    HRESULT STDMETHODCALLTYPE ViewDocument(
        BSTR bstrDocumentLocation,
        VARIANT varProgID,
        VARIANT_BOOL *pbResult) override;

    HRESULT STDMETHODCALLTYPE ViewDocument2(
        IDispatch *pdisp,
        BSTR bstrDocumentLocation,
        VARIANT varProgID,
        VARIANT_BOOL *pbResult) override;

    HRESULT STDMETHODCALLTYPE EditDocument2(
        IDispatch *pdisp,
        BSTR bstrDocumentLocation,
        VARIANT varProgID,
        VARIANT_BOOL *pbResult) override;

    HRESULT STDMETHODCALLTYPE CreateNewDocument2(
        IDispatch *pdisp,
        BSTR bstrTemplateLocation,
        BSTR bstrDefaultSaveLocation,
        VARIANT_BOOL *pbResult) override;

    HRESULT STDMETHODCALLTYPE PromptedOnLastOpen(
        VARIANT_BOOL *pbResult) override;

    // IOWSNewDocument3 methods

    HRESULT STDMETHODCALLTYPE ViewDocument3(
        IDispatch *pdisp,
        BSTR bstrDocumentLocation,
        int OpenType,
        VARIANT varProgID,
        VARIANT_BOOL *pbResult) override;

    HRESULT STDMETHODCALLTYPE CheckinDocument(
        BSTR bstrDocumentLocation,
        int CheckinType,
        BSTR CheckinComment,
        VARIANT_BOOL bKeepCheckout,
        VARIANT_BOOL *pbResult) override;

    HRESULT STDMETHODCALLTYPE DiscardLocalCheckout(
        BSTR bstrDocumentLocationRaw,
        VARIANT_BOOL *pbResult) override;

    HRESULT STDMETHODCALLTYPE ViewInExcel(
        BSTR SiteUrl,
        BSTR FileName,
        BSTR SessionId,
        BSTR Cmd,
        BSTR Sheet,
        int Row,
        int Column,
        VARIANT varProgID) override;

    HRESULT STDMETHODCALLTYPE CheckoutDocumentPrompt(
        BSTR bstrDocumentLocationRaw,
        VARIANT_BOOL fEditAfterCheckout,
        VARIANT varProgID,
        VARIANT_BOOL *pbResult) override;

    HRESULT STDMETHODCALLTYPE EditDocument3(
        IDispatch *pdisp,
        BSTR bstrDocumentLocation,
        VARIANT_BOOL fUseLocalCopy,
        VARIANT varProgID,
        VARIANT_BOOL *pbResult) override;

    HRESULT STDMETHODCALLTYPE NewBlogPost(
        BSTR bstrProviderId,
        BSTR bstrBlogUrl,
        BSTR bstrBlogName) override;

    // Non-COM methods

    static long GetObjectCount();

private:
    //Aggregated object
    class COMObjectSafety : public IObjectSafety
    {
    public:
        COMObjectSafety(IUnknown* pOwner) : m_pOwner(pOwner) { assert(m_pOwner); }
        virtual ~COMObjectSafety() {}

        // IUnknown members delegate to the outer unknown
        // IUnknown members do not control lifetime of object

        HRESULT STDMETHODCALLTYPE QueryInterface(
            REFIID riid,
            void **ppvObject) override
        {
            return m_pOwner->QueryInterface(riid, ppvObject);
        }

        ULONG STDMETHODCALLTYPE AddRef() override { return m_pOwner->AddRef(); }

        ULONG STDMETHODCALLTYPE Release() override { return m_pOwner->Release(); }

        // IObjectSafety methods

        HRESULT STDMETHODCALLTYPE GetInterfaceSafetyOptions(
            REFIID riid,
            DWORD *pdwSupportedOptions,
            DWORD *pdwEnabledOptions) override;

        HRESULT STDMETHODCALLTYPE SetInterfaceSafetyOptions(
            REFIID riid,
            DWORD dwOptionSetMask,
            DWORD dwEnabledOptions) override;

        // Non-COM methods

        bool GetSafe_forUntrustedCaller() { return (m_iEnabledOptions & INTERFACESAFE_FOR_UNTRUSTED_CALLER) != 0; }
        bool GetSafe_forUntrustedData() { return (m_iEnabledOptions & INTERFACESAFE_FOR_UNTRUSTED_DATA) != 0; }

    private:
        IUnknown* m_pOwner;
        DWORD m_iEnabledOptions = 0;
        enum : DWORD { iSupportedOptionsMask = INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA };

        void SetMaskedOptions(DWORD iMask, DWORD iOptions);
        void SetSafe_forUntrustedCaller(bool bSafe);
        void SetSafe_forUntrustedData(bool bSafe);
    };

    static long m_nObjCount;
    static ITypeInfo* m_pTypeInfo;
    COMObjectSafety m_aObjectSafety;
};

#endif

/* vim:set shiftwidth=4 softtabstop=4 expandtab: */