diff options
Diffstat (limited to 'jar/jar.go')
-rw-r--r-- | jar/jar.go | 63 |
1 files changed, 63 insertions, 0 deletions
@@ -15,8 +15,14 @@ package jar import ( + "bytes" "fmt" + "io/ioutil" + "os" "strings" + "time" + + "android/soong/third_party/zip" ) const ( @@ -25,6 +31,10 @@ const ( ModuleInfoClass = "module-info.class" ) +var DefaultTime = time.Date(2009, 1, 1, 0, 0, 0, 0, time.UTC) + +var MetaDirExtra = [2]byte{0xca, 0xfe} + // EntryNamesLess tells whether <filepathA> should precede <filepathB> in // the order of files with a .jar func EntryNamesLess(filepathA string, filepathB string) (less bool) { @@ -59,3 +69,56 @@ func index(name string) int { } panic(fmt.Errorf("file %q did not match any pattern", name)) } + +func MetaDirFileHeader() *zip.FileHeader { + dirHeader := &zip.FileHeader{ + Name: MetaDir, + Extra: []byte{MetaDirExtra[1], MetaDirExtra[0], 0, 0}, + } + dirHeader.SetMode(0700 | os.ModeDir) + dirHeader.SetModTime(DefaultTime) + + return dirHeader +} + +// Convert manifest source path to zip header and contents. If path is empty uses a default +// manifest. +func ManifestFileContents(src string) (*zip.FileHeader, []byte, error) { + b, err := manifestContents(src) + if err != nil { + return nil, nil, err + } + + fh := &zip.FileHeader{ + Name: ManifestFile, + Method: zip.Store, + UncompressedSize64: uint64(len(b)), + } + + return fh, b, nil +} + +// Convert manifest source path to contents. If path is empty uses a default manifest. +func manifestContents(src string) ([]byte, error) { + var givenBytes []byte + var err error + + if src != "" { + givenBytes, err = ioutil.ReadFile(src) + if err != nil { + return nil, err + } + } + + manifestMarker := []byte("Manifest-Version:") + header := append(manifestMarker, []byte(" 1.0\nCreated-By: soong_zip\n")...) + + var finalBytes []byte + if !bytes.Contains(givenBytes, manifestMarker) { + finalBytes = append(append(header, givenBytes...), byte('\n')) + } else { + finalBytes = givenBytes + } + + return finalBytes, nil +} |