@@ -181,70 +181,104 @@ void WebRTCTransportProviderServer::RemoveSession(uint16_t sessionId)
181
181
// Command Handlers
182
182
void WebRTCTransportProviderServer::HandleSolicitOffer (HandlerContext & ctx, const Commands::SolicitOffer::DecodableType & req)
183
183
{
184
- CHIP_ERROR err = CHIP_NO_ERROR;
185
- Status status = Status::Success;
186
- bool deferOffer = false ;
184
+ // Extract parameters from the command
185
+ StreamUsageEnum streamUsage = req.streamUsage ;
186
+ auto videoStreamID = req.videoStreamID ;
187
+ auto audioStreamID = req.audioStreamID ;
188
+ auto iceServers = req.iceServers ;
189
+ auto iceTransportPolicy = req.iceTransportPolicy ;
190
+ auto metadataOptions = req.metadataOptions ;
191
+
192
+ // Convert ICE Servers from DecodableList to vector
193
+ Optional<std::vector<Structs::ICEServerStruct::Type>> iceServersList;
194
+ if (iceServers.HasValue ())
195
+ {
196
+ std::vector<Structs::ICEServerStruct::Type> list;
197
+ auto iter = iceServers.Value ().begin ();
198
+ while (iter.Next ())
199
+ {
200
+ list.push_back (iter.GetValue ());
201
+ }
202
+ iceServersList.SetValue (list);
203
+ }
187
204
188
- if (mDelegate == nullptr )
205
+ // Convert ICETransportPolicy to string
206
+ Optional<std::string> iceTransportPolicyStr;
207
+ if (iceTransportPolicy.HasValue ())
189
208
{
190
- ctx.mCommandHandler .AddStatus (ctx.mRequestPath , Status::Failure);
191
- return ;
209
+ iceTransportPolicyStr.SetValue (std::string (iceTransportPolicy.Value ().data (), iceTransportPolicy.Value ().size ()));
192
210
}
193
211
194
- auto nodeId = GetNodeIdFromCtx (ctx.mCommandHandler );
195
- auto fabricIdx = ctx.mCommandHandler .GetAccessingFabricIndex ();
212
+ NodeId nodeId = GetNodeIdFromCtx (ctx.mCommandHandler );
213
+ FabricIndex fabricIdx = ctx.mCommandHandler .GetAccessingFabricIndex ();
196
214
197
- // Create a new session entry or fetch one, as needed
215
+ // Delegate processing
198
216
Structs::WebRTCSessionStruct::Type session;
199
- err = mDelegate -> HandleSolicitOffer (req. streamUsage , nodeId, fabricIdx, session, deferOffer) ;
200
- if ( err != CHIP_NO_ERROR)
201
- {
202
- status = StatusIB (err). mStatus ;
203
- }
217
+ bool deferredOffer = false ;
218
+ CHIP_ERROR err = mDelegate -> HandleSolicitOffer (streamUsage, videoStreamID, audioStreamID, iceServersList,
219
+ iceTransportPolicyStr, metadataOptions, nodeId, fabricIdx,
220
+ session, deferredOffer) ;
221
+ Status status = StatusIB (err). mStatus ;
204
222
205
- // Build the response command
223
+ // Build response with actual session data
206
224
Commands::SolicitOfferResponse::Type resp;
207
- resp.webRTCSessionID = static_cast <uint16_t >(session.sessionId );
208
- resp.deferredOffer = deferOffer;
209
-
210
- // The cluster spec says video/audio stream IDs might be null if not known yet
211
- // or if no video/audio is requested. For illustration, we set them to NullOptional:
212
- resp.videoStreamID .SetNull ();
213
- resp.audioStreamID .SetNull ();
225
+ resp.webRTCSessionID = session.id ;
226
+ resp.deferredOffer = deferredOffer;
227
+ resp.videoStreamID = session.videoStreamID ;
228
+ resp.audioStreamID = session.audioStreamID ;
214
229
215
230
ctx.mCommandHandler .AddResponse (ctx.mRequestPath , resp, status);
216
231
}
217
232
218
- void WebRTCProviderServer ::HandleSolicitOffer (HandlerContext & ctx, const Commands::SolicitOffer::DecodableType & req)
233
+ void WebRTCTransportProviderServer ::HandleSolicitOffer (HandlerContext & ctx, const Commands::SolicitOffer::DecodableType & req)
219
234
{
220
- // Example logic: we create a brand new session with an ID
221
- static uint16_t sNextSessionId = 1 ; // simplistic ID generator for illustration
222
- uint16_t newSessionId = sNextSessionId ++;
223
-
224
- // Fill out the struct from the spec
225
- WebRTCSessionStruct::Type newSession;
226
- newSession.id = newSessionId;
227
- newSession.peerNodeID = ctx.mCommandHandler .GetSubjectDescriptor ().subject ;
228
- newSession.peerFabricIndex = ctx.mCommandHandler .GetAccessingFabricIndex ();
229
- newSession.streamUsage = req.streamUsage ;
230
- newSession.videoStreamID .SetNull ();
231
- newSession.audioStreamID .SetNull ();
232
- newSession.metadataOptions .SetRaw (0 );
233
-
234
- // Store it
235
- AddOrUpdateSession (newSession);
236
-
237
- // Build the response
238
- Commands::SolicitOfferResponse::Type response;
239
- response.webRTCSessionID = newSessionId;
240
- // For demonstration, we say "deferredOffer" is always false
241
- response.deferredOffer = false ;
242
- // Echo the video/audio stream IDs we set
243
- response.videoStreamID = newSession.videoStreamID ;
244
- response.audioStreamID = newSession.audioStreamID ;
245
-
246
- // Return the response
247
- ctx.mCommandHandler .AddResponse (ctx.mRequestPath , response);
235
+ // Extract parameters from the command
236
+ uint8_t streamUsage = req.streamUsage ;
237
+ auto videoStreamID = req.videoStreamID ;
238
+ auto audioStreamID = req.audioStreamID ;
239
+ auto iceServers = req.iceServers ;
240
+ auto iceTransportPolicy = req.iceTransportPolicy ;
241
+ auto metadataOptions = req.metadataOptions ;
242
+
243
+ // Convert ICE Servers from DecodableList to vector
244
+ Optional<std::vector<Structs::ICEServerStruct::Type>> iceServersList;
245
+ if (iceServers.HasValue ())
246
+ {
247
+ std::vector<Structs::ICEServerStruct::Type> list;
248
+ auto iter = iceServers.Value ().begin ();
249
+ while (iter.Next ())
250
+ {
251
+ list.push_back (iter.GetValue ());
252
+ }
253
+ iceServersList.SetValue (list);
254
+ }
255
+
256
+ // Convert ICETransportPolicy to string
257
+ Optional<std::string> iceTransportPolicyStr;
258
+ if (iceTransportPolicy.HasValue ())
259
+ {
260
+ iceTransportPolicyStr.SetValue (std::string (iceTransportPolicy.Value ().data (), iceTransportPolicy.Value ().size ()));
261
+ }
262
+
263
+ NodeId nodeId = GetNodeIdFromCtx (ctx.mCommandHandler );
264
+ FabricIndex fabricIdx = ctx.mCommandHandler .GetAccessingFabricIndex ();
265
+
266
+ // Delegate processing
267
+ Structs::WebRTCSessionStruct::Type session;
268
+ bool deferredOffer = false ;
269
+ CHIP_ERROR err = mDelegate ->HandleSolicitOffer (streamUsage, videoStreamID, audioStreamID, iceServersList,
270
+ iceTransportPolicyStr, metadataOptions, nodeId, fabricIdx,
271
+ session, deferredOffer);
272
+ Status status = StatusIB (err).mStatus ;
273
+
274
+ // Build response with actual session data
275
+ Commands::SolicitOfferResponse::Type resp;
276
+ resp.webRTCSessionID = session.id ;
277
+ resp.deferredOffer = deferredOffer;
278
+ resp.videoStreamID = session.videoStreamID ;
279
+ resp.audioStreamID = session.audioStreamID ;
280
+
281
+ ctx.mCommandHandler .AddResponse (ctx.mRequestPath , resp, status);
248
282
}
249
283
250
284
void WebRTCTransportProviderServer::HandleProvideOffer (HandlerContext & ctx, const Commands::ProvideOffer::DecodableType & req)
@@ -367,6 +401,22 @@ void WebRTCTransportProviderServer::HandleProvideICECandidates(HandlerContext &
367
401
ctx.mCommandHandler .AddStatus (ctx.mRequestPath , status);
368
402
}
369
403
404
+ void WebRTCTransportProviderServer::HandleProvideICECandidates (HandlerContext & ctx,
405
+ const Commands::ProvideICECandidates::DecodableType & req)
406
+ {
407
+ std::vector<std::string> candidates;
408
+ for (auto & candidate : req.iCECandidates )
409
+ {
410
+ candidates.emplace_back (candidate.data (), candidate.size ());
411
+ }
412
+
413
+ NodeId nodeId = GetNodeIdFromCtx (ctx.mCommandHandler );
414
+ FabricIndex fabricIdx = ctx.mCommandHandler .GetAccessingFabricIndex ();
415
+
416
+ CHIP_ERROR err = mDelegate ->HandleProvideICECandidates (req.webRTCSessionID , nodeId, fabricIdx, candidates);
417
+ ctx.mCommandHandler .AddStatus (ctx.mRequestPath , StatusIB (err).mStatus );
418
+ }
419
+
370
420
void WebRTCTransportProviderServer::HandleEndSession (HandlerContext & ctx, const Commands::EndSession::DecodableType & req)
371
421
{
372
422
// Remove from our vector
0 commit comments