Example #1
0
        private XmlElement AppendMode(EQueryDirection queryDir, bool allowed)
        {
            XmlElement eWord = XmlHelper.CreateAndAppendElement(m_QueryDirections, m_XPathQueryDirection);

            eWord.SetAttribute(m_XPathAttributeName, queryDir.ToString());
            eWord.SetAttribute(m_XPathAttributeValue, XmlConvert.ToString(allowed));
            return(eWord);
        }
Example #2
0
        private void SetAllowed(EQueryDirection queryDir, bool allowed)
        {
            XmlNode node = m_QueryDirections.SelectSingleNode(String.Format(m_XPathFilter, queryDir.ToString()));

            if (node == null)
            {
                AppendMode(queryDir, allowed);
            }
            else
            {
                node.Value = XmlConvert.ToString(allowed);
            }
        }
Example #3
0
        private bool IsAllowed(EQueryDirection queryDir)
        {
            bool    allowed = false;
            XmlNode node    = m_QueryDirections.SelectSingleNode(String.Format(m_XPathFilter, queryDir.ToString()));

            if (node == null)
            {
                allowed = true;
            }
            else
            {
                allowed = XmlConvert.ToBoolean(node.Value);
            }
            return(allowed);
        }
Example #4
0
        /// <summary>
        /// Initializes a new instance of the <see cref="StackCard"/> class.
        /// </summary>
        /// <param name="card">The card.</param>
        /// <param name="result">The result.</param>
        /// <param name="promoted">if set to <c>true</c> [promoted].</param>
        /// <param name="queryDirection">The query direction.</param>
        /// <param name="learnMode">The learn mode.</param>
        /// <param name="asked">The asked.</param>
        /// <param name="answered">The answered.</param>
        /// <param name="questionCulture">The question culture.</param>
        /// <param name="answerculture">The answerculture.</param>
        /// <remarks>Documented by Dev02, 2008-07-17</remarks>
        public StackCard(ICard card, AnswerResult result, bool promoted, EQueryDirection queryDirection, LearnModes learnMode, DateTime asked, DateTime answered, CultureInfo questionCulture, CultureInfo answerculture, string answer, int obox, int nbox, bool canDem, Dictionary lm, int cs)
        {
            m_Card           = card;
            m_Result         = result;
            m_Promoted       = promoted;
            m_QueryDirection = queryDirection;
            m_LearnMode      = learnMode;
            m_CardAsked      = asked;
            m_CardAnswered   = answered;

            m_QuestionCulture = questionCulture;
            m_AnswerCulture   = answerculture;

            m_answer          = answer;
            m_newBox          = nbox;
            m_oldBox          = obox;
            m_canceledDemote  = canDem;
            m_lm              = lm;
            m_correctSynonyms = cs;
        }
Example #5
0
        /// <summary>
        /// Gets the next cardNode.
        /// </summary>
        /// <param name="BoxNr">The box nr.</param>
        /// <returns></returns>
        /// <remarks>Documented by Dev05, 2007-09-03</remarks>
        private ICard GetNextCard(int BoxNr)
        {
            learnMode = GetNextLearnMode();
            currentQueryDirection = GetNextQueryDirection();
            List<QueryStruct> queryStructs = new List<QueryStruct>();

            //add user.Dictionary.MultipleChoice to user.Dictionary.CurrentMultipleChoice
            CurrentMultipleChoiceOptions = new QueryMultipleChoiceOptions();
            CurrentMultipleChoiceOptions.AllowMultipleCorrectAnswers = MultipleChoiceOptions.AllowMultipleCorrectAnswers;
            CurrentMultipleChoiceOptions.AllowRandomDistractors = MultipleChoiceOptions.AllowRandomDistractors;
            CurrentMultipleChoiceOptions.MaxNumberOfCorrectAnswers = MultipleChoiceOptions.MaxNumberOfCorrectAnswers;
            CurrentMultipleChoiceOptions.NumberOfChoices = MultipleChoiceOptions.NumberOfChoices;

            if (QueryChapters.Count == Chapters.Chapters.Count)
                queryStructs.Add(new QueryStruct(-1, BoxNr, QueryCardState.Active));
            else
            {
                foreach (int chapter in QueryChapters)
                    queryStructs.Add(new QueryStruct(chapter, BoxNr, QueryCardState.Active));
            }

            List<ICard> cards;
            if ((BoxNr == 0) && Settings.RandomPool.GetValueOrDefault())
            {
                cards = dictionary.Cards.GetCards(queryStructs.ToArray(), QueryOrder.Random, QueryOrderDir.Ascending, 1);
            }
            else
                cards = dictionary.Cards.GetCards(queryStructs.ToArray(), QueryOrder.Timestamp, QueryOrderDir.Ascending, 1);

            if (cards.Count > 0)
            {
                CurrentBox = cards[0].Box;
                return cards[0];
            }
            else
                return null;
        }
