Example #1
0
        public static APIDataType fromDataType(DataType sourceDataType)
        {
            APIDataType result = new APIDataType();

            result.ID    = sourceDataType.ID;
            result.Title = sourceDataType.Title;
            return(result);
        }
 public void SetLastAPIUpdateError(CharOrCorp corc, APIDataType type, string error)
 {
     _apiSettings.SetLastUpdateError(corc, type, error);
 }
 public void SetAPIAutoUpdate(CharOrCorp corc, APIDataType type, bool auto)
 {
     _apiSettings.SetAutoUpdateFlag(corc, type, auto);
     StoreGroupLevelSettings(corc == CharOrCorp.Char ? SettingsStoreType.Char : SettingsStoreType.Corp);
 }
 public string GetLastAPIUpdateError(CharOrCorp corc, APIDataType type)
 {
     return _apiSettings.GetLastUpdateError(corc, type);
 }
 public bool GetAPIAutoUpdate(CharOrCorp corc, APIDataType type)
 {
     GetGroupLevelCharSettings();
     return _apiSettings.GetAutoUpdateFlag(corc, type);
 }
        public bool CharHasCorporateAccess(APIDataType type)
        {
            bool retVal = true;
            switch (type)
            {
                case APIDataType.Transactions:
                    retVal = Settings.CorpTransactionsAPIAccess;
                    break;
                case APIDataType.Journal:
                    retVal = Settings.CorpJournalAPIAccess;
                    break;
                case APIDataType.Assets:
                    retVal = Settings.CorpAssetsAPIAccess;
                    break;
                case APIDataType.Orders:
                    retVal = Settings.CorpOrdersAPIAccess;
                    break;
                case APIDataType.IndustryJobs:
                    retVal = Settings.CorpIndustryJobsAPIAccess;
                    break;
                case APIDataType.Unknown:
                    break;
                case APIDataType.Full:
                    retVal = Settings.CorpTransactionsAPIAccess && Settings.CorpJournalAPIAccess &&
                        Settings.CorpAssetsAPIAccess && Settings.CorpOrdersAPIAccess &&
                        Settings.CorpIndustryJobsAPIAccess;
                    break;
                default:
                    break;
            }

            return retVal;
        }
        /// <summary>
        /// Download XML from the Eve API
        /// </summary>
        /// <param name="corc"></param>
        /// <param name="type"></param>
        private void RetrieveAPIXML(CharOrCorp corc, APIDataType type)
        {
            TimeSpan timeBetweenUpdates = UserAccount.Settings.GetAPIUpdatePeriod(type);
            DateTime earliestUpdate = GetLastAPIUpdateTime(corc, type).Add(timeBetweenUpdates);
            DateTime dataDate = DateTime.MinValue;

            short walletID = corc == CharOrCorp.Corp ? (short)1000 : (short)0;
            decimal beforeID = 0;
            bool finishedDownloading = false;
            bool walletExhausted = false;
            bool noData = true;
            bool abort = false;
            string xmlFile = "";
            int rowCount = 200;
            XmlDocument xml = null;

            long currentMaxID = 0;
            if (type == APIDataType.Transactions) { currentMaxID = _apiSettings.GetHighestID(corc, APIDataType.Transactions); }
            if (type == APIDataType.Journal) { currentMaxID = _apiSettings.GetHighestID(corc, APIDataType.Journal); }

            try
            {
                // Make sure we don't download if we've already done so recently.
                if (earliestUpdate.CompareTo(DateTime.UtcNow) > 0)
                {
                    throw new EMMAEveAPIException(ExceptionSeverity.Warning, 1000, "Cannot get " +
                        type.ToString() + " data so soon after the last update. Wait until at least " +
                        earliestUpdate.ToLongTimeString() + " before updating.");
                }

                while (!finishedDownloading)
                {
                    try
                    {
                        // Set parameters that will be passed to the API
                        #region Set parameters
                        StringBuilder parameters = new StringBuilder();
                        parameters.Append("keyID=");
                        parameters.Append(_userID);
                        parameters.Append("&vCode=");
                        parameters.Append(_apiKey);
                        parameters.Append("&characterID=");
                        parameters.Append(_charID);
                        if (type == APIDataType.Journal || type == APIDataType.Transactions)
                        {
                            parameters.Append("&rowCount=");
                            parameters.Append(rowCount);
                            if (walletID != 0)
                            {
                                parameters.Append("&accountKey=");
                                parameters.Append(walletID);
                            }
                            if (beforeID != 0)
                            {
                                parameters.Append("&fromID=");
                                parameters.Append(beforeID);
                            }
                        }
                        if (type == APIDataType.Assets || type == APIDataType.Orders)
                        {
                            parameters.Append("&version=2");
                        }
                        #endregion

                        xml = EveAPI.GetXml(EveAPI.URL_EveApiHTTPS + EveAPI.GetURL(corc, type),
                            parameters.ToString(), ref xmlFile);
                        XmlNodeList tmp = EveAPI.GetResults(xml);
                        if (xmlFile.Length > 0)
                        {
                            lock (_unprocessedXMLFiles) { _unprocessedXMLFiles.Enqueue(xmlFile); }
                            noData = false;
                        }
                        if (type == APIDataType.Journal || type == APIDataType.Transactions)
                        {
                            if (tmp.Count < rowCount) { walletExhausted = true; }
                        }

                        // Set the last update time based upon the 'cached until'
                        // time rather than the actual time the update occured
                        // Note we could modify the API update period timer instead but
                        // that would cause other issues. It's better for the user if
                        // we just do things this way.
                        if (type == APIDataType.Transactions)
                        {
                            // Transactions XML often gives a cache expiry date time that is too soon.
                            // If we try and update again when it says then it will fail so just wait
                            // for the usual 1 hour. (Or whatever the user has it set to)
                            SetLastAPIUpdateTime(corc, type, DateTime.UtcNow);
                        }
                        else
                        {
                            DateTime nextAllowed = EveAPI.GetCachedUntilTime(xml);
                            SetLastAPIUpdateTime(corc, type, nextAllowed.Subtract(
                                UserAccount.Settings.GetAPIUpdatePeriod(type)));
                        }

                        // If we've been successfull in getting data and this is a corporate data request
                        // then make sure we've got access set to true;
                        if (corc == CharOrCorp.Corp)
                        {
                            Settings.SetCorpAPIAccess(type, true);
                        }

                    }
                    catch (EMMAEveAPIException emmaApiEx)
                    {
                        #region API Error Handling
                        if (emmaApiEx.EveCode == 100)
                        {
                            // Error code 100 indicates that a 'beforeRefID' has been passed in when the
                            // api was not expecting it. If we know for sure that we've already called
                            // the api once then have to abandon the data we have got so far.
                            // (No idea why the API does this, it just happens from time to time)
                            if (!noData)
                            {
                                walletExhausted = true;
                                //SetLastAPIUpdateError(corc, type, "Eve API Error 100");
                            }
                            else
                            {
                                throw emmaApiEx;
                            }
                        }
                        else if (emmaApiEx.EveCode == 101 || emmaApiEx.EveCode == 102 ||
                            emmaApiEx.EveCode == 103 || emmaApiEx.EveCode == 116 || emmaApiEx.EveCode == 117)
                        {
                            // Data already retrieved
                            string err = emmaApiEx.EveDescription;

                            // If there is a cachedUntil tag, dont try and get data again until
                            // after it has expired.
                            DateTime nextAllowed = EveAPI.GetCachedUntilTime(xml);
                            SetLastAPIUpdateTime(corc, type, nextAllowed.Subtract(
                                UserAccount.Settings.GetAPIUpdatePeriod(type)));
                            if (noData)
                            {
                                SetLastAPIUpdateError(corc, type,
                                    "The Eve API reports that this data has already been retrieved, no update has occured.");
                            }
                            walletExhausted = true;
                        }
                        else if (emmaApiEx.EveCode == 200)
                        {
                            // Security level not high enough
                            SetLastAPIUpdateError(corc, type,
                                "You must enter your FULL api key to retrieve financial and asset data.\r\n" +
                                "Use the 'manage group' button to correct this.");
                            abort = true;
                        }
                        else if (emmaApiEx.EveCode == 206 || emmaApiEx.EveCode == 208 ||
                            emmaApiEx.EveCode == 209 || emmaApiEx.EveCode == 213)
                        {
                            // Character does not have required corporate role.
                            Settings.SetCorpAPIAccess(type, false);
                            SetAPIAutoUpdate(corc, type, false);
                            SetLastAPIUpdateError(corc, type, emmaApiEx.Message);
                            abort = true;
                        }
                        else
                        {
                            throw emmaApiEx;
                        }
                        #endregion
                    }

                    /// By default, we're now done..
                    finishedDownloading = true;

                    // However, for some update types, we'll want to go round a few more times
                    #region Determine if we should access API again with different variables
                    if (!abort)
                    {
                        if (type == APIDataType.Journal || type == APIDataType.Transactions)
                        {
                            //XmlNode lastRowNode = xml.SelectSingleNode(@"/eveapi/result/rowset/row[last()]");
                            XmlNodeList results = xml.SelectNodes(@"/eveapi/result/rowset/row");
                            long minID = long.MaxValue;
                            if (results != null)
                            {
                                foreach (XmlNode node in results)
                                {
                                    string idAttribName = "";
                                    if (type == APIDataType.Journal) { idAttribName = "@refID"; }
                                    if (type == APIDataType.Transactions) { idAttribName = "@transactionID"; }
                                    long val = long.Parse(node.SelectSingleNode(idAttribName).Value);
                                    if (val < minID) { minID = val; }
                                }
                            }

                            if (minID != long.MaxValue && minID > currentMaxID)
                            {
                                beforeID = minID;
                            }
                            else { walletExhausted = true; }
                            if (!walletExhausted) { finishedDownloading = false; }
                            if (walletExhausted && corc == CharOrCorp.Corp && walletID < 1006)
                            {
                                walletID++;
                                beforeID = 0;
                                finishedDownloading = false;
                            }
                        }
                    }
                    #endregion
                }

            }
            catch (Exception ex)
            {
                EMMAException emmaEx = ex as EMMAException;
                if (emmaEx == null)
                {
                    // If we've caught a standard exception rather than an EMMA one then log it be creating a
                    // new exception.
                    // Note that we don't need to actually throw it..
                    emmaEx = new EMMAException(ExceptionSeverity.Error,
                        "Error when downloading " + type.ToString() + " from Eve API", ex);
                }

                SetLastAPIUpdateError(corc, type, ex.Message);
                noData = true;
            }

            // If we have not retrieved any data at all then mark the update as completed.
            if (noData)
            {
                if (UpdateEvent != null)
                {
                    UpdateEvent(this, new APIUpdateEventArgs(type,
                        corc == CharOrCorp.Char ? _charID : _corpID,
                        APIUpdateEventType.UpdateCompleted));
                }
            }
        }
 public bool GetCorpAPIAccess(APIDataType type)
 {
     bool retVal =false;
     switch (type)
     {
         case APIDataType.Transactions:
             retVal = CorpTransactionsAPIAccess;
             break;
         case APIDataType.Journal:
             retVal = CorpJournalAPIAccess;
             break;
         case APIDataType.Assets:
             retVal = CorpAssetsAPIAccess;
             break;
         case APIDataType.Orders:
             retVal = CorpOrdersAPIAccess;
             break;
         case APIDataType.IndustryJobs:
             retVal = CorpIndustryJobsAPIAccess;
             break;
         case APIDataType.Unknown:
             break;
         case APIDataType.Full:
             break;
         default:
             break;
     }
     return retVal;
 }
 public void SetLastUpdateTime(CharOrCorp corc, APIDataType type, DateTime time)
 {
     switch (corc)
     {
         case CharOrCorp.Char:
             switch (type)
             {
                 case APIDataType.Transactions:
                     _lastCharTransUpdate = time;
                     break;
                 case APIDataType.Journal:
                     _lastCharJournalUpdate = time;
                     break;
                 case APIDataType.Assets:
                     _lastCharAssetsUpdate = time;
                     break;
                 case APIDataType.Orders:
                     _lastCharOrdersUpdate = time;
                     break;
                 case APIDataType.IndustryJobs:
                     _settings.LastCharIndustryJobsUpdate = time;
                     break;
                 default:
                     break;
             }
             break;
         case CharOrCorp.Corp:
             switch (type)
             {
                 case APIDataType.Transactions:
                     _lastCorpTransUpdate = time;
                     break;
                 case APIDataType.Journal:
                     _lastCorpJournalUpdate = time;
                     break;
                 case APIDataType.Assets:
                     _lastCorpAssetsUpdate = time;
                     break;
                 case APIDataType.Orders:
                     _lastCorpOrdersUpdate = time;
                     break;
                 case APIDataType.IndustryJobs:
                     _settings.LastCorpIndustryJobsUpdate = time;
                     break;
                 default:
                     break;
             }
             break;
         default:
             break;
     }
 }
 public void SetLastUpdateError(CharOrCorp corc, APIDataType type, string error)
 {
     switch (corc)
     {
         case CharOrCorp.Char:
             switch (type)
             {
                 case APIDataType.Transactions:
                     _lastCharTransUpdateError = error;
                     break;
                 case APIDataType.Journal:
                     _lastCharJournalUpdateError = error;
                     break;
                 case APIDataType.Assets:
                     _lastCharAssetsUpdateError = error;
                     break;
                 case APIDataType.Orders:
                     _lastCharOrdersUpdateError = error;
                     break;
                 case APIDataType.IndustryJobs:
                     _lastCharIndustryJobsUpdateError = error;
                     break;
                 default:
                     break;
             }
             break;
         case CharOrCorp.Corp:
             switch (type)
             {
                 case APIDataType.Transactions:
                     _lastCorpTransUpdateError = error;
                     break;
                 case APIDataType.Journal:
                     _lastCorpJournalUpdateError = error;
                     break;
                 case APIDataType.Assets:
                     _lastCorpAssetsUpdateError = error;
                     break;
                 case APIDataType.Orders:
                     _lastCorpOrdersUpdateError = error;
                     break;
                 case APIDataType.IndustryJobs:
                     _lastCorpIndustryJobsUpdateError = error;
                     break;
                 default:
                     break;
             }
             break;
         default:
             break;
     }
 }
 public void SetHighestID(CharOrCorp corc, APIDataType type, long id)
 {
     switch (corc)
     {
         case CharOrCorp.Char:
             switch (type)
             {
                 case APIDataType.Transactions:
                     _highestCharTransID = id;
                     break;
                 case APIDataType.Journal:
                     _highestCharJournalID = id;
                     break;
                 default:
                     break;
             }
             break;
         case CharOrCorp.Corp:
             switch (type)
             {
                 case APIDataType.Transactions:
                     _highestCorpTransID = id;
                     break;
                 case APIDataType.Journal:
                     _highestCorpJournalID = id;
                     break;
                 default:
                     break;
             }
             break;
         default:
             break;
     }
 }
 public void SetAutoUpdateFlag(CharOrCorp corc, APIDataType type, bool auto)
 {
     switch (corc)
     {
         case CharOrCorp.Char:
             switch (type)
             {
                 case APIDataType.Transactions:
                     _autoUpdateCharTrans = auto;
                     break;
                 case APIDataType.Journal:
                     _autoUpdateCharJournal = auto;
                     break;
                 case APIDataType.Assets:
                     _autoUpdateCharAssets = auto;
                     break;
                 case APIDataType.Orders:
                     _autoUpdateCharOrders = auto;
                     break;
                 case APIDataType.IndustryJobs:
                     _autoUpdateCharIndustryJobs = auto;
                     break;
                 default:
                     break;
             }
             break;
         case CharOrCorp.Corp:
             switch (type)
             {
                 case APIDataType.Transactions:
                     _autoUpdateCorpTrans = auto;
                     break;
                 case APIDataType.Journal:
                     _autoUpdateCorpJournal = auto;
                     break;
                 case APIDataType.Assets:
                     _autoUpdateCorpAssets = auto;
                     break;
                 case APIDataType.Orders:
                     _autoUpdateCorpOrders = auto;
                     break;
                 case APIDataType.IndustryJobs:
                     _autoUpdateCorpIndustryJobs = auto;
                     break;
                 default:
                     break;
             }
             break;
         default:
             break;
     }
 }
        public DateTime GetLastUpdateTime(CharOrCorp corc, APIDataType type)
        {
            DateTime retVal = SqlDateTime.MinValue.Value;
            switch (corc)
            {
                case CharOrCorp.Char:
                    switch (type)
                    {
                        case APIDataType.Transactions:
                            retVal = _lastCharTransUpdate;
                            break;
                        case APIDataType.Journal:
                            retVal = _lastCharJournalUpdate;
                            break;
                        case APIDataType.Assets:
                            retVal = _lastCharAssetsUpdate;
                            break;
                        case APIDataType.Orders:
                            retVal = _lastCharOrdersUpdate;
                            break;
                        case APIDataType.IndustryJobs:
                            retVal = _settings.LastCharIndustryJobsUpdate;
                            break;
                        default:
                            break;
                    }
                    break;
                case CharOrCorp.Corp:
                    switch (type)
                    {
                        case APIDataType.Transactions:
                            retVal = _lastCorpTransUpdate;
                            break;
                        case APIDataType.Journal:
                            retVal = _lastCorpJournalUpdate;
                            break;
                        case APIDataType.Assets:
                            retVal = _lastCorpAssetsUpdate;
                            break;
                        case APIDataType.Orders:
                            retVal = _lastCorpOrdersUpdate;
                            break;
                        case APIDataType.IndustryJobs:
                            retVal = _settings.LastCorpIndustryJobsUpdate;
                            break;
                        default:
                            break;
                    }
                    break;
                default:
                    break;
            }

            return retVal;
        }
        public string GetLastUpdateError(CharOrCorp corc, APIDataType type)
        {
            string retVal = "";
            switch (corc)
            {
                case CharOrCorp.Char:
                    switch (type)
                    {
                        case APIDataType.Transactions:
                            retVal = _lastCharTransUpdateError;
                            break;
                        case APIDataType.Journal:
                            retVal = _lastCharJournalUpdateError;
                            break;
                        case APIDataType.Assets:
                            retVal = _lastCharAssetsUpdateError;
                            break;
                        case APIDataType.Orders:
                            retVal = _lastCharOrdersUpdateError;
                            break;
                        case APIDataType.IndustryJobs:
                            retVal = _lastCharIndustryJobsUpdateError;
                            break;
                        default:
                            break;
                    }
                    break;
                case CharOrCorp.Corp:
                    switch (type)
                    {
                        case APIDataType.Transactions:
                            retVal = _lastCorpTransUpdateError;
                            break;
                        case APIDataType.Journal:
                            retVal = _lastCorpJournalUpdateError;
                            break;
                        case APIDataType.Assets:
                            retVal = _lastCorpAssetsUpdateError;
                            break;
                        case APIDataType.Orders:
                            retVal = _lastCorpOrdersUpdateError;
                            break;
                        case APIDataType.IndustryJobs:
                            retVal = _lastCorpIndustryJobsUpdateError;
                            break;
                        default:
                            break;
                    }
                    break;
                default:
                    break;
            }

            return retVal;
        }
        public long GetHighestID(CharOrCorp corc, APIDataType type)
        {
            long retVal = 0;
            switch (corc)
            {
                case CharOrCorp.Char:
                    switch (type)
                    {
                        case APIDataType.Transactions:
                            retVal = _highestCharTransID;
                            break;
                        case APIDataType.Journal:
                            retVal = _highestCharJournalID;
                            break;
                        default:
                            break;
                    }
                    break;
                case CharOrCorp.Corp:
                    switch (type)
                    {
                        case APIDataType.Transactions:
                            retVal = _highestCorpTransID;
                            break;
                        case APIDataType.Journal:
                            retVal = _highestCorpJournalID;
                            break;
                        default:
                            break;
                    }
                    break;
                default:
                    break;
            }

            return retVal;
        }
