WiiUDownloader/gtitles.go
2023-07-21 15:43:05 +02:00

168 lines
3.5 KiB
Go

package wiiudownloader
/*
#cgo CFLAGS: -I${SRCDIR}/gtitles
#cgo LDFLAGS: -Wl,-rpath,${SRCDIR}
#cgo LDFLAGS: -L${SRCDIR}
#cgo LDFLAGS: -lgtitles
#include <gtitles.h>
#include <ctype.h>
*/
import "C"
import (
"strconv"
"unsafe"
)
const (
MCP_REGION_JAPAN = 0x01
MCP_REGION_USA = 0x02
MCP_REGION_EUROPE = 0x04
MCP_REGION_CHINA = 0x10
MCP_REGION_KOREA = 0x20
MCP_REGION_TAIWAN = 0x40
)
const (
TITLE_KEY_mypass = iota
TITLE_KEY_nintendo
TITLE_KEY_test
TITLE_KEY_1234567890
TITLE_KEY_Lucy131211
TITLE_KEY_fbf10
TITLE_KEY_5678
TITLE_KEY_1234
TITLE_KEY_
TITLE_KEY_MAGIC
)
const (
TITLE_CATEGORY_GAME = iota
TITLE_CATEGORY_UPDATE
TITLE_CATEGORY_DLC
TITLE_CATEGORY_DEMO
TITLE_CATEGORY_ALL
TITLE_CATEGORY_DISC
)
const (
TID_HIGH_GAME = 0x00050000
TID_HIGH_DEMO = 0x00050002
TID_HIGH_SYSTEM_APP = 0x00050010
TID_HIGH_SYSTEM_DATA = 0x0005001B
TID_HIGH_SYSTEM_APPLET = 0x00050030
TID_HIGH_VWII_IOS = 0x00000007
TID_HIGH_VWII_SYSTEM_APP = 0x00070002
TID_HIGH_VWII_SYSTEM = 0x00070008
TID_HIGH_DLC = 0x0005000C
TID_HIGH_UPDATE = 0x0005000E
)
type TitleEntry struct {
Name string
TitleID uint64
Region uint8
key uint8
}
func GetTitleEntries(category uint8) []TitleEntry {
entriesSize := getTitleEntriesSize(category)
entriesSlice := make([]TitleEntry, entriesSize)
cEntries := C.getTitleEntries(C.TITLE_CATEGORY(category))
cSlice := (*[1 << 28]C.TitleEntry)(unsafe.Pointer(cEntries))[:entriesSize:entriesSize]
for i := 0; i < entriesSize; i++ {
entriesSlice[i] = TitleEntry{
Name: C.GoString(cSlice[i].name),
TitleID: uint64(cSlice[i].tid),
Region: uint8(cSlice[i].region),
key: uint8(cSlice[i].key),
}
}
return entriesSlice
}
func getTitleEntriesSize(category uint8) int {
return int(C.getTitleEntriesSize(C.TITLE_CATEGORY(category)))
}
func GetFormattedRegion(region uint8) string {
if region&MCP_REGION_EUROPE != 0 {
if region&MCP_REGION_USA != 0 {
if region&MCP_REGION_JAPAN != 0 {
return "All"
}
return "USA/Europe"
}
if region&MCP_REGION_JAPAN != 0 {
return "Europe/Japan"
}
return "Europe"
}
if region&MCP_REGION_USA != 0 {
if region&MCP_REGION_JAPAN != 0 {
return "USA/Japan"
}
return "USA"
}
if region&MCP_REGION_JAPAN != 0 {
return "Japan"
}
return "Unknown"
}
func GetFormattedKind(titleID uint64) string {
switch titleID >> 32 {
case TID_HIGH_GAME:
return "Game"
case TID_HIGH_DEMO:
return "Demo"
case TID_HIGH_SYSTEM_APP:
return "System App"
case TID_HIGH_SYSTEM_DATA:
return "System Data"
case TID_HIGH_SYSTEM_APPLET:
return "System Applet"
case TID_HIGH_VWII_IOS:
return "vWii IOS"
case TID_HIGH_VWII_SYSTEM_APP:
return "vWii System App"
case TID_HIGH_VWII_SYSTEM:
return "vWii System"
case TID_HIGH_DLC:
return "DLC"
case TID_HIGH_UPDATE:
return "Update"
default:
return "Unknown"
}
}
func GetCategoryFromFormattedCategory(formattedCategory string) uint8 {
switch formattedCategory {
case "Game":
return TITLE_CATEGORY_GAME
case "Update":
return TITLE_CATEGORY_UPDATE
case "DLC":
return TITLE_CATEGORY_DLC
case "Demo":
return TITLE_CATEGORY_DEMO
case "All":
return TITLE_CATEGORY_ALL
default:
return TITLE_CATEGORY_ALL
}
}
func getTitleEntryFromTid(tid string) TitleEntry {
titleID, err := strconv.ParseUint(tid, 16, 64)
if err != nil {
return TitleEntry{}
}
for _, entry := range GetTitleEntries(TITLE_CATEGORY_ALL) {
if entry.TitleID == titleID {
return entry
}
}
return TitleEntry{}
}