Public general use code classes and xml files that we've compiled and used over the years:
Structure of the lulutypermarket.com website.
1: using System;
2: using System.Collections.Generic;
3: using System.IO;
4: using System.Linq;
5: using System.Reflection;
6: using System.Xml.Linq;
7: using System.Text.RegularExpressions;
8: using OpenQA.Selenium;
9: using OpenQA.Selenium.Chrome;
10:
11: namespace Ia.Statistics.Cl.Models.LuluHypermarket
12: {
13: ////////////////////////////////////////////////////////////////////////////
14:
15: /// <summary publish="true">
16: /// Structure of the lulutypermarket.com website.
17: /// </summary>
18: /// <remarks>
19: /// Copyright © 2024-2025 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 class Default
32: {
33: private static int updateProductUrlListCounter = 0;
34:
35: private static XDocument xd;
36:
37: private static List<Ia.Statistics.Cl.Models.Category> categoryList;
38:
39: private static Dictionary<Ia.Statistics.Cl.Models.Category, string> categoryToNextUrlDictionary = new Dictionary<Ia.Statistics.Cl.Models.Category, string>();
40:
41: private static List<string> productUrlList = new List<string>();
42:
43: ////////////////////////////////////////////////////////////////////////////
44:
45: /// <summary>
46: ///
47: /// </summary>
48: public Default() { }
49:
50: ////////////////////////////////////////////////////////////////////////////
51:
52: /// <summary>
53: ///
54: /// </summary>
55: public static void UpdateProductUrlList(Ia.Statistics.Cl.Models.Site site)
56: {
57: var list = ProductUrlListOfCategorySequentially();
58:
59: var storedList = Ia.Statistics.Cl.Models.Product.UrlListBySiteId(site.Id);
60:
61: if (productUrlList.Count > 0)
62: {
63: foreach (var l in list)
64: {
65: if (!productUrlList.Contains(l)) productUrlList.Add(l);
66: }
67: }
68: else productUrlList = list;
69:
70: if (productUrlList.Count > 0)
71: {
72: foreach (var l in storedList)
73: {
74: if (!productUrlList.Contains(l)) productUrlList.Add(l);
75: }
76: }
77: else productUrlList = storedList;
78: }
79:
80: ////////////////////////////////////////////////////////////////////////////
81:
82: /// <summary>
83: ///
84: /// </summary>
85: private static List<string> ProductUrlListOfCategorySequentially()
86: {
87: Ia.Statistics.Cl.Models.Category category;
88:
89: if (categoryToNextUrlDictionary.Count > 0)
90: {
91: var categoryToNextUrl = categoryToNextUrlDictionary.First();
92:
93: category = categoryToNextUrl.Key;
94: category.Url = categoryToNextUrl.Value;
95:
96: categoryToNextUrlDictionary.Remove(category);
97: }
98: else
99: {
100: category = Ia.Statistics.Cl.Models.LuluHypermarket.Default.CategoryList.RandomThenNext();
101: }
102:
103: var list = ProductUrlListOfCategory(category);
104:
105: return list;
106: }
107:
108: ////////////////////////////////////////////////////////////////////////////
109:
110: /// <summary>
111: ///
112: /// </summary>
113: public static List<string> ProductUrlListOfCategory(Ia.Statistics.Cl.Models.Category category)
114: {
115: var list = new List<string>();
116:
117: var options = new ChromeOptions();
118:
119: var chromeDriverService = ChromeDriverService.CreateDefaultService();
120: chromeDriverService.HideCommandPromptWindow = true;
121: chromeDriverService.SuppressInitialDiagnosticInformation = true;
122:
123: options.AddArgument("--headless");
124: options.AddArgument("--log-level=3");
125: options.AddArgument("--disable-extensions");
126: options.AddArgument("--ignore-certificate-errors");
127:
128: using (var chromeDriver = new OpenQA.Selenium.Chrome.ChromeDriver(chromeDriverService, options))
129: {
130: chromeDriver.Manage().Timeouts().ImplicitWait = Ia.Statistics.Cl.Models.Default.TimeoutTimeSpan;
131:
132: chromeDriver.Navigate().GoToUrl(category.Url);
133:
134: var javaScriptExecutor = ((IJavaScriptExecutor)chromeDriver);
135: javaScriptExecutor.ExecuteScript("window.scrollTo(0, document.body.scrollHeight)");
136:
137: var content = chromeDriver.PageSource;
138:
139: list = ProductUrlListFromCategoryContent(category, content);
140: }
141:
142: return list;
143: }
144:
145: ////////////////////////////////////////////////////////////////////////////
146:
147: /// <summary>
148: ///
149: /// </summary>
150: public static List<string> ProductUrlListFromCategoryContent(Ia.Statistics.Cl.Models.Category category, string content)
151: {
152: string url;
153:
154: var list = new List<string>();
155:
156: /*
157: // below: check if content has a Next link
158: var nextMatch = Regex.Match(content, @"<li class=""item pages-item-next"">.+?<a class=""action next"".+?href=""(.+?)"".+?title=""Next"">", RegexOptions.Singleline, Ia.Statistics.Cl.Model.Default.TimeoutTimeSpan);
159:
160: if (nextMatch.Success)
161: {
162: var nextUrl = nextMatch.Groups[1].Value;
163:
164: categoryToNextUrlDictionary[category] = nextUrl;
165: }
166: */
167:
168: var matchCollection = Regex.Matches(content, @"<div class=""product-box .+? data-url=""(.+?)"" data-productcode=""\d+?"">.+?<input type=""hidden"" id="".+?"" class="".+?"" data-id=""\d+?"" data-name="".+?"" data-price="".+?"" .+?", RegexOptions.Singleline, Ia.Statistics.Cl.Models.Default.TimeoutTimeSpan);
169:
170: foreach (Match match in matchCollection)
171: {
172: url = Ia.Statistics.Cl.Models.Site.LuluHypermarketKuwait.BaseUrl + match.Groups[1].Value;
173:
174: list.Add(url);
175: }
176:
177: return list;
178: }
179:
180: ////////////////////////////////////////////////////////////////////////////
181: ////////////////////////////////////////////////////////////////////////////
182:
183: /// <summary>
184: ///
185: /// </summary>
186: public static string ReadUpdateProductPriceStockByProductUrlSequentially(Ia.Statistics.Cl.Models.Site site)
187: {
188: var s = string.Empty;
189: var productUrl = string.Empty;
190:
191: if (productUrlList.Count == 0 || updateProductUrlListCounter++ % Ia.Statistics.Cl.Models.Default.AverageNumberOfProductsPerCategory == 0) Ia.Statistics.Cl.Models.LuluHypermarket.Default.UpdateProductUrlList(site);
192:
193: if (productUrlList.Count > 0)
194: {
195: productUrl = productUrlList.RandomThenNext();
196:
197: ReadProductPriceStockByProductUrl(site, productUrl, out Ia.Statistics.Cl.Models.Product product, out decimal price, out int stock);
198:
199: if (!string.IsNullOrEmpty(product.Sku))
200: {
201: Ia.Statistics.Cl.Models.Product.Create(product);
202: Ia.Statistics.Cl.Models.ProductPriceSpot.Create(product, price);
203: Ia.Statistics.Cl.Models.ProductStockSpot.Create(product, stock);
204:
205: s = "Product: " + product.Name + "; price: " + price + "; stock: " + stock + ". ";
206: }
207: else s = "Product: " + product.Name + ": SKU is null. ";
208: }
209: else s = "Product list is empty. ";
210:
211: s = site.Name + ": " + productUrl + ": " + s;
212:
213: return s;
214: }
215:
216: ////////////////////////////////////////////////////////////////////////////
217:
218: /// <summary>
219: ///
220: /// </summary>
221: public static void ReadProductPriceStockByProductUrl(Ia.Statistics.Cl.Models.Site site, string productUrl, out Ia.Statistics.Cl.Models.Product product, out decimal price, out int stock)
222: {
223: var options = new ChromeOptions();
224:
225: var chromeDriverService = ChromeDriverService.CreateDefaultService();
226: chromeDriverService.HideCommandPromptWindow = true;
227: chromeDriverService.SuppressInitialDiagnosticInformation = true;
228:
229: options.AddArgument("--headless");
230: options.AddArgument("--log-level=3");
231: options.AddArgument("--disable-extensions");
232: options.AddArgument("--ignore-certificate-errors");
233:
234: using (var chromeDriver = new OpenQA.Selenium.Chrome.ChromeDriver(chromeDriverService, options))
235: {
236: chromeDriver.Manage().Timeouts().ImplicitWait = Ia.Statistics.Cl.Models.Default.TimeoutTimeSpan;
237:
238: chromeDriver.Navigate().GoToUrl(productUrl);
239:
240: //var javaScriptExecutor = ((IJavaScriptExecutor)chromeDriver); do not scroll or you will loose button position
241: //javaScriptExecutor.ExecuteScript("window.scrollTo(0, document.body.scrollHeight)");
242:
243: var content = chromeDriver.PageSource;
244:
245: ProductSkuNamePriceStockFromContent(content, out string sku, out string name, out price, out stock);
246:
247: product = new Ia.Statistics.Cl.Models.Product();
248:
249: product.Id = Ia.Statistics.Cl.Models.Product.ProductId(site, sku);
250: product.SiteId = site.Id;
251: //product.Category = product.Category;
252: product.Sku = sku;
253: product.Name = name;
254: product.Url = productUrl;
255:
256: if (content.Contains("product:availability") && content.Contains("in stock"))
257: {
258: var exceptionCounter = 0;
259: stock = 0;
260: var stockList = new List<int>();
261: //var list = new List<int>();
262:
263: do
264: {
265: try
266: {
267: // <button id="addToCartButton"
268: var addToCartButton = chromeDriver.FindElement(By.Id("addToCartButton"), 10);
269:
270: // <span class="badge badge-warning minicart-count js-mini-cart-count">100</span>
271: var counterNumberTag = chromeDriver.FindElement(By.ClassName("badge"), 10);
272:
273: if (addToCartButton.Text == "ADD TO CART")
274: {
275: addToCartButton.Click();
276: //list.Add(0);
277:
278: var text = counterNumberTag.Text;
279:
280: if (int.TryParse(text, out stock)) stockList.Add(stock);
281: }
282: else //if(addToCartButton.Text == "Add to Cart" || addToCartButton.Text == "Adding...")
283: {
284: // nothing
285: }
286: }
287: catch (Exception e)
288: {
289: if (exceptionCounter++ == 10) throw new Exception("Exception counter at 10: " + e.Message);
290: }
291: }
292: while (!LastThreeNumbersAreIdentical(stockList));
293: }
294: else stock = 0;
295: }
296: }
297:
298: private static bool LastThreeNumbersAreIdentical(List<int> list)
299: {
300: var identical = false;
301:
302: if (list.Count >= 3)
303: {
304: var length = list.Count;
305:
306: if (list[length - 1] == list[length - 2] && list[length - 1] == list[length - 3]) identical = true;
307: else identical = false;
308: }
309:
310: return identical;
311: }
312:
313: ////////////////////////////////////////////////////////////////////////////
314:
315: ///// <summary>
316: ///
317: /// </summary>
318: public static void ProductSkuNamePriceStockFromContent(string content, out string sku, out string name, out decimal price, out int stock)
319: {
320: var match = Regex.Match(content, @"<div class=""product-box .+? data-productcode=""(\d+?)"" data-url="".+?"">.+?<input type=""hidden"" id="".+?"" class="".+?"" data-id=""\d+?"" data-name=""(.+?)"" data-price=""(.+?)"" data-brand=.+?", RegexOptions.Singleline, Ia.Statistics.Cl.Models.Default.TimeoutTimeSpan);
321:
322: if (match.Success)
323: {
324: sku = match.Groups[1].Value;
325: name = match.Groups[2].Value;
326: name = Ia.Statistics.Cl.Models.Default.NormalizeName(name);
327:
328: price = decimal.TryParse(match.Groups[3].Value, out decimal d) ? d : 0;
329:
330: //stock = int.Parse(match.Groups[6].Value);
331: stock = Ia.Statistics.Cl.Models.Default.StockValueUnAvailable; //stock <= Ia.Statistics.Cl.Model.Default.MaximumReasonableStockValue ? stock : Ia.Statistics.Cl.Model.Default.MaximumReasonableStockValue;
332: }
333: else
334: {
335: name = string.Empty;
336: sku = string.Empty;
337:
338: price = Ia.Statistics.Cl.Models.Default.UndefinedOrInvalidOrUnknown;
339: stock = Ia.Statistics.Cl.Models.Default.UndefinedOrInvalidOrUnknown;
340: }
341: }
342:
343: /*
344: ////////////////////////////////////////////////////////////////////////////
345:
346: /// <summary>
347: ///
348: /// </summary>
349: public static string ReadUpdateProductListOfCategorySequentially()
350: {
351: string s;
352: List<string> productIdList;
353:
354: var category = Ia.Statistics.Cl.Model.LuluHypermarket.Default.CategoryList.RandomThenNext();
355:
356: var site = Ia.Statistics.Cl.Model.Site.SiteFromId(category.SiteId);
357:
358: var productPriceStockQuantitySoldList = ProductPriceStockListOfCategory(site, category, out string exception);
359:
360: if (string.IsNullOrEmpty(exception))
361: {
362: if (productPriceStockQuantitySoldList.Count > 0)
363: {
364: s = string.Empty;
365: productIdList = new List<string>(); // this is needed because sometimes the parser read a product twice
366:
367: foreach (var productPriceStockQuantitySold in productPriceStockQuantitySoldList)
368: {
369: if (!productIdList.Contains(productPriceStockQuantitySold.Product.Id))
370: {
371: if (!string.IsNullOrEmpty(productPriceStockQuantitySold.Product.Sku))
372: {
373: Ia.Statistics.Cl.Model.Product.Create(productPriceStockQuantitySold.Product);
374: Ia.Statistics.Cl.Model.ProductPriceSpot.Create(productPriceStockQuantitySold.Product, productPriceStockQuantitySold.Price);
375: Ia.Statistics.Cl.Model.ProductStockSpot.Create(productPriceStockQuantitySold.Product, productPriceStockQuantitySold.Stock);
376:
377: s += "Product: " + productPriceStockQuantitySold.Product.Name + "; price: " + productPriceStockQuantitySold.Price + "; stock: " + productPriceStockQuantitySold.Stock + ". ";
378: }
379: else
380: {
381: s += "Product: " + productPriceStockQuantitySold.Product.Name + ": SKU is null. ";
382: }
383: }
384: else
385: {
386: s += "Product: Product with Id " + productPriceStockQuantitySold.Product.Id + " has already been created. ";
387: }
388:
389: productIdList.Add(productPriceStockQuantitySold.Product.Id);
390: }
391: }
392: else s = "Product list is 0. ";
393:
394: s = site.Name + ": " + category.Url + ": " + s;
395: }
396: else s = exception;
397:
398: return s;
399: }
400:
401: ////////////////////////////////////////////////////////////////////////////
402:
403: /// <summary>
404: ///
405: /// </summary>
406: public static List<Ia.Statistics.Cl.Model.ProductPriceStockQuantitySold> ProductPriceStockListOfCategory(Ia.Statistics.Cl.Model.Site site, Ia.Statistics.Cl.Model.Category category, out string exception)
407: {
408: int areaId;
409:
410: var productPriceStockQuantitySoldList = new List<Ia.Statistics.Cl.Model.ProductPriceStockQuantitySold>();
411:
412: var options = new ChromeOptions();
413:
414: var chromeDriverService = ChromeDriverService.CreateDefaultService();
415: chromeDriverService.HideCommandPromptWindow = true;
416: chromeDriverService.SuppressInitialDiagnosticInformation = true;
417:
418: options.AddArgument("--headless");
419: options.AddArgument("--log-level=3");
420: options.AddArgument("--disable-extensions");
421: options.AddArgument("--ignore-certificate-errors");
422:
423: /*
424: switch (site.Iso)
425: {
426: case "KW": areaId = 10; break;
427: case "SA": areaId = 2648; break;
428: case "AE": areaId = 12; break;
429: case "QA": areaId = 6; break;
430: case "BH": areaId = 11; break;
431: default: areaId = 10; break;
432: }
433: * /
434:
435: using (var chromeDriver = new OpenQA.Selenium.Chrome.ChromeDriver(chromeDriverService, options))
436: {
437: chromeDriver.Manage().Timeouts().ImplicitWait = Ia.Statistics.Cl.Model.Default.TimeoutTimeSpan;
438:
439: chromeDriver.Navigate().GoToUrl(category.Url);
440:
441: //chromeDriver.Manage().Cookies.AddCookie(new OpenQA.Selenium.Cookie("DAB_AREA", areaId.ToString(), "", DateTime.UtcNow.AddHours(3).AddYears(1)));
442: //chromeDriver.Manage().Cookies.AddCookie(new OpenQA.Selenium.Cookie("DAB_COUNTRY", site.Iso, "", DateTime.UtcNow.AddHours(3).AddYears(1)));
443: //chromeDriver.Manage().Cookies.AddCookie(new OpenQA.Selenium.Cookie("accept_cookies", "accepted", "", DateTime.UtcNow.AddHours(3).AddYears(1)));
444: //chromeDriver.Manage().Cookies.AddCookie(new OpenQA.Selenium.Cookie("ajs_anonymous_id", "e7a170bb-807b-4546-8caf-b7cec22f20c5", "", DateTime.UtcNow.AddHours(3).AddYears(1)));
445:
446: //chromeDriver.Navigate().GoToUrl(category.Url); // I will access site again with location cookies
447:
448: // maximize the browser
449: // chromeDriver.Manage().Window.Maximize();
450:
451: // scroll down the webpage
452: var javaScriptExecutor = ((IJavaScriptExecutor)chromeDriver);
453: javaScriptExecutor.ExecuteScript("window.scrollTo(0, document.body.scrollHeight)");
454:
455: var content = chromeDriver.PageSource;
456:
457: ProductPriceStockListFromCategoryContent(site, category, content, out productPriceStockQuantitySoldList, out exception);
458: }
459:
460: return productPriceStockQuantitySoldList;
461: }
462:
463: ////////////////////////////////////////////////////////////////////////////
464:
465: /// <summary>
466: ///
467: /// </summary>
468: public static void ProductPriceStockListFromCategoryContent(Ia.Statistics.Cl.Model.Site site, Ia.Statistics.Cl.Model.Category category, string content, out List<Ia.Statistics.Cl.Model.ProductPriceStockQuantitySold> productPriceStockQuantitySoldList, out string exception)
469: {
470: productPriceStockQuantitySoldList = new List<Ia.Statistics.Cl.Model.ProductPriceStockQuantitySold>();
471:
472: var matchCollection = Regex.Matches(content, @"<div class=""product-box .+? data-url=""(.+?)"" data-productcode=""(\d+?)"">.+?<input type=""hidden"" id="".+?"" class="".+?"" data-id=""\d+?"" data-name=""(.+?)"" data-price=""(.+?)"" .+?", RegexOptions.Singleline, Ia.Statistics.Cl.Model.Default.TimeoutTimeSpan);
473:
474: foreach (Match match in matchCollection)
475: {
476: var product = new Ia.Statistics.Cl.Model.Product();
477: var productPriceStockQuantitySold = new Ia.Statistics.Cl.Model.ProductPriceStockQuantitySold();
478:
479: var sku = match.Groups[2].Value; // data-productcode
480:
481: var name = match.Groups[3].Value; // name
482: name = Ia.Statistics.Cl.Model.Default.NormalizeName(name);
483:
484: var url = match.Groups[1].Value; // data-url
485:
486: product.Id = Ia.Statistics.Cl.Model.Product.ProductId(site, sku);
487: product.SiteId = site.Id;
488: //product.Category = category;
489: product.Sku = sku;
490: product.Name = name;
491: product.Url = site.BaseUrl + url;
492:
493: var price = decimal.TryParse(match.Groups[4].Value, out decimal d) ? d : 0;
494:
495: //var stock = int.Parse(match.Groups[6].Value); // buy_limit;
496: var stock = Ia.Statistics.Cl.Model.Default.StockValueUnAvailable; // stock <= Ia.Statistics.Cl.Model.Default.MaximumReasonableStockValue ? stock : Ia.Statistics.Cl.Model.Default.MaximumReasonableStockValue;
497:
498: productPriceStockQuantitySold.Product = product;
499: productPriceStockQuantitySold.Price = price;
500: productPriceStockQuantitySold.Stock = stock;
501:
502: productPriceStockQuantitySoldList.Add(productPriceStockQuantitySold);
503: }
504:
505: exception = string.Empty;
506: }
507:
508: ////////////////////////////////////////////////////////////////////////////
509: ////////////////////////////////////////////////////////////////////////////
510:
511: /// <summary>
512: ///
513: /// </summary>
514: public static string ProductUrlListOfCategorySequentially()
515: {
516: Ia.Statistics.Cl.Model.Category category;
517:
518: /*
519: if (categoryToNextUrlDictionary.Count > 0)
520: {
521: var categoryToNextUrl = categoryToNextUrlDictionary.First();
522:
523: category = categoryToNextUrl.Key;
524: category.Url = categoryToNextUrl.Value;
525:
526: categoryToNextUrlDictionary.Remove(category);
527: }
528: else
529: {
530: * /
531: category = Ia.Statistics.Cl.Model.LuluHypermarket.Default.CategoryList.RandomThenNext();
532: //category = (from c in Ia.Statistics.Cl.Model.LuluHypermarket.Default.CategoryList where c.Url.Contains("chocolate-candy.html") select c).SingleOrDefault();
533: //}
534:
535: var list = ProductUrlListOfCategory(category);
536:
537: if (productUrlList.Count > 0)
538: {
539: foreach (var l in list)
540: {
541: if (!productUrlList.Contains(l)) productUrlList.Add(l);
542: }
543: }
544: else productUrlList = list;
545:
546: return "Category: " + category.Name + "; product count: " + productUrlList.Count + ". ";
547: }
548: */
549:
550: ////////////////////////////////////////////////////////////////////////////
551: ////////////////////////////////////////////////////////////////////////////
552:
553: /// <summary>
554: ///
555: /// </summary>
556: public static List<Ia.Statistics.Cl.Models.Category> CategoryList
557: {
558: get
559: {
560: if (categoryList == null || categoryList.Count == 0)
561: {
562: categoryList = (from c in XDocument.Element("luluhypermarket").Descendants("category")
563: where !c.HasElements
564: select new Ia.Statistics.Cl.Models.Category
565: {
566: Id = 0, //Ia.Statistics.Cl.Model.Category.CategoryId(Ia.Statistics.Cl.Model.Site.LuluHypermarketKuwait, int.Parse(c.Attribute("id").Value)),
567: SiteId = Ia.Statistics.Cl.Models.Site.LuluHypermarketKuwait.Id,
568: Url = Ia.Statistics.Cl.Models.Site.LuluHypermarketKuwait.BaseUrl + c.Attribute("url").Value,
569: Name = c.Attribute("name").Value
570: }
571: ).ToList<Ia.Statistics.Cl.Models.Category>();
572:
573: categoryList = categoryList.Shuffle().ToList();
574: }
575:
576: return categoryList;
577: }
578: }
579:
580: ////////////////////////////////////////////////////////////////////////////
581:
582: /// <summary>
583: ///
584: /// How to embed and access resources by using Visual C# http://support.microsoft.com/kb/319292/en-us
585: ///
586: /// 1. Change the "Build Action" property of your XML file from "Content" to "Embedded Resource".
587: /// 2. Add "using System.Reflection".
588: /// 3. Manifest resource stream will start with the project namespace, the location of XML file.
589: ///
590: /// </summary>
591:
592: private static XDocument XDocument
593: {
594: get
595: {
596: Assembly assembly;
597: StreamReader streamReader;
598:
599: xd = null;
600: assembly = Assembly.GetExecutingAssembly();
601: streamReader = new StreamReader(assembly.GetManifestResourceStream("Ia.Statistics.Cl.Models.luluhypermarket.com.default.xml"));
602:
603: try
604: {
605: if (streamReader.Peek() != -1)
606: {
607: xd = System.Xml.Linq.XDocument.Load(streamReader);
608: }
609: }
610: catch (Exception)
611: {
612: }
613: finally
614: {
615: }
616:
617: return xd;
618: }
619: }
620:
621: ////////////////////////////////////////////////////////////////////////////
622: ////////////////////////////////////////////////////////////////////////////
623: }
624: }
- HomeController (Ia.Hsb.DrugOnCall.Wa.Controllers) :
- ErrorViewModel (Ia.Hsb.DrugOnCall.Wa.Models) :
- HomeViewModel (Ia.Hsb.DrugOnCall.Wa.Models) :
- Ui (Ia.Hsb.DrugOnCall.Wa.Models) :
- HomeController (Ia.Hsb.Pregnalact.Wa.Controllers) :
- ErrorViewModel (Ia.Hsb.Pregnalact.Wa.Models) :
- HomeViewModel (Ia.Hsb.Pregnalact.Wa.Models) :
- Ui (Ia.Hsb.Pregnalact.Wa.Models) :
- AgentController (Ia.Api.Wa.Controllers) : Agent API Controller class.
- AuthorizationHeaderHandler () :
- DefaultController (Ia.Api.Wa.Controllers) : Default API Controller class.
- GeoIpController (Ia.Api.Wa.Controllers) : GeoIp API Controller class of Internet Application project model.
- HeartbeatController (Ia.Api.Wa.Controllers) : Heartbeat API Controller class.
- HomeController (Ia.Api.Wa.Controllers) :
- PacketController (Ia.Api.Wa.Controllers) : Packet API Controller class.
- TempController (Ia.Api.Wa.Controllers.Db) : DB Temp API Controller class.
- TraceController (Ia.Api.Wa.Controllers) : Trace API Controller class.
- WeatherController (Ia.Api.Wa.Controllers) : OpenWeatherMap API Controller class.
- WebhookController (Ia.Api.Wa.Controllers) : Webhook API Controller class.
- Ui (Ia.Api.Wa.Models) :
- WeatherForecast (Ia.Api.Wa.Models) :
- Webhook (Ia.Api.Wa.Models) :
- HomeController (Ia.Cdn.Wa.Controllers) :
- ErrorViewModel (Ia.Cdn.Wa.Models) :
- ApplicationDbContext (Ia.Cl) :
- ApplicationUser (Ia.Cl) :
- Db (Ia.Cl) :
- DynamicSiteMapProvider () : Sitemap support class.
- Enumeration () : Enumeration class. Extends enumeration to class like behaviour.
- Extention () : Extention methods for different class objects.
- Agent (Ia.Cl.Models) : Agent model
- ApplicationConfiguration (Ia.Cl.Models) : ApplicationConfiguration class.
- Authentication (Ia.Cl.Model) : Manage and verify user logging and passwords. The administrator will define the user's password and logging website. The service will issue a true of false according to authentication.
- Storage (Ia.Cl.Model.Azure) : Azure Cloud related support functions.
- Default (Ia.Cl.Model.Business.Nfc) : Default NFC Near-Field Communication (NFC) Support Business functions
- Inventory (Ia.Cl.Model.Business.Nfc) : Inventory NFC Near-Field Communication (NFC) Support Business functions
- Tag (Ia.Cl.Model.Business.Nfc) : TAG NFC Near-Field Communication (NFC) Support Business functions
- Country (Ia.Cl.Models) : Country geographic coordinates and standard UN naming conventions.
- Germany (Ia.Cl.Models) : German cities and states.
- Kuwait (Ia.Cl.Models) : Kuwait provinces, cities, and areas.
- SaudiArabia (Ia.Cl.Models) : Saudi Arabia provinces, cities, and areas.
- Encryption (Ia.Cl.Models.Cryptography) : Symmetric Key Algorithm (Rijndael/AES) to encrypt and decrypt data.
- Default (Ia.Cl.Models.Data) : Support class for data model
- Default (Ia.Cl.Model.Data.Nfc) : Default NFC Near-Field Communication (NFC) Support Data functions
- Inventory (Ia.Cl.Model.Data.Nfc) : Inventory NFC Near-Field Communication (NFC) Support Data functions
- Project (Ia.Cl.Model.Nfc.Data) : Project Support class for NFC data model
- Tag (Ia.Cl.Model.Data.Nfc) : TAG NFC Near-Field Communication (NFC) Support Data functions
- Msmq (Ia.Cl.Model.Db) : MSMQ Database support class. This handles storing and retrieving MSMQ storage.
- MySql (Ia.Model.Db) : MySQL supporting class.
- Object (Ia.Cl.Model.Db) : Object entity class
- Odbc (Ia.Cl.Model.Db) : ODBC support class.
- OleDb (Ia.Cl.Models.Db) : OLEDB support class
- Oracle (Ia.Cl.Models.Db) : Oracle support class.
- Sqlite (Ia.Cl.Models.Db) : SQLite support class.
- SqlServer (Ia.Cl.Models.Db) : SQL Server support class.
- SqlServerCe (Ia.Cs.Db) : SQL Server CE support class.
- Temp (Ia.Cl.Models.Db) : Temporary Storage support class.
- Text (Ia.Cl.Models.Db) : Text Database support class. This handles storing and retrieving text storage.
- Xml (Ia.Cl.Models.Db) : XML Database support class. This handles storing and retrieving XDocument storage.
- Default (Ia.Cl.Models) : General use static class of common functions used by most applications.
- Gv (Ia.Cl.Models.Design) : ASP.NET design related support class.
- File (Ia.Cl.Models) : File manipulation related support class.
- Ftp (Ia.Cl.Models) : A wrapper class for .NET 2.0 FTP
- Location (Ia.Cl.Models.Geography) : Geographic location related function, location, coordinates (latitude, longitude), bearing, degree and radian conversions, CMap value for resolution, and country geographic info-IP from MaxMind.
- GeoIp (Ia.Cl.Models) : GeoIp class of Internet Application project model.
- Gmail (Ia.Cl.Models) : Gmail API support class
- StaticMap (Ia.Cl.Models.Google) : Google support class.
- Drive (Ia.Cl.Models.Google) : Google Drive Directory and File support class.
- Heartbeat (Ia.Cl.Models) : Heartbeat class.
- Hijri (Ia.Cl.Model) : Hijri date handler class.
- Html (Ia.Cl.Models) : Handle HTML encoding, decoding functions.
- HtmlHelper (Ia.Cl.Models) : HtmlHelper for ASP.Net Core.
- Http (Ia.Cl.Models) : Contains functions that relate to posting and receiving data from remote Internet/Intranet pages
- Identity (Ia.Cl.Models) : ASP.NET Identity support class.
- Image (Ia.Cl.Models) : Image processing support class.
- Imap (Ia.Cl.Models) : IMAP Server Support Class
- Language (Ia.Cl.Models) : Language related support class including langauge list and codes.
- Individual (Ia.Cl.Model.Life) : Individual object.
- Main (Ia.Cl.Models.Life) : General base class for life entities. Make it link through delegates to create and update database objects.
- Log (Ia.Cl.Models) : Log file support class.
- Mouse (Ia.Cl.Models) : Windows mouse movements and properties control support class.
- Newspaper (Ia.Cl.Models) : Newspaper and publication display format support class.
- Inventory (Ia.Cl.Model.Nfc) : Inventory NFC Near-Field Communication (NFC) Support Entity functions
- Tag (Ia.Cl.Model.Nfc) : TAG NFC Near-Field Communication (NFC) Support Entity functions
- Ocr (Ia.Cl.Models) : Handles OCR operations.
- Packet (Ia.Cl.Models) : Packet model
- PrayerTime (Ia.Cl.Models) : Prayer times support class.
- Punycode (Ia.Cl.Models) : Punycode support class.
- QrCode (Ia.Cl.Models) : QR Code support class.
- RabbitMq (Ia.Cl.Models) : RabbitMQ Messaging and Streaming Broker Support Class.
- Result (Ia.Cl.Models) : Result support class.
- Seo (Ia.Cl.Models) : Search Engine Optimization (SEO) support class.
- Sms (Ia.Cl.Models) : SMS API service support class.
- Smtp (Ia.Cl.Models) : SMTP Server Support Class
- Socket (Ia.Cl.Models) : Search Engine Optimization (SEO) support class.
- Sound (Ia.Cl.Models) : Sound support class.
- Stopwatch (Ia.Cl.Models) : Stopwatch model
- TagHelper (Ia.Cl.Models) : TagHelper for ASP.Net Core.
- Telnet (Ia.Cl.Models) : Telnet communication support class.
- Trace (Ia.Cl.Models) : Trace function to try to identifiy a user using IP addresses, cookies, and session states.
- Default (Ia.Cl.Models.Ui) : Default support UI class
- Upload (Ia.Cl.Model) : Handle file uploading functions.
- Utf8 (Ia.Cl.Models) : Handle UTF8 issues.
- Weather (Ia.Cl.Models) : Weather class
- Winapi (Ia.Cl.Models) : WINAPI click events support class.
- Word (Ia.Cl.Models) : Word object.
- Twitter (Ia.Cl.Models) : Twitter API support class.
- Xml (Ia.Cl.Models) : XML support class.
- Zip (Ia.Cl.Models) : Zip
- AboutController (Ia.Wa.Controllers) :
- AccountController (Ia.Wa.Controllers) :
- ApplicationController (Ia.Wa.Controllers) :
- ContactController (Ia.Wa.Controllers) :
- HelpController (Ia.Wa.Controllers) :
- HomeController (Ia.Wa.Controllers) :
- IdentityController (Ia.Wa.Controllers) :
- LegalController (Ia.Wa.Controllers) :
- LibraryController (Ia.Wa.Controllers) :
- ManageController (Ia.Wa.Controllers) :
- NetworkController (Ia.Wa.Controllers) :
- NgossController (Ia.Wa.Controllers) :
- PortfolioController (Ia.Wa.Controllers) :
- ServiceController (Ia.Wa.Controllers) :
- ServiceDesignChartController (Ia.Wa.Controllers) :
- ServiceDesignController (Ia.Wa.Controllers) :
- ServiceMAndroidController (Ia.Wa.Controllers) :
- ServiceMController (Ia.Wa.Controllers) :
- ServiceMIosController (Ia.Wa.Controllers) :
- ServiceNfcController (Ia.Wa.Controllers) :
- SmsController (Ia.Wa.Controllers) :
- ExternalLoginConfirmationViewModel (Ia.Wa.Models.AccountViewModels) :
- ForgotPasswordViewModel (Ia.Wa.Models.AccountViewModels) :
- LoginViewModel (Ia.Wa.Models.AccountViewModels) :
- RegisterViewModel (Ia.Wa.Models.AccountViewModels) :
- ResetPasswordViewModel (Ia.Wa.Models.AccountViewModels) :
- SendCodeViewModel (Ia.Wa.Models.AccountViewModels) :
- UseRecoveryCodeViewModel (Ia.Wa.Models.AccountViewModels) :
- VerifyAuthenticatorCodeViewModel (Ia.Wa.Models.AccountViewModels) :
- VerifyCodeViewModel (Ia.Wa.Models.AccountViewModels) :
- Default (Ia.Wa.Models.Business) :
- ContactViewModel (Ia.Wa.Models) :
- Default (Ia.Wa.Models.Data) :
- Portfolio (Ia.Wa.Models.Data) :
- ErrorViewModel (Ia.Wa.Models) :
- AddPhoneNumberViewModel (Ia.Wa.Models.ManageViewModels) :
- ChangePasswordViewModel (Ia.Wa.Models.ManageViewModels) :
- ConfigureTwoFactorViewModel (Ia.Wa.Models.ManageViewModels) :
- DisplayRecoveryCodesViewModel (Ia.Wa.Models.ManageViewModels) :
- FactorViewModel (Ia.Wa.Models.ManageViewModels) :
- IndexViewModel (Ia.Wa.Models.ManageViewModels) :
- ManageLoginsViewModel (Ia.Wa.Models.ManageViewModels) :
- RemoveLoginViewModel (Ia.Wa.Models.ManageViewModels) :
- SetPasswordViewModel (Ia.Wa.Models.ManageViewModels) :
- VerifyPhoneNumberViewModel (Ia.Wa.Models.ManageViewModels) :
- MenuViewModel (Ia.Wa.Models) :
- ParameterViewModel (Ia.Wa.Models) :
- QrCodeViewModel (Ia.Wa.Models) :
- Default (Ia.Wa.Models.Ui) :
- ServiceAndroidApplicationTrekCountry (Ia.Wa.Models.Ui) :
- AuthMessageSender (IdentitySample.Services) :
- DefaultController (Ia.Ngn.Cl.Model.Api.Controller) : Service Suspension API Controller class of Next Generation Network'a (NGN's) model.
- KoranController (Ia.Islamic.Koran.Cl.Model.Api.Controller) : Koran API Controller class of Islamic Koran Reference Network project model.
- PrayerTimeController (Ia.Islamic.Koran.Cl.Model.Api.Controller) : Prayer Time API Controller class of Islamic Koran Reference Network project model.
- ApplicationController (Ia.Islamic.Koran.Belief.Wa.Controllers) :
- HomeController (Ia.Islamic.Koran.Belief.Wa.Controllers) :
- ApplicationViewModel (Ia.Islamic.Koran.Belief.Wa.Models) :
- Business (Ia.Islamic.Koran.Belief.Wa.Models) : Koran Reference Network support functions: Business model
- ErrorViewModel (Ia.Islamic.Koran.Belief.Wa.Models) :
- HomeViewModel (Ia.Islamic.Koran.Belief.Wa.Models) :
- VerseCheckboxViewModel (Ia.Islamic.Koran.Belief.Wa.Models) :
- KoranDbContext (Ia.Islamic.Cl) : Koran Reference Network Data Context
- Default (Ia.Islamic.Cl.Model.Business) : Koran Reference Network Class Library support functions: Business model
- PrayerTime (Ia.Islamic.Koran.Cl.Model.Business) : Prayer Time Business class of Islamic Koran Reference Network project model.
- Word (Ia.Islamic.Cl.Model.Business) : Koran Reference Network Class Library support functions: business model
- Chapter (Ia.Islamic.Cl.Model.Data) : Koran Reference Network Class Library support functions: data model
- Default (Ia.Islamic.Cl.Model.Data) : Koran Reference Network Class Library support functions: Data model
- Koran (Ia.Islamic.Cl.Model.Data) : Koran Reference Network Class Library support functions: data model
- Verse (Ia.Islamic.Cl.Model.Data) : Koran Reference Network Class Library support functions: data model
- VerseTopic (Ia.Islamic.Cl.Model.Data) : Koran Reference Network Class Library support functions: data model
- Chapter (Ia.Islamic.Cl.Model) : Chapter Koran Reference Network Class Library support functions: Entity model
- Koran (Ia.Islamic.Cl.Model) : Koran Koran Reference Network Class Library support functions: Entity model
- Verse (Ia.Islamic.Cl.Model) : Verse Koran Reference Network Class Library support functions: Entity model
- VerseTopic (Ia.Islamic.Cl.Model) : VerseTopic Koran Reference Network Class Library support functions: Entity model
- Word (Ia.Islamic.Cl.Model) : Word Koran Reference Network Class Library support functions: Entity model
- WordVerse (Ia.Islamic.Cl.Model) : WordVerse Koran Reference Network Class Library support functions: Entity model
- Translation (Ia.Islamic.Cl.Model) : Koran Reference Network Class Library support functions: Data model
- VerseTopicUi (Ia.Islamic.Cl.Model.Ui) : Koran Reference Network Class Library support functions: UI model
- HomeController (Ia.Islamic.Koran.Wa.Controllers) :
- KoranController (Ia.Islamic.Koran.Wa.Controllers) :
- Default (Ia.Islamic.Koran.Wa.Model.Business) :
- ErrorViewModel (Ia.Islamic.Koran.Wa.Models) :
- KoranViewModel (Ia.Islamic.Koran.Wa.Models) :
- Default (Ia.Islamic.Koran.Wa.Models.Ui) :
- Default (Ia.Islamic.Koran.Wfa.Model.Business) : Koran Reference Network Windows Form support functions: Business model
- Preparation (Ia.Islamic.Koran.Wfa.Model.Business) : Koran Reference Network Windows Form support functions: Business model
- Default (Ia.Islamic.Koran.Wfa.Model.Data) : Koran Reference Network Windows Form support functions: Data model
- Kanji (Ia.Learning.Cl.Models.Business) : Kanji business support class
- Kanji (Ia.Learning.Cl.Models.Data) : Kanji support class
- Default (Ia.Learning.Cl.Models) : Default data support functions
- MoeBook (Ia.Learning.Cl.Models) : Ministry of Education Books support class for Learning data model.
- Default (Ia.Learning.Cl.Models.Ui) :
- Business (Ia.Learning.Kafiya.Models) : Default business support class.
- Data (Ia.Learning.Kafiya.Models) : Default data support class.
- HomeController (Ia.Learning.Manhag.Wa.Controllers) :
- ErrorViewModel (Ia.Learning.Manhag.Wa.Models) :
- IndexViewModel (Ia.Learning.Manhag.Wa.Models.Home) :
- DefaultController (Ia.Learning.Kanji.Wa.Controllers) :
- Default (Ia.Learning.Kanji.Models.Business) : Default business support class.
- Index (Ia.Learning.Kanji.Wa.Models.Default) :
- IndexViewModel (Ia.Learning.Kanji.Wa.Models.Default) :
- ErrorViewModel (Ia.Learning.Kanji.Wa.Models) :
- Default (Ia.Simple.Cl.Models.Business.SmartDeals) :
- Category (Ia.Simple.Cl.Models.Data.SmartDeals) :
- Default (Ia.Simple.Cl.Models.Data.SmartDeals) :
- Product (Ia.Simple.Cl.Models.Data.SmartDeals) :
- HomeController (Ia.Statistics.Cdn.Wa.Controllers) :
- Default (Ia.Statistics.Cl.Models.Boutiqaat) : Structure of the boutiqaat.com website.
- Category (Ia.Statistics.Cl.Models) :
- Default (Ia.Statistics.Cl.Models.Dabdoob) : Structure of the dabdoob.com website.
- Default (Ia.Statistics.Cl.Models) :
- Default (Ia.Statistics.Cl.Models.EnglishBookshop) : Structure of the theenglishbookshop.com website.
- Default (Ia.Statistics.Cl.Models.FantasyWorldToys) : Structure of the fantasyworldtoys.com website.
- Default (Ia.Statistics.Cl.Models.HsBookstore) : Structure of the hsbookstore.com website.
- Default (Ia.Statistics.Cl.Models.LuluHypermarket) : Structure of the lulutypermarket.com website.
- Default (Ia.Statistics.Cl.Models.Natureland) : Structure of the natureland.net website.
- Product (Ia.Statistics.Cl.Models) :
- ProductPriceSpot (Ia.Statistics.Cl.Models) :
- ProductPriceStockQuantitySold (Ia.Statistics.Cl.Models) :
- ProductStockSpot (Ia.Statistics.Cl.Models) :
- Site (Ia.Statistics.Cl.Models) : Site support class for Optical Fiber Network (OFN) data model.
- Default (Ia.Statistics.Cl.Models.SultanCenter) : Structure of the sultan-center.com website.
- Default (Ia.Statistics.Cl.Models.Taw9eel) : Structure of the taw9eel.com website.
- WebDriverExtensions () :
- AboutController (Ia.Statistics.Wa.Controllers) :
- ContactController (Ia.Statistics.Wa.Controllers) :
- HelpController (Ia.Statistics.Wa.Controllers) :
- HomeController (Ia.Statistics.Wa.Controllers) :
- IdentityController (Ia.Statistics.Wa.Controllers) :
- LegalController (Ia.Statistics.Wa.Controllers) :
- ListController (Ia.Statistics.Wa.Controllers) :
- SearchController (Ia.Statistics.Wa.Controllers) :
- ServiceController (Ia.Statistics.Wa.Controllers) :
- Default (Ia.Statistics.Wa.Models.Business) :
- ContactViewModel (Ia.Statistics.Wa.Models) :
- Default (Ia.Statistics.Wa.Models.Data) :
- ErrorViewModel (Ia.Statistics.Wa.Models) :
- Index (Ia.Statistics.Wa.Models.Home) :
- IndexViewModel (Ia.Statistics.Wa.Models.Home) :
- ProductViewModel (Ia.Statistics.Wa.Models.List) :
- Default (Ia.Statistics.Wa.Models.Ui) :
- ServiceAndroidApplicationTrekCountry (Ia.Statistics.Wa.Models.Ui) :
- DefaultController (Ia.TentPlay.Api.Wa.Controllers) : Trek API Controller class of Tent Play's model.
- ApplicationDbContext (Ia.TentPlay) :
- Db (Ia.TentPlay) :
- Default (Ia.TentPlay.Cl.Models.Business) : Support class for TentPlay business model
- Default (Ia.TentPlay.Cl.Models.Business.Trek) : Support class for TentPlay Trek business model
- Feature (Ia.TentPlay.Cl.Models.Business.Trek) : Feature class for TentPlay Trek business model
- FeatureClass (Ia.TentPlay.Cl.Models.Business.Trek) : FeatureClass Support class for TentPlay Trek business model
- FeatureClassDistanceToCapital (Ia.TentPlay.Cl.Models.Business.Trek) : FeatureClassDistanceToCapital Support class for TentPlay business model
- FeatureDesignation (Ia.TentPlay.Cl.Models.Business.Trek) : FeatureClass Support class for TentPlay Trek business model
- FeatureName (Ia.TentPlay.Cl.Models.Business.Trek) : Support class for TentPlay Trek business model
- CompanyInformation (Ia.TentPlay.Cl.Models.Data) : CompanyInformation Support class for TentPlay data model
- Default (Ia.TentPlay.Cl.Models.Data) : Support class for TentPlay data model
- ApplicationInformation (Ia.TentPlay.Cl.Models.Data.Trek) : ApplicationInformation Support class for TentPlay Trek data model
- Default (Ia.TentPlay.Cl.Models.Data.Trek) : Default class for TentPlay Trek data model
- Feature (Ia.TentPlay.Cl.Models.Data.Trek) : Feature Support class for TentPlay entity data
- FeatureClass (Ia.TentPlay.Cl.Models.Data.Trek) : FeatureClass Support class for TentPlay Trek business model
- FeatureDesignation (Ia.TentPlay.Cl.Models.Data.Trek) : FeatureDesignation Support class for TentPlay Trek data model
- NgaCountryWaypoint (Ia.TentPlay.Cl.Models.Data.Trek) : NgaCountryWaypoint Support class for TentPlay Waypoint entity data
- Score (Ia.TentPlay.Cl.Models.Memorise) : Score entity functions
- Feature (Ia.TentPlay.Cl.Models.Trek) : Feature Support class for TentPlay entity model
- FeatureDesignation (Ia.TentPlay.Cl.Models.Trek) : FeatureDesignation Support class for TentPlay Trek entity model
- ApplicationInformation (Ia.TentPlay.Cl.Models.Memorise) : ApplicationInformation Support class for TentPlay Memorise model
- Default (Ia.TentPlay.Cl.Models.Memorise) : Default class for TentPlay Memorise data model
- German (Ia.TentPlay.Cl.Models.Memorise) : German class
- Kana (Ia.TentPlay.Cl.Models.Memorise) : Kana class
- Kanji (Ia.TentPlay.Cl.Models.Memorise) : Kanji class
- Math (Ia.TentPlay.Cl.Models.Memorise) : Math Class
- MorseCode (Ia.TentPlay.Cl.Models.Memorise) : Morse code class
- PhoneticAlphabet (Ia.TentPlay.Cl.Models.Memorise) : Phonetic Alphabet
- Russian (Ia.TentPlay.Cl.Models.Memorise) : Russian class
- Test (Ia.TentPlay.Cl.Models.Memorise) : Test Class
- Default (Ia.TentPlay.Cl.Models.Ui.Trek) : Default class for TentPlay Trek UI model
- AboutController (Ia.TentPlay.Wa.Controllers) :
- ContactController (Ia.TentPlay.Wa.Controllers) :
- HelpController (Ia.TentPlay.Wa.Controllers) :
- HomeController (Ia.TentPlay.Wa.Controllers) :
- LegalController (Ia.TentPlay.Wa.Controllers) :
- MemoriseController (Ia.TentPlay.Wa.Controllers) :
- TradeController (Ia.TentPlay.Wa.Controllers) :
- TrekController (Ia.TentPlay.Wa.Controllers) :
- ErrorViewModel (Ia.TentPlay.Wa.Models) :
- TrekViewModel (Ia.TentPlay.Wa.Models) :
- Default (Ia.TentPlay.Wa.Models.Ui) :