⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 form_multiload.cpp

📁 多路下载工具源代码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
}



//---------------------------------------------------------------------------
void __fastcall TfrmMultiLoad::RedrawLVList( int idx, DL_HANDLE_T *p_dl_handle )
{
    unsigned short rom_count;
   // DL_HANDLE_T *p_dl_handle = MainForm->Get_DlHandle(idx);

    TListItem	*pListItem;
    m_lv[idx]->Items->Clear();
    DN_PARAM_S* p_dn_param = MainForm->Get_DNParameter();
    if( OPERATION_NFB == p_dn_param->eOperation )
    {
        BL_INFO	bl_info;

        pListItem = m_lv[idx]->Items->Add();
        pListItem->Caption = "BootLoader";
      //  if(!BL_GetInfo(p_dn_param->bl_handle, &bl_info))
        if( ! DL_BL_GetInfo( *p_dl_handle, &bl_info ) )
        {
            AnsiString  region_prefix;

            pListItem->Checked = _TRUE==bl_info.m_enable?true:false;
            pListItem->SubItems->Add("");
            pListItem->SubItems->Add( "0x" + IntToHex((int)bl_info.m_start_addr, 8) );
            pListItem->SubItems->Add("");
            pListItem->SubItems->Add(bl_info.m_filepath);
        }
    }


    if(!DL_GetCount(*p_dl_handle, &rom_count))
    {
        ROM_INFO	 rom_info[MAX_LOAD_SECTIONS];
        if(!DL_Rom_GetInfoAll(*p_dl_handle, rom_info, MAX_LOAD_SECTIONS))
        {
            // access
            unsigned int total_file_size = 0;
            for(int i=0; i<rom_count; i++)
            {
                AnsiString  as_reg_prefix;
                TListItem	*p_list_item;

                // access
                total_file_size += rom_info[i].filesize;
              //  if( ! DL_Rom_GetInfo(g_DL_HANDLE, i, &(rom_info[i])) )
                {
                    p_list_item = m_lv[idx]->Items->Add();
                    p_list_item->Caption = rom_info[i].name;
                    if( strcmpi( rom_info[i].name, "ROM" ) == 0 )
                    {
                        m_asROMFileName[idx] = rom_info[i].filepath;
                    }
                    if( strcmpi( rom_info[i].name, "FAT" ) == 0 )
                    {
                        m_iLV_FAT_index[idx] = i;
                        m_asFATFileName[idx] = rom_info[i].filepath;
                    }

                    p_list_item->Checked = rom_info[i].enable;

            	    if( ABSOLUTE_ADDR == rom_info[i].addr_type )
                    {
                        as_reg_prefix = "";
                    }
                    else
                    {
                        as_reg_prefix = "+";
                    }
                    p_list_item->SubItems->Add( as_reg_prefix + "0x" + IntToHex((int)rom_info[i].region_addr, 8) );
                    p_list_item->SubItems->Add( "0x" + IntToHex((int)rom_info[i].begin_addr, 8) );
                    p_list_item->SubItems->Add( "0x" + IntToHex((int)rom_info[i].end_addr, 8) );
                    p_list_item->SubItems->Add(rom_info[i].filepath);
                }
            } // for
            MainForm->Set_TotalFileSize( total_file_size );
        }
    }

}

//---------------------------------------------------------------------------
void __fastcall TfrmMultiLoad::RedrawLVCheckBox( int idx )
{
    unsigned short rom_count;
    int	rom_begin_index;
    DN_PARAM_S* p_dn_param = MainForm->Get_DNParameter();
    DL_HANDLE_T *p_dl_handle = MainForm->Get_DlHandle(idx);

    if( OPERATION_NFB == p_dn_param->eOperation )
    {
       BL_INFO	bl_info;
      // if(!BL_GetInfo(p_dn_param->bl_handle, &bl_info))
       if(!DL_BL_GetInfo(*p_dl_handle, &bl_info))
       {
           m_lv[idx]->Items->Item[0]->Checked = (_TRUE==bl_info.m_enable)?true:false;
       }
       rom_begin_index = 1;
    }
    else
    {
        rom_begin_index = 0;
    }

    if(!DL_GetCount(*p_dl_handle, &rom_count))
    {
        ROM_INFO	rom[MAX_LOAD_SECTIONS];
        int		checked_count=0;
        if(!DL_Rom_GetInfoAll(*p_dl_handle, rom, MAX_LOAD_SECTIONS))
        {
            for(int i=0; i<rom_count; i++)
            {
                if(rom[i].enable)
                {
                    checked_count++;
                }
                m_lv[idx]->Items->Item[rom_begin_index+i]->Checked = (_TRUE==rom[i].enable)?true:false;
            }
        }

        if( OPERATION_NFB == p_dn_param->eOperation )
        {
            if( 0 < checked_count )
            {
                m_lv[idx]->Items->Item[0]->Checked = true;
               // BL_SetEnableAttr(p_dn_param->bl_handle, _TRUE);
                DL_BL_SetEnableAttr(*p_dl_handle,  _TRUE);
            }
        }
    }
}

