/// <summary>
        /// Fired when the cache needs and image that it does not currently hold.
        /// </summary>
        /// <param name="myObject"></param>
        /// <param name="args"></param>
        static void Cache_DataUpdateNeeded(object myObject, DataUpdateNeededArgs<long, Image> args)
        {
            bool success = false;
            Image pic = GetImageFromAPI(args.Key, out success);

            if (success)
            {
                StorePortrait(args.Key, pic);
                args.Data = pic;
            }
            else
            {
                EMMADataSet.PortraitsRow rowData = LoadPortraitFromDB(args.Key);
                //EMMADataSet.PortraitsRow rowData = null;
                if (rowData != null)
                {
                    MemoryStream stream = new MemoryStream(rowData.portrait);
                    pic = Image.FromStream(stream);
                    args.Data = pic;
                }
                else
                {
                    // Just use the placeholder generated by the failed call to 'GetImageFromAPI'
                    args.Data = pic;
                }
            }
        }
        /// <summary>
        /// Called when the cache requires a region name to be read from the database
        /// </summary>
        /// <param name="myObject"></param>
        /// <param name="args"></param>
        static void NameCache_DataUpdateNeeded(object myObject, DataUpdateNeededArgs<long, string> args)
        {
            string name = "";

            lock (regionsTableAdapter)
            {
                EveDataSet.mapRegionsDataTable table = new EveDataSet.mapRegionsDataTable();
                regionsTableAdapter.FillByIDs(table, args.Key.ToString());
                if (table.Count > 0)
                {
                    name = table[0].regionName;
                }
            }

            if (name.Equals(""))
            {
                name = "Unknown Region (" + args.Key + ")";
            }
            // Add region ID to wormhole regions
            if (name.Trim().ToUpper().Equals("UNKNOWN"))
            {
                name = "Unknown (" + args.Key + ")";
            }

            args.Data = name;
        }
        static void LocationCache_DataUpdateNeeded(object myObject, DataUpdateNeededArgs<int, int> args)
        {
            EveDataSet.mapConstellationsDataTable retVal = new EveDataSet.mapConstellationsDataTable();
            lock (tableAdapter)
            {
                tableAdapter.FillByIDs(retVal, args.Key.ToString());
            }

            if (retVal.Count > 0)
            {
                args.Data = retVal[0].regionID;
            }
        }
 static void Descriptions_DataUpdateNeeded(object myObject,
     DataUpdateNeededArgs<short, string> args)
 {
     string desc = "";
     _tableAdapter.GetDesc(args.Key, ref desc);
     args.Data = desc;
 }
 static void Cache_DataUpdateNeeded(object myObject, DataUpdateNeededArgs<long, Contract> args)
 {
     EMMADataSet.ContractsDataTable contracts = new EMMADataSet.ContractsDataTable();
     contractsTableAdapter.FillByID(contracts, args.Key);
     if (contracts.Count > 0)
     {
         args.Data = new Contract(contracts[0]);
     }
 }
        static void VolCache_DataUpdateNeeded(object myObject, DataUpdateNeededArgs<int, double> args)
        {
            double vol = 0;

            EveDataSet.invTypesRow itemData = GetItem(args.Key);

            if (itemData == null || itemData.IsvolumeNull())
            {
                vol = 0;
            }
            else
            {
                int groupID = itemData.groupID;
                if (groupTable == null)
                {
                    groupTable = new EveDataSet.invGroupsDataTable();
                    groupsTableAdapter.Fill(groupTable);
                }
                EveDataSet.invGroupsRow groupData = groupTable.FindBygroupID(groupID);

                if (groupData.categoryID == 6)
                {
                    // If the item is a ship then use the groupID to get the unpackaged volume
                    // Shuttle
                    if (groupID == 31) { vol = 500; }
                    // Frigs, Interceptors, Covops, EAS, Assault Ships, Stealth Bombers
                    else if (groupID == 25 || groupID == 831 || groupID == 830 || groupID == 893 ||
                        groupID == 324 || groupID == 834) { vol = 2500; }
                    // Mining Barges, Exhumers
                    else if (groupID == 463 || groupID == 543) { vol = 3750; }
                    // Destroyers, Interdictors
                    else if (groupID == 420 || groupID == 541) { vol = 5000; }
                    // Cruiser, HACs, HICs, Logistics, Combat Recons, Force Recons
                    else if (groupID == 26 || groupID == 358 || groupID == 894 || groupID == 832 ||
                        groupID == 906 || groupID == 833) { vol = 10000; }
                    // Battlecruiser, Command Ships
                    else if (groupID == 419 || groupID == 540) { vol = 15000; }
                    // Industrials, Transport Ships
                    else if (groupID == 28 || groupID == 380) { vol = 20000; }
                    // Battleships, Blackops, Marauders
                    else if (groupID == 27 || groupID == 898 || groupID == 900) { vol = 50000; }
                    // Freighters, Jump Freighters
                    else if (groupID == 513 || groupID == 902) { vol = 1000000; }
                    // If the ship belongs to a different group we don't know about then just use
                    // it's unpackaged volume.
                    else { vol = itemData.volume; }
                }
                else
                {
                    vol = itemData.volume;
                }
            }

            args.Data = vol;
        }
        static void ReproCache_DataUpdateNeeded(object myObject, DataUpdateNeededArgs<int, Dictionary<int, double>> args)
        {
            // decimal value = 0;
            Dictionary<int, double> list = new Dictionary<int, double>();

            try
            {
                EveDataSetTableAdapters.ReprocesResultsTableAdapter reproAdapter =
                    new EveMarketMonitorApp.DatabaseClasses.EveDataSetTableAdapters.ReprocesResultsTableAdapter();
                EveDataSet.ReprocesResultsDataTable reprocessResults = new EveDataSet.ReprocesResultsDataTable();

                reproAdapter.Fill(reprocessResults, args.Key);

                foreach (EveDataSet.ReprocesResultsRow row in reprocessResults)
                {
                    double quantity = row.quantity;
                    EveDataSet.invTypesRow item = Items.GetItem(args.Key);
                    int portion = (item.IsportionSizeNull() ? 0 : item.portionSize);
                    if (portion != 0)
                    {
                        quantity /= portion;
                    }
                    //value += quantity * UserAccount.CurrentGroup.ItemsTraded.GetItemValue(row.requiredTypeID);

                    list.Add(row.requiredTypeID, quantity);
                }
            }
            catch (Exception ex)
            {
                EMMAException emmaEx = ex as EMMAException;
                if (emmaEx == null)
                {
                    new EMMAException(ExceptionSeverity.Error, "Problem getting reprocessor update for item '" +
                        Items.GetItemName(args.Key) + "'", ex);
                }
            }

            //args.Data = value;
            args.Data = list;
        }
        static void NameCache_DataUpdateNeeded(object myObject, DataUpdateNeededArgs<int, string> args)
        {
            string name = "";

            lock (tableAdapter)
            {
                tableAdapter.GetName(args.Key, ref name);
            }

            if (name.Equals(""))
            {
                AddItem(args.Key, "Unknown Item (" + args.Key + ")");
                name = "Unknown Item (" + args.Key + ")";
            }

            args.Data = name;
        }
 static void Cache_DataUpdateNeeded(object myObject, DataUpdateNeededArgs<int, PublicCorp> args)
 {
     PublicCorp data = null;
     EMMADataSet.PublicCorpsDataTable table =new EMMADataSet.PublicCorpsDataTable();
     tableAdapter.FillByID(table, args.Key);
     if (table.Count > 0)
     {
         data = new PublicCorp(table[0]);
     }
     args.Data = data;
 }
 static void SecurityCache_DataUpdateNeeded(object myObject, DataUpdateNeededArgs<long, double> args)
 {
     double security = 0;
     EveDataSet.staStationsRow station = GetStation(args.Key);
     if (station != null)
     {
         EveDataSet.mapSolarSystemsRow system = SolarSystems.GetSystem(station.solarSystemID);
         if(system != null)
         {
             security = (double)system.security;
         }
     }
     args.Data = security;
 }
        /// <summary>
        /// Called when the cache requires a station name to be read from the database
        /// </summary>
        /// <param name="myObject"></param>
        /// <param name="args"></param>
        static void NameCache_DataUpdateNeeded(object myObject, DataUpdateNeededArgs<long, string> args)
        {
            string name = "";

            lock (stationsTableAdapter)
            {
                stationsTableAdapter.GetName((int)args.Key, ref name);
            }

            if (name.Equals(""))
            {
                name = "Unknown Station (" + args.Key + ")";
            }

            args.Data = name;
        }
        void PriceCache_DataUpdateNeeded(object myObject, DataUpdateNeededArgs<PriceCacheKey, decimal> args)
        {
            int itemID = args.Key.ItemID;
            long regionID = args.Key.RegionID;
            DateTime valueDate = args.Key.ValueDate;
            bool buyPrice = myObject == _buyPriceCache;

            args.Data = GetItemValue(itemID, regionID, valueDate, buyPrice);
        }
        /// <summary>
        /// Called when the cache does not contain the requested route length.
        /// Attempt to get length from the database, if it's not there then calculate it and
        /// store the result in the database.
        /// </summary>
        /// <param name="myObject"></param>
        /// <param name="args"></param>
        static void _cache_DataUpdateNeeded(object myObject, DataUpdateNeededArgs<RouteKey, int> args)
        {
            int jumps = int.MaxValue;
            int startSystemID = args.Key.StartSystem;
            int endSystemID = args.Key.EndSystem;

            if (_hitLevel.ContainsKey(args.Key))
            {
                _hitLevel.Remove(args.Key);
            }

            EveDataSet.SolarSystemDistancesDataTable distances = new EveDataSet.SolarSystemDistancesDataTable();

            // try the database...
            LoadDistanceData(startSystemID, endSystemID, distances);
            EveDataSet.SolarSystemDistancesRow distanceData =
                distances.FindByFromSolarSystemIDToSolarSystemID(startSystemID, endSystemID);

            if (distanceData != null)
            {
                jumps = distanceData.Distance;
                _hitLevel.Add(args.Key, 2);
            }
            else
            {
                LoadDistanceData(endSystemID, startSystemID, distances);
                distanceData = distances.FindByFromSolarSystemIDToSolarSystemID(endSystemID, startSystemID);
                if (distanceData != null)
                {
                    jumps = distanceData.Distance;
                    SetDistance(startSystemID, endSystemID, jumps);
                    _hitLevel.Add(args.Key, 2);
                }
                else
                {
                    // If it's not in the database then we need to calculate it.
                    Map.SetCosts(1, 1, 1);
                    jumps = Map.CalcRouteLength(startSystemID, endSystemID);
                    SetDistance(startSystemID, endSystemID, jumps);
                    _hitLevel.Add(args.Key, 3);
                }
            }

            args.Data = jumps;
        }
        static void Cache_DataUpdateNeeded(object myObject, DataUpdateNeededArgs<string, decimal> args)
        {
            EMMADataSet.StandingsDataTable table = new EMMADataSet.StandingsDataTable();
            lock (tableAdapter)
            {
                char[] delim = { '|' };
                long toID = 0, fromID = 0;
                string[] ids = args.Key.Split(delim);
                toID = long.Parse(ids[0]);
                fromID = long.Parse(ids[1]);
                tableAdapter.FillByIDs(table, toID, fromID);
            }

            if (table.Count > 0)
            {
                args.Data = table[0].standing;
            }
            else
            {
                args.Data = 0;
            }
        }
 static void Cache_DataUpdateNeeded(object myObject, DataUpdateNeededArgs<long, string> args)
 {
     try
     {
         string name = "";
         lock (namesTableAdapter)
         {
             namesTableAdapter.GetName(args.Key, ref name);
         }
         if (name == null || name.Equals(""))
         {
             name = EveAPI.GetName(args.Key);
             if (!name.Equals("")) { AddName(args.Key, name); }
         }
         args.Data = name;
     }
     catch (Exception)
     {
         args.Data = null;
     }
 }
        /// <summary>
        /// Fired when the cache needs data from the database.
        /// </summary>
        /// <param name="myObject"></param>
        /// <param name="args"></param>
        static void Cache_DataUpdateNeeded(object myObject, DataUpdateNeededArgs<string, APICharacter> args)
        {
            char[] delim = {'|'};
            string[] keyData = args.Key.Split(delim);

            EVEAccount account = EveAccounts.GetAccount(int.Parse(keyData[0]));

            EMMADataSet.APICharactersRow rowData = LoadCharFromDB(long.Parse(keyData[2]));
            if (rowData != null)
            {
                args.Data = new APICharacter(long.Parse(keyData[0]), keyData[1], account.Type, rowData);
            }
            else
            {
                args.Data = null;
            }
        }
 /// <summary>
 /// Fired when the cache needs data from the database.
 /// </summary>
 /// <param name="myObject"></param>
 /// <param name="args"></param>
 static void Cache_DataUpdateNeeded(object myObject, DataUpdateNeededArgs<int, EVEAccount> args)
 {
     EMMADataSet.EveAccountsRow rowData = LoadAccountFromDB(args.Key);
     if (rowData != null)
     {
         args.Data = new EVEAccount(rowData);
     }
     else
     {
         args.Data = null;
     }
 }