now detecting and setting writeable flag based on how a resource was opened

This commit is contained in:
Rob Greene 2020-11-03 10:51:12 -06:00 committed by Iván Izaguirre
parent cadbd70b53
commit 313733b728
6 changed files with 25 additions and 17 deletions

View File

@ -72,7 +72,7 @@ const (
// LoadRom loads a standard Apple2+ or 2e ROM // LoadRom loads a standard Apple2+ or 2e ROM
func (a *Apple2) LoadRom(filename string) error { func (a *Apple2) LoadRom(filename string) error {
data, err := storage.LoadResource(filename) data, _, err := storage.LoadResource(filename)
if err != nil { if err != nil {
return err return err
} }

View File

@ -36,7 +36,7 @@ func loadBase64aRom(a *Apple2) error {
for i := 0; i < base64aRomChipCount; i++ { for i := 0; i < base64aRomChipCount; i++ {
filename := fmt.Sprintf("<internal>/BASE64A_%X.BIN", 0xd0+i*0x08) filename := fmt.Sprintf("<internal>/BASE64A_%X.BIN", 0xd0+i*0x08)
data, err := storage.LoadResource(filename) data, _, err := storage.LoadResource(filename)
if err != nil { if err != nil {
return err return err
} }

View File

@ -39,7 +39,7 @@ func (c *cardBase) reset() {
} }
func (c *cardBase) loadRomFromResource(resource string) { func (c *cardBase) loadRomFromResource(resource string) {
data, err := storage.LoadResource(resource) data, _, err := storage.LoadResource(resource)
if err != nil { if err != nil {
// The resource should be internal and never fail // The resource should be internal and never fail
panic(err) panic(err)

View File

@ -45,7 +45,7 @@ func newCharacterGenerator(filename string, order charColumnMap) (*CharacterGene
} }
func (cg *CharacterGenerator) load(filename string) error { func (cg *CharacterGenerator) load(filename string) error {
bytes, err := storage.LoadResource(filename) bytes, _, err := storage.LoadResource(filename)
if err != nil { if err != nil {
return err return err
} }

View File

@ -14,7 +14,7 @@ type Diskette interface {
// IsDiskette returns true if the files looks like a 5 1/4 diskette // IsDiskette returns true if the files looks like a 5 1/4 diskette
func IsDiskette(filename string) bool { func IsDiskette(filename string) bool {
data, err := LoadResource(filename) data, _, err := LoadResource(filename)
if err != nil { if err != nil {
return false return false
} }
@ -24,7 +24,7 @@ func IsDiskette(filename string) bool {
// LoadDiskette returns a Diskette by detecting the format // LoadDiskette returns a Diskette by detecting the format
func LoadDiskette(filename string) (Diskette, error) { func LoadDiskette(filename string) (Diskette, error) {
data, err := LoadResource(filename) data, writeable, err := LoadResource(filename)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -32,12 +32,14 @@ func LoadDiskette(filename string) (Diskette, error) {
if isFileNib(data) { if isFileNib(data) {
var d diskette16sector var d diskette16sector
d.nib = newFileNib(data) d.nib = newFileNib(data)
d.nib.supportsWrite = d.nib.supportsWrite && writeable
return &d, nil return &d, nil
} }
if isFileDsk(data) { if isFileDsk(data) {
var d diskette16sectorWritable var d diskette16sectorWritable
d.nib = newFileDsk(data, filename) d.nib = newFileDsk(data, filename)
d.nib.supportsWrite = d.nib.supportsWrite && writeable
return &d, nil return &d, nil
} }

View File

@ -29,66 +29,72 @@ func isHTTPResource(filename string) bool {
} }
// LoadResource loads in memory a file from the filesystem, http or embedded // LoadResource loads in memory a file from the filesystem, http or embedded
func LoadResource(filename string) ([]uint8, error) { func LoadResource(filename string) ([]uint8, bool, error) {
var writeable bool
var file io.Reader var file io.Reader
if isInternalResource(filename) { if isInternalResource(filename) {
// load from embedded resource // load from embedded resource
resource := strings.TrimPrefix(filename, internalPrefix) resource := strings.TrimPrefix(filename, internalPrefix)
resourceFile, err := romdumps.Assets.Open(resource) resourceFile, err := romdumps.Assets.Open(resource)
if err != nil { if err != nil {
return nil, err return nil, false, err
} }
defer resourceFile.Close() defer resourceFile.Close()
file = resourceFile file = resourceFile
writeable = false
} else if isHTTPResource(filename) { } else if isHTTPResource(filename) {
response, err := http.Get(filename) response, err := http.Get(filename)
if err != nil { if err != nil {
return nil, err return nil, false, err
} }
defer response.Body.Close() defer response.Body.Close()
file = response.Body file = response.Body
writeable = false
} else { } else {
diskFile, err := os.Open(filename) diskFile, err := os.Open(filename)
if err != nil { if err != nil {
return nil, err return nil, false, err
} }
defer diskFile.Close() defer diskFile.Close()
file = diskFile file = diskFile
writeable = true
} }
data, err := ioutil.ReadAll(file) data, err := ioutil.ReadAll(file)
if err != nil { if err != nil {
return nil, err return nil, false, err
} }
contentType := http.DetectContentType(data) contentType := http.DetectContentType(data)
if contentType == "application/x-gzip" { if contentType == "application/x-gzip" {
writeable = false
gz, err := gzip.NewReader(bytes.NewReader(data)) gz, err := gzip.NewReader(bytes.NewReader(data))
if err != nil { if err != nil {
return nil, err return nil, false, err
} }
defer gz.Close() defer gz.Close()
data, err = ioutil.ReadAll(gz) data, err = ioutil.ReadAll(gz)
if err != nil { if err != nil {
return nil, err return nil, false, err
} }
} else if contentType == "application/zip" { } else if contentType == "application/zip" {
writeable = false
z, err := zip.NewReader(bytes.NewReader(data), int64(len(data))) z, err := zip.NewReader(bytes.NewReader(data), int64(len(data)))
if err != nil { if err != nil {
return nil, err return nil, false, err
} }
for _, zf := range z.File { for _, zf := range z.File {
f, err := zf.Open() f, err := zf.Open()
if err != nil { if err != nil {
return nil, err return nil, false, err
} }
defer f.Close() defer f.Close()
bytes, err := ioutil.ReadAll(f) bytes, err := ioutil.ReadAll(f)
if err != nil { if err != nil {
return nil, err return nil, false, err
} }
if isFileDsk(bytes) || isFileNib(bytes) || isFileWoz(bytes) { if isFileDsk(bytes) || isFileNib(bytes) || isFileWoz(bytes) {
data = bytes data = bytes
@ -97,5 +103,5 @@ func LoadResource(filename string) ([]uint8, error) {
} }
} }
return data, nil return data, writeable, nil
} }