/*! Construct a GSM key filter and attach it to \a parent. */ GsmKeyFilter::GsmKeyFilter( QObject *parent ) : QObject( parent ) { d = new GsmKeyFilterPrivate(); // Add the standard call actions from GSM 02.30, section 4.5.5. addAction( "0", this, SIGNAL(setBusy()), Send | Incoming ); addAction( QRegExp( "4\\*([0-9]+)" ), this, SIGNAL(deflect(QString)), Send | Incoming ); addAction( "0", this, SIGNAL(releaseHeld()), Send | OnCall ); addAction( "0", this, SIGNAL(releaseActive()), Send | Incoming ); addAction( "1", this, SIGNAL(releaseAllAcceptIncoming()), Send | Incoming ); addAction( "1", this, SIGNAL(releaseActive()), Send | OnCall ); addAction( QRegExp( "1([1-9])" ), this, SLOT(releaseId(QString)), Send | OnCall ); addAction( "2", this, SIGNAL(swap()), Send | OnCall ); addAction( QRegExp( "2([1-9])" ), this, SLOT(activateId(QString)), Send | OnCall ); addAction( "3", this, SIGNAL(join()), Send | OnCall ); addAction( "4", this, SIGNAL(transfer()), Send | OnCall ); }
int __cdecl wmain(void) { HRESULT hr = CoInitialize(NULL); if (FAILED(hr)) { LOG(L"Failed CoInitializeEx: hr = 0x%08x", hr); return __LINE__; } CoUninitializeOnExit cuoe; // get active devices IMMDeviceEnumerator *pEnum = NULL; hr = CoCreateInstance( __uuidof(MMDeviceEnumerator), NULL, CLSCTX_ALL, __uuidof(IMMDeviceEnumerator), (void**)&pEnum ); if (FAILED(hr)) { LOG(L"Couldn't get device enumerator: hr = 0x%08x", hr); return __LINE__; } ReleaseOnExit releaseEnum(pEnum); IMMDeviceCollection *pDeviceCollection = NULL; hr = pEnum->EnumAudioEndpoints(eAll, DEVICE_STATE_ACTIVE | DEVICE_STATE_UNPLUGGED, &pDeviceCollection); if (FAILED(hr)) { LOG(L"Couldn't get device collection: hr = 0x%08x", hr); return __LINE__; } ReleaseOnExit releaseDeviceCollection(pDeviceCollection); UINT nDevices = 0; hr = pDeviceCollection->GetCount(&nDevices); if (FAILED(hr)) { LOG(L"Couldn't get device collection count: hr = 0x%08x", hr); return __LINE__; } for (UINT i = 0; i < nDevices; i++) { IMMDevice *pDevice = NULL; hr = pDeviceCollection->Item(i, &pDevice); if (FAILED(hr)) { LOG(L"Couldn't get device: hr = 0x%08x", hr); return __LINE__; } ReleaseOnExit releaseDevice(pDevice); IMMEndpoint *pEndpoint = NULL; hr = pDevice->QueryInterface(IID_PPV_ARGS(&pEndpoint)); if (FAILED(hr)) { LOG(L"Couldn't get endpoint: hr = 0x%08x", hr); return __LINE__; } ReleaseOnExit releaseEndpoint(pEndpoint); EDataFlow eDirection = eAll; hr = pEndpoint->GetDataFlow(&eDirection); if (FAILED(hr)) { LOG(L"Couldn't get data flow: hr = 0x%08x", hr); return __LINE__; } LOG(L"%s endpoint", StringFromDataFlow(eDirection)); IPropertyStore *pPropertyStore = NULL; hr = pDevice->OpenPropertyStore(STGM_READ, &pPropertyStore); if (FAILED(hr)) { LOG(L"Couldn't get property store: hr = 0x%08x", hr); return __LINE__; } ReleaseOnExit releasePropertyStore(pPropertyStore); // get the long name property PROPVARIANT pv; PropVariantInit(&pv); hr = pPropertyStore->GetValue(PKEY_Device_FriendlyName, &pv); if (FAILED(hr)) { LOG(L"Couldn't get friendly name: hr = 0x%08x", hr); return hr; } PropVariantClearOnExit clearPropVariant(&pv); LOG(L"Name: %s", pv.pwszVal); // get the ID WCHAR *wszId = NULL; hr = pDevice->GetId(&wszId); if (FAILED(hr)) { LOG(L"Couldn't get device ID: hr = 0x%08x", hr); return __LINE__; } CoTaskMemFreeOnExit releaseId(wszId); LOG(L"Endpoint ID: %s", wszId); // get device topology object for that endpoint IDeviceTopology *pDT = NULL; hr = pDevice->Activate(__uuidof(IDeviceTopology), CLSCTX_ALL, NULL, (void**)&pDT); if (FAILED(hr)) { LOG(L"Couldn't get device topology object: hr = 0x%08x", hr); return __LINE__; } ReleaseOnExit releaseDT(pDT); // get the single connector for that endpoint IConnector *pConnector = NULL; hr = pDT->GetConnector(0, &pConnector); if (FAILED(hr)) { LOG(L"Couldn't get the connector on the endpoint: hr = 0x%08x", hr); return __LINE__; } ReleaseOnExit releaseConnector(pConnector); // QI on the device's connector for IPart IPart *pPart = NULL; hr = pConnector->QueryInterface(IID_PPV_ARGS(&pPart)); if (FAILED(hr)) { LOG(L"Couldn't get the part: hr = 0x%08x", hr); return __LINE__; } ReleaseOnExit releasePart(pPart); // all the real work is done in this function // follow the connector from this trivial endpoint topology // over to the rest of the topologies hr = WalkTreeFromPart(pPart, eDirection, true, 1); if (FAILED(hr)) { LOG(L"Couldn't walk the tree: hr = 0x%08x", hr); return __LINE__; } LOG(L""); } return 0; }