Example #16
0
 public static string GetURL(CharOrCorp corc, APIDataType type)
 {
     string retVal = "";
     switch (type)
     {
         case APIDataType.Transactions:
             retVal = corc == CharOrCorp.Char ? URL_TransApi : URL_TransCorpApi;
             break;
         case APIDataType.Journal:
             retVal = corc == CharOrCorp.Char ? URL_JournApi : URL_JournCorpApi;
             break;
         case APIDataType.Assets:
             retVal = corc == CharOrCorp.Char ? URL_AssetApi : URL_AssetCorpApi;
             break;
         case APIDataType.Orders:
             retVal = corc == CharOrCorp.Char ? URL_CharOrdersApi : URL_CorpOrdersApi;
             break;
         case APIDataType.IndustryJobs:
             retVal = corc == CharOrCorp.Char ? URL_IndustryApi : URL_IndustryCorpApi;
             break;
         case APIDataType.Unknown:
             break;
         case APIDataType.Full:
             break;
         default:
             break;
     }
     return retVal;
 }
        public bool GetAutoUpdateFlag(CharOrCorp corc, APIDataType type)
        {
            bool retVal = false;
            switch (corc)
            {
                case CharOrCorp.Char:
                    switch (type)
                    {
                        case APIDataType.Transactions:
                            retVal = _autoUpdateCharTrans;
                            break;
                        case APIDataType.Journal:
                            retVal = _autoUpdateCharJournal;
                            break;
                        case APIDataType.Assets:
                            retVal = _autoUpdateCharAssets;
                            break;
                        case APIDataType.Orders:
                            retVal = _autoUpdateCharOrders;
                            break;
                        case APIDataType.IndustryJobs:
                            retVal = _autoUpdateCharIndustryJobs;
                            break;
                        default:
                            break;
                    }
                    break;
                case CharOrCorp.Corp:
                    switch (type)
                    {
                        case APIDataType.Transactions:
                            retVal = _autoUpdateCorpTrans;
                            break;
                        case APIDataType.Journal:
                            retVal = _autoUpdateCorpJournal;
                            break;
                        case APIDataType.Assets:
                            retVal = _autoUpdateCorpAssets;
                            break;
                        case APIDataType.Orders:
                            retVal = _autoUpdateCorpOrders;
                            break;
                        case APIDataType.IndustryJobs:
                            retVal = _autoUpdateCorpIndustryJobs;
                            break;
                        default:
                            break;
                    }
                    break;
                default:
                    break;
            }

            return retVal;
        }
 public void SetCorpAPIAccess(APIDataType type, bool value)
 {
     switch (type)
     {
         case APIDataType.Transactions:
             CorpTransactionsAPIAccess = value;
             break;
         case APIDataType.Journal:
             CorpJournalAPIAccess = value;
             break;
         case APIDataType.Assets:
             CorpAssetsAPIAccess = value;
             break;
         case APIDataType.Orders:
             CorpOrdersAPIAccess = value;
             break;
         case APIDataType.IndustryJobs:
             CorpIndustryJobsAPIAccess = value;
             break;
         case APIDataType.Unknown:
             break;
         case APIDataType.Full:
             break;
         default:
             break;
     }
 }
 public List<CharCorpOption> GetCharCorpOptions(APIDataType type)
 {
     return GetCharCorpOptions(type, false);
 }
 public APIUpdateInfo(CharOrCorp corc, APIDataType type)
 {
     Corc = corc;
     Type = type;
 }
        public List<CharCorpOption> GetCharCorpOptions(APIDataType type, bool charsOnly)
        {
            List<CharCorpOption> options = new List<CharCorpOption>();

            foreach (EVEAccount account in _accounts)
            {
                foreach (APICharacter apichar in account.Chars)
                {
                    if (account.Type == CharOrCorp.Char && apichar.CharIncWithRptGroup)
                    {
                        CharCorpOption opt = new CharCorpOption(apichar, false);
                        options.Add(opt);
                    }
                    if (account.Type == CharOrCorp.Corp && !charsOnly && apichar.CorpIncWithRptGroup && apichar.CharHasCorporateAccess(type))
                    {
                        CharCorpOption opt = new CharCorpOption(apichar, true);
                        options.Add(opt);
                    }
                }
            }

            return options;
        }
 public void DownloadXMLFromAPI(CharOrCorp corc, APIDataType type)
 {
     switch (type)
     {
         case APIDataType.Transactions:
             SetLastAPIUpdateError(corc, type, "QUEUED");
             ThreadPool.QueueUserWorkItem(RetrieveAPIXML, new APIUpdateInfo(corc, type));
             break;
         case APIDataType.Journal:
             SetLastAPIUpdateError(corc, type, "QUEUED");
             ThreadPool.QueueUserWorkItem(RetrieveAPIXML, new APIUpdateInfo(corc, type));
             break;
         case APIDataType.Assets:
             SetLastAPIUpdateError(corc, type, "QUEUED");
             ThreadPool.QueueUserWorkItem(RetrieveAPIXML, new APIUpdateInfo(corc, type));
             break;
         case APIDataType.Orders:
             SetLastAPIUpdateError(corc, type, "QUEUED");
             ThreadPool.QueueUserWorkItem(RetrieveAPIXML, new APIUpdateInfo(corc, type));
             break;
         case APIDataType.IndustryJobs:
             SetLastAPIUpdateError(corc, type, "QUEUED");
             ThreadPool.QueueUserWorkItem(RetrieveAPIXML, new APIUpdateInfo(corc, type));
             break;
         case APIDataType.Unknown:
             break;
         case APIDataType.Full:
             SetLastAPIUpdateError(corc, APIDataType.Transactions, "QUEUED");
             SetLastAPIUpdateError(corc, APIDataType.Orders, "QUEUED");
             SetLastAPIUpdateError(corc, APIDataType.IndustryJobs, "QUEUED");
             SetLastAPIUpdateError(corc, APIDataType.Journal, "QUEUED");
             SetLastAPIUpdateError(corc, APIDataType.Assets, "QUEUED");
             ThreadPool.QueueUserWorkItem(RetrieveAPIXML, new APIUpdateInfo(corc, APIDataType.Transactions));
             ThreadPool.QueueUserWorkItem(RetrieveAPIXML, new APIUpdateInfo(corc, APIDataType.Orders));
             ThreadPool.QueueUserWorkItem(RetrieveAPIXML, new APIUpdateInfo(corc, APIDataType.IndustryJobs));
             ThreadPool.QueueUserWorkItem(RetrieveAPIXML, new APIUpdateInfo(corc, APIDataType.Journal));
             ThreadPool.QueueUserWorkItem(RetrieveAPIXML, new APIUpdateInfo(corc, APIDataType.Assets));
             break;
         default:
             break;
     }
 }
 public List<FinanceAccessParams> GetFinanceAccessParams(APIDataType type)
 {
     List<FinanceAccessParams> accessList = new List<FinanceAccessParams>();
     foreach (EVEAccount account in _accounts)
     {
         foreach (APICharacter character in account.Chars)
         {
             if (character.CharIncWithRptGroup)
             {
                 accessList.Add(new FinanceAccessParams(character.CharID));
             }
             if (character.CorpIncWithRptGroup && character.CharHasCorporateAccess(type))
             {
                 accessList.Add(new FinanceAccessParams(character.CorpID));
             }
         }
     }
     return accessList;
 }
 public long GetHighestID(CharOrCorp corc, APIDataType type)
 {
     return _apiSettings.GetHighestID(corc, type);
 }
 public APIUpdateEventArgs(APIDataType updateType, long ownerID, APIUpdateEventType eventType)
 {
     _updateType = updateType;
     _id = ownerID;
     _eventType = eventType;
 }
 public DateTime GetLastAPIUpdateTime(CharOrCorp corc, APIDataType type)
 {
     return _apiSettings.GetLastUpdateTime(corc, type);
 }
        private void UpdateLabel(Label label, Label otherLabel, CharOrCorp corc, APIDataType dataType, TimeSpan minTimeBetweenUpdates)
        {
            DateTime lastDataUpdate = _character.GetLastAPIUpdateTime(corc, dataType);
            TimeSpan time = DateTime.UtcNow.Subtract(lastDataUpdate);
            string errorText = _character.GetLastAPIUpdateError(corc, dataType);
            bool doUpdate = false;
            bool checkForAccess = false;

            // No need for this.
            // The 'update completed' event is fired by the APICharacter object and handled by the
            // UpdateStatus window anyway.
            //if (label.Text.ToUpper().Equals("UPDATING") && !errorText.ToUpper().Equals("UPDATING")
            //    && !errorText.ToUpper().Equals("BLOCKED") && !errorText.ToUpper().Equals("AWAITING ACKNOWLEDGEMENT"))
            //{
            //    // If the label currently says 'updating' but the error text no longer says 'updating' (or blocked)
            //    // then fire the update completed event.
            //    if (UpdateEvent != null)
            //    {
            //        UpdateEvent(this, new APIUpdateEventArgs(dataType, corc ==
            //            CharOrCorp.Char ? _character.CharID : _character.CorpID,
            //            APIUpdateEventType.UpdateCompleted));
            //    }
            //}

            if (errorText.Equals("") || (_type == CharOrCorp.Corp && (
                errorText.ToUpper().Contains("CHARACTER MUST BE A") ||
                errorText.ToUpper().Contains("CHARACTER MUST HAVE"))))
            {
                if (_type == CharOrCorp.Corp && !_character.CharHasCorporateAccess(dataType))
                {
                    label.Text = "No Access";
                    label.BackColor = _errorColour;
                    otherLabel.BackColor = _errorColour;
                    if (chkUpdate.Checked) { checkForAccess = true; }
                    //switch (dataType)
                    //{
                    //    case APIDataType.Transactions:
                    //        if (chkAutoTrans.Checked) { checkForAccess = true; chkAutoTrans.Checked = false; }
                    //        break;
                    //    case APIDataType.Journal:
                    //        if (chkAutoJournal.Checked) { checkForAccess = true; chkAutoJournal.Checked = false; }
                    //        break;
                    //    case APIDataType.Assets:
                    //        if (chkAutoAssets.Checked) { checkForAccess = true; chkAutoAssets.Checked = false; }
                    //        break;
                    //    case APIDataType.Orders:
                    //        if (chkAutoOrders.Checked) { checkForAccess = true; chkAutoOrders.Checked = false; }
                    //        break;
                    //    default:
                    //        break;
                    //}
                }
                else if (minTimeBetweenUpdates.CompareTo(time) > 0)
                {
                    time = minTimeBetweenUpdates.Subtract(time);
                    // Waiting for next update window
                    label.Text = time.Hours.ToString().PadLeft(2, '0') + ":" +
                        time.Minutes.ToString().PadLeft(2, '0') + ":" +
                        time.Seconds.ToString().PadLeft(2, '0');
                    label.BackColor = _upToDateColour;
                    otherLabel.BackColor = _upToDateColour;
                }
                else
                {
                    // Update overdue
                    label.Text = "Overdue";
                    label.BackColor = _overdueUpdateColour;
                    otherLabel.BackColor = _overdueUpdateColour;
                    doUpdate = true;
                }
            }
            else if (errorText.ToUpper().Equals("UPDATING"))
            {
                if (label.Text.Equals(BLOCKEDTEXT))
                {
                    // If the update was previously blocked then need to let the rest of EMMA
                    // know that the update is now restarted.
                    if (UpdateEvent != null)
                    {
                        UpdateEvent(this, new APIUpdateEventArgs(dataType, corc ==
                            CharOrCorp.Char ? _character.CharID : _character.CorpID,
                            APIUpdateEventType.UpdateStarted));
                    }
                }
                // The update is in progress.
                label.Text = "Updating";
                label.BackColor = _updatingColour;
                otherLabel.BackColor = _updatingColour;
            }
            else if (errorText.ToUpper().Equals("DOWNLOADING"))
            {
                // The update is in progress.
                label.Text = "Downloading";
                label.BackColor = _updatingColour;
                otherLabel.BackColor = _updatingColour;
            }
            else if (errorText.ToUpper().Equals("QUEUED"))
            {
                // The thread performing the update has been started but is currently waiting
                // for some other update to complete before it can proceed.
                // No transaction, orders or assets update can be running at the same time for a particular
                // character or corp.
                // No journal update can be running at the same time for ANY character or corp.
                label.Text = "Queued";
                label.BackColor = _updatingColour;
                otherLabel.BackColor = _updatingColour;
            }
            else if (errorText.ToUpper().Equals("BLOCKED"))
            {
                // An assets update has been blocked because the most recent transaction and orders
                // updates are not within the timeframe specified.
                // Ask the user if they want to reconfigure this to always allow asset updates.
                if (!label.Text.Equals(BLOCKEDTEXT))
                {
                    label.Text = BLOCKEDTEXT;
                    label.BackColor = _updatingColour;

                    otherLabel.BackColor = _updatingColour;
                    // Make sure we let the rest of EMMA know that the update has stopped.
                    // Otherwise, the user will be unable to use reports, exit, etc while
                    // waiting for it to unblock.
                    if (UpdateEvent != null)
                    {
                        UpdateEvent(this, new APIUpdateEventArgs(dataType, corc ==
                            CharOrCorp.Char ? _character.CharID : _character.CorpID,
                            APIUpdateEventType.UpdateCompleted));
                    }
                    DialogResult result = MessageBox.Show("An assets update for " + (corc == CharOrCorp.Char ?
                        _character.CharName : _character.CorpName) + " has been blocked because transaction " +
                        " & orders updates have not occured within the last " +
                        UserAccount.Settings.AssetsUpdateMaxMinutes + " minutes.\r\n" +
                        "The assets update is only allowed to run when the number of minutes since transactions & " +
                        "orders updates is less than a configured number. This setting can be changed in " +
                        "Settings -> API Update Settings.\r\n" +
                        "Do you wish to set this to zero now? (i.e. always allow assets updates regardless of " +
                        "the last time a transaction/orders update occured)", "Question",
                        MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                    if (result == DialogResult.Yes)
                    {
                        UserAccount.Settings.AssetsUpdateMaxMinutes = 0;
                    }
                }
            }
            else if (errorText.ToUpper().Equals("AWAITING ACKNOWLEDGEMENT"))
            {
                if (!label.Text.Equals(WAITINGTEXT))
                {
                    label.Text = WAITINGTEXT;
                    label.BackColor = _updatingColour;
                    otherLabel.BackColor = _updatingColour;
                }
            }
            else
            {
                // The last update caused an error of some sort.

                if (minTimeBetweenUpdates.CompareTo(time) > 0)
                {
                    time = minTimeBetweenUpdates.Subtract(time);
                    // Waiting for next update window
                    label.Text = "Error " + time.Hours.ToString().PadLeft(2, '0') + ":" +
                        time.Minutes.ToString().PadLeft(2, '0') + ":" +
                        time.Seconds.ToString().PadLeft(2, '0');
                    label.BackColor = _errorColour;
                    LabelMetaData metaData = (LabelMetaData)otherLabel.Tag;
                    metaData.TimerType = APIUpdateTimerType.Normal;
                    otherLabel.BackColor = _errorColour;
                }
                else
                {
                    LabelMetaData metaData = (LabelMetaData)otherLabel.Tag;
                    if (metaData.TimerType == APIUpdateTimerType.Normal)
                    {
                        // Update overdue
                        label.Text = "Overdue";
                        label.BackColor = _overdueUpdateColour;
                        otherLabel.BackColor = _overdueUpdateColour;
                        doUpdate = true;
                    }
                    else
                    {
                        // If we didn't even get as far as setting the update time when
                        // requesting data from the API last time then just use a one hour
                        // timer to make sure we don't request updates every few seconds
                        // after an error occurs.
                        metaData.TimerType = APIUpdateTimerType.Error;
                        DateTime lastAttempt = _lastUpdateAttempt[dataType];
                        TimeSpan timeSinceLastAttempt = DateTime.UtcNow.Subtract(lastAttempt);
                        if (timeSinceLastAttempt.TotalMinutes > 60)
                        {
                            // Update overdue
                            label.Text = "Overdue";
                            label.BackColor = _overdueUpdateColour;
                            otherLabel.BackColor = _overdueUpdateColour;
                            doUpdate = true;
                        }
                        else
                        {
                            // Error on the last update
                            time = new TimeSpan(0, 61, 0);
                            time = time.Subtract(timeSinceLastAttempt);
                            label.Text = "Error " + time.Hours.ToString().PadLeft(2, '0') + ":" +
                                    time.Minutes.ToString().PadLeft(2, '0') + ":" +
                                    time.Seconds.ToString().PadLeft(2, '0'); ;
                            label.BackColor = _errorColour;
                            otherLabel.BackColor = _errorColour;
                        }
                    }
                }
            }

            if (checkForAccess || (doUpdate && _character.GetAPIAutoUpdate(corc, dataType)))
            {
                // If we're updating assets and order or transaction updates are pending then do those first.
                if (dataType == APIDataType.Assets &&
                    ((_character.GetAPIAutoUpdate(corc, APIDataType.Orders) &&
                    (lblOrdersStatus.Text.Equals("Overdue") || lblOrdersStatus.Text.Equals("Queued"))) ||
                    (_character.GetAPIAutoUpdate(corc, APIDataType.Transactions) &&
                    (lblTransStatus.Text.Equals("Overdue") || lblTransStatus.Text.Equals("Queued")))))
                {
                }
                else
                {
                    // If we're auto updating then kick it off.
                    LabelMetaData metaData = (LabelMetaData)otherLabel.Tag;
                    metaData.TimerType = APIUpdateTimerType.Normal;
                    if (UpdateEvent != null)
                    {
                        UpdateEvent(this, new APIUpdateEventArgs(dataType, corc ==
                            CharOrCorp.Char ? _character.CharID : _character.CorpID,
                            APIUpdateEventType.UpdateStarted));
                    }
                    if (_lastUpdateAttempt.ContainsKey(dataType))
                    {
                        _lastUpdateAttempt.Remove(dataType);
                    }
                    _lastUpdateAttempt.Add(dataType, DateTime.UtcNow);
                    _character.DownloadXMLFromAPI(corc, dataType);
                    //if (corc == CharOrCorp.Corp && dataType == APIDataType.Orders)
                    //{
                    //    // If we're dealing with corporate orders then we need to grab corporate orders for
                    //    // all characters in this report group that are part of the corp.
                    //    // This is because orders will only be returned that were actually created by
                    //    // the character we are retrieving data for.
                    //    foreach (EVEAccount account in UserAccount.CurrentGroup.Accounts)
                    //    {
                    //        foreach (APICharacter character in account.Chars)
                    //        {
                    //            if (character.CorpID == _character.CorpID && character.CharID != _character.CharID)
                    //            {
                    //                if (character.CharHasCorporateAccess(APIDataType.Orders))
                    //                {
                    //                    character.UpdateDataFromAPI(corc, dataType);
                    //                }
                    //            }
                    //        }
                    //    }
                    //}
                }
            }

            // Make sure the state of the auto update checkboxes reflects the true values.
            // This only needs to be done for corps because the only way the auto-update
            // setting can change without user intervention is if a char does not have corp
            // data access.
            if (corc == CharOrCorp.Corp)
            {
                switch (dataType)
                {
                    case APIDataType.Transactions:
                        chkAutoTrans.Checked = _character.GetAPIAutoUpdate(corc, dataType);
                        break;
                    case APIDataType.Journal:
                        chkAutoJournal.Checked = _character.GetAPIAutoUpdate(corc, dataType);
                        break;
                    case APIDataType.Assets:
                        chkAutoAssets.Checked = _character.GetAPIAutoUpdate(corc, dataType);
                        break;
                    case APIDataType.Orders:
                        chkAutoOrders.Checked = _character.GetAPIAutoUpdate(corc, dataType);
                        break;
                    case APIDataType.IndustryJobs:
                        chkAutoIndustryJobs.Checked = _character.GetAPIAutoUpdate(corc, dataType);
                        break;
                    default:
                        break;
                }
                SetOverallUpdateState();
            }
        }
 public void SetHighestID(CharOrCorp corc, APIDataType type, long id)
 {
     _apiSettings.SetHighestID(corc, type, id);
 }
 public LabelMetaData(APIDataType type)
 {
     _type = type;
     _timerType = APIUpdateTimerType.Normal;
 }
 public void SetLastAPIUpdateTime(CharOrCorp corc, APIDataType type, DateTime time)
 {
     _apiSettings.SetLastUpdateTime(corc, type, time);
 }
 public ReportType(IReport report, string description, RptParamsBase parameterForm,
     bool needFinanceAccessParams, bool needAssetAccessParams, APIDataType accessType)
 {
     _report = report;
     _name = report.GetTitle();
     _description = description;
     _parameterForm = parameterForm;
     _needFinanceAccessParams = needFinanceAccessParams;
     _needAssetAccessParams = needAssetAccessParams;
     _accessType = accessType;
 }