)>}]
شركة التطبيقات المتكاملة لتصميم وبرمجة البرمجيات الخاصة ش.ش.و.
Integrated Applications Programming Company
Skip Navigation LinksHome » Code Library » Default

Public general use code classes and xml files that we've compiled and used over the years:

Default class for TentPlay Trek data model

    1: using System;
    2: using System.Collections.Generic;
    3: using System.Linq;
    4: using System.Data;
    5: using System.Collections;
    6: using System.IO;
    7: using Ionic.Zip;
    8: using System.Drawing.Imaging;
    9:  
   10: namespace Ia.TentPlay.Cl.Model.Data.Trek
   11: {
   12:     ////////////////////////////////////////////////////////////////////////////
   13:  
   14:     /// <summary publish="true">
   15:     /// Default class for TentPlay Trek data model
   16:     /// </summary>
   17:     /// 
   18:     /// <remarks> 
   19:     /// Copyright © 2006-2017 Jasem Y. Al-Shamlan (info@ia.com.kw), Integrated Applications - Kuwait. All Rights Reserved.
   20:     ///
   21:     /// This library is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by
   22:     /// the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
   23:     ///
   24:     /// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
   25:     /// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
   26:     /// 
   27:     /// You should have received a copy of the GNU General Public License along with this library. If not, see http://www.gnu.org/licenses.
   28:     /// 
   29:     /// Copyright notice: This notice may not be removed or altered from any source distribution.
   30:     /// </remarks> 
   31:     public static class Default
   32:     {
   33:         ////////////////////////////////////////////////////////////////////////////
   34:         ////////////////////////////////////////////////////////////////////////////
   35:  
   36:         /// <summary>
   37:         ///
   38:         /// </summary>
   39:         public struct Drawable
   40:         {
   41:             ////////////////////////////////////////////////////////////////////////////
   42:  
   43:             /// <summary>
   44:             ///
   45:             /// </summary>
   46:             public Drawable(string name, int maxWidth)
   47:             {
   48:                 this.Name = name;
   49:                 this.MaxWidth = maxWidth;
   50:             }
   51:  
   52:             /// <summary/>
   53:             public string Name;
   54:             /// <summary/>
   55:             public int MaxWidth;
   56:         }
   57:  
   58:         ////////////////////////////////////////////////////////////////////////////
   59:  
   60:         /// <summary>
   61:         ///
   62:         /// </summary>
   63:         public static List<Ia.TentPlay.Cl.Model.Business.Trek.FeatureClass> FeatureClassNameAndCountWithinDatabaseList(string countryIso2, Ia.TentPlay.Cl.Model.Data.Trek.ApplicationInformation.Translation translation, out Ia.Cl.Model.Result result)
   64:         {
   65:             List<Ia.TentPlay.Cl.Model.Business.Trek.FeatureClass> featureClassList;
   66:             Dictionary<string, int> featureClassCountDictionary;
   67:  
   68:             result = new Ia.Cl.Model.Result();
   69:             featureClassCountDictionary = new Dictionary<string, int>();
   70:  
   71:             featureClassList = Ia.TentPlay.Cl.Model.Data.Trek.FeatureClass.List;
   72:  
   73:             using (var db = new Ia.TentPlay.Db())
   74:             {
   75:                 featureClassCountDictionary = (from ncw in db.Features
   76:                                                where ncw.FileCountry == countryIso2
   77:                                                group ncw.Class by ncw.Class into g
   78:                                                select new Ia.TentPlay.Cl.Model.Business.Trek.FeatureClass() { Id = g.Key, Count = g.Count() }).ToDictionary(f => f.Id, f => f.Count);
   79:             }
   80:  
   81:             foreach (var fc in featureClassList)
   82:             {
   83:                 fc.Name = (from fc2 in translation.FeatureClassList where fc2.Id == fc.Id select fc2.Name).SingleOrDefault();
   84:                 fc.Caption = (from fc2 in translation.FeatureClassList where fc2.Id == fc.Id select fc2.Caption).SingleOrDefault();
   85:                 fc.Description = (from fc2 in translation.FeatureClassList where fc2.Id == fc.Id select fc2.Description).SingleOrDefault();
   86:  
   87:                 if (featureClassCountDictionary.ContainsKey(fc.Id)) fc.Count = featureClassCountDictionary[fc.Id];
   88:                 else fc.Count = 0;
   89:             }
   90:  
   91:             return featureClassList;
   92:         }
   93:  
   94:         ////////////////////////////////////////////////////////////////////////////
   95:  
   96:         /// <summary>
   97:         ///
   98:         /// </summary>
   99:         public static List<Ia.TentPlay.Cl.Model.Business.Trek.FeatureDesignation> FeatureDesignationNameAndCountWithinDatabaseList(string countryIso2, Ia.TentPlay.Cl.Model.Data.Trek.ApplicationInformation.Translation translation, out Ia.Cl.Model.Result result)
  100:         {
  101:             List<Ia.TentPlay.Cl.Model.Business.Trek.FeatureDesignation> featureDesignationList;
  102:  
  103:             result = new Ia.Cl.Model.Result();
  104:  
  105:             using (var db = new Ia.TentPlay.Db())
  106:             {
  107:                 featureDesignationList = (from ncw in db.Features
  108:                                           where ncw.FileCountry == countryIso2
  109:                                           group ncw.Designation.Id by ncw.Designation.Id into g
  110:                                           select new Ia.TentPlay.Cl.Model.Business.Trek.FeatureDesignation() { Id = g.Key, Count = g.Count() }).ToList();
  111:             }
  112:  
  113:             foreach (var fd in featureDesignationList)
  114:             {
  115:                 fd.Name = Ia.TentPlay.Cl.Model.Data.Trek.FeatureDesignation.DesignationIdToDesignationCaptionHashtable(translation.Iso6391)[fd.Id].ToString();
  116:                 fd.FeatureClass = Ia.TentPlay.Cl.Model.Data.Trek.FeatureDesignation.DesignationIdToClassIdHashtable[fd.Id].ToString();
  117:             }
  118:  
  119:             return featureDesignationList;
  120:         }
  121:  
  122:         ////////////////////////////////////////////////////////////////////////////
  123:  
  124:         /// <summary>
  125:         ///
  126:         /// </summary>
  127:         public static void GenerateSpecificFeatureSqliteDatabaseFileFromSqlServer(Ia.TentPlay.Cl.Model.Data.Trek.ApplicationInformation.Country applicationCountry, out Ia.Cl.Model.Result result)
  128:         {
  129:             int featureDesignationCount, featuresCount;
  130:             string fileName, sql, filePath, scalar;
  131:             DataTable dataTable;
  132:             FileInfo file;
  133:             Ia.Cl.Model.Db.Sqlite sqlite;
  134:             List<Ia.TentPlay.Cl.Model.Trek.FeatureDesignation> featureDesignationList;
  135:             List<Ia.TentPlay.Cl.Model.Trek.Feature> featureList;
  136:  
  137:             fileName = Ia.TentPlay.Cl.Model.Business.Trek.Default.SqliteDatabaseFileName(applicationCountry.Iso2, applicationCountry.VersionName);
  138:  
  139:             filePath = global::Ia.Cl.Model.Default.AbsolutePath(true) + fileName;
  140:  
  141:             file = new FileInfo(filePath);
  142:  
  143:             if (file.Exists)
  144:             {
  145:                 // delete file if it exists
  146:                 File.Delete(filePath);
  147:             }
  148:  
  149:             sqlite = new Ia.Cl.Model.Db.Sqlite(filePath); //, filePassword);
  150:  
  151:             // below: drop table if exists
  152:             sql = "drop table if exists features"; // first because of foreign keys
  153:             sqlite.Sql(sql);
  154:             sql = "drop table if exists featuresFts";
  155:             sqlite.Sql(sql);
  156:  
  157:             sql = "drop table if exists featureDesignations";
  158:             sqlite.Sql(sql);
  159:  
  160:             // create and populate non-virtual table FeatureDesignations
  161:             sql = Ia.TentPlay.Cl.Model.Business.Trek.Default.SqliteDatabaseFileCreateFeatureDesignationTableString(false, applicationCountry.Languages);
  162:             sqlite.Sql(sql);
  163:  
  164:             featureDesignationList = Ia.TentPlay.Cl.Model.Data.Trek.FeatureDesignation.List;
  165:  
  166:             dataTable = Ia.Cl.Model.Default.GenerateDataTableFromGenericClassList<Ia.TentPlay.Cl.Model.Trek.FeatureDesignation>(featureDesignationList, "FeatureDesignations");
  167:  
  168:             // delete irrelevant entries from dataTable
  169:             RemoveUnNeededColumns(ref dataTable, applicationCountry.Languages);
  170:  
  171:             sqlite.SqlBulkCopy(dataTable, out result);
  172:  
  173:             sql = "select count(0) from featureDesignations";
  174:             scalar = sqlite.Scalar(sql);
  175:  
  176:             if (!string.IsNullOrEmpty(scalar))
  177:             {
  178:                 featureDesignationCount = int.Parse(scalar);
  179:  
  180:                 if (featureDesignationCount == featureDesignationList.Count)
  181:                 {
  182:                     // regular table
  183:                     sql = Ia.TentPlay.Cl.Model.Business.Trek.Default.SqliteDatabaseFileCreateFeaturesTableString(false);
  184:                     sqlite.Sql(sql);
  185:  
  186:                     // You can not use index with virtual tables
  187:                     sqlite.Sql("create index if not exists noDiacriticLowerCaseNameIndex on features (noDiacriticLowerCaseName)");
  188:                     sqlite.Sql("create index if not exists fullTextSearchNameIndex on features (fullTextSearchName)");
  189:  
  190:                     // virtual table
  191:                     sql = Ia.TentPlay.Cl.Model.Business.Trek.Default.SqliteDatabaseFileCreateFeaturesTableString(true);
  192:                     sqlite.Sql(sql);
  193:  
  194:                     //sqlList = Ia.TentPlay.Cl.Model.Business.Default.SqliteDatabaseFileInsertListSpecificFeaturesTableListString(fileCountry);
  195:                     //sqlite.Sql(sqlList);
  196:                     featureList = Ia.TentPlay.Cl.Model.Data.Trek.Feature.List(applicationCountry.Iso2, out result);
  197:  
  198:                     featureList = LimitNumberOfFeaturesHenceSizeOfApp(applicationCountry.Iso2, featureList);
  199:  
  200:                     dataTable = Ia.Cl.Model.Default.GenerateDataTableFromGenericClassList<Ia.TentPlay.Cl.Model.Trek.Feature>(featureList, "Features");
  201:  
  202:                     dataTable.Columns.Remove("Deleted");
  203:                     dataTable.Columns.Remove("Created");
  204:                     dataTable.Columns.Remove("Updated");
  205:  
  206:                     sqlite.SqlBulkCopy(dataTable, out result);
  207:  
  208:                     // the FTS table
  209:                     dataTable.TableName = "featuresFts";
  210:                     sqlite.SqlBulkCopy(dataTable, out result);
  211:  
  212:                     sql = "select count(0) from features";
  213:                     scalar = sqlite.Scalar(sql);
  214:  
  215:                     if (!string.IsNullOrEmpty(scalar))
  216:                     {
  217:                         featuresCount = int.Parse(scalar);
  218:  
  219:                         if (featuresCount == featureList.Count)
  220:                         {
  221:                             result.AddSuccess("Feature designation code count: " + featureDesignationCount + "; country trek count: " + featuresCount + ". ");
  222:                         }
  223:                     }
  224:                     else
  225:                     {
  226:                         result.AddError("dt is null or dt.Rows.Count == 0 for Features. ");
  227:                     }
  228:                 }
  229:                 else
  230:                 {
  231:                     result.AddError("dt.Rows.Count != sqlList.Count for FeatureDesignations. ");
  232:                 }
  233:             }
  234:             else
  235:             {
  236:                 result.AddError("dt is null or dt.Rows.Count == 0 for FeatureDesignations. ");
  237:             }
  238:         }
  239:  
  240:         ////////////////////////////////////////////////////////////////////////////
  241:  
  242:         /// <summary>
  243:         /// This function will attempt the lower the number of features and limit the size of the database for very large numbers of features
  244:         /// </summary>
  245:         public static List<Ia.TentPlay.Cl.Model.Trek.Feature> LimitNumberOfFeaturesHenceSizeOfApp(string fileCountry, List<Ia.TentPlay.Cl.Model.Trek.Feature> featureList)
  246:         {
  247:             int r;
  248:             double specialCases;
  249:  
  250:             List<Ia.TentPlay.Cl.Model.Trek.Feature> list;
  251:  
  252:             list = new List<Ia.TentPlay.Cl.Model.Trek.Feature>();
  253:  
  254:             if (fileCountry == "ir") specialCases = .8; // I think this is because farsi feature has lots of utf8 arabic scripts
  255:             else if (fileCountry == "ru") specialCases = .48;
  256:             else specialCases = 1;
  257:  
  258:             if (featureList.Count > Ia.TentPlay.Cl.Model.Business.Trek.Default.MaximumNumberOfFeaturesThatWouldAllowForAcceptableAppSizeInAndroidPlayStore * specialCases)
  259:             {
  260:                 foreach (var f in featureList)
  261:                 {
  262:                     r = Ia.Cl.Model.Default.Random(featureList.Count);
  263:  
  264:                     if (r < Ia.TentPlay.Cl.Model.Business.Trek.Default.MaximumNumberOfFeaturesThatWouldAllowForAcceptableAppSizeInAndroidPlayStore * specialCases)
  265:                     {
  266:                         list.Add(f);
  267:                     }
  268:                     else
  269:                     {
  270:                         // ignore item to reduce size
  271:                     }
  272:                 }
  273:             }
  274:             else list = featureList;
  275:  
  276:             return list;
  277:         }
  278:  
  279:         ////////////////////////////////////////////////////////////////////////////
  280:  
  281:         /// <summary>
  282:         ///
  283:         /// </summary>
  284:         public static void GenerateDrawableVersionOfNavigationViewBackground(Ia.TentPlay.Cl.Model.Data.Trek.ApplicationInformation.Country applicationCountry, out Ia.Cl.Model.Result result)
  285:         {
  286:             /*
  287:     drawable-ldpi
  288:     drawable-hdpi
  289:     drawable-mdpi
  290:     drawable-xhdpi
  291:     drawable-xxhdpi
  292:     drawable-xxxhdpi
  293: 
  294:     Maximum width: 320dp
  295: 
  296:     ldpi    @ 320.00dp    = 240.00px
  297:     mdpi    @ 320.00dp    = 320.00px
  298:     hdpi    @ 320.00dp    = 480.00px
  299:     xhdpi    @ 320.00dp    = 640.00px
  300:     xxhdpi    @ 320.00dp    = 960.00px
  301:     xxxhdpi    @ 320.00dp    = 1280.00px
  302:              */
  303:  
  304:             bool filesMatch;
  305:             int c;
  306:             string originalImageFtpLocation, destinationImageFtpLocation, newFile;
  307:             string temporaryDirectory, temporaryZipFile;
  308:             System.Drawing.Image newImage;
  309:             Hashtable ht;
  310:             ZipFile zipFile;
  311:             Ia.Cl.Model.Ftp ftp;
  312:             Ia.Cl.Model.FtpDirectory serverImageFtpDirectory;
  313:             List<string> imageList, serverImageFtpDirectoryFileNameList, serverImageFtpDirectoryNameOnlyList;
  314:             List<Drawable> drawableList;
  315:  
  316:             temporaryDirectory = Ia.Cl.Model.Default.AbsoluteTempPath() + applicationCountry.Iso2; // + @"\" + DateTime.UtcNow.AddHours(3).Ticks;
  317:             temporaryZipFile = Ia.Cl.Model.Default.AbsoluteTempPath() + applicationCountry.Iso2 + ".zip";
  318:  
  319:             originalImageFtpLocation = Ia.TentPlay.Cl.Model.Business.Trek.Default.OriginalImageFtpLocation(applicationCountry.Iso2);
  320:             destinationImageFtpLocation = Ia.TentPlay.Cl.Model.Business.Trek.Default.DestinationImageFtpLocation(applicationCountry.Iso2);
  321:  
  322:             ht = new Hashtable();
  323:  
  324:             zipFile = new ZipFile();
  325:  
  326:             drawableList = new List<Drawable>();
  327:             drawableList.Add(new Drawable("ldpi", 240));
  328:             drawableList.Add(new Drawable("hdpi", 320));
  329:             drawableList.Add(new Drawable("mdpi", 480));
  330:             drawableList.Add(new Drawable("xhdpi", 640));
  331:             drawableList.Add(new Drawable("xxhdpi", 960));
  332:             drawableList.Add(new Drawable("xxxhdpi", 1280));
  333:  
  334:             result = new Ia.Cl.Model.Result();
  335:  
  336:             try
  337:             {
  338:                 ftp = new Ia.Cl.Model.Ftp(originalImageFtpLocation, Ia.TentPlay.Cl.Model.Business.Trek.Default.FtpUser, Ia.TentPlay.Cl.Model.Business.Trek.Default.FtpPassword);
  339:  
  340:                 Directory.CreateDirectory(temporaryDirectory);
  341:                 Directory.CreateDirectory(temporaryDirectory + @"\images");
  342:  
  343:                 foreach (Drawable d in drawableList)
  344:                 {
  345:                     Directory.CreateDirectory(temporaryDirectory + @"\drawable-" + d.Name);
  346:                 }
  347:  
  348:                 // check that the files on server match the count and names of files in XML
  349:                 serverImageFtpDirectory = ftp.ListDirectoryDetail("/*.*");
  350:  
  351:                 serverImageFtpDirectoryFileNameList = (from s in serverImageFtpDirectory select s.Filename).ToList();
  352:                 serverImageFtpDirectoryNameOnlyList = (from s in serverImageFtpDirectory select s.NameOnly).ToList();
  353:  
  354:                 imageList = (from i in applicationCountry.NavigationHeaderImages select i.FileName).ToList();
  355:  
  356:                 filesMatch = true;
  357:  
  358:                 if (serverImageFtpDirectory.Count == 0 || imageList.Count == 0)
  359:                 {
  360:                     result.AddError("serverImageFtpDirectory.Count = 0 or imageList.Count = 0. ");
  361:  
  362:                     filesMatch = false;
  363:                 }
  364:                 else if (serverImageFtpDirectory.Count != imageList.Count)
  365:                 {
  366:                     result.AddError("serverImageFtpDirectory.Count (" + serverImageFtpDirectory.Count + ") != imageList.Count (" + imageList.Count + "). ");
  367:  
  368:                     filesMatch = false;
  369:                 }
  370:                 else
  371:                 {
  372:                     // check all files have *.jpg extension
  373:                     foreach (Ia.Cl.Model.FtpFileInfo ffi in serverImageFtpDirectory)
  374:                     {
  375:                         if (ffi.Extension != "jpg")
  376:                         {
  377:                             result.AddError(@"serverImageFtpDirectory's """ + ffi.Filename + @""" extension is not the required ""jpg"". ");
  378:  
  379:                             filesMatch = false;
  380:                         }
  381:  
  382:                         // check all files are at least 1M
  383:                         if (ffi.Size < 300000)
  384:                         {
  385:                             result.AddError(@"serverImageFtpDirectory's """ + ffi.Filename + @""" size is smaller than the required 300K. ");
  386:  
  387:                             filesMatch = false;
  388:                         }
  389:  
  390:                         if (!imageList.Contains(ffi.NameOnly))
  391:                         {
  392:                             result.AddError(@"serverImageFtpDirectory's """ + ffi.Filename + @""" does not exist in imageList. ");
  393:  
  394:                             filesMatch = false;
  395:                         }
  396:                     }
  397:  
  398:                     // below: check if imageList has duplicates
  399:                     foreach (string i in imageList)
  400:                     {
  401:                         if (ht.ContainsKey(i))
  402:                         {
  403:                             result.AddError(@"imageList's """ + i + @""" appears more than once in XML file. ");
  404:  
  405:                             filesMatch = false;
  406:                         }
  407:                         else ht[i] = 1;
  408:                     }
  409:  
  410:                     foreach (string i in imageList)
  411:                     {
  412:                         if (!serverImageFtpDirectoryNameOnlyList.Contains(i))
  413:                         {
  414:                             result.AddError(@"imageList's """ + i + @""" does not exist in serverImageFtpDirectoryNameOnlyList. ");
  415:  
  416:                             filesMatch = false;
  417:                         }
  418:                     }
  419:  
  420:                     if (filesMatch)
  421:                     {
  422:                         // download all original image files and create drawables
  423:                         c = 0;
  424:  
  425:                         foreach (string fileName in serverImageFtpDirectoryFileNameList)
  426:                         {
  427:                             newFile = fileName.Replace("-", "_");
  428:  
  429:                             Ia.Cl.Model.Default.DownloadFile(originalImageFtpLocation + @"/" + fileName, temporaryDirectory + @"\images\" + newFile);
  430:  
  431:                             using (var image = System.Drawing.Image.FromFile(temporaryDirectory + @"\images\" + newFile))
  432:                             {
  433:                                 foreach (Drawable d in drawableList)
  434:                                 {
  435:                                     newImage = Ia.Cl.Model.Image.Resize(image, d.MaxWidth, (image.Height * d.MaxWidth) / image.Width);
  436:  
  437:                                     newImage.Save(temporaryDirectory + @"\drawable-" + d.Name + @"\" + newFile, ImageFormat.Jpeg);
  438:  
  439:                                     c++;
  440:  
  441:                                     newImage.Dispose();
  442:                                 }
  443:  
  444:                                 image.Dispose();
  445:                             }
  446:                         }
  447:  
  448:                         // delete images so it will not be added to zip
  449:                         Directory.Delete(temporaryDirectory + @"\images", true);
  450:  
  451:                         // Zip all image files and prepare them for download
  452:                         zipFile.AddDirectory(temporaryDirectory);
  453:  
  454:                         zipFile.Save(temporaryZipFile);
  455:  
  456:                         Directory.Delete(temporaryDirectory, true);
  457:  
  458:                         result.AddSuccess("Generated " + c + " drawables for " + serverImageFtpDirectoryNameOnlyList.Count + " *.jpg original images. ");
  459:                     }
  460:                     else
  461:                     {
  462:                         result.AddError("File mismatch between server and XML file. ");
  463:                     }
  464:                 }
  465:             }
  466:             catch (Exception ex)
  467:             {
  468:                 result.AddError("Exception: " + ex.ToString());
  469:             }
  470:         }
  471:  
  472:         ////////////////////////////////////////////////////////////////////////////
  473:  
  474:         /// <summary>
  475:         ///
  476:         /// </summary>
  477:         public static void DownloadSpecificFeatureSqliteDatabaseFileFromTempFolder(Ia.TentPlay.Cl.Model.Data.Trek.ApplicationInformation.Country applicationCountry, System.Web.UI.Page page, out Ia.Cl.Model.Result result)
  478:         {
  479:             string fileName, filePath;
  480:             FileInfo file;
  481:  
  482:             result = new Ia.Cl.Model.Result();
  483:  
  484:             fileName = Ia.TentPlay.Cl.Model.Business.Trek.Default.SqliteDatabaseFileName(applicationCountry.Iso2, applicationCountry.VersionName);
  485:  
  486:             filePath = global::Ia.Cl.Model.Default.AbsolutePath(true) + fileName;
  487:  
  488:             file = new FileInfo(filePath);
  489:  
  490:             if (file.Exists)
  491:             {
  492:                 page.Response.Clear();
  493:                 page.Response.ClearHeaders();
  494:                 page.Response.ClearContent();
  495:                 page.Response.AddHeader("Content-Disposition", "attachment; filename=" + file.Name);
  496:                 page.Response.AddHeader("Content-Length", file.Length.ToString());
  497:                 page.Response.ContentType = "text/plain";
  498:                 page.Response.Flush();
  499:                 page.Response.TransmitFile(file.FullName);
  500:                 page.Response.End();
  501:  
  502:                 result.AddSuccess("Download complete. ");
  503:             }
  504:             else
  505:             {
  506:                 result.AddError("Download file does not exists. ");
  507:             }
  508:         }
  509:  
  510:         ////////////////////////////////////////////////////////////////////////////
  511:  
  512:         /// <summary>
  513:         ///
  514:         /// </summary>
  515:         public static void DownloadSpecificDrawableImageFileFromTempFolder(Ia.TentPlay.Cl.Model.Data.Trek.ApplicationInformation.Country applicationCountry, System.Web.UI.Page page, out Ia.Cl.Model.Result result)
  516:         {
  517:             string fileName, filePath;
  518:             FileInfo file;
  519:  
  520:             result = new Ia.Cl.Model.Result();
  521:  
  522:             fileName = applicationCountry.Iso2 + ".zip";
  523:  
  524:             filePath = global::Ia.Cl.Model.Default.AbsolutePath(true) + fileName;
  525:  
  526:             file = new FileInfo(filePath);
  527:  
  528:             if (file.Exists)
  529:             {
  530:                 page.Response.Clear();
  531:                 page.Response.ClearHeaders();
  532:                 page.Response.ClearContent();
  533:                 page.Response.AddHeader("Content-Disposition", "attachment; filename=" + file.Name);
  534:                 page.Response.AddHeader("Content-Length", file.Length.ToString());
  535:                 page.Response.ContentType = "application/x-zip-compressed";
  536:                 page.Response.Flush();
  537:                 page.Response.TransmitFile(file.FullName);
  538:                 page.Response.End();
  539:  
  540:                 result.AddSuccess("Download complete. ");
  541:             }
  542:             else
  543:             {
  544:                 result.AddError("Download file does not exists. ");
  545:             }
  546:         }
  547:  
  548:         ////////////////////////////////////////////////////////////////////////////
  549:  
  550:         /// <summary>
  551:         ///
  552:         /// </summary>
  553:         public static void WriteFeatureDesignationRecordListXmlToDatabase(out Ia.Cl.Model.Result result)
  554:         {
  555:             int c;
  556:             result = new Ia.Cl.Model.Result();
  557:  
  558:             c = 0;
  559:  
  560:             try
  561:             {
  562:                 using (var db = new Ia.TentPlay.Db())
  563:                 {
  564:                     if (db.Database.EnsureCreated())
  565:                     {
  566:                         // below: first will delete all current records
  567:                         var all = from nfdc in db.FeatureDesignations select nfdc;
  568:                         db.FeatureDesignations.RemoveRange(all);
  569:                         db.SaveChanges();
  570:                     }
  571:  
  572:                     foreach (Ia.TentPlay.Cl.Model.Trek.FeatureDesignation featureDesignation in Ia.TentPlay.Cl.Model.Data.Trek.FeatureDesignation.List)
  573:                     {
  574:                         var p = new Ia.TentPlay.Cl.Model.Trek.FeatureDesignation
  575:                         {
  576:                             Id = featureDesignation.Id,
  577:  
  578:                             En = featureDesignation.En,
  579:                             Ar = featureDesignation.Ar,
  580:                             Da = featureDesignation.Da,
  581:                             Zh_Simplified = featureDesignation.Zh_Simplified,
  582:                             Zh_Traditional = featureDesignation.Zh_Traditional,
  583:                             Hi = featureDesignation.Hi,
  584:                             Ja = featureDesignation.Ja,
  585:                             De = featureDesignation.De,
  586:                             Ru = featureDesignation.Ru,
  587:                             Pt = featureDesignation.Pt,
  588:                             _Id = featureDesignation._Id,
  589:                             Fr = featureDesignation.Fr,
  590:                             Es = featureDesignation.Es,
  591:                             It = featureDesignation.It,
  592:                             Ko = featureDesignation.Ko,
  593:                             Tr = featureDesignation.Tr,
  594:                             Fa = featureDesignation.Fa,
  595:                             Th = featureDesignation.Th,
  596:                             Ha = featureDesignation.Ha,
  597:                             Ig = featureDesignation.Ig,
  598:                             Yo = featureDesignation.Yo,
  599:                             Pl = featureDesignation.Pl,
  600:                             Ur = featureDesignation.Ur,
  601:                             Nl = featureDesignation.Nl,
  602:                             Ms = featureDesignation.Ms,
  603:                             Tl = featureDesignation.Tl,
  604:                             Af = featureDesignation.Af,
  605:                             Zu = featureDesignation.Zu,
  606:                             Xh = featureDesignation.Xh,
  607:                             Bn = featureDesignation.Bn,
  608:                             Vi = featureDesignation.Vi,
  609:                             Kk = featureDesignation.Kk,
  610:                             Ro = featureDesignation.Ro,
  611:                             No = featureDesignation.No,
  612:                             Uk = featureDesignation.Uk,
  613:                             Cs = featureDesignation.Cs,
  614:                             He = featureDesignation.He,
  615:                             El = featureDesignation.El,
  616:                             My = featureDesignation.My,
  617:                             Hu = featureDesignation.Hu,
  618:                             Ga = featureDesignation.Ga,
  619:                             Si = featureDesignation.Si,
  620:                             Ta = featureDesignation.Ta,
  621:                             Fi = featureDesignation.Fi,
  622:                             Uz = featureDesignation.Uz,
  623:                             Az = featureDesignation.Az,
  624:                             Be = featureDesignation.Be,
  625:                             Sk = featureDesignation.Sk,
  626:                             Am = featureDesignation.Am,
  627:                             Sw = featureDesignation.Sw,
  628:                             Bg = featureDesignation.Bg,
  629:                             Hr = featureDesignation.Hr,
  630:                             Lt = featureDesignation.Lt,
  631:                             Ne = featureDesignation.Ne,
  632:                             Sl = featureDesignation.Sl,
  633:                             Ps = featureDesignation.Ps,
  634:                             Lb = featureDesignation.Lb,
  635:                             Km = featureDesignation.Km,
  636:                             Lv = featureDesignation.Lv,
  637:                             Bs = featureDesignation.Bs,
  638:                             Et = featureDesignation.Et,
  639:                             Lo = featureDesignation.Lo,
  640:                             Mn = featureDesignation.Mn,
  641:                             Mg = featureDesignation.Mg,
  642:                             Ka = featureDesignation.Ka,
  643:                             Sq = featureDesignation.Sq,
  644:                             Mk = featureDesignation.Mk,
  645:                             Hy = featureDesignation.Hy,
  646:                             Tg = featureDesignation.Tg,
  647:                             Ky = featureDesignation.Ky,
  648:                             Is = featureDesignation.Is,
  649:                             Mt = featureDesignation.Mt,
  650:                             Ca = featureDesignation.Ca,
  651:  
  652:                             Description = featureDesignation.Description,
  653:                             Class = featureDesignation.Class,
  654:                             Deleted = featureDesignation.Deleted,
  655:  
  656:                             Created = featureDesignation.Created,
  657:                             Updated = featureDesignation.Updated
  658:                         };
  659:  
  660:                         db.FeatureDesignations.Add(p);
  661:                         c++;
  662:                     }
  663:  
  664:                     db.SaveChanges();
  665:  
  666:                     result.AddSuccess("Records added: " + c + ". ");
  667:                 }
  668:             }
  669:             catch (Exception ex)
  670:             {
  671:                 result.AddError(ex.ToString());
  672:             }
  673:         }
  674:  
  675:         ////////////////////////////////////////////////////////////////////////////
  676:  
  677:         /// <summary>
  678:         ///
  679:         /// </summary>
  680:         public static void DeleteFeatureDesignationRecordListFromDatabase(out Ia.Cl.Model.Result result)
  681:         {
  682:             result = new Ia.Cl.Model.Result();
  683:  
  684:             try
  685:             {
  686:                 using (var db = new Ia.TentPlay.Db())
  687:                 {
  688:                     if (db.Database.EnsureCreated())
  689:                     {
  690:                         // below: first will delete all current records
  691:                         var all = from nfdc in db.FeatureDesignations select nfdc;
  692:                         db.FeatureDesignations.RemoveRange(all);
  693:                         db.SaveChanges();
  694:                     }
  695:  
  696:                     db.SaveChanges();
  697:  
  698:                     result.AddSuccess("Records deleted. ");
  699:                 }
  700:             }
  701:             catch (Exception ex)
  702:             {
  703:                 result.AddError(ex.ToString());
  704:             }
  705:         }
  706:  
  707:         ////////////////////////////////////////////////////////////////////////////
  708:  
  709:         /// <summary>
  710:         ///
  711:         /// </summary>
  712:         public static void RemoveUnNeededColumns(ref DataTable dataTable, List<Ia.Cl.Model.Language> countrySpokenLanguageList)
  713:         {
  714:             List<string> columnsToRemove;
  715:  
  716:             dataTable.Columns.Remove("Deleted");
  717:             dataTable.Columns.Remove("Description");
  718:             dataTable.Columns.Remove("Created");
  719:             dataTable.Columns.Remove("Updated");
  720:  
  721:             columnsToRemove = new List<string>();
  722:  
  723:             foreach (DataColumn column in dataTable.Columns)
  724:             {
  725:                 if (countrySpokenLanguageList.Find(u => u.Symbol == column.ColumnName.ToLower()) == null)
  726:                 {
  727:                     if (column.ColumnName.ToLower() != "id" && column.ColumnName.ToLower() != "class")
  728:                     {
  729:                         columnsToRemove.Add(column.ColumnName);
  730:                     }
  731:                 }
  732:             }
  733:  
  734:             if (columnsToRemove.Count > 0)
  735:             {
  736:                 foreach (string columnName in columnsToRemove)
  737:                 {
  738:                     dataTable.Columns.Remove(columnName);
  739:                 }
  740:             }
  741:         }
  742:  
  743:         ////////////////////////////////////////////////////////////////////////////
  744:         ////////////////////////////////////////////////////////////////////////////
  745:     }
  746: }