On 8/30/20 6:03 PM, Jactry Zeng wrote:
static HRESULT WINAPI group_manager_CreatePropertyGroup(ISharedPropertyGroupManager *iface, BSTR name, LONG *isolation, LONG *release, VARIANT_BOOL *exists, ISharedPropertyGroup **group) {
- FIXME("iface %p, name %s, isolation %p, release %p, exists %p, group %p: stub.\n",
- struct group_manager *manager = impl_from_ISharedPropertyGroupManager(iface);
- struct property_group *property_group;
- TRACE("iface %p, name %s, isolation %p, release %p, exists %p, group %p.\n", iface, debugstr_w(name), isolation, release, exists, group);
- return E_NOTIMPL;
- if (!name)
return E_POINTER;
- if (*isolation > 1 || *release > 1)
return E_INVALIDARG;
- if (*isolation || *release)
FIXME("Unsopported mode: isolation %d, release %d.\n", *isolation, *release);
They have named constants for modes. Also typo in fixme message.
- EnterCriticalSection(&manager->cs);
- property_group = find_propery_group(manager, name);
- if (!property_group)
- {
property_group = heap_alloc(sizeof(*property_group));
if (!property_group)
{
LeaveCriticalSection(&manager->cs);
return E_OUTOFMEMORY;
}
property_group->ISharedPropertyGroup_iface.lpVtbl = &property_group_vtbl;
property_group->parent = manager;
property_group->isolation = *isolation;
property_group->release = *release;
property_group->refcount = 1;
property_group->name = SysAllocString(name);
if (!property_group->name)
{
LeaveCriticalSection(&manager->cs);
heap_free(property_group);
return E_OUTOFMEMORY;
}
list_add_tail(&manager->property_groups, &property_group->entry);
*exists = FALSE;
ISharedPropertyGroupManager_AddRef(&property_group->parent->ISharedPropertyGroupManager_iface);
- }
- else
- {
*exists = TRUE;
*isolation = property_group->isolation;
*release = property_group->release;
ISharedPropertyGroup_AddRef(&property_group->ISharedPropertyGroup_iface);
- }
- *group = &property_group->ISharedPropertyGroup_iface;
- LeaveCriticalSection(&manager->cs);
- return S_OK;
I think it would be more readable if lock/unlock was around a smaller block, for example using a helper that creates a new group instance, to avoid multiple error handling branches.