@@ -99,7 +99,7 @@ CHIP_ERROR AndroidLogDownloadFromNode::SendRetrieveLogsRequest(Messaging::Exchan
99
99
if (err != CHIP_NO_ERROR)
100
100
{
101
101
ChipLogError (Controller, " Make BDX URI failure : %" CHIP_ERROR_FORMAT, err.Format ());
102
- FinishLogDownloadFromNode (err);
102
+ FinishLogDownloadFromNode (static_cast < void *>( this ), err);
103
103
}
104
104
105
105
mBdxReceiver =
@@ -132,18 +132,14 @@ void AndroidLogDownloadFromNode::OnDeviceConnectedFn(void * context, Messaging::
132
132
if (err != CHIP_NO_ERROR)
133
133
{
134
134
ChipLogError (Controller, " Log Download failure : %" CHIP_ERROR_FORMAT, err.Format ());
135
- self-> FinishLogDownloadFromNode (err);
135
+ FinishLogDownloadFromNode (context, err);
136
136
}
137
137
}
138
138
139
139
void AndroidLogDownloadFromNode::OnDeviceConnectionFailureFn (void * context, const ScopedNodeId & peerId, CHIP_ERROR err)
140
140
{
141
141
ChipLogProgress (Controller, " OnDeviceConnectionFailureFn: %" CHIP_ERROR_FORMAT, err.Format ());
142
-
143
- auto * self = static_cast <AndroidLogDownloadFromNode *>(context);
144
- VerifyOrReturn (self != nullptr , ChipLogProgress (Controller, " Device connected failure callback with null context. Ignoring" ));
145
-
146
- self->FinishLogDownloadFromNode (err);
142
+ FinishLogDownloadFromNode (context, err);
147
143
}
148
144
149
145
void AndroidLogDownloadFromNode::OnResponseRetrieveLogs (void * context,
@@ -162,25 +158,25 @@ void AndroidLogDownloadFromNode::OnResponseRetrieveLogs(void * context,
162
158
{
163
159
CHIP_ERROR err = CHIP_NO_ERROR;
164
160
self->OnTransferCallback (self->mController ->GetFabricIndex (), self->mRemoteNodeId , data.logContent , &err);
165
- self-> FinishLogDownloadFromNode (err);
161
+ FinishLogDownloadFromNode (context, err);
166
162
}
167
163
else if (data.status == StatusEnum::kNoLogs )
168
164
{
169
165
CHIP_ERROR err = CHIP_NO_ERROR;
170
166
self->OnTransferCallback (self->mController ->GetFabricIndex (), self->mRemoteNodeId , ByteSpan (), &err);
171
- self-> FinishLogDownloadFromNode (err);
167
+ FinishLogDownloadFromNode (context, err);
172
168
}
173
169
else if (data.status == StatusEnum::kBusy )
174
170
{
175
- self-> FinishLogDownloadFromNode (CHIP_ERROR_BUSY);
171
+ FinishLogDownloadFromNode (context, CHIP_ERROR_BUSY);
176
172
}
177
173
else if (data.status == StatusEnum::kDenied )
178
174
{
179
- self-> FinishLogDownloadFromNode (CHIP_ERROR_ACCESS_DENIED);
175
+ FinishLogDownloadFromNode (context, CHIP_ERROR_ACCESS_DENIED);
180
176
}
181
177
else
182
178
{
183
- self-> FinishLogDownloadFromNode (CHIP_ERROR_INVALID_DATA_LIST);
179
+ FinishLogDownloadFromNode (context, CHIP_ERROR_INVALID_DATA_LIST);
184
180
}
185
181
}
186
182
@@ -191,48 +187,60 @@ void AndroidLogDownloadFromNode::OnCommandFailure(void * context, CHIP_ERROR err
191
187
auto * self = static_cast <AndroidLogDownloadFromNode *>(context);
192
188
VerifyOrReturn (self != nullptr , ChipLogProgress (Controller, " Send command failure callback with null context. Ignoring" ));
193
189
194
- self-> FinishLogDownloadFromNode (err);
190
+ FinishLogDownloadFromNode (context, err);
195
191
}
196
192
197
- void AndroidLogDownloadFromNode::FinishLogDownloadFromNode (CHIP_ERROR err)
193
+ void AndroidLogDownloadFromNode::FinishLogDownloadFromNode (void * context, CHIP_ERROR err)
198
194
{
199
- CHIP_ERROR jniErr = CHIP_NO_ERROR;
200
- if (mBdxReceiver != nullptr )
195
+ auto * self = static_cast <AndroidLogDownloadFromNode *>(context);
196
+ VerifyOrReturn (self != nullptr , ChipLogProgress (Controller, " Finish Log Download with null context. Ignoring" ));
197
+
198
+ if (self->mBdxReceiver != nullptr )
201
199
{
202
- if (mTimeout > 0 )
200
+ if (self-> mTimeout > 0 && err != CHIP_ERROR_TIMEOUT )
203
201
{
204
- mBdxReceiver ->CancelBDXTransferTimeout ();
202
+ self-> mBdxReceiver ->CancelBDXTransferTimeout ();
205
203
}
206
- delete mBdxReceiver ;
207
- mBdxReceiver = nullptr ;
204
+ delete self-> mBdxReceiver ;
205
+ self-> mBdxReceiver = nullptr ;
208
206
}
209
207
210
- JNIEnv * env = JniReferences::GetInstance ().GetEnvForCurrentThread ();
208
+ CHIP_ERROR jniErr = CHIP_NO_ERROR;
209
+ JNIEnv * env = JniReferences::GetInstance ().GetEnvForCurrentThread ();
211
210
JniLocalReferenceScope scope (env);
212
211
212
+ jobject jCallback = self->mJavaCallback .ObjectRef ();
213
+ jint jFabricIndex = self->mController ->GetFabricIndex ();
214
+ jlong jremoteNodeId = self->mRemoteNodeId ;
215
+
216
+ VerifyOrExit (env != nullptr , ChipLogError (Controller, " Could not get JNIEnv for current thread" ));
217
+
213
218
if (err == CHIP_NO_ERROR)
214
219
{
215
220
ChipLogProgress (Controller, " Log Download succeeded." );
216
221
jmethodID onSuccessMethod;
217
222
// Java method signature : boolean onSuccess(int fabricIndex, long nodeId)
218
- jniErr = JniReferences::GetInstance ().FindMethod (env, mJavaCallback . ObjectRef () , " onSuccess" , " (IJ)V" , &onSuccessMethod);
223
+ jniErr = JniReferences::GetInstance ().FindMethod (env, jCallback , " onSuccess" , " (IJ)V" , &onSuccessMethod);
219
224
220
- VerifyOrReturn (jniErr == CHIP_NO_ERROR, ChipLogError (Controller, " Could not find onSuccess method" ));
225
+ VerifyOrExit (jniErr == CHIP_NO_ERROR, ChipLogError (Controller, " Could not find onSuccess method" ));
221
226
222
- env->CallVoidMethod (mJavaCallback .ObjectRef (), onSuccessMethod, static_cast <jint>(mController ->GetFabricIndex ()),
223
- static_cast <jlong>(mRemoteNodeId ));
224
- return ;
227
+ env->CallVoidMethod (jCallback, onSuccessMethod, jFabricIndex, jremoteNodeId);
225
228
}
229
+ else
230
+ {
231
+ ChipLogError (Controller, " Log Download Failed : %" CHIP_ERROR_FORMAT, err.Format ());
226
232
227
- ChipLogError (Controller, " Log Download Failed : %" CHIP_ERROR_FORMAT, err.Format ());
233
+ jmethodID onErrorMethod;
234
+ // Java method signature : void onError(int fabricIndex, long nodeId, long errorCode)
235
+ jniErr = JniReferences::GetInstance ().FindMethod (env, jCallback, " onError" , " (IJJ)V" , &onErrorMethod);
236
+ VerifyOrExit (jniErr == CHIP_NO_ERROR, ChipLogError (Controller, " Could not find onError method" ));
228
237
229
- jmethodID onErrorMethod;
230
- // Java method signature : void onError(int fabricIndex, long nodeId, long errorCode)
231
- jniErr = JniReferences::GetInstance ().FindMethod (env, mJavaCallback .ObjectRef (), " onError" , " (IJJ)V" , &onErrorMethod);
232
- VerifyOrReturn (jniErr == CHIP_NO_ERROR, ChipLogError (Controller, " Could not find onError method" ));
238
+ env->CallVoidMethod (jCallback, onErrorMethod, jFabricIndex, jremoteNodeId, static_cast <jlong>(err.AsInteger ()));
239
+ }
233
240
234
- env->CallVoidMethod (mJavaCallback .ObjectRef (), onErrorMethod, static_cast <jint>(mController ->GetFabricIndex ()),
235
- static_cast <jlong>(mRemoteNodeId ), static_cast <jlong>(err.AsInteger ()));
241
+ exit :
242
+ // Finish this function, this object will be deleted.
243
+ delete self;
236
244
}
237
245
238
246
void AndroidLogDownloadFromNode::OnBdxTransferCallback (void * context, FabricIndex fabricIndex, NodeId remoteNodeId,
@@ -277,7 +285,7 @@ void AndroidLogDownloadFromNode::OnBdxTransferSuccessCallback(void * context, Fa
277
285
auto * self = static_cast <AndroidLogDownloadFromNode *>(context);
278
286
VerifyOrReturn (self != nullptr , ChipLogProgress (Controller, " Send command failure callback with null context. Ignoring" ));
279
287
280
- self-> FinishLogDownloadFromNode (CHIP_NO_ERROR);
288
+ FinishLogDownloadFromNode (context, CHIP_NO_ERROR);
281
289
}
282
290
283
291
void AndroidLogDownloadFromNode::OnBdxTransferFailureCallback (void * context, FabricIndex fabricIndex, NodeId remoteNodeId,
@@ -288,7 +296,7 @@ void AndroidLogDownloadFromNode::OnBdxTransferFailureCallback(void * context, Fa
288
296
auto * self = static_cast <AndroidLogDownloadFromNode *>(context);
289
297
VerifyOrReturn (self != nullptr , ChipLogProgress (Controller, " Send command failure callback with null context. Ignoring" ));
290
298
291
- self-> FinishLogDownloadFromNode (status);
299
+ FinishLogDownloadFromNode (context, status);
292
300
}
293
301
} // namespace Controller
294
302
} // namespace chip
0 commit comments