2 * COPYRIGHT: See COPYING in the top level directory
4 * FILE: drivers/multimedia/portcls/helpers/ResourceList.c
5 * PURPOSE: Port Class driver / ResourceList implementation
6 * PROGRAMMER: Andrew Greenwood
16 typedef struct CResourceList
21 IResourceList IResourceList
;
25 PUNKNOWN m_outer_unknown
;
27 PCM_RESOURCE_LIST translated_resources
;
28 PCM_RESOURCE_LIST untranslated_resources
;
33 Basic IUnknown methods
38 ResourceList_QueryInterface(
39 IResourceList
* this_container
,
44 return STATUS_SUCCESS
;
50 IResourceList
* this_container
)
52 struct CUnknown
* this = CONTAINING_RECORD(this_container
, struct CUnknown
, IUnknown
);
55 /* ExInterlockedIncrement(&this->m_ref_count); */
56 return this->m_ref_count
;
62 IResourceList
* this_container
)
64 struct CUnknown
* this = CONTAINING_RECORD(this_container
, struct CUnknown
, IUnknown
);
67 /* ExInterlockedDecrement(&this->m_ref_count); */
69 if ( this->m_ref_count
== 0 )
75 return this->m_ref_count
;
85 ResourceList_NumberOfEntries(IResourceList
* this_container
)
92 ResourceList_NumberOfEntriesOfType(
93 IResourceList
* this_container
,
94 IN CM_RESOURCE_TYPE type
)
96 /* I guess the translated and untranslated lists will be same length? */
98 CResourceList
* this = CONTAINING_RECORD(this_container
, CResourceList
, IResourceList
);
99 ULONG index
, count
= 0;
101 for ( index
= 0; index
< this->translated_resources
->Count
; index
++ )
103 PCM_FULL_RESOURCE_DESCRIPTOR full_desc
= &this->translated_resources
->List
[index
];
106 for ( sub_index
= 0; sub_index
< full_desc
->PartialResourceList
.Count
; sub_index
++ )
108 PCM_PARTIAL_RESOURCE_DESCRIPTOR partial_desc
;
109 partial_desc
= &full_desc
->PartialResourceList
.PartialDescriptors
[sub_index
];
111 if ( partial_desc
->Type
== type
)
113 /* Yay! Finally found one that matches! */
119 DPRINT("Found %d\n", count
);
123 PCM_PARTIAL_RESOURCE_DESCRIPTOR
125 ResourceList_FindTranslatedEntry(
126 IResourceList
* this_container
,
127 IN CM_RESOURCE_TYPE Type
,
133 PCM_PARTIAL_RESOURCE_DESCRIPTOR
135 ResourceList_FindUntranslatedEntry(
136 IResourceList
* this_container
,
137 IN CM_RESOURCE_TYPE Type
,
145 ResourceList_AddEntry(
146 IResourceList
* this_container
,
147 IN PCM_PARTIAL_RESOURCE_DESCRIPTOR Translated
,
148 IN PCM_PARTIAL_RESOURCE_DESCRIPTOR Untranslated
)
150 return STATUS_SUCCESS
;
155 ResourceList_AddEntryFromParent(
156 IResourceList
* this_container
,
157 IN IResourceList
* Parent
,
158 IN CM_RESOURCE_TYPE Type
,
161 return STATUS_SUCCESS
;
166 ResourceList_TranslatedList(
167 IResourceList
* this_container
)
174 ResourceList_UntranslatedList(
175 IResourceList
* this_container
)
184 static const IResourceListVtbl ResourceListVtbl
=
187 ResourceList_QueryInterface
,
189 ResourceList_Release
,
192 ResourceList_NumberOfEntries
,
193 ResourceList_NumberOfEntriesOfType
,
194 ResourceList_FindTranslatedEntry
,
195 ResourceList_FindUntranslatedEntry
,
196 ResourceList_AddEntry
,
197 ResourceList_AddEntryFromParent
,
198 ResourceList_TranslatedList
,
199 ResourceList_UntranslatedList
204 Factory for creating a resource list
206 PORTCLASSAPI NTSTATUS NTAPI
208 OUT PRESOURCELIST
* OutResourceList
,
209 IN PUNKNOWN OuterUnknown OPTIONAL
,
210 IN POOL_TYPE PoolType
,
211 IN PCM_RESOURCE_LIST TranslatedResources
,
212 IN PCM_RESOURCE_LIST UntranslatedResources
)
214 IResourceList
* new_list
= NULL
;
215 CResourceList
* this = NULL
;
217 /* TODO: Validate parameters */
219 DPRINT("PcNewResourceList\n");
221 new_list
= ExAllocatePoolWithTag(sizeof(IResourceList
), PoolType
, TAG_PORTCLASS
);
225 DPRINT("ExAllocatePoolWithTag failed\n");
226 return STATUS_INSUFFICIENT_RESOURCES
;
229 /* Obtain our private data */
230 this = CONTAINING_RECORD(new_list
, CResourceList
, IResourceList
);
235 this->m_outer_unknown
= OuterUnknown
;
236 this->translated_resources
= TranslatedResources
;
237 this->untranslated_resources
= UntranslatedResources
;
239 /* Increment our usage count and set the pointer to this object */
240 *OutResourceList
= new_list
;
241 ResourceListVtbl
.AddRef(*OutResourceList
);
243 return STATUS_SUCCESS
;
246 PORTCLASSAPI NTSTATUS NTAPI
247 PcNewResourceSublist(
248 OUT PRESOURCELIST
* OutResourceList
,
249 IN PUNKNOWN OuterUnknown OPTIONAL
,
250 IN POOL_TYPE PoolType
,
251 IN PRESOURCELIST ParentList
,
252 IN ULONG MaximumEntries
)
254 return STATUS_UNSUCCESSFUL
;