コード例 #1
0
ファイル: net-if.c プロジェクト: AmesianX/obs-studio
static inline void netif_get_addrs_win32(struct netif_saddr_data *ifaddrs)
{
	PIP_ADAPTER_ADDRESSES adapter = get_adapters();
	PIP_ADAPTER_UNICAST_ADDRESS unicast = NULL;
	PIP_ADAPTER_ADDRESSES cur_adap = NULL;
	SOCKET_ADDRESS socket_addr;
	int family;

	if (!adapter)
		return;

	for (cur_adap = adapter; !!cur_adap; cur_adap = cur_adap->Next) {
		char *adap_name = NULL;

		if (cur_adap->OperStatus != IfOperStatusUp ||
		    cur_adap->IfType == IF_TYPE_SOFTWARE_LOOPBACK)
			continue;

		os_wcs_to_utf8_ptr(cur_adap->FriendlyName, 0, &adap_name);

		unicast = cur_adap->FirstUnicastAddress;

		for (; !!unicast; unicast = unicast->Next) {
			socket_addr = unicast->Address;

			family = socket_addr.lpSockaddr->sa_family;
			if (family == AF_INET || family == AF_INET6)
				netif_push(socket_addr.lpSockaddr, ifaddrs,
						adap_name);
		}

		bfree(adap_name);
	}

	bfree(adapter);
}
コード例 #2
0
ファイル: SST_WMEnum_Win32.c プロジェクト: figgles/libsst
static SST_GraphicsEnumerator Win32_CreateGraphicsEnumerator(void)
{
	DISPLAY_DEVICEA* devsFound = NULL;
	char* adapterNames;
	char* adapterGUIDs;
	size_t* screenCount;
	size_t adapterCount;
	size_t devCount = 0;
	size_t ASPairCount = 0;
	size_t i;
	SST_GraphicsEnumerator_Win32* enumerator;
	ASMapEntry* ASMap;
	HANDLE hProcessHeap;

	/* Get a list of Win32 display devices */
	devsFound = get_win32devs(&devCount);
	if(devsFound == NULL)
		return NULL;

	hProcessHeap = GetProcessHeap();

	/* Get a list of the graphics adapters' names */
	adapterNames = get_adapters(devsFound, devCount, &adapterCount, &adapterGUIDs);
	if(adapterNames == NULL)
	{
		HeapFree(hProcessHeap, 0, devsFound);
		return NULL;
	}

	/* Make a map of adapter->screen count */
	screenCount = HeapAlloc(hProcessHeap, 0, adapterCount*sizeof(size_t));
	if(screenCount == NULL)
	{
		HeapFree(hProcessHeap, 0, adapterGUIDs);
		HeapFree(hProcessHeap, 0, adapterNames);
		HeapFree(hProcessHeap, 0, devsFound);
		return NULL;
	}
	for(i=0; i<adapterCount; i++)
		screenCount[i] = 0;
	
	/* Attempt to build the adapter-screen map */
	ASMap = build_asmap(devsFound, adapterGUIDs, devCount, adapterCount, screenCount, &ASPairCount);
	if(ASMap == NULL)
	{
		HeapFree(hProcessHeap, 0, adapterGUIDs);
		HeapFree(hProcessHeap, 0, adapterNames);
		HeapFree(hProcessHeap, 0, devsFound);
		HeapFree(hProcessHeap, 0, screenCount);
		return NULL;
	}

	/* Done with GUIDs */
	HeapFree(hProcessHeap, 0, adapterGUIDs);

	/* Get the list of video modes for each adapter-screen pair */
	for(i=0; i<ASPairCount; i++)
	{
		size_t vmodeCount;
		SST_VideoMode* vmodes;
		
		vmodes = get_vmodes(ASMap[i].dev, &vmodeCount, &ASMap[i].defaultVmode);
		if(vmodes == NULL)
		{
			size_t j;
			for(j=0; j<i; j++)
				HeapFree(hProcessHeap, 0, ASMap[i].vmodes);
			HeapFree(hProcessHeap, 0, adapterNames);
			HeapFree(hProcessHeap, 0, devsFound);
			HeapFree(hProcessHeap, 0, screenCount);
			HeapFree(hProcessHeap, 0, ASMap);
			return NULL;
		}
		/* Save the screens for this */
		ASMap[i].vmodeCount = vmodeCount;
		ASMap[i].vmodes = vmodes;
	}

	/* Prepare a structure to return... */
	enumerator = HeapAlloc(hProcessHeap, 0, sizeof(SST_GraphicsEnumerator_Win32));
	if(enumerator == NULL)
	{
		/* Doh! So close :\ */
		size_t j;
		for(j=0; j<i; j++)
			HeapFree(hProcessHeap, 0, ASMap[i].vmodes);

		HeapFree(hProcessHeap, 0, adapterNames);
		HeapFree(hProcessHeap, 0, devsFound);
		HeapFree(hProcessHeap, 0, screenCount);
		HeapFree(hProcessHeap, 0, ASMap);
		return NULL;
	}

	/* Save fields */
	enumerator->adapterNames = adapterNames;
	enumerator->adapterCount = adapterCount;
	enumerator->devCount = devCount;
	enumerator->devsFound = devsFound;
	enumerator->screenCount = screenCount;
	enumerator->ASMap = ASMap;
	enumerator->ASPairCount = ASPairCount;

	return enumerator;
}