You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
75 lines
1.7 KiB
Go
75 lines
1.7 KiB
Go
package commands
|
|
|
|
import (
|
|
"bufio"
|
|
"encoding/binary"
|
|
"io"
|
|
"os"
|
|
)
|
|
|
|
type PrepareBinCommand struct {
|
|
Version string `long:"version" alias:"V" required:"true" description:"a version string of max 16 chars"`
|
|
SourceFileName string `long:"src" alias:"i" required:"true" description:"input-filename"`
|
|
DestFileName string `long:"dest" alias:"o" required:"true" description:"output-filename"`
|
|
MediaID byte `long:"mediaid" alias:"m" required:"true" description:"media identifier"`
|
|
}
|
|
|
|
func (command *PrepareBinCommand) Execute(args []string) error {
|
|
inputFile, err := os.Open(command.SourceFileName)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer inputFile.Close()
|
|
inputFileStat, err := inputFile.Stat()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
headerFileSize := inputFileStat.Size() + 32
|
|
|
|
outputFile, err := os.Create(command.DestFileName)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer outputFile.Close()
|
|
|
|
outputWriter := bufio.NewWriter(outputFile)
|
|
//Header
|
|
headerBytes := []byte{command.MediaID, 0x32, 0xF6, 0x0C}
|
|
_, err = outputWriter.Write(headerBytes)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
totalSizeBytes := make([]byte, 4)
|
|
binary.LittleEndian.PutUint32(totalSizeBytes, uint32(headerFileSize))
|
|
_, err = outputWriter.Write(totalSizeBytes)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
fillerBytes := make([]byte, 8)
|
|
_, err = outputWriter.Write(fillerBytes)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
versionTextBytes := make([]byte, 16)
|
|
for i := 0; i < 16; i++ {
|
|
if i < len(command.Version) {
|
|
versionTextBytes[i] = command.Version[i]
|
|
} else {
|
|
versionTextBytes[i] = 0x20
|
|
}
|
|
}
|
|
_, err = outputWriter.Write(versionTextBytes)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
_, err = io.Copy(outputWriter, inputFile)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|