//---------------------------------------------------------------------------
void __fastcall TfrmMultiLoad::lvChange(TObject *Sender, TListItem *Item,
      TItemChange Change)
{
    if( (Change == ctState) && (Item->Checked != m_slvChanged.bPreCheckBoxState) )
    {
        m_slvChanged.iChangedIndex = Item->Index;
        return;
    }

    m_slvChanged.iChangedIndex = NO_CHANGE;
}
//---------------------------------------------------------------------------
void __fastcall TfrmMultiLoad::lvChanging(TObject *Sender, TListItem *Item,
      TItemChange Change, bool &AllowChange)
{
    m_slvChanged.bPreCheckBoxState = Item->Checked;
    m_slvChanged.iChangedIndex = NO_CHANGE;   
}
//---------------------------------------------------------------------------
void __fastcall TfrmMultiLoad::lvClick(TObject *Sender)
{
    TListView *plv = dynamic_cast<TListView *>(Sender);

    DN_PARAM_S* p_dn_param = MainForm->Get_DNParameter();
    DL_HANDLE_T *p_dl_handle = MainForm->Get_DlHandle((int) plv->Tag);
    
    int idx= plv->Tag;
    if( 0<=m_slvChanged.iChangedIndex && m_slvChanged.iChangedIndex < plv->Items->Count )
    {
        if( OPERATION_NOR == p_dn_param->eOperation )
        {
            DL_Rom_SetEnableAttr( *p_dl_handle, m_slvChanged.iChangedIndex, plv->Items->Item[m_slvChanged.iChangedIndex]->Checked?_TRUE:_FALSE );
        }
        else
        {
            if( 0 == m_slvChanged.iChangedIndex )
            {
               // BL_SetEnableAttr(p_dn_param->bl_handle, plv->Items->Item[0]->Checked?_TRUE:_FALSE);
               DL_BL_SetEnableAttr( *p_dl_handle, plv->Items->Item[0]->Checked?_TRUE:_FALSE);
            }
            else
            {
                DL_Rom_SetEnableAttr(*p_dl_handle, m_slvChanged.iChangedIndex-1, plv->Items->Item[m_slvChanged.iChangedIndex]->Checked?_TRUE:_FALSE);
            }
        }
        RedrawLVCheckBox( (int) plv->Tag );
    }
    else
    {
        lv_oldClick(Sender);
    }

    m_slvChanged.iChangedIndex = NO_CHANGE;
}

