private static void Instance_CallChanged(SkypeInstance instance, SkypeWatcher.Model.SkypeCall call, SkypeWatcher.Model.SkypeCallState state) { log.Info($"Call detected: {call.CallId}, {call.From} -> {call.To}, {state}"); if (state == SkypeCallState.Started) { call.Started = DateTime.Now; if (_recorder == null || !_recorder.IsRecording) { _recorder = new SkypeRecorder(); _recorder.Instance = instance; _recorder.Call = call; _recorder.StartRecording(); } } else if (state == SkypeCallState.Finished) { if (_recorder != null && _recorder.IsRecording) { _recorder.StopRecording(); _recorder = null; } } }
private void DetectNewCallsInternal(string path, bool generateEvents) { log.Debug($"Detecting new calls at {path}"); if (!File.Exists(path)) { return; } var key = BuildDbKey(path); SkypeCall lastCall = null; if (lastCalls.ContainsKey(key)) { lastCall = lastCalls[key]; } var connectString = $"Data Source={path};Version=3;Read Only=True;cache=shared; nolock=1"; using (var sqliteConnection = new SQLiteConnection(connectString)) { sqliteConnection.Open(); using (var command = sqliteConnection.CreateCommand()) { string lastCallId = lastCall == null ? "0" : lastCall.CallId; command.CommandText = "select c.id, c.begin_timestamp, c.status, c.host_identity, cm.identity from Calls c, CallMembers cm\n" + $"where cm.[call_db_id]=c.id and c.id>={lastCallId}\n" + "order by c.begin_timestamp"; command.CommandType = CommandType.Text; using (DbDataReader dbDataReader = command.ExecuteReader()) { while (dbDataReader.Read()) { SkypeCall call = new SkypeCall(); long callId = Convert.ToInt64(dbDataReader[0]); call.CallId = callId.ToString(); int stateVal = dbDataReader[2] == DBNull.Value ? 0 : Convert.ToInt32(dbDataReader[2]); switch (stateVal) { case 4: call.State = SkypeCallState.Started; break; case 6: call.State = SkypeCallState.Finished; break; case 7: case 8: call.State = SkypeCallState.Missed; break; default: call.State = SkypeCallState.Unknown; break; } if (call.State == SkypeCallState.Started || dbDataReader[1] == DBNull.Value) { call.Started = DateTime.Now; } else { call.Started = ConvertFromUnixTimestamp((long)dbDataReader[1]); } call.From = new SkypeUser() { SkypeId = dbDataReader[3].ToString(), DisplayName = dbDataReader[3].ToString() }; call.To = new SkypeUser() { SkypeId = dbDataReader[4].ToString(), DisplayName = dbDataReader[4].ToString() }; if (call.State == SkypeCallState.Finished) { call.Duration = DateTime.Now.Subtract(call.Started); } if (generateEvents && (lastCall == null || lastCall.CallId != call.CallId || call.State != lastCall.State)) { OnCallChanged(call, call.State); } lastCall = call; } log.Debug($"Last found call for {key} is {lastCallId}"); } } } lastCalls[key] = lastCall; }
protected override void ParseCall(string call) { log.Debug($"Parse call: {call}"); try { var obj = JObject.Parse(call); SkypeCallState state = SkypeCallState.Unknown; string callId = null; SkypeUser from = null; SkypeUser to = null; JObject current = obj.GetValue("current") as JObject; if (current != null) { var idObj = obj.GetValue("ids") as JObject; callId = idObj.GetValue("callId").ToString(); var stateInt = current.GetValue("state").Value <int>(); if (stateInt == 3) { state = SkypeCallState.Started; } } else { state = SkypeCallState.Finished; callId = obj.GetValue("callId").ToString(); var fromObj = obj.GetValue("originatorParticipant") as JObject; if (fromObj != null) { from = new SkypeUser() { SkypeId = fromObj.GetValue("id").ToString(), DisplayName = fromObj.GetValue("displayName").ToString() }; } var toObj = obj.GetValue("targetParticipant") as JObject; if (toObj != null) { to = new SkypeUser() { SkypeId = toObj.GetValue("id").ToString(), DisplayName = toObj.GetValue("displayName").ToString() }; } } var skypeCall = new SkypeCall() { CallId = callId, From = from, To = to }; if (state != SkypeCallState.Started || IsNewCall(callId)) { OnCallChanged(skypeCall, state); } } catch (Exception ex) { } }