Example #6
0
        /// <summary>
        /// Loads dictionary from the old database format (ODF) and stores it to the current format.
        /// </summary>
        /// <param name="srcFile">The source database file.</param>
        /// <param name="dstFile">The destination database file.</param>
        /// <remarks>Documented by Dev03, 2007-07-26</remarks>
        public MLifter.DAL.Interfaces.IDictionary Load(string srcFile, string dstFile)
        {
            MLifter.DAL.Interfaces.IDictionary dictionary = null;
            int wbVersion;

#if !DEBUG
            try
            {
#endif
            string srcPath            = Path.GetDirectoryName(srcFile);
            _rBox_[] box_data         = new _rBox_[0];
            _rChapter_[] chapter_data = new _rChapter_[0];
            _rCards_[] cards_data     = new _rCards_[0];
            _rBoxes_[] boxes_data     = new _rBoxes_[0];
            _rBlob_[] blob_data       = new _rBlob_[0];
            _rStats_[] stats_data     = new _rStats_[0];

            string headerstr = string.Empty;
            UInt16 ssize;
            int len, rsize;

            using (FileStream DicFile = new FileStream(srcFile, FileMode.Open))
            {
                BinaryReader Dic = new BinaryReader(DicFile, System.Text.UnicodeEncoding.UTF8);
                // Check header first
                len = Dic.ReadInt32();
                if (len < 30)
                {
                    headerstr = byte2string(Dic.ReadBytes(len));
                }
                else
                {
                    headerstr = string.Empty;
                }
                // Check version byte
                wbVersion = Dic.ReadInt16();

                // Some code to correct "bugs" in previous dictionary versions
                if (wbVersion <= 0x0104)
                {
                    throw new DictionaryFormatNotSupported(wbVersion);
                }

                // Header has to be okay, and Version smaller than prog's version
                if (headerstr.Equals(m_odfFileHeaderString) && (wbVersion <= m_oldFileVersion))
                {
                    if (File.Exists(dstFile))
                    {
                        throw new DictionaryPathExistsException(dstFile);
                    }

                    IUser user = UserFactory.Create(m_loginCallback, new ConnectionStringStruct(DatabaseType.Xml, dstFile, false),
                                                    (DataAccessErrorDelegate) delegate { return; }, this);
                    dictionary = user.Open();
                    len        = Dic.ReadByte();
                    dictionary.DefaultSettings.QuestionCaption = byte2string(Dic.ReadBytes(20)).Substring(0, len);
                    len = Dic.ReadByte();
                    dictionary.DefaultSettings.AnswerCaption = byte2string(Dic.ReadBytes(20)).Substring(0, len);

                    Dic.ReadBytes(82);                    //SrcFont & DstFont
                    Dic.ReadBytes(2);                     //SrcCharSet & DstCharSet

                    Dic.ReadBoolean();                    //ReadOnly

                    ssize             = Dic.ReadUInt16();
                    dictionary.Author = byte2string(Dic.ReadBytes(ssize));

                    ssize = Dic.ReadUInt16();
                    dictionary.Description = byte2string(Dic.ReadBytes(ssize));

                    if (wbVersion >= 0x0104)
                    {
                        ssize = Dic.ReadUInt16();
                        string mediafolder = byte2string(Dic.ReadBytes(ssize)).TrimEnd(new char[] { Path.DirectorySeparatorChar });
                        if (Directory.Exists(mediafolder))
                        {
                            dictionary.MediaDirectory = mediafolder;
                        }
                    }

                    if (wbVersion >= 0x0107)
                    {
                        for (int i = 0; i < 12; i++)
                        {
                            ssize = Dic.ReadUInt16();
                            dictionary.DefaultSettings.CommentarySounds[CommentarySoundIdentifier.Create(i > 6 ? Side.Answer : Side.Question,
                                                                                                         (ECommentarySoundType)(i > 6 ? i - 6 : i))] =
                                new MLifter.DAL.XML.XmlAudio(SkinDir2RealDir(byte2string(Dic.ReadBytes(ssize)), Path.GetDirectoryName(dstFile), m_applicationPath),
                                                             new MLifter.DAL.Tools.ParentClass(user, dictionary));
                        }
                    }

                    if (wbVersion >= 0x0108)
                    {
                        Dic.ReadBytes(10);                         //Pwd
                    }
                    if (wbVersion >= 0x0109)
                    {
                        dictionary.Category = new Category((int)Dic.ReadByte(), false);
                    }
                    else
                    {
                        dictionary.Category = new Category(m_defaultCategory, true);
                    }

                    (dictionary as MLifter.DAL.XML.XmlDictionary).score = Dic.ReadInt32();
                    dictionary.HighScore = Dic.ReadInt32();

                    int queryChapter = 0;
                    rsize = Dic.ReadInt32();
                    dictionary.DefaultSettings.SelectedLearnChapters.Clear();
                    for (int i = 0; i < rsize; i++)
                    {
                        queryChapter = Math.Abs(Dic.ReadInt32());     // BUG?? what is the minus for??
                        if (queryChapter < 0)                         //chapterID starts with 1, should be zero-based
                        {
                            queryChapter++;
                        }
                        else
                        {
                            queryChapter--;
                        }

                        dictionary.DefaultSettings.SelectedLearnChapters.Add(queryChapter);
                    }

                    Dic.ReadUInt16();                       //the LastBox user property is not used anymore
                    EQueryDirection dir = (EQueryDirection)Dic.ReadByte();
                    switch (dir)
                    {
                    case EQueryDirection.Question2Answer:
                        dictionary.DefaultSettings.QueryDirections.Question2Answer = true;
                        break;

                    case EQueryDirection.Answer2Question:
                        dictionary.DefaultSettings.QueryDirections.Answer2Question = true;
                        break;

                    case EQueryDirection.Mixed:
                        dictionary.DefaultSettings.QueryDirections.Mixed = true;
                        break;
                    }

                    int queryType = Convert.ToInt32(Dic.ReadByte());
                    dictionary.DefaultSettings.QueryTypes.ImageRecognition       = ((((int)EQueryType.ImageRecognition) & queryType) > 0);
                    dictionary.DefaultSettings.QueryTypes.ListeningComprehension = ((((int)EQueryType.ListeningComprehension) & queryType) > 0);
                    dictionary.DefaultSettings.QueryTypes.MultipleChoice         = ((((int)EQueryType.MultipleChoice) & queryType) > 0);
                    dictionary.DefaultSettings.QueryTypes.Sentence = ((((int)EQueryType.Sentences) & queryType) > 0);
                    dictionary.DefaultSettings.QueryTypes.Word     = ((((int)EQueryType.Word) & queryType) > 0);

                    int queryOptions;
                    if (wbVersion >= 0x0103)
                    {
                        queryOptions = Convert.ToInt32(Dic.ReadUInt16());
                    }
                    else
                    {
                        queryOptions = Convert.ToInt32(Dic.ReadByte());
                    }

                    dictionary.DefaultSettings.CaseSensitive      = ((((int)EQueryOption.CaseSensitive) & queryOptions) > 0);
                    dictionary.DefaultSettings.EnableTimer        = ((((int)EQueryOption.CountDown) & queryOptions) > 0);
                    dictionary.DefaultSettings.ShowStatistics     = ((((int)EQueryOption.Stats) & queryOptions) > 0);
                    dictionary.DefaultSettings.ShowImages         = ((((int)EQueryOption.Images) & queryOptions) > 0);
                    dictionary.DefaultSettings.AutoplayAudio      = ((((int)EQueryOption.Sounds) & queryOptions) > 0);
                    dictionary.DefaultSettings.EnableCommentary   = ((((int)EQueryOption.Commentary) & queryOptions) > 0);
                    dictionary.DefaultSettings.CorrectOnTheFly    = ((((int)EQueryOption.Correct) & queryOptions) > 0);
                    dictionary.DefaultSettings.SkipCorrectAnswers = ((((int)EQueryOption.Skip) & queryOptions) > 0);
                    dictionary.DefaultSettings.SelfAssessment     = ((((int)EQueryOption.Self) & queryOptions) > 0);
                    dictionary.DefaultSettings.RandomPool         = ((((int)EQueryOption.RandomPool) & queryOptions) > 0);
                    dictionary.DefaultSettings.ConfirmDemote      = ((((int)EQueryOption.ConfirmDemote) & queryOptions) > 0);

                    if (wbVersion >= 0x0101)
                    {
                        EGradeSynonyms gradeS = (EGradeSynonyms)Dic.ReadByte();
                        switch (gradeS)
                        {
                        case EGradeSynonyms.AllKnown:
                            dictionary.DefaultSettings.GradeSynonyms.AllKnown = true;
                            break;

                        case EGradeSynonyms.HalfKnown:
                            dictionary.DefaultSettings.GradeSynonyms.HalfKnown = true;
                            break;

                        case EGradeSynonyms.OneKnown:
                            dictionary.DefaultSettings.GradeSynonyms.OneKnown = true;
                            break;

                        case EGradeSynonyms.FirstKnown:
                            dictionary.DefaultSettings.GradeSynonyms.FirstKnown = true;
                            break;

                        case EGradeSynonyms.Prompt:
                            dictionary.DefaultSettings.GradeSynonyms.Prompt = true;
                            break;
                        }
                    }
                    else
                    {
                        dictionary.DefaultSettings.GradeSynonyms.OneKnown = true;
                    }

                    dictionary.DefaultSettings.PoolEmptyMessageShown = Dic.ReadBoolean();
                    dictionary.DefaultSettings.UseLMStylesheets      = false;

                    ssize = Dic.ReadUInt16();
                    Dic.ReadBytes(ssize);                  //Skin
                    Dic.ReadBoolean();                     //UseSkin

                    string stripchars = String.Empty;
                    if (wbVersion >= 0x0102)
                    {
                        byte[] temp = Dic.ReadBytes(32);
                        for (int i = 0; i < 8; i++)
                        {
                            for (int j = 0; j < 8; j++)
                            {
                                if ((temp[i] & (0x0001 << j)) > 0)
                                {
                                    stripchars += (char)(i * 8 + j);
                                }
                            }
                        }
                        dictionary.DefaultSettings.StripChars = stripchars;
                    }

                    EGradeTyping gradeT = (EGradeTyping)Dic.ReadByte();
                    switch (gradeT)
                    {
                    case EGradeTyping.AllCorrect:
                        dictionary.DefaultSettings.GradeTyping.AllCorrect = true;
                        break;

                    case EGradeTyping.HalfCorrect:
                        dictionary.DefaultSettings.GradeTyping.HalfCorrect = true;
                        break;

                    case EGradeTyping.NoneCorrect:
                        dictionary.DefaultSettings.GradeTyping.NoneCorrect = true;
                        break;

                    case EGradeTyping.Prompt:
                        dictionary.DefaultSettings.GradeTyping.Prompt = true;
                        break;

                    default:
                        break;
                    }

                    if ((((int)ESnoozeMode.QuitProgram) & queryOptions) > 0)
                    {
                        dictionary.DefaultSettings.SnoozeOptions.SnoozeMode = ESnoozeMode.QuitProgram;
                    }
                    if ((((int)ESnoozeMode.SendToTray) & queryOptions) > 0)
                    {
                        dictionary.DefaultSettings.SnoozeOptions.SnoozeMode = ESnoozeMode.SendToTray;
                    }

                    if (!ReportProgressUpdate(5))
                    {
                        return(null);
                    }

                    if (wbVersion >= 0x0103)
                    {
                        int snoozeTime     = Convert.ToInt32(Dic.ReadByte());
                        int snoozeRights   = Convert.ToInt32(Dic.ReadByte());
                        int snoozeCards    = Convert.ToInt32(Dic.ReadByte());
                        int snoozeTimeLow  = Convert.ToInt32(Dic.ReadByte());
                        int snoozeTimeHigh = Convert.ToInt32(Dic.ReadByte());
                        if ((((int)ESnoozeMode.Time) & queryType) > 0)
                        {
                            dictionary.DefaultSettings.SnoozeOptions.EnableTime(snoozeTime);
                        }
                        if ((((int)ESnoozeMode.Rights) & queryType) > 0)
                        {
                            dictionary.DefaultSettings.SnoozeOptions.EnableRights(snoozeRights);
                        }
                        if ((((int)ESnoozeMode.Cards) & queryType) > 0)
                        {
                            dictionary.DefaultSettings.SnoozeOptions.EnableCards(snoozeCards);
                        }
                        dictionary.DefaultSettings.SnoozeOptions.SetSnoozeTimes(snoozeTimeLow, snoozeTimeHigh);
                    }
                    //box_data -> user
                    rsize    = Dic.ReadInt32();
                    box_data = (_rBox_[])SetLength(box_data, rsize);
                    for (int i = 0; i < box_data.Length; i++)
                    {
                        box_data[i]       = new _rBox_();
                        box_data[i].First = Dic.ReadInt32();
                        Dic.ReadInt32();                         // box_data[i].Last

                        if (i < box_data.Length - 2)
                        {
                            dictionary.Boxes.Box[i].MaximalSize = Dic.ReadInt32();
                        }
                        else
                        {
                            Dic.ReadInt32();                             //MaxLen for the last two boxes - not needed
                        }

                        if (wbVersion > 0x0106)
                        {
                            Dic.ReadInt32();                             // box_data[i].Len
                        }
                    }
                    // end of user -----------------------------------------------------------------

                    if (!ReportProgressUpdate(10))
                    {
                        return(null);
                    }

                    //chapter_data
                    rsize        = Dic.ReadInt32();
                    chapter_data = (_rChapter_[])SetLength(chapter_data, rsize);
                    for (int i = 0; i < chapter_data.Length; i++)
                    {
                        chapter_data[i] = new _rChapter_();
                        Dic.ReadUInt16();                         //ID
                        Dic.ReadUInt16();                         // SubID
                        len = Dic.ReadByte();
                        chapter_data[i].Title = byte2string(Dic.ReadBytes(30)).Substring(0, len);
                        len = Dic.ReadByte();
                        chapter_data[i].Description = byte2string(Dic.ReadBytes(256)).Substring(0, len);
                    }

                    if (!ReportProgressUpdate(15))
                    {
                        return(null);
                    }

                    //cards_data
                    rsize      = Dic.ReadInt32();
                    cards_data = (_rCards_[])SetLength(cards_data, rsize);
                    for (int i = 0; i < cards_data.Length; i++)
                    {
                        cards_data[i] = new _rCards_();
                        ssize         = Dic.ReadUInt16();
                        cards_data[i].Src.SpecialImportFormat = byte2string(Dic.ReadBytes(ssize));
                        ssize = Dic.ReadUInt16();
                        cards_data[i].Dst.SpecialImportFormat = byte2string(Dic.ReadBytes(ssize));
                        ssize = Dic.ReadUInt16();
                        cards_data[i].SentSrc = byte2string(Dic.ReadBytes(ssize));
                        ssize = Dic.ReadUInt16();
                        cards_data[i].SentDst   = byte2string(Dic.ReadBytes(ssize));
                        cards_data[i].ChapterID = Dic.ReadUInt16() - 1;                         //chapterID starts with 1, should be zero-based
                        cards_data[i].CardParts = Dic.ReadByte();
                        if (wbVersion >= 0x0107)
                        {
                            Dic.ReadByte();                             // Probability
                        }
                    }

                    if (!ReportProgressUpdate(20))
                    {
                        return(null);
                    }

                    //boxes_data
                    rsize      = Dic.ReadInt32();
                    boxes_data = (_rBoxes_[])SetLength(boxes_data, rsize);
                    for (int i = 0; i < boxes_data.Length; i++)
                    {
                        boxes_data[i]       = new _rBoxes_();
                        boxes_data[i].BoxID = Dic.ReadByte();
                        Dic.ReadBytes(3);                         //TODO BUG ?
                        boxes_data[i].CardID = Dic.ReadInt32();
                        boxes_data[i].Prior  = Dic.ReadInt32();
                        boxes_data[i].Next   = Dic.ReadInt32();
                    }

                    if (!ReportProgressUpdate(25))
                    {
                        return(null);
                    }

                    //blob_data
                    rsize     = Dic.ReadInt32();
                    blob_data = (_rBlob_[])SetLength(blob_data, rsize);
                    for (int i = 0; i < blob_data.Length; i++)
                    {
                        blob_data[i]        = new _rBlob_();
                        blob_data[i].SrcDst = (TBlobType)Dic.ReadByte();
                        len = Dic.ReadByte();
                        string tstr = byte2string(Dic.ReadBytes(101));
                        blob_data[i].Link = tstr.Substring(0, len);
                        blob_data[i].Link = blob_data[i].Link.Replace('/', '\\');                         // repair work
                        blob_data[i].Link = blob_data[i].Link.Replace("\\\\", "\\");                      // repair work
                        Dic.ReadByte();
                        blob_data[i].CardID = Dic.ReadInt32();
                    }

                    if (!ReportProgressUpdate(30))
                    {
                        return(null);
                    }

                    //stats_data
                    rsize      = Dic.ReadInt32();
                    stats_data = (_rStats_[])SetLength(stats_data, rsize);
                    for (int i = 0; i < stats_data.Length; i++)
                    {
                        stats_data[i]        = new _rStats_(m_nrBox);
                        stats_data[i].SStart = new System.DateTime(1899, 12, 30, 0, 0, 0);                       // startdate in delphi
                        stats_data[i].SStart = stats_data[i].SStart.AddDays(Dic.ReadDouble());
                        stats_data[i].SEnd   = new System.DateTime(1899, 12, 30, 0, 0, 0);                       // startdate in delphi
                        stats_data[i].SEnd   = stats_data[i].SEnd.AddDays(Dic.ReadDouble());
                        stats_data[i].Right  = Dic.ReadInt32();
                        stats_data[i].Wrong  = Dic.ReadInt32();
                        for (int j = 0; j < m_nrBox; j++)
                        {
                            stats_data[i].Boxes[j] = Dic.ReadInt32();
                        }
                    }

                    if (!ReportProgressUpdate(35))
                    {
                        return(null);
                    }

                    //chapters
                    for (int i = 0; i < chapter_data.Length; i++)
                    {
                        IChapter chapter = dictionary.Chapters.AddNew();
                        //chapter.Id = i; //Interface change
                        chapter.Title       = chapter_data[i].Title;
                        chapter.Description = chapter_data[i].Description;
                    }

                    if (!ReportProgressUpdate(40))
                    {
                        return(null);
                    }

                    //cards
                    for (int i = 0; i < cards_data.Length; i++)
                    {
                        if ((i % 10) == 0)
                        {
                            int progress = (int)Math.Floor(35.0 + ((90.0 - 35.0) * (i + 1) / cards_data.Length));
                            if (!ReportProgressUpdate(progress))
                            {
                                return(null);
                            }
                        }
                        ICard card = dictionary.Cards.AddNew();
                        //card.Id = i;  //Interface change
                        StringList words = new StringList();
                        words.CommaText = cards_data[i].Src.CommaText;
                        for (int k = 0; k < words.Count; k++)
                        {
                            IWord word = card.Question.CreateWord(words[k], WordType.Word, (k == 0));
                            card.Question.AddWord(word);
                        }
                        card.QuestionExample.AddWord(card.QuestionExample.CreateWord(cards_data[i].SentSrc, WordType.Sentence, false));
                        words.CommaText = cards_data[i].Dst.CommaText;
                        for (int k = 0; k < words.Count; k++)
                        {
                            IWord word = card.Answer.CreateWord(words[k], WordType.Word, (k == 0));
                            card.Answer.AddWord(word);
                        }
                        card.AnswerExample.AddWord(card.AnswerExample.CreateWord(cards_data[i].SentDst, WordType.Sentence, false));
                        card.Chapter   = cards_data[i].ChapterID;
                        card.Box       = 0;
                        card.Timestamp = DateTime.Now;

                        for (int j = 0; j < blob_data.Length; j++)
                        {
                            if (blob_data[j].CardID == i)
                            {
                                if (File.Exists(Path.Combine(srcPath, blob_data[j].Link)))
                                {
                                    blob_data[j].Link = Path.Combine(srcPath, blob_data[j].Link);
                                    if (blob_data[j].SrcDst.ToString().Equals("image"))
                                    {
                                        IMedia media = card.CreateMedia(EMedia.Image, blob_data[j].Link, true, false, false);
                                        card.AddMedia(media, Side.Question);
                                        card.AddMedia(media, Side.Answer);
                                    }
                                    else
                                    {
                                        IMedia media = null;
                                        Side   side  = Side.Question;
                                        switch (blob_data[j].SrcDst.ToString())
                                        {
                                        case "questionaudio":
                                            media = card.CreateMedia(EMedia.Audio, blob_data[j].Link, true, true, false);
                                            side  = Side.Question;
                                            break;

                                        case "questionexampleaudio":
                                            media = card.CreateMedia(EMedia.Audio, blob_data[j].Link, true, false, true);
                                            side  = Side.Question;
                                            break;

                                        case "questionvideo":
                                            media = card.CreateMedia(EMedia.Video, blob_data[j].Link, true, false, false);
                                            side  = Side.Question;
                                            break;

                                        case "questionimage":
                                            media = card.CreateMedia(EMedia.Image, blob_data[j].Link, true, false, false);
                                            side  = Side.Question;
                                            break;

                                        case "answeraudio":
                                            media = card.CreateMedia(EMedia.Audio, blob_data[j].Link, true, true, false);
                                            side  = Side.Answer;
                                            break;

                                        case "answerexampleaudio":
                                            media = card.CreateMedia(EMedia.Audio, blob_data[j].Link, true, false, true);
                                            side  = Side.Answer;
                                            break;

                                        case "answervideo":
                                            media = card.CreateMedia(EMedia.Video, blob_data[j].Link, true, false, false);
                                            side  = Side.Answer;
                                            break;

                                        case "answerimage":
                                            media = card.CreateMedia(EMedia.Image, blob_data[j].Link, true, false, false);
                                            side  = Side.Answer;
                                            break;

                                        case "unusedmedia":
                                        default:
                                            try
                                            {
                                                EMedia mType = Helper.GetMediaType(blob_data[j].Link);
                                                if (mType == EMedia.Unknown)
                                                {
                                                    media = card.CreateMedia(mType, blob_data[j].Link, false, false, false);
                                                    side  = Side.Question;                                                               //doesn't matter
                                                }
                                            }
                                            catch { }
                                            break;
                                        }
                                        if (media != null)
                                        {
                                            card.AddMedia(media, side);
                                        }
                                    }
                                }
                            }
                        }
                    }

                    if (!ReportProgressUpdate(95))
                    {
                        return(null);
                    }

                    //stats
                    for (int i = 0; i < stats_data.Length; i++)
                    {
                        IStatistic stat = new MLifter.DAL.XML.XmlStatistic(dictionary as MLifter.DAL.XML.XmlDictionary, i, true);
                        dictionary.Statistics.Add(stat);
                        stat.StartTimestamp = stats_data[i].SStart;
                        stat.EndTimestamp   = stats_data[i].SEnd;
                        stat.Right          = stats_data[i].Right;
                        stat.Wrong          = stats_data[i].Wrong;
                        stat.Boxes.Clear();
                        for (int j = 0; j < stats_data[i].Boxes.Length; j++)
                        {
                            stat.Boxes.Add(stats_data[i].Boxes[j]);
                        }
                    }

                    DateTime start_of_year      = new DateTime(m_releaseYear, 1, 1);
                    int      additional_seconds = 1;

                    for (int i = box_data.Length - 1; i >= 0; i--)
                    {
                        int exitCounter = 0;
                        for (int j = box_data[i].First; j != (-1); j = boxes_data[j].Next)
                        {
                            try
                            {
                                ICard card = dictionary.Cards.Get(boxes_data[j].CardID);
                                card.Box       = boxes_data[j].BoxID;
                                card.Timestamp = start_of_year.AddSeconds(additional_seconds++).ToUniversalTime();
                            }
                            catch { }
                            //boxes_data seems to be a linked list which sometimes may be broken - this is the emergency exit
                            if (exitCounter++ > dictionary.Cards.Count)
                            {
                                break;
                            }
                        }
                    }

                    dictionary.Save();
                }
                else
                {
                    throw new InvalidImportFormatException(dstFile);
                }

                Dic.Close();
            }
#if !DEBUG
        }

        catch (DictionaryPathExistsException ex)
        {
            throw ex;
        }
        catch (DictionaryFormatNotSupported ex)
        {
            throw ex;
        }
        catch (InvalidImportFormatException ex)
        {
            throw ex;
        }
        catch (Exception ex)
        {
            throw ex;
        }
#endif
            return(dictionary);
        }
 private void SetAllowed(EQueryDirection queryDir, bool allowed)
 {
     XmlNode node = m_QueryDirections.SelectSingleNode(String.Format(m_XPathFilter, queryDir.ToString()));
     if (node == null)
     {
         AppendMode(queryDir, allowed);
     }
     else
     {
         node.Value = XmlConvert.ToString(allowed);
     }
 }
 private bool IsAllowed(EQueryDirection queryDir)
 {
     bool allowed = false;
     XmlNode node = m_QueryDirections.SelectSingleNode(String.Format(m_XPathFilter, queryDir.ToString()));
     if (node == null)
         allowed = true;
     else
         allowed = XmlConvert.ToBoolean(node.Value);
     return allowed;
 }
 private XmlElement AppendMode(EQueryDirection queryDir, bool allowed)
 {
     XmlElement eWord = XmlHelper.CreateAndAppendElement(m_QueryDirections, m_XPathQueryDirection);
     eWord.SetAttribute(m_XPathAttributeName, queryDir.ToString());
     eWord.SetAttribute(m_XPathAttributeValue, XmlConvert.ToString(allowed));
     return eWord;
 }