//---------------------------------------------------------------------------
void __fastcall TfrmMultiLoad::lv_oldClick(TObject *Sender)
{
    TListView *p_lv = dynamic_cast<TListView *>(Sender);
    int iLD=0;
    int ret;
    int idx=p_lv->Tag;
    DL_HANDLE_T *p_dl_handle = MainForm->Get_DlHandle(idx);

    if( NULL == p_lv->Selected )
       return;

    if( m_asROMPath[idx].Length()>0 )
    {
        m_dlgOpenROM[idx]->InitialDir = m_asROMPath[idx];
        m_dlgOpenROM[idx]->FileName = "";
    }
    else if( 4 <= p_lv->Selected->SubItems->Count )
    {
        iLD = p_lv->Selected->SubItems->Strings[3].LastDelimiter("\\:");
        if ( iLD > 0)
        {
	    m_dlgOpenROM[idx]->InitialDir = p_lv->Selected->SubItems->Strings[3].SubString(1, iLD-1 );
            m_dlgOpenROM[idx]->FileName = "";
        }
    }

    //getIndexFromListView(p_lv);
    if( m_dlgOpenROM[idx]->Execute( ))
    {
        DL_HANDLE_T *p_dl_handle = MainForm->Get_DlHandle(idx);
        unsigned short index;
        DN_PARAM_S* p_dn_param = MainForm->Get_DNParameter();

        if( OPERATION_NFB == p_dn_param->eOperation )
        {
            if( 0 == p_lv->ItemIndex ) // boot loader
            {
               // if(ret=BL_LoadByFilepath(p_dn_param->bl_handle, m_dlgOpenROM[idx]->FileName.c_str()))
                if(ret=DL_BL_LoadByFilepath(*p_dl_handle, m_dlgOpenROM[idx]->FileName.c_str()))
                {
                    if( FTHND_HANDLE_BUSY_NOW == ret )
                    {
                        Application->MessageBox( "Program is busy! Can not update setting right now.", "Fail", MB_OK );
                        return;
                    }
                    else
                    {
                        AnsiString as_msg = " Load boot-loader \"" + m_dlgOpenROM[idx]->FileName + "\" fail!";
                        Application->MessageBox( as_msg.c_str(), "Fail", MB_OK );
                        return;
                    }
                }
            }
            else
            {
                index = p_lv->ItemIndex-1;
            }
        }
        else // NOR
        {
            index = p_lv->ItemIndex;
        }

        if( !  ( OPERATION_NFB == p_dn_param->eOperation && 0 == p_lv->ItemIndex )  )
        {
            if(ret=DL_Rom_LoadByFilepath(*p_dl_handle, index, m_dlgOpenROM[idx]->FileName.c_str()))
        //if(ret=DL_Rom_LoadByFilepath(g_DL_HANDLE, p_lv->Selected->Index, dlgOpenROM->FileName.c_str()))
            {
                if( FTHND_HANDLE_BUSY_NOW == ret )
                {
                    Application->MessageBox( "Program is busy! Can not update setting right now.", "Fail", MB_OK );
                    return;
                }
                else if( FTHND_SCAT_REGION_IS_OVERLAP == ret )
                {
                    AnsiString as_msg = "\"" + m_dlgOpenROM[idx]->FileName + "\" is too large and causes region overlap!";
                    Application->MessageBox( as_msg.c_str(), "Fail", MB_OK );
                    return;
                }
                else
                {
                    AnsiString as_msg = " Load file \"" + m_dlgOpenROM[idx]->FileName + "\" fail!";
                    Application->MessageBox( as_msg.c_str(), "Fail", MB_OK );
                    return;
                }
            }

            iLD = m_dlgOpenROM[idx]->FileName.LastDelimiter("\\:");
            if ( iLD > 0)
            {
                m_asROMPath[idx] = m_dlgOpenROM[idx]->FileName.SubString(1, iLD-1 );
            }

            // check if NFB enabled
	    _BOOL    bNFBEnabled=_FALSE;
	    if( FTHND_OK == DL_IsNFB( *p_dl_handle, &bNFBEnabled) )
            {
	    	// update operation method
	        if( bNFBEnabled && (OPERATION_NFB!=p_dn_param->eOperation) ) {
	            MainForm->rbNFBClick(Sender);
	        }
	        else if( !bNFBEnabled && (OPERATION_NFB==p_dn_param->eOperation) ) {
	            MainForm->rbNORClick(Sender);
	        }
	    }

		// auto load boot loader
           // if(bNFBEnabled)
           // {
           //     BL_AutoLoad(p_dn_param->bl_handle, m_dlgOpenROM[idx]->FileName.c_str(), "*_BOOTLOADER_*.bin");
    	   // }

		// auto load download bin files
            if(MainForm->Get_AutoLoadResByScatFlag())
            {
                if(bNFBEnabled)
                {
                    ret = DL_AutoLoadByScatRegionName(*p_dl_handle, m_dlgOpenROM[idx]->FileName.c_str(), NORMAL_ROM|RESOURCE_BIN|JUMPTABLE_BIN);

                }
                else
                {
                    ret = DL_AutoLoadByScatRegionName(*p_dl_handle, m_dlgOpenROM[idx]->FileName.c_str(), RESOURCE_BIN|JUMPTABLE_BIN);
                }
                if( ret != 0 )
                {
                    Application->MessageBox( "Automatic load by scatter region name fail", "FAIL", MB_OK );
                    return;
                }
            }
        }
    }

    
    RedrawLVList( (int) p_lv->Tag, p_dl_handle );

}



//---------------------------------------------------------------------------
void __fastcall TfrmMultiLoad::btnDelLoadClick(TObject *Sender)
{
    int ret;
    TButton *btn = (TButton*)Sender;
    int idx = btn->Tag;
    DL_HANDLE_LIST_T *p_dl_handle_list = MainForm->Get_DlHandleList();
    DL_HANDLE_T *p_dl_handle = MainForm->Get_DlHandle(idx);
    m_lblScatFileName[idx]->Caption = "";
    m_lv[idx]->Clear();

    ret = DL_CheckHandleInList( *p_dl_handle_list, *p_dl_handle );
    if( ret != 0 )
    {    DL_DeleteHandleFromList( *p_dl_handle_list, *p_dl_handle );
    }
}

//---------------------------------------------------------------------------
bool TfrmMultiLoad::Destroy_DLHandle( DL_HANDLE_T *p_dl_handle )
{
    if( NULL != p_dl_handle )
    {
        int ret;
        ret = DL_Rom_UnloadAll( *p_dl_handle );
        if( ret != 0 )
        {
            Application->MessageBox( "Unload all ROM fail", "FAIL", MB_OK );
            return false;
        }

        ret = DL_Destroy( p_dl_handle );
        if( ret != 0 )
        {
            Application->MessageBox( "Unload all ROM fail", "FAIL", MB_OK );
            return false;
        }

        delete p_dl_handle;
        p_dl_handle = NULL;
    }
    
    return true;
}




⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -