/// <summary> /// Callback fired by the tvcontroller when EPG data has been received /// The method checks if epg grabbing was in progress and ifso creates a new workerthread /// to update the database with the new epg data /// </summary> public override int OnEpgReceived() { try { //is epg grabbing in progress? /*if (_state == EpgState.Idle) * { * Log.Epg("Epg: card:{0} OnEpgReceived while idle", _user.CardId); * return 0; * }*/ //is epg grabber already updating the database? if (_state == EpgState.Updating) { Log.Epg("Epg: card:{0} OnEpgReceived while updating", _user.CardId); return(0); } //is the card still idle? if (IsCardIdle(_user) == false) { Log.Epg("Epg: card:{0} OnEpgReceived but card is not idle", _user.CardId); _state = EpgState.Idle; _tvController.StopGrabbingEpg(_user); _user.CardId = -1; _currentTransponder.InUse = false; return(0); } List <EpgChannel> epg = _tvController.Epg(_user.CardId) ?? new List <EpgChannel>(); //did we receive epg info? if (epg.Count == 0) { //no epg found for this transponder Log.Epg("Epg: card:{0} no epg found", _user.CardId); _currentTransponder.InUse = false; _currentTransponder.OnTimeOut(); _state = EpgState.Idle; _tvController.StopGrabbingEpg(_user); _tvController.PauseCard(_user); _user.CardId = -1; _currentTransponder.InUse = false; return(0); } //create worker thread to update the database Log.Epg("Epg: card:{0} received epg for {1} channels", _user.CardId, epg.Count); _state = EpgState.Updating; _epg = epg; Thread workerThread = new Thread(UpdateDatabaseThread); workerThread.IsBackground = true; workerThread.Name = "EPG Update thread"; workerThread.Start(); } catch (Exception ex) { Log.Write(ex); } return(0); }