public ICardTuneReservationTicket RequestCardTuneReservation(ITvCardHandler tvcard, IChannel tuningDetail, IUser user)
{
ICardTuneReservationTicket cardTuneReservationTicket = null;
var layer = new TvBusinessLayer();
CardTuneState cardTuneState;
int ticketId = 0;
bool isCardAvail;
bool hasUserHigherPriorityThanBlockingUser = false;
lock (tvcard.Tuner.CardReservationsLock)
{
isCardAvail = IsCardAvail(tvcard);
if (!isCardAvail)
{
if (tvcard.Tuner.CardTuneState != CardTuneState.TuneCancelled)
{
IUser blockingUser = GetBlockingUser(tvcard);
hasUserHigherPriorityThanBlockingUser = (HasUserHigherPriorityThanBlockingUser(user, blockingUser));
if (hasUserHigherPriorityThanBlockingUser)
{
tvcard.Tuner.CardTuneState = CardTuneState.TuneCancelled;
}
}
}
}
if (!isCardAvail)
{
if (hasUserHigherPriorityThanBlockingUser)
{
tvcard.Tuner.CancelTune(tvcard.Tuner.ActiveCardTuneReservationTicket.PendingSubchannel);
lock (tvcard.Tuner.CardReservationsLock)
{
isCardAvail = IsCardAvail(tvcard);
}
}
}
lock (tvcard.Tuner.CardReservationsLock)
{
if (isCardAvail)
{
tvcard.Tuner.CardTuneState = CardTuneState.TunePending;
bool isTunedToTransponder = IsTunedToTransponder(tvcard, tuningDetail);
if (isTunedToTransponder)
{
CheckTransponder(tvcard, tuningDetail, layer, user);
}
int ownerSubchannel = -1;
int numberOfUsersOnSameCurrentChannel = 0;
int numberOfOtherUsersOnSameChannel = 0;
int numberOfOtherUsersOnCurrentCard = 0;
bool hasUserHighestPriority = false;
bool hasUserEqualOrHigherPriority = false;
bool isCamAlreadyDecodingChannel = false;
bool conflictingSubchannelFound = false;
bool isRecordingAnyUser = false;
bool isAnySubChannelTimeshifting = tvcard.TimeShifter.IsAnySubChannelTimeshifting;
bool isOwner = tvcard.Users.IsOwner(user);
var users = new List<IUser>(tvcard.Users.GetUsers());
var inactiveUsers = new List<IUser>();
var activeUsers = new List<IUser>();
var recUsers = new List<IUser>();
var tsUsers = new List<IUser>();
var context = tvcard.Card.Context as ITvCardContext;
if (context != null)
{
context.GetUser(ref user);
hasUserHighestPriority = context.HasUserHighestPriority(user);
hasUserEqualOrHigherPriority = context.HasUserEqualOrHigherPriority(user);
}
int currentChannelId = tvcard.CurrentDbChannel(ref user);
for (int i = users.Count - 1; i > -1; i--)
{
IUser actualUser = users[i];
CardReservationHelper.AddUserIfRecording(tvcard, ref actualUser, recUsers);
CardReservationHelper.AddUserIfTimeshifting(tvcard, ref actualUser, tsUsers);
bool isCurrentUser = user.Name.Equals(actualUser.Name);
IChannel userChannel = tvcard.CurrentChannel(ref actualUser);
var userDVBchannel = userChannel as DVBBaseChannel;
if (!isCurrentUser)
{
if (!isRecordingAnyUser)
{
isRecordingAnyUser = CardReservationHelper.IsRecordingUser(tvcard, user, ref actualUser);
}
if (actualUser.SubChannel == user.SubChannel && user.IdChannel > 0)
{
conflictingSubchannelFound = true;
}
numberOfOtherUsersOnCurrentCard = CardReservationHelper.GetNumberOfOtherUsersOnCurrentCard(user,
numberOfOtherUsersOnCurrentCard);
if (userChannel == null)
{
inactiveUsers.Add(actualUser);
}
else
{
if (userDVBchannel != null)
{
actualUser.IdChannel = layer.GetTuningDetail(userDVBchannel).IdChannel;
}
bool isDiffTS = tuningDetail.IsDifferentTransponder(userChannel);
if (isDiffTS)
{
activeUsers.Add(actualUser);
}
else
{
if (!isOwner)
{
bool isUserOnSameChannel = CardReservationHelper.IsUserOnSameChannel(tuningDetail, layer,
userDVBchannel);
if (isUserOnSameChannel)
{
numberOfOtherUsersOnSameChannel++;
//we do not want to hook up on schedulers existing subchannel
if (!actualUser.IsAdmin)
{
ownerSubchannel = actualUser.SubChannel;
}
}
}
}
}
}
bool isUserOnSameCurrentChannel = CardReservationHelper.IsUserOnSameCurrentChannel(currentChannelId, actualUser);
if (isUserOnSameCurrentChannel)
{
numberOfUsersOnSameCurrentChannel++;
}
if (!isCamAlreadyDecodingChannel)
{
isCamAlreadyDecodingChannel = IsCamAlreadyDecodingChannel(tuningDetail, userChannel);
}
}
bool isFreeToAir = CardReservationHelper.IsFreeToAir(tvcard, user);
cardTuneReservationTicket = new CardTuneReservationTicket
(
user,
tuningDetail,
isTunedToTransponder,
numberOfOtherUsersOnSameChannel,
isAnySubChannelTimeshifting,
inactiveUsers,
activeUsers,
users,
ownerSubchannel,
isOwner,
tvcard.DataBaseCard.IdCard,
tvcard.NumberOfChannelsDecrypting,
isFreeToAir,
numberOfOtherUsersOnCurrentCard,
recUsers,
tsUsers,
conflictingSubchannelFound,
numberOfUsersOnSameCurrentChannel,
isCamAlreadyDecodingChannel,
hasUserHighestPriority,
hasUserEqualOrHigherPriority);
tvcard.Tuner.ActiveCardTuneReservationTicket = cardTuneReservationTicket;
tvcard.Tuner.ReservationsForTune.Add(cardTuneReservationTicket);
}
cardTuneState = tvcard.Tuner.CardTuneState;
if (tvcard.Tuner.ActiveCardTuneReservationTicket != null)
{
ticketId = tvcard.Tuner.ActiveCardTuneReservationTicket.Id;
}
}
if (cardTuneReservationTicket != null)
{
Log.Debug("CardReservationBase.RequestCardTuneReservation: placed reservation with id={0}, tuningdetails={1}", cardTuneReservationTicket.Id, cardTuneReservationTicket.TuningDetail);
}
else
{
if (ticketId > 0)
{
Log.Debug("CardReservationBase.RequestCardTuneReservation: failed reservation tuningdetails={0}, res id blocking={1}, state={2}", tuningDetail, ticketId, cardTuneState);
}
else
{
Log.Debug("CardReservationBase.RequestCardTuneReservation: failed reservation tuningdetails={0}, res id blocking={1}, state={2}", tuningDetail, "n/a", cardTuneState);
}
}
return cardTuneReservationTicket;
}