now detecting and setting writeable flag based on how a resource was opened
This commit is contained in:
parent
cadbd70b53
commit
313733b728
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue