|
37 | 37 | : mDeviceControllerFactory(aFactory)
|
38 | 38 | , mQueue(aQueue)
|
39 | 39 | {
|
40 |
| - // If we fail to start a browse, there's nothing our consumer would do |
41 |
| - // differently, so we might as well do this in the constructor. |
42 |
| - TryToStartBrowse(); |
43 | 40 | }
|
44 | 41 |
|
45 |
| -void MTROperationalBrowser::TryToStartBrowse() |
| 42 | +void MTROperationalBrowser::ControllerActivated() |
46 | 43 | {
|
47 | 44 | assertChipStackLockedByCurrentThread();
|
48 | 45 |
|
49 |
| - ChipLogProgress(Controller, "Trying to start persistent operational browse"); |
| 46 | + if (mActiveControllerCount == 0) { |
| 47 | + EnsureBrowse(); |
| 48 | + } |
| 49 | + ++mActiveControllerCount; |
| 50 | +} |
| 51 | + |
| 52 | +void MTROperationalBrowser::ControllerDeactivated() |
| 53 | +{ |
| 54 | + assertChipStackLockedByCurrentThread(); |
| 55 | + |
| 56 | + if (mActiveControllerCount == 1) { |
| 57 | + StopBrowse(); |
| 58 | + } |
| 59 | + |
| 60 | + --mActiveControllerCount; |
| 61 | +} |
| 62 | + |
| 63 | +void MTROperationalBrowser::EnsureBrowse() |
| 64 | +{ |
| 65 | + assertChipStackLockedByCurrentThread(); |
| 66 | + |
| 67 | + if (mInitialized) { |
| 68 | + ChipLogProgress(Controller, "%p already has a persistent operational browse running", this); |
| 69 | + return; |
| 70 | + } |
| 71 | + |
| 72 | + ChipLogProgress(Controller, "%p trying to start persistent operational browse", this); |
50 | 73 |
|
51 | 74 | auto err = DNSServiceCreateConnection(&mBrowseRef);
|
52 | 75 | if (err != kDNSServiceErr_NoError) {
|
53 |
| - ChipLogError(Controller, "Failed to create connection for persistent operational browse: %" PRId32, err); |
| 76 | + ChipLogError(Controller, "%p failed to create connection for persistent operational browse: %" PRId32, this, err); |
54 | 77 | return;
|
55 | 78 | }
|
56 | 79 |
|
57 | 80 | err = DNSServiceSetDispatchQueue(mBrowseRef, mQueue);
|
58 | 81 | if (err != kDNSServiceErr_NoError) {
|
59 |
| - ChipLogError(Controller, "Failed to set up dispatch queue properly for persistent operational browse: %" PRId32, err); |
| 82 | + ChipLogError(Controller, "%p failed to set up dispatch queue properly for persistent operational browse: %" PRId32, this, err); |
60 | 83 | DNSServiceRefDeallocate(mBrowseRef);
|
61 | 84 | return;
|
62 | 85 | }
|
|
67 | 90 | auto browseRef = mBrowseRef; // Mandatory copy because of kDNSServiceFlagsShareConnection.
|
68 | 91 | err = DNSServiceBrowse(&browseRef, kDNSServiceFlagsShareConnection, kDNSServiceInterfaceIndexAny, kOperationalType, domain, OnBrowse, this);
|
69 | 92 | if (err != kDNSServiceErr_NoError) {
|
70 |
| - ChipLogError(Controller, "Failed to start persistent operational browse for \"%s\" domain: %" PRId32, StringOrNullMarker(domain), err); |
| 93 | + ChipLogError(Controller, "%p failed to start persistent operational browse for \"%s\" domain: %" PRId32, this, StringOrNullMarker(domain), err); |
71 | 94 | }
|
72 | 95 | }
|
73 | 96 | }
|
74 | 97 |
|
| 98 | +void MTROperationalBrowser::StopBrowse() |
| 99 | +{ |
| 100 | + ChipLogProgress(Controller, "%p stopping persistent operational browse", this); |
| 101 | + if (mInitialized) { |
| 102 | + DNSServiceRefDeallocate(mBrowseRef); |
| 103 | + mInitialized = false; |
| 104 | + } |
| 105 | +} |
| 106 | + |
75 | 107 | void MTROperationalBrowser::OnBrowse(DNSServiceRef aServiceRef, DNSServiceFlags aFlags, uint32_t aInterfaceId,
|
76 | 108 | DNSServiceErrorType aError, const char * aName, const char * aType, const char * aDomain, void * aContext)
|
77 | 109 | {
|
|
82 | 114 | // We only expect to get notified about our type/domain.
|
83 | 115 | if (aError != kDNSServiceErr_NoError) {
|
84 | 116 | ChipLogError(Controller, "Operational browse failure: %" PRId32, aError);
|
85 |
| - DNSServiceRefDeallocate(self->mBrowseRef); |
86 |
| - self->mInitialized = false; |
| 117 | + self->StopBrowse(); |
87 | 118 |
|
88 | 119 | // We shouldn't really get callbacks under our destructor, but guard
|
89 | 120 | // against it just in case.
|
90 | 121 | if (!self->mIsDestroying) {
|
91 | 122 | // Try to start a new browse, so we have one going.
|
92 |
| - self->TryToStartBrowse(); |
| 123 | + self->EnsureBrowse(); |
93 | 124 | }
|
94 | 125 | return;
|
95 | 126 | }
|
|
116 | 147 |
|
117 | 148 | mIsDestroying = true;
|
118 | 149 |
|
119 |
| - if (mInitialized) { |
120 |
| - DNSServiceRefDeallocate(mBrowseRef); |
121 |
| - } |
| 150 | + StopBrowse(); |
122 | 151 | }
|
0 commit comments