2018-10-08 17:58:12 +08:00
/* fssbuilder.cpp
2015-04-02 16:04:37 +08:00
Copyright ( c ) 2015 , Nikolaj Schlej . All rights reserved .
This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution . The full text of the license may be found at
http : //opensource.org/licenses/bsd-license.php
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN " AS IS " BASIS ,
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND , EITHER EXPRESS OR IMPLIED .
*/
2015-05-15 01:15:19 +08:00
# include "ffsbuilder.h"
2016-10-10 14:05:04 +08:00
# include "descriptor.h"
# include "ffs.h"
# include "peimage.h"
# include "utility.h"
2018-10-08 17:58:12 +08:00
# include "nvram.h"
# include <cstring>
2016-10-10 14:05:04 +08:00
2016-07-07 13:57:45 +08:00
USTATUS FfsBuilder : : erase ( const UModelIndex & index , UByteArray & erased )
2015-05-15 01:15:19 +08:00
{
2015-06-20 02:26:45 +08:00
// Sanity check
if ( ! index . isValid ( ) )
2016-07-07 13:57:45 +08:00
return U_INVALID_PARAMETER ;
2015-06-20 02:26:45 +08:00
2017-02-14 14:39:16 +08:00
// Try to get emptyByte value from item's parsing data
UINT8 emptyByte = 0xFF ;
if ( ! model - > hasEmptyParsingData ( index ) ) {
if ( model - > type ( index ) = = Types : : Volume ) {
VOLUME_PARSING_DATA pdata = * ( VOLUME_PARSING_DATA * ) model - > parsingData ( index ) . constData ( ) ;
emptyByte = pdata . emptyByte ;
}
else if ( model - > type ( index ) = = Types : : File ) {
FILE_PARSING_DATA pdata = * ( FILE_PARSING_DATA * ) model - > parsingData ( index ) . constData ( ) ;
emptyByte = pdata . emptyByte ;
}
}
2018-10-08 17:58:12 +08:00
erased = UByteArray ( model - > header ( index ) . size ( ) + model - > body ( index ) . size ( ) + model - > tail ( index ) . size ( ) , emptyByte ) ;
2017-02-14 14:39:16 +08:00
return U_SUCCESS ;
2015-05-15 01:15:19 +08:00
}
2016-07-07 13:57:45 +08:00
USTATUS FfsBuilder : : build ( const UModelIndex & root , UByteArray & image )
2016-03-01 15:20:44 +08:00
{
// Sanity check
if ( ! root . isValid ( ) )
2016-07-07 13:57:45 +08:00
return U_INVALID_PARAMETER ;
2016-03-01 15:20:44 +08:00
if ( model - > type ( root ) = = Types : : Capsule ) {
return buildCapsule ( root , image ) ;
}
else if ( model - > type ( root ) = = Types : : Image ) {
if ( model - > subtype ( root ) = = Subtypes : : IntelImage ) {
return buildIntelImage ( root , image ) ;
}
2016-03-21 18:34:45 +08:00
else if ( model - > subtype ( root ) = = Subtypes : : UefiImage ) {
2016-03-01 15:20:44 +08:00
return buildRawArea ( root , image ) ;
}
}
2016-07-07 13:57:45 +08:00
return U_NOT_IMPLEMENTED ;
2016-03-01 15:20:44 +08:00
}
2016-07-07 13:57:45 +08:00
USTATUS FfsBuilder : : buildCapsule ( const UModelIndex & index , UByteArray & capsule )
2015-05-15 01:15:19 +08:00
{
// Sanity check
if ( ! index . isValid ( ) )
2016-07-07 13:57:45 +08:00
return U_INVALID_PARAMETER ;
2015-05-15 01:15:19 +08:00
2017-02-14 14:39:16 +08:00
// No action
2015-05-15 01:15:19 +08:00
if ( model - > action ( index ) = = Actions : : NoAction ) {
2015-12-30 06:39:43 +08:00
// Use original item data
2017-02-14 14:39:16 +08:00
capsule = model - > header ( index ) + model - > body ( index ) + model - > tail ( index ) ;
2016-07-07 13:57:45 +08:00
return U_SUCCESS ;
2015-05-15 01:15:19 +08:00
}
// Rebuild or Replace
2021-10-07 23:51:39 +08:00
else if ( model - > action ( index ) = = Actions : : Rebuild
2015-05-15 01:15:19 +08:00
| | model - > action ( index ) = = Actions : : Replace ) {
if ( model - > rowCount ( index ) ) {
2016-07-07 13:57:45 +08:00
// Clear the supplied UByteArray
2015-05-15 01:15:19 +08:00
capsule . clear ( ) ;
2015-12-30 06:39:43 +08:00
// Right now there is only one capsule image element supported
if ( model - > rowCount ( index ) ! = 1 ) {
2017-02-14 14:39:16 +08:00
msg ( usprintf ( " buildCapsule: building of capsules with %d items is not yet supported " , model - > rowCount ( index ) ) , index ) ;
return U_NOT_IMPLEMENTED ;
2015-05-15 01:15:19 +08:00
}
2021-04-04 17:09:23 +08:00
2015-12-30 06:39:43 +08:00
// Build image
2021-04-04 17:09:23 +08:00
UModelIndex imageIndex = index . model ( ) - > index ( 0 , 0 , index ) ;
2016-07-07 13:57:45 +08:00
UByteArray imageData ;
2015-12-30 06:39:43 +08:00
// Check image type
if ( model - > type ( imageIndex ) = = Types : : Image ) {
2016-07-07 13:57:45 +08:00
USTATUS result = U_SUCCESS ;
2016-03-01 15:20:44 +08:00
if ( model - > subtype ( imageIndex ) = = Subtypes : : IntelImage ) {
2015-12-30 06:39:43 +08:00
result = buildIntelImage ( imageIndex , imageData ) ;
2016-03-01 15:20:44 +08:00
}
else if ( model - > subtype ( imageIndex ) = = Subtypes : : UefiImage ) {
2015-12-30 06:39:43 +08:00
result = buildRawArea ( imageIndex , imageData ) ;
2016-03-01 15:20:44 +08:00
}
else {
2017-02-14 14:39:16 +08:00
msg ( UString ( " buildCapsule: unexpected item subtype " ) + itemSubtypeToUString ( model - > type ( imageIndex ) , model - > subtype ( imageIndex ) ) , imageIndex ) ;
return U_UNKNOWN_ITEM_TYPE ;
2016-03-01 15:20:44 +08:00
}
2015-12-30 06:39:43 +08:00
// Check build result
if ( result ) {
2017-02-14 14:39:16 +08:00
msg ( UString ( " buildCapsule: building of " ) + model - > name ( imageIndex ) + UString ( " failed with error " ) + errorCodeToUString ( result ) , imageIndex ) ;
return result ;
2015-12-30 06:39:43 +08:00
}
else
2018-10-08 17:58:12 +08:00
capsule + = imageData ;
2015-12-30 06:39:43 +08:00
}
else {
2017-02-14 14:39:16 +08:00
msg ( UString ( " buildCapsule: unexpected item type " ) + itemTypeToUString ( model - > type ( imageIndex ) ) , imageIndex ) ;
return U_UNKNOWN_ITEM_TYPE ;
2015-12-30 06:39:43 +08:00
}
2017-02-14 14:39:16 +08:00
// Check size of reconstructed capsule body, it must remain the same
2021-04-04 17:09:23 +08:00
UINT32 newSize = ( UINT32 ) capsule . size ( ) ;
UINT32 oldSize = ( UINT32 ) model - > body ( index ) . size ( ) ;
2015-06-20 02:26:45 +08:00
if ( newSize > oldSize ) {
2017-02-14 14:39:16 +08:00
msg ( usprintf ( " buildCapsule: new capsule size %Xh (%u) is bigger than the original %Xh (%u) " , newSize , newSize , oldSize , oldSize ) , index ) ;
return U_INVALID_CAPSULE ;
2015-05-15 01:15:19 +08:00
}
2015-06-20 02:26:45 +08:00
else if ( newSize < oldSize ) {
2017-02-14 14:39:16 +08:00
msg ( usprintf ( " buildCapsule: new capsule size %Xh (%u) is smaller than the original %Xh (%u) " , newSize , newSize , oldSize , oldSize ) , index ) ;
return U_INVALID_CAPSULE ;
2015-05-15 01:15:19 +08:00
}
}
else
capsule = model - > body ( index ) ;
2017-02-14 14:39:16 +08:00
// Build successful, append header and tail
capsule = model - > header ( index ) + capsule + model - > tail ( index ) ;
2016-07-07 13:57:45 +08:00
return U_SUCCESS ;
2015-05-15 01:15:19 +08:00
}
2015-06-20 02:26:45 +08:00
2017-02-14 14:39:16 +08:00
msg ( UString ( " buildCapsule: unexpected action " + actionTypeToUString ( model - > action ( index ) ) ) , index ) ;
2016-07-07 13:57:45 +08:00
return U_NOT_IMPLEMENTED ;
2015-05-15 01:15:19 +08:00
}
2016-07-07 13:57:45 +08:00
USTATUS FfsBuilder : : buildIntelImage ( const UModelIndex & index , UByteArray & intelImage )
2015-05-15 01:15:19 +08:00
{
2016-01-28 07:21:51 +08:00
// Sanity check
2015-06-20 02:26:45 +08:00
if ( ! index . isValid ( ) )
2016-07-07 13:57:45 +08:00
return U_SUCCESS ;
2015-12-30 06:39:43 +08:00
2015-06-20 02:26:45 +08:00
// No action
if ( model - > action ( index ) = = Actions : : NoAction ) {
2017-02-14 14:39:16 +08:00
intelImage = model - > header ( index ) + model - > body ( index ) + model - > tail ( index ) ;
return U_SUCCESS ;
}
// Remove
else if ( model - > action ( index ) = = Actions : : Remove ) {
intelImage . clear ( ) ;
2016-07-07 13:57:45 +08:00
return U_SUCCESS ;
2015-06-20 02:26:45 +08:00
}
2016-03-01 15:20:44 +08:00
// Rebuild
2015-06-20 02:26:45 +08:00
else if ( model - > action ( index ) = = Actions : : Rebuild ) {
2017-02-14 14:39:16 +08:00
// First child will always be descriptor for this type of image, and it's read only for now
2021-04-04 17:09:23 +08:00
intelImage = model - > header ( index . model ( ) - > index ( 0 , 0 , index ) ) + model - > body ( index . model ( ) - > index ( 0 , 0 , index ) ) + model - > tail ( index . model ( ) - > index ( 0 , 0 , index ) ) ;
2016-03-01 15:20:44 +08:00
// Process other regions
2015-06-20 02:26:45 +08:00
for ( int i = 1 ; i < model - > rowCount ( index ) ; i + + ) {
2021-04-04 17:09:23 +08:00
UModelIndex currentRegion = index . model ( ) - > index ( i , 0 , index ) ;
2016-03-01 15:20:44 +08:00
2015-12-30 06:39:43 +08:00
// Skip regions with Remove action
if ( model - > action ( currentRegion ) = = Actions : : Remove )
continue ;
// Check item type to be either region or padding
UINT8 type = model - > type ( currentRegion ) ;
if ( type = = Types : : Padding ) {
2016-03-01 15:20:44 +08:00
// Add padding as is
2018-10-08 17:58:12 +08:00
intelImage + = model - > header ( currentRegion ) + model - > body ( currentRegion ) + model - > tail ( currentRegion ) ;
2015-12-30 06:39:43 +08:00
continue ;
}
// Check region subtype
2016-07-07 13:57:45 +08:00
USTATUS result ;
UByteArray region ;
2015-12-30 06:39:43 +08:00
UINT8 regionType = model - > subtype ( currentRegion ) ;
switch ( regionType ) {
2015-06-20 02:26:45 +08:00
case Subtypes : : BiosRegion :
case Subtypes : : PdrRegion :
2016-03-01 15:20:44 +08:00
result = buildRawArea ( currentRegion , region ) ;
2015-12-30 06:39:43 +08:00
if ( result ) {
2017-02-14 14:39:16 +08:00
msg ( UString ( " buildIntelImage: building of region " ) + regionTypeToUString ( regionType ) + UString ( " failed with error " ) + errorCodeToUString ( result ) , currentRegion ) ;
return result ;
2015-12-30 06:39:43 +08:00
}
break ;
2016-03-01 15:20:44 +08:00
case Subtypes : : MeRegion :
2017-12-11 09:56:00 +08:00
case Subtypes : : GbeRegion :
case Subtypes : : DevExp1Region :
case Subtypes : : Bios2Region :
case Subtypes : : MicrocodeRegion :
2015-12-30 06:39:43 +08:00
case Subtypes : : EcRegion :
2017-12-11 09:56:00 +08:00
case Subtypes : : DevExp2Region :
case Subtypes : : IeRegion :
case Subtypes : : Tgbe1Region :
case Subtypes : : Tgbe2Region :
2016-03-01 15:20:44 +08:00
case Subtypes : : Reserved1Region :
case Subtypes : : Reserved2Region :
2017-12-11 09:56:00 +08:00
case Subtypes : : PttRegion :
2016-03-01 15:20:44 +08:00
// Add region as is
2018-10-08 17:58:12 +08:00
region = model - > header ( currentRegion ) + model - > body ( currentRegion ) ;
2015-06-20 02:26:45 +08:00
break ;
default :
2017-02-14 14:39:16 +08:00
msg ( UString ( " buildIntelImage: unknown region type " ) , currentRegion ) ;
2016-07-07 13:57:45 +08:00
return U_UNKNOWN_ITEM_TYPE ;
2015-06-20 02:26:45 +08:00
}
2015-12-30 06:39:43 +08:00
2016-03-01 15:20:44 +08:00
// Append the resulting region
2018-10-08 17:58:12 +08:00
intelImage + = region ;
2015-06-20 02:26:45 +08:00
}
2016-01-28 07:21:51 +08:00
2015-06-20 02:26:45 +08:00
// Check size of new image, it must be same as old one
2021-04-04 17:09:23 +08:00
UINT32 newSize = ( UINT32 ) intelImage . size ( ) ;
UINT32 oldSize = ( UINT32 ) model - > body ( index ) . size ( ) ;
2015-06-20 02:26:45 +08:00
if ( newSize > oldSize ) {
2017-02-14 14:39:16 +08:00
msg ( usprintf ( " buildIntelImage: new image size %Xh (%u) is bigger than the original %Xh (%u) " , newSize , newSize , oldSize , oldSize ) , index ) ;
return U_INVALID_IMAGE ;
2015-06-20 02:26:45 +08:00
}
else if ( newSize < oldSize ) {
2017-02-14 14:39:16 +08:00
msg ( usprintf ( " buildIntelImage: new image size %Xh (%u) is smaller than the original %Xh (%u) " , newSize , newSize , oldSize , oldSize ) , index ) ;
return U_INVALID_IMAGE ;
2015-06-20 02:26:45 +08:00
}
2017-02-14 14:39:16 +08:00
// Build successful, append header and tail
intelImage = model - > header ( index ) + intelImage + model - > tail ( index ) ;
2016-07-07 13:57:45 +08:00
return U_SUCCESS ;
2015-06-20 02:26:45 +08:00
}
2017-02-14 14:39:16 +08:00
msg ( UString ( " buildIntelImage: unexpected action " + actionTypeToUString ( model - > action ( index ) ) ) , index ) ;
2016-07-07 13:57:45 +08:00
return U_NOT_IMPLEMENTED ;
2015-06-20 02:26:45 +08:00
}
2017-02-14 14:39:16 +08:00
USTATUS FfsBuilder : : buildRawArea ( const UModelIndex & index , UByteArray & rawArea )
2015-05-15 01:15:19 +08:00
{
// Sanity check
if ( ! index . isValid ( ) )
2016-07-07 13:57:45 +08:00
return U_INVALID_PARAMETER ;
2015-05-15 01:15:19 +08:00
// No action required
if ( model - > action ( index ) = = Actions : : NoAction ) {
2017-02-14 14:39:16 +08:00
rawArea = model - > header ( index ) + model - > body ( index ) + model - > tail ( index ) ;
return U_SUCCESS ;
}
// Remove
else if ( model - > action ( index ) = = Actions : : Remove ) {
rawArea . clear ( ) ;
2016-07-07 13:57:45 +08:00
return U_SUCCESS ;
2015-05-15 01:15:19 +08:00
}
// Rebuild or Replace
2021-10-07 23:51:39 +08:00
else if ( model - > action ( index ) = = Actions : : Rebuild
2015-05-15 01:15:19 +08:00
| | model - > action ( index ) = = Actions : : Replace ) {
2017-02-14 14:39:16 +08:00
// Rebuild if there is at least 1 child
2015-05-15 01:15:19 +08:00
if ( model - > rowCount ( index ) ) {
2016-07-07 13:57:45 +08:00
// Clear the supplied UByteArray
2015-05-15 01:15:19 +08:00
rawArea . clear ( ) ;
2015-06-20 02:26:45 +08:00
// Build children
2015-05-15 01:15:19 +08:00
for ( int i = 0 ; i < model - > rowCount ( index ) ; i + + ) {
2016-07-07 13:57:45 +08:00
USTATUS result = U_SUCCESS ;
2021-04-04 17:09:23 +08:00
UModelIndex currentChild = index . model ( ) - > index ( i , 0 , index ) ;
2016-07-07 13:57:45 +08:00
UByteArray currentData ;
2022-08-25 04:17:51 +08:00
2015-05-15 01:15:19 +08:00
// Check child type
if ( model - > type ( currentChild ) = = Types : : Volume ) {
result = buildVolume ( currentChild , currentData ) ;
}
else if ( model - > type ( currentChild ) = = Types : : Padding ) {
result = buildPadding ( currentChild , currentData ) ;
}
else {
2017-02-14 14:39:16 +08:00
msg ( UString ( " buildRawArea: unexpected item type " ) + itemTypeToUString ( model - > type ( currentChild ) ) , currentChild ) ;
return U_UNKNOWN_ITEM_TYPE ;
2015-05-15 01:15:19 +08:00
}
// Check build result
if ( result ) {
2017-02-14 14:39:16 +08:00
msg ( UString ( " buildRawArea: building of " ) + model - > name ( currentChild ) + UString ( " failed with error " ) + errorCodeToUString ( result ) , currentChild ) ;
return result ;
2015-05-15 01:15:19 +08:00
}
// Append current data
2018-10-08 17:58:12 +08:00
rawArea + = currentData ;
2015-05-15 01:15:19 +08:00
}
2015-06-20 02:26:45 +08:00
// Check size of new raw area, it must be same as original one
2021-04-04 17:09:23 +08:00
UINT32 newSize = ( UINT32 ) rawArea . size ( ) ;
UINT32 oldSize = ( UINT32 ) model - > body ( index ) . size ( ) ;
2015-06-20 02:26:45 +08:00
if ( newSize > oldSize ) {
2017-02-14 14:39:16 +08:00
msg ( usprintf ( " buildRawArea: new area size %Xh (%u) is bigger than the original %Xh (%u) " , newSize , newSize , oldSize , oldSize ) , index ) ;
return U_INVALID_RAW_AREA ;
2015-05-15 01:15:19 +08:00
}
2015-06-20 02:26:45 +08:00
else if ( newSize < oldSize ) {
2017-02-14 14:39:16 +08:00
msg ( usprintf ( " buildRawArea: new area size %Xh (%u) is smaller than the original %Xh (%u) " , newSize , newSize , oldSize , oldSize ) , index ) ;
return U_INVALID_RAW_AREA ;
2015-05-15 01:15:19 +08:00
}
}
2017-02-14 14:39:16 +08:00
// No need to rebuild a raw area with no children
else {
2015-05-15 01:15:19 +08:00
rawArea = model - > body ( index ) ;
2017-02-14 14:39:16 +08:00
}
2015-05-15 01:15:19 +08:00
2015-06-20 02:26:45 +08:00
// Build successful, add header if needed
2017-02-14 14:39:16 +08:00
rawArea = model - > header ( index ) + rawArea + model - > tail ( index ) ;
2016-07-07 13:57:45 +08:00
return U_SUCCESS ;
2015-05-15 01:15:19 +08:00
}
2017-02-14 14:39:16 +08:00
msg ( UString ( " buildRawArea: unexpected action " + actionTypeToUString ( model - > action ( index ) ) ) , index ) ;
2016-07-07 13:57:45 +08:00
return U_NOT_IMPLEMENTED ;
2015-05-15 01:15:19 +08:00
}
2016-07-07 13:57:45 +08:00
USTATUS FfsBuilder : : buildPadding ( const UModelIndex & index , UByteArray & padding )
2015-05-15 01:15:19 +08:00
{
// Sanity check
if ( ! index . isValid ( ) )
2016-07-07 13:57:45 +08:00
return U_INVALID_PARAMETER ;
2015-05-15 01:15:19 +08:00
// No action required
if ( model - > action ( index ) = = Actions : : NoAction ) {
2017-02-14 14:39:16 +08:00
padding = model - > header ( index ) + model - > body ( index ) + model - > tail ( index ) ;
return U_SUCCESS ;
}
// Remove
else if ( model - > action ( index ) = = Actions : : Remove ) {
padding . clear ( ) ;
2016-07-07 13:57:45 +08:00
return U_SUCCESS ;
2015-05-15 01:15:19 +08:00
}
// Erase
else if ( model - > action ( index ) = = Actions : : Erase ) {
2017-02-14 14:39:16 +08:00
return erase ( index , padding ) ;
2015-05-15 01:15:19 +08:00
}
2017-02-14 14:39:16 +08:00
msg ( UString ( " buildPadding: unexpected action " + actionTypeToUString ( model - > action ( index ) ) ) , index ) ;
2016-07-07 13:57:45 +08:00
return U_NOT_IMPLEMENTED ;
2015-05-15 01:15:19 +08:00
}
2016-07-07 13:57:45 +08:00
USTATUS FfsBuilder : : buildNonUefiData ( const UModelIndex & index , UByteArray & data )
2015-05-15 01:15:19 +08:00
{
// Sanity check
if ( ! index . isValid ( ) )
2016-07-07 13:57:45 +08:00
return U_INVALID_PARAMETER ;
2015-05-15 01:15:19 +08:00
// No action required
if ( model - > action ( index ) = = Actions : : NoAction ) {
2017-02-14 14:39:16 +08:00
data = model - > header ( index ) + model - > body ( index ) + model - > tail ( index ) ;
return U_SUCCESS ;
}
// Remove
else if ( model - > action ( index ) = = Actions : : Remove ) {
data . clear ( ) ;
2016-07-07 13:57:45 +08:00
return U_SUCCESS ;
2015-05-15 01:15:19 +08:00
}
// Erase
else if ( model - > action ( index ) = = Actions : : Erase ) {
2017-02-14 14:39:16 +08:00
return erase ( index , data ) ;
2015-05-15 01:15:19 +08:00
}
2017-02-14 14:39:16 +08:00
// TODO: rebuild properly
msg ( UString ( " buildNoUefiData: unexpected action " + actionTypeToUString ( model - > action ( index ) ) ) , index ) ;
2016-07-07 13:57:45 +08:00
return U_NOT_IMPLEMENTED ;
2015-05-15 01:15:19 +08:00
}
2016-07-07 13:57:45 +08:00
USTATUS FfsBuilder : : buildFreeSpace ( const UModelIndex & index , UByteArray & freeSpace )
2015-05-15 01:15:19 +08:00
{
// Sanity check
if ( ! index . isValid ( ) )
2016-07-07 13:57:45 +08:00
return U_INVALID_PARAMETER ;
2015-05-15 01:15:19 +08:00
2017-02-14 14:39:16 +08:00
// No actions possible for free space
freeSpace = model - > header ( index ) + model - > body ( index ) + model - > tail ( index ) ;
return U_SUCCESS ;
2015-05-15 01:15:19 +08:00
}
2016-07-07 13:57:45 +08:00
USTATUS FfsBuilder : : buildVolume ( const UModelIndex & index , UByteArray & volume )
2015-06-20 02:26:45 +08:00
{
2016-11-03 03:40:38 +08:00
U_UNUSED_PARAMETER ( index ) ;
U_UNUSED_PARAMETER ( volume ) ;
2016-07-07 13:57:45 +08:00
return U_NOT_IMPLEMENTED ;
2015-06-20 02:26:45 +08:00
}
2016-07-07 13:57:45 +08:00
USTATUS FfsBuilder : : buildPadFile ( const UModelIndex & index , UByteArray & padFile )
2015-05-15 01:15:19 +08:00
{
2016-11-03 03:40:38 +08:00
U_UNUSED_PARAMETER ( index ) ;
U_UNUSED_PARAMETER ( padFile ) ;
2016-07-07 13:57:45 +08:00
return U_NOT_IMPLEMENTED ;
2015-05-15 01:15:19 +08:00
}
2016-07-07 13:57:45 +08:00
USTATUS FfsBuilder : : buildFile ( const UModelIndex & index , UByteArray & file )
2015-05-15 01:15:19 +08:00
{
2016-11-03 03:40:38 +08:00
U_UNUSED_PARAMETER ( index ) ;
U_UNUSED_PARAMETER ( file ) ;
2016-07-07 13:57:45 +08:00
return U_NOT_IMPLEMENTED ;
2015-05-15 01:15:19 +08:00
}
2016-07-07 13:57:45 +08:00
USTATUS FfsBuilder : : buildSection ( const UModelIndex & index , UByteArray & section )
2015-05-15 01:15:19 +08:00
{
2016-11-03 03:40:38 +08:00
U_UNUSED_PARAMETER ( index ) ;
U_UNUSED_PARAMETER ( section ) ;
2016-07-07 13:57:45 +08:00
return U_NOT_IMPLEMENTED ;
2015-05-15 01:15:19 +08:00
}
2016-03-01 15:20:44 +08:00