| 2474 | } |
| 2475 | |
| 2476 | Result NewBrowser(const BrowserParams* params, HBrowser* browser) |
| 2477 | { |
| 2478 | if (browser == 0 || params == 0 || params->m_ServiceType == 0) |
| 2479 | return RESULT_INVALID_ARGS; |
| 2480 | |
| 2481 | *browser = 0; |
| 2482 | |
| 2483 | Browser* instance = new Browser(); |
| 2484 | if (instance == 0) |
| 2485 | return RESULT_OUT_OF_RESOURCES; |
| 2486 | |
| 2487 | dmStrlCpy(instance->m_ServiceType, params->m_ServiceType, sizeof(instance->m_ServiceType)); |
| 2488 | BuildLocalName(params->m_ServiceType, instance->m_ServiceTypeLocal, sizeof(instance->m_ServiceTypeLocal)); |
| 2489 | instance->m_Callback = params->m_Callback; |
| 2490 | instance->m_Context = params->m_Context; |
| 2491 | |
| 2492 | RefreshBrowserInterfaceAddresses(instance); |
| 2493 | instance->m_Socket = CreateSocket(); |
| 2494 | if (instance->m_Socket == dmSocket::INVALID_SOCKET_HANDLE) |
| 2495 | { |
| 2496 | delete instance; |
| 2497 | return RESULT_NETWORK_ERROR; |
| 2498 | } |
| 2499 | |
| 2500 | EnsureMemberships(instance->m_Socket, instance->m_InterfaceAddresses, &instance->m_MembershipAddresses); |
| 2501 | ResetBrowserQueryBackoff(instance, 0); |
| 2502 | instance->m_NextInterfaceRefresh = 0; |
| 2503 | *browser = instance; |
| 2504 | return RESULT_OK; |
| 2505 | } |
| 2506 | |
| 2507 | void UpdateBrowser(HBrowser browser) |
| 2508 | { |