2 * Multisource AutoComplete list
4 * Copyright 2007 Mikolaj Zalewski
5 * Copyright 2009 Andrew Hill
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
24 void CACLMulti::release_obj(struct ACLMultiSublist
*obj
)
28 obj
->pEnum
->Release();
33 CACLMulti::CACLMulti()
40 CACLMulti::~CACLMulti()
44 TRACE("destroying %p\n", this);
45 for (i
= 0; i
< fObjectCount
; i
++)
46 release_obj(&fObjects
[i
]);
47 CoTaskMemFree(fObjects
);
50 HRESULT STDMETHODCALLTYPE
CACLMulti::Append(IUnknown
*punk
)
52 TRACE("(%p, %p)\n", this, punk
);
56 fObjects
= static_cast<ACLMultiSublist
*>(
57 CoTaskMemRealloc(fObjects
, sizeof(fObjects
[0]) * (fObjectCount
+ 1)));
58 fObjects
[fObjectCount
].punk
= punk
;
60 if (FAILED_UNEXPECTEDLY(punk
->QueryInterface(IID_PPV_ARG(IEnumString
, &fObjects
[fObjectCount
].pEnum
))))
61 fObjects
[fObjectCount
].pEnum
= NULL
;
62 if (FAILED_UNEXPECTEDLY(punk
->QueryInterface(IID_PPV_ARG(IACList
, &fObjects
[fObjectCount
].pACL
))))
63 fObjects
[fObjectCount
].pACL
= NULL
;
68 HRESULT STDMETHODCALLTYPE
CACLMulti::Remove(IUnknown
*punk
)
72 TRACE("(%p, %p)\n", this, punk
);
73 for (i
= 0; i
< fObjectCount
; i
++)
74 if (fObjects
[i
].punk
== punk
)
76 release_obj(&fObjects
[i
]);
77 MoveMemory(&fObjects
[i
], &fObjects
[i
+ 1], (fObjectCount
- i
- 1) * sizeof(ACLMultiSublist
));
79 fObjects
= static_cast<ACLMultiSublist
*>(
80 CoTaskMemRealloc(fObjects
, sizeof(fObjects
[0]) * fObjectCount
));
87 HRESULT STDMETHODCALLTYPE
CACLMulti::Next(ULONG celt
, LPOLESTR
*rgelt
, ULONG
*pceltFetched
)
89 TRACE("(%p, %d, %p, %p)\n", this, celt
, rgelt
, pceltFetched
);
90 while (fCurrentObject
< fObjectCount
)
92 if (fObjects
[fCurrentObject
].pEnum
)
94 /* native browseui 6.0 also returns only one element */
95 HRESULT ret
= fObjects
[fCurrentObject
].pEnum
->Next(1, rgelt
, pceltFetched
);
108 HRESULT STDMETHODCALLTYPE
CACLMulti::Reset()
113 for (i
= 0; i
< fObjectCount
; i
++)
115 if (fObjects
[i
].pEnum
)
116 fObjects
[i
].pEnum
->Reset();
121 HRESULT STDMETHODCALLTYPE
CACLMulti::Skip(ULONG celt
)
123 /* native browseui 6.0 returns this: */
127 HRESULT STDMETHODCALLTYPE
CACLMulti::Clone(IEnumString
**ppOut
)
130 /* native browseui 6.0 returns this: */
131 return E_OUTOFMEMORY
;
134 HRESULT STDMETHODCALLTYPE
CACLMulti::Expand(LPCWSTR wstr
)
139 for (i
= 0; i
< fObjectCount
; i
++)
141 if (!fObjects
[i
].pACL
)
143 res
= fObjects
[i
].pACL
->Expand(wstr
);