Ejemplo n.º 1
0
        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;
                }
            }
        }
Ejemplo n.º 2
0
        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) {
            }
        }