DBD-ADO
view release on metacpan or search on metacpan
ex/Enums.patch view on Meta::CPAN
*** OLE.orig Fri Aug 01 07:34:14 2003
--- OLE.xs Wed Nov 05 22:32:20 2003
***************
*** 6584,6589 ****
--- 6584,6679 ----
XSRETURN_EMPTY;
}
+ void
+ Enums(self)
+ SV *self
+ PPCODE:
+ {
+ HRESULT hr;
+ UINT cp = cpDefault;
+ HV *stash = gv_stashpv(szWINOLE, TRUE);
+ HV *hv;
+ unsigned int count;
+
+ WINOLETYPELIBOBJECT *pObj = GetOleTypeLibObject(aTHX_ self);
+ if (!pObj)
+ XSRETURN_EMPTY;
+
+ hv = newHV();
+ ST(0) = sv_2mortal(newRV_noinc((SV*)hv));
+
+ /* loop through all objects in type lib */
+ count = pObj->pTypeLib->GetTypeInfoCount();
+ for (unsigned int index=0; index < count; ++index) {
+ ITypeInfo *pTypeInfo;
+ TYPEATTR *pTypeAttr;
+
+ hr = pObj->pTypeLib->GetTypeInfo(index, &pTypeInfo);
+ if (CheckOleError(aTHX_ stash, hr))
+ continue;
+
+ hr = pTypeInfo->GetTypeAttr(&pTypeAttr);
+ if (FAILED(hr)) {
+ pTypeInfo->Release();
+ ReportOleError(aTHX_ stash, hr);
+ continue;
+ }
+
+ if ( pTypeAttr->typekind == TKIND_ENUM ) {
+ unsigned int cName;
+ BSTR bstr;
+ char szName[64];
+
+ hr = pTypeInfo->GetDocumentation(MEMBERID_NIL, &bstr, NULL, NULL, NULL);
+ if (CheckOleError(aTHX_ stash, hr) || !bstr)
+ continue;
+
+ char *pszName = GetMultiByte(aTHX_ bstr, szName, sizeof(szName), cp);
+ HV *hv2 = newHV();
+ hv_store(hv, pszName, strlen(pszName), newRV_noinc((SV*)hv2), 0);
+ SysFreeString(bstr);
+ ReleaseBuffer(aTHX_ pszName, szName);
+
+ for (int iVar=0; iVar < pTypeAttr->cVars; ++iVar) {
+ VARDESC *pVarDesc;
+
+ hr = pTypeInfo->GetVarDesc(iVar, &pVarDesc);
+ /* XXX LEAK alert */
+ if (CheckOleError(aTHX_ stash, hr))
+ continue;
+
+ if (!(pVarDesc->wVarFlags & (VARFLAG_FHIDDEN |
+ VARFLAG_FRESTRICTED |
+ VARFLAG_FNONBROWSABLE)))
+ {
+ unsigned int cName;
+ BSTR bstr;
( run in 0.502 second using v1.01-cache-2.11-cpan-71847e10f99 )