HRESULT CProjectDBI::Load ()
{
    HRESULT hr;
    CString strDBIFile;
    CFile file;
    CString strName;
    CFileStatus fileStatus;

    if (m_bLoaded)
    {
        return (S_OK);
    };

    // Currently loading? Recursive call!!!
    if (m_bLoading)
    {
        return (E_FAIL);
    };
    m_bLoading = true;

    strDBIFile.Format ("%s\\%s", (LPCTSTR)m_pContext->GetDebugInfoPath (), PROJECT_DBI_FILE);

    if (!file.Open (strDBIFile, CFile::modeRead | CFile::shareDenyWrite))
    {
        m_bLoading = false;
        return (S_FALSE);
    };

    try
    {
        CXMLArchive ar (&file, CArchive::load);

        try
        {
            ar.Load ();

            if (!ar.MoveDown (DBI_XML_PROJECT))
            {
                Corrupt ();
                throw E_FAIL;
            };
        }
        catch (HRESULT hr)
        {
            try
            {
                ar.Close ();
            }
            catch (HRESULT)
            {
            };

            m_bLoading = false;
            return (hr);
        };

        try
        {
            if (!ar.GetAttribute (DBI_XML_ID, strName))
            {
                Corrupt ();
                throw E_FAIL;
            };
            m_strName = strName;

            hr = LoadPOUs (ar);
            if (FAILED (hr))
            {
                throw hr;
            };
        }
        catch (HRESULT hr)
        {
            try
            {
                ar.MoveUp ();
            }
            catch (HRESULT)
            {
            };

            try
            {
                ar.Close ();
            }
            catch (HRESULT)
            {
            };

            m_bLoading = false;
            return (hr);
        };

        try
        {
            ar.MoveUp ();
        }
        catch (HRESULT hr)
        {
            try
            {
                ar.Close ();
            }
            catch (HRESULT)
            {
            };

            return (hr);
        };

        ar.Close ();
    }
    catch (HRESULT hr)
    {
        return (hr);
    };

    m_bLoaded = true;
    m_bLoading = false;

    if (!CFile::GetStatus (strDBIFile, fileStatus))
    {
        fileStatus.m_mtime = 0;
    }
    else
    {
        m_Timestamp = fileStatus.m_mtime;
    };

    return (S_OK);
}
Exemple #2
0
void Dnode:: NotifyCorrupt(bool bk)	{
	Corrupt(bk);
}