| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| static const Itdb_IpodInfo ipod_info_table [] = { |
| |
| |
| {"Invalid", 0, ITDB_IPOD_MODEL_INVALID, ITDB_IPOD_GENERATION_UNKNOWN, 0}, |
| {"Unknown", 0, ITDB_IPOD_MODEL_UNKNOWN, ITDB_IPOD_GENERATION_UNKNOWN, 0}, |
| |
| |
| |
| |
| {"8513", 5, ITDB_IPOD_MODEL_REGULAR, ITDB_IPOD_GENERATION_FIRST, 20}, |
| {"8541", 5, ITDB_IPOD_MODEL_REGULAR, ITDB_IPOD_GENERATION_FIRST, 20}, |
| {"8697", 5, ITDB_IPOD_MODEL_REGULAR, ITDB_IPOD_GENERATION_FIRST, 20}, |
| {"8709", 10, ITDB_IPOD_MODEL_REGULAR, ITDB_IPOD_GENERATION_FIRST, 20}, |
| |
| |
| |
| |
| |
| {"8737", 10, ITDB_IPOD_MODEL_REGULAR, ITDB_IPOD_GENERATION_SECOND, 20}, |
| {"8740", 10, ITDB_IPOD_MODEL_REGULAR, ITDB_IPOD_GENERATION_SECOND, 20}, |
| {"8738", 20, ITDB_IPOD_MODEL_REGULAR, ITDB_IPOD_GENERATION_SECOND, 50}, |
| {"8741", 20, ITDB_IPOD_MODEL_REGULAR, ITDB_IPOD_GENERATION_SECOND, 50}, |
| |
| |
| |
| |
| |
| {"8976", 10, ITDB_IPOD_MODEL_REGULAR, ITDB_IPOD_GENERATION_THIRD, 20}, |
| {"8946", 15, ITDB_IPOD_MODEL_REGULAR, ITDB_IPOD_GENERATION_THIRD, 50}, |
| {"9460", 15, ITDB_IPOD_MODEL_REGULAR, ITDB_IPOD_GENERATION_THIRD, 50}, |
| {"9244", 20, ITDB_IPOD_MODEL_REGULAR, ITDB_IPOD_GENERATION_THIRD, 50}, |
| {"8948", 30, ITDB_IPOD_MODEL_REGULAR, ITDB_IPOD_GENERATION_THIRD, 50}, |
| {"9245", 40, ITDB_IPOD_MODEL_REGULAR, ITDB_IPOD_GENERATION_THIRD, 50}, |
| |
| |
| |
| {"9282", 20, ITDB_IPOD_MODEL_REGULAR, ITDB_IPOD_GENERATION_FOURTH, 50}, |
| {"9787", 25, ITDB_IPOD_MODEL_REGULAR_U2, ITDB_IPOD_GENERATION_FOURTH, 50}, |
| {"9268", 40, ITDB_IPOD_MODEL_REGULAR, ITDB_IPOD_GENERATION_FOURTH, 50}, |
| |
| |
| {"9160", 4, ITDB_IPOD_MODEL_MINI, ITDB_IPOD_GENERATION_MINI_1, 6}, |
| {"9436", 4, ITDB_IPOD_MODEL_MINI_BLUE, ITDB_IPOD_GENERATION_MINI_1, 6}, |
| {"9435", 4, ITDB_IPOD_MODEL_MINI_PINK, ITDB_IPOD_GENERATION_MINI_1, 6}, |
| {"9434", 4, ITDB_IPOD_MODEL_MINI_GREEN, ITDB_IPOD_GENERATION_MINI_1, 6}, |
| {"9437", 4, ITDB_IPOD_MODEL_MINI_GOLD, ITDB_IPOD_GENERATION_MINI_1, 6}, |
| |
| |
| {"9800", 4, ITDB_IPOD_MODEL_MINI, ITDB_IPOD_GENERATION_MINI_2, 6}, |
| {"9802", 4, ITDB_IPOD_MODEL_MINI_BLUE, ITDB_IPOD_GENERATION_MINI_2, 6}, |
| {"9804", 4, ITDB_IPOD_MODEL_MINI_PINK, ITDB_IPOD_GENERATION_MINI_2, 6}, |
| {"9806", 4, ITDB_IPOD_MODEL_MINI_GREEN, ITDB_IPOD_GENERATION_MINI_2, 6}, |
| {"9801", 6, ITDB_IPOD_MODEL_MINI, ITDB_IPOD_GENERATION_MINI_2, 20}, |
| {"9803", 6, ITDB_IPOD_MODEL_MINI_BLUE, ITDB_IPOD_GENERATION_MINI_2, 20}, |
| {"9805", 6, ITDB_IPOD_MODEL_MINI_PINK, ITDB_IPOD_GENERATION_MINI_2, 20}, |
| {"9807", 6, ITDB_IPOD_MODEL_MINI_GREEN, ITDB_IPOD_GENERATION_MINI_2, 20}, |
| |
| |
| |
| {"A079", 20, ITDB_IPOD_MODEL_COLOR, ITDB_IPOD_GENERATION_PHOTO, 50}, |
| {"A127", 20, ITDB_IPOD_MODEL_COLOR_U2, ITDB_IPOD_GENERATION_PHOTO, 50}, |
| {"9829", 30, ITDB_IPOD_MODEL_COLOR, ITDB_IPOD_GENERATION_PHOTO, 50}, |
| {"9585", 40, ITDB_IPOD_MODEL_COLOR, ITDB_IPOD_GENERATION_PHOTO, 50}, |
| {"9830", 60, ITDB_IPOD_MODEL_COLOR, ITDB_IPOD_GENERATION_PHOTO, 50}, |
| {"9586", 60, ITDB_IPOD_MODEL_COLOR, ITDB_IPOD_GENERATION_PHOTO, 50}, |
| |
| |
| {"9724", 0.5,ITDB_IPOD_MODEL_SHUFFLE, ITDB_IPOD_GENERATION_SHUFFLE_1, 3}, |
| {"9725", 1, ITDB_IPOD_MODEL_SHUFFLE, ITDB_IPOD_GENERATION_SHUFFLE_1, 3}, |
| |
| |
| {"A546", 1, ITDB_IPOD_MODEL_SHUFFLE_SILVER, ITDB_IPOD_GENERATION_SHUFFLE_2, 3}, |
| {"A947", 1, ITDB_IPOD_MODEL_SHUFFLE_PINK, ITDB_IPOD_GENERATION_SHUFFLE_2, 3}, |
| {"A949", 1, ITDB_IPOD_MODEL_SHUFFLE_BLUE, ITDB_IPOD_GENERATION_SHUFFLE_2, 3}, |
| {"A951", 1, ITDB_IPOD_MODEL_SHUFFLE_GREEN, ITDB_IPOD_GENERATION_SHUFFLE_2, 3}, |
| {"A953", 1, ITDB_IPOD_MODEL_SHUFFLE_ORANGE, ITDB_IPOD_GENERATION_SHUFFLE_2, 3}, |
| {"C167", 1, ITDB_IPOD_MODEL_SHUFFLE_GOLD, ITDB_IPOD_GENERATION_SHUFFLE_2, 3}, |
| |
| |
| |
| {"B225", 1, ITDB_IPOD_MODEL_SHUFFLE_SILVER, ITDB_IPOD_GENERATION_SHUFFLE_2, 3}, |
| {"B233", 1, ITDB_IPOD_MODEL_SHUFFLE_PURPLE, ITDB_IPOD_GENERATION_SHUFFLE_2, 3}, |
| {"B231", 1, ITDB_IPOD_MODEL_SHUFFLE_RED, ITDB_IPOD_GENERATION_SHUFFLE_2, 3}, |
| {"B227", 1, ITDB_IPOD_MODEL_SHUFFLE_BLUE, ITDB_IPOD_GENERATION_SHUFFLE_2, 3}, |
| {"B228", 1, ITDB_IPOD_MODEL_SHUFFLE_BLUE, ITDB_IPOD_GENERATION_SHUFFLE_2, 3}, |
| {"B229", 1, ITDB_IPOD_MODEL_SHUFFLE_GREEN, ITDB_IPOD_GENERATION_SHUFFLE_2, 3}, |
| {"B518", 2, ITDB_IPOD_MODEL_SHUFFLE_SILVER, ITDB_IPOD_GENERATION_SHUFFLE_2, 3}, |
| {"B520", 2, ITDB_IPOD_MODEL_SHUFFLE_BLUE, ITDB_IPOD_GENERATION_SHUFFLE_2, 3}, |
| {"B522", 2, ITDB_IPOD_MODEL_SHUFFLE_GREEN, ITDB_IPOD_GENERATION_SHUFFLE_2, 3}, |
| {"B524", 2, ITDB_IPOD_MODEL_SHUFFLE_RED, ITDB_IPOD_GENERATION_SHUFFLE_2, 3}, |
| {"B526", 2, ITDB_IPOD_MODEL_SHUFFLE_PURPLE, ITDB_IPOD_GENERATION_SHUFFLE_2, 3}, |
| |
| |
| |
| {"C306", 2, ITDB_IPOD_MODEL_SHUFFLE_SILVER, ITDB_IPOD_GENERATION_SHUFFLE_3, 3}, |
| {"C323", 2, ITDB_IPOD_MODEL_SHUFFLE_BLACK, ITDB_IPOD_GENERATION_SHUFFLE_3, 3}, |
| {"C381", 2, ITDB_IPOD_MODEL_SHUFFLE_GREEN, ITDB_IPOD_GENERATION_SHUFFLE_3, 3}, |
| {"C384", 2, ITDB_IPOD_MODEL_SHUFFLE_BLUE, ITDB_IPOD_GENERATION_SHUFFLE_3, 3}, |
| {"C387", 2, ITDB_IPOD_MODEL_SHUFFLE_PINK, ITDB_IPOD_GENERATION_SHUFFLE_3, 3}, |
| {"B867", 4, ITDB_IPOD_MODEL_SHUFFLE_SILVER, ITDB_IPOD_GENERATION_SHUFFLE_3, 3}, |
| {"C164", 4, ITDB_IPOD_MODEL_SHUFFLE_BLACK, ITDB_IPOD_GENERATION_SHUFFLE_3, 3}, |
| {"C303", 4, ITDB_IPOD_MODEL_SHUFFLE_STAINLESS, ITDB_IPOD_GENERATION_SHUFFLE_3, 3}, |
| {"C307", 4, ITDB_IPOD_MODEL_SHUFFLE_GREEN, ITDB_IPOD_GENERATION_SHUFFLE_3, 3}, |
| {"C328", 4, ITDB_IPOD_MODEL_SHUFFLE_BLUE, ITDB_IPOD_GENERATION_SHUFFLE_3, 3}, |
| {"C331", 4, ITDB_IPOD_MODEL_SHUFFLE_PINK, ITDB_IPOD_GENERATION_SHUFFLE_3, 3}, |
| |
| |
| |
| {"C584", 2, ITDB_IPOD_MODEL_SHUFFLE_SILVER, ITDB_IPOD_GENERATION_SHUFFLE_4, 3}, |
| {"C585", 2, ITDB_IPOD_MODEL_SHUFFLE_PINK, ITDB_IPOD_GENERATION_SHUFFLE_4, 3}, |
| {"C749", 2, ITDB_IPOD_MODEL_SHUFFLE_ORANGE, ITDB_IPOD_GENERATION_SHUFFLE_4, 3}, |
| {"C750", 2, ITDB_IPOD_MODEL_SHUFFLE_GREEN, ITDB_IPOD_GENERATION_SHUFFLE_4, 3}, |
| {"C751", 2, ITDB_IPOD_MODEL_SHUFFLE_BLUE, ITDB_IPOD_GENERATION_SHUFFLE_4, 3}, |
| |
| |
| |
| {"A350", 1, ITDB_IPOD_MODEL_NANO_WHITE, ITDB_IPOD_GENERATION_NANO_1, 3}, |
| {"A352", 1, ITDB_IPOD_MODEL_NANO_BLACK, ITDB_IPOD_GENERATION_NANO_1, 3}, |
| {"A004", 2, ITDB_IPOD_MODEL_NANO_WHITE, ITDB_IPOD_GENERATION_NANO_1, 3}, |
| {"A099", 2, ITDB_IPOD_MODEL_NANO_BLACK, ITDB_IPOD_GENERATION_NANO_1, 3}, |
| {"A005", 4, ITDB_IPOD_MODEL_NANO_WHITE, ITDB_IPOD_GENERATION_NANO_1, 6}, |
| {"A107", 4, ITDB_IPOD_MODEL_NANO_BLACK, ITDB_IPOD_GENERATION_NANO_1, 6}, |
| |
| |
| |
| {"A002", 30, ITDB_IPOD_MODEL_VIDEO_WHITE, ITDB_IPOD_GENERATION_VIDEO_1, 50}, |
| {"A146", 30, ITDB_IPOD_MODEL_VIDEO_BLACK, ITDB_IPOD_GENERATION_VIDEO_1, 50}, |
| {"A003", 60, ITDB_IPOD_MODEL_VIDEO_WHITE, ITDB_IPOD_GENERATION_VIDEO_1, 50}, |
| {"A147", 60, ITDB_IPOD_MODEL_VIDEO_BLACK, ITDB_IPOD_GENERATION_VIDEO_1, 50}, |
| {"A452", 30, ITDB_IPOD_MODEL_VIDEO_U2, ITDB_IPOD_GENERATION_VIDEO_1, 50}, |
| |
| |
| |
| |
| {"A444", 30, ITDB_IPOD_MODEL_VIDEO_WHITE, ITDB_IPOD_GENERATION_VIDEO_2, 50}, |
| {"A446", 30, ITDB_IPOD_MODEL_VIDEO_BLACK, ITDB_IPOD_GENERATION_VIDEO_2, 50}, |
| {"A664", 30, ITDB_IPOD_MODEL_VIDEO_U2, ITDB_IPOD_GENERATION_VIDEO_2, 50}, |
| {"A448", 80, ITDB_IPOD_MODEL_VIDEO_WHITE, ITDB_IPOD_GENERATION_VIDEO_2, 50}, |
| {"A450", 80, ITDB_IPOD_MODEL_VIDEO_BLACK, ITDB_IPOD_GENERATION_VIDEO_2, 50}, |
| |
| |
| |
| |
| {"A477", 2, ITDB_IPOD_MODEL_NANO_SILVER, ITDB_IPOD_GENERATION_NANO_2, 3}, |
| {"A426", 4, ITDB_IPOD_MODEL_NANO_SILVER, ITDB_IPOD_GENERATION_NANO_2, 6}, |
| {"A428", 4, ITDB_IPOD_MODEL_NANO_BLUE, ITDB_IPOD_GENERATION_NANO_2, 6}, |
| {"A487", 4, ITDB_IPOD_MODEL_NANO_GREEN, ITDB_IPOD_GENERATION_NANO_2, 6}, |
| {"A489", 4, ITDB_IPOD_MODEL_NANO_PINK, ITDB_IPOD_GENERATION_NANO_2, 6}, |
| {"A725", 4, ITDB_IPOD_MODEL_NANO_RED, ITDB_IPOD_GENERATION_NANO_2, 6}, |
| {"A726", 8, ITDB_IPOD_MODEL_NANO_RED, ITDB_IPOD_GENERATION_NANO_2, 6}, |
| {"A497", 8, ITDB_IPOD_MODEL_NANO_BLACK, ITDB_IPOD_GENERATION_NANO_2, 14}, |
| |
| |
| |
| {"E436", 40, ITDB_IPOD_MODEL_REGULAR, ITDB_IPOD_GENERATION_FOURTH, 50}, |
| {"S492", 30, ITDB_IPOD_MODEL_COLOR, ITDB_IPOD_GENERATION_PHOTO, 50}, |
| |
| |
| |
| {"B029", 80, ITDB_IPOD_MODEL_CLASSIC_SILVER, ITDB_IPOD_GENERATION_CLASSIC_1, 50}, |
| {"B147", 80, ITDB_IPOD_MODEL_CLASSIC_BLACK, ITDB_IPOD_GENERATION_CLASSIC_1, 50}, |
| {"B145", 160, ITDB_IPOD_MODEL_CLASSIC_SILVER, ITDB_IPOD_GENERATION_CLASSIC_1, 50}, |
| {"B150", 160, ITDB_IPOD_MODEL_CLASSIC_BLACK, ITDB_IPOD_GENERATION_CLASSIC_1, 50}, |
| |
| |
| {"B562", 120, ITDB_IPOD_MODEL_CLASSIC_SILVER, ITDB_IPOD_GENERATION_CLASSIC_2, 50}, |
| {"B565", 120, ITDB_IPOD_MODEL_CLASSIC_BLACK, ITDB_IPOD_GENERATION_CLASSIC_2, 50}, |
| |
| |
| {"C293", 160, ITDB_IPOD_MODEL_CLASSIC_SILVER, ITDB_IPOD_GENERATION_CLASSIC_3, 50}, |
| {"C297", 160, ITDB_IPOD_MODEL_CLASSIC_BLACK, ITDB_IPOD_GENERATION_CLASSIC_3, 50}, |
| |
| |
| |
| {"A978", 4, ITDB_IPOD_MODEL_NANO_SILVER, ITDB_IPOD_GENERATION_NANO_3, 6}, |
| {"A980", 8, ITDB_IPOD_MODEL_NANO_SILVER, ITDB_IPOD_GENERATION_NANO_3, 14}, |
| {"B261", 8, ITDB_IPOD_MODEL_NANO_BLACK, ITDB_IPOD_GENERATION_NANO_3, 14}, |
| {"B249", 8, ITDB_IPOD_MODEL_NANO_BLUE, ITDB_IPOD_GENERATION_NANO_3, 14}, |
| {"B253", 8, ITDB_IPOD_MODEL_NANO_GREEN, ITDB_IPOD_GENERATION_NANO_3, 14}, |
| {"B257", 8, ITDB_IPOD_MODEL_NANO_RED, ITDB_IPOD_GENERATION_NANO_3, 14}, |
| |
| |
| {"B480", 4, ITDB_IPOD_MODEL_NANO_SILVER, ITDB_IPOD_GENERATION_NANO_4, 14}, |
| {"B651", 4, ITDB_IPOD_MODEL_NANO_BLUE, ITDB_IPOD_GENERATION_NANO_4, 14}, |
| {"B654", 4, ITDB_IPOD_MODEL_NANO_PINK, ITDB_IPOD_GENERATION_NANO_4, 14}, |
| {"B657", 4, ITDB_IPOD_MODEL_NANO_PURPLE, ITDB_IPOD_GENERATION_NANO_4, 14}, |
| {"B660", 4, ITDB_IPOD_MODEL_NANO_ORANGE, ITDB_IPOD_GENERATION_NANO_4, 14}, |
| {"B663", 4, ITDB_IPOD_MODEL_NANO_GREEN, ITDB_IPOD_GENERATION_NANO_4, 14}, |
| {"B666", 4, ITDB_IPOD_MODEL_NANO_YELLOW, ITDB_IPOD_GENERATION_NANO_4, 14}, |
| |
| {"B598", 8, ITDB_IPOD_MODEL_NANO_SILVER, ITDB_IPOD_GENERATION_NANO_4, 14}, |
| {"B732", 8, ITDB_IPOD_MODEL_NANO_BLUE, ITDB_IPOD_GENERATION_NANO_4, 14}, |
| {"B735", 8, ITDB_IPOD_MODEL_NANO_PINK, ITDB_IPOD_GENERATION_NANO_4, 14}, |
| {"B739", 8, ITDB_IPOD_MODEL_NANO_PURPLE, ITDB_IPOD_GENERATION_NANO_4, 14}, |
| {"B742", 8, ITDB_IPOD_MODEL_NANO_ORANGE, ITDB_IPOD_GENERATION_NANO_4, 14}, |
| {"B745", 8, ITDB_IPOD_MODEL_NANO_GREEN, ITDB_IPOD_GENERATION_NANO_4, 14}, |
| {"B748", 8, ITDB_IPOD_MODEL_NANO_YELLOW, ITDB_IPOD_GENERATION_NANO_4, 14}, |
| {"B751", 8, ITDB_IPOD_MODEL_NANO_RED, ITDB_IPOD_GENERATION_NANO_4, 14}, |
| {"B754", 8, ITDB_IPOD_MODEL_NANO_BLACK, ITDB_IPOD_GENERATION_NANO_4, 14}, |
| |
| {"B903", 16, ITDB_IPOD_MODEL_NANO_SILVER, ITDB_IPOD_GENERATION_NANO_4, 14}, |
| {"B905", 16, ITDB_IPOD_MODEL_NANO_BLUE, ITDB_IPOD_GENERATION_NANO_4, 14}, |
| {"B907", 16, ITDB_IPOD_MODEL_NANO_PINK, ITDB_IPOD_GENERATION_NANO_4, 14}, |
| {"B909", 16, ITDB_IPOD_MODEL_NANO_PURPLE, ITDB_IPOD_GENERATION_NANO_4, 14}, |
| {"B911", 16, ITDB_IPOD_MODEL_NANO_ORANGE, ITDB_IPOD_GENERATION_NANO_4, 14}, |
| {"B913", 16, ITDB_IPOD_MODEL_NANO_GREEN, ITDB_IPOD_GENERATION_NANO_4, 14}, |
| {"B915", 16, ITDB_IPOD_MODEL_NANO_YELLOW, ITDB_IPOD_GENERATION_NANO_4, 14}, |
| {"B917", 16, ITDB_IPOD_MODEL_NANO_RED, ITDB_IPOD_GENERATION_NANO_4, 14}, |
| {"B918", 16, ITDB_IPOD_MODEL_NANO_BLACK, ITDB_IPOD_GENERATION_NANO_4, 14}, |
| |
| |
| {"C027", 8, ITDB_IPOD_MODEL_NANO_SILVER, ITDB_IPOD_GENERATION_NANO_5, 14}, |
| {"C031", 8, ITDB_IPOD_MODEL_NANO_BLACK, ITDB_IPOD_GENERATION_NANO_5, 14}, |
| {"C034", 8, ITDB_IPOD_MODEL_NANO_PURPLE, ITDB_IPOD_GENERATION_NANO_5, 14}, |
| {"C037", 8, ITDB_IPOD_MODEL_NANO_BLUE, ITDB_IPOD_GENERATION_NANO_5, 14}, |
| {"C040", 8, ITDB_IPOD_MODEL_NANO_GREEN, ITDB_IPOD_GENERATION_NANO_5, 14}, |
| {"C043", 8, ITDB_IPOD_MODEL_NANO_YELLOW, ITDB_IPOD_GENERATION_NANO_5, 14}, |
| {"C046", 8, ITDB_IPOD_MODEL_NANO_ORANGE, ITDB_IPOD_GENERATION_NANO_5, 14}, |
| {"C049", 8, ITDB_IPOD_MODEL_NANO_RED, ITDB_IPOD_GENERATION_NANO_5, 14}, |
| {"C050", 8, ITDB_IPOD_MODEL_NANO_PINK, ITDB_IPOD_GENERATION_NANO_5, 14}, |
| |
| {"C060", 16, ITDB_IPOD_MODEL_NANO_SILVER, ITDB_IPOD_GENERATION_NANO_5, 14}, |
| {"C062", 16, ITDB_IPOD_MODEL_NANO_BLACK, ITDB_IPOD_GENERATION_NANO_5, 14}, |
| {"C064", 16, ITDB_IPOD_MODEL_NANO_PURPLE, ITDB_IPOD_GENERATION_NANO_5, 14}, |
| {"C066", 16, ITDB_IPOD_MODEL_NANO_BLUE, ITDB_IPOD_GENERATION_NANO_5, 14}, |
| {"C068", 16, ITDB_IPOD_MODEL_NANO_GREEN, ITDB_IPOD_GENERATION_NANO_5, 14}, |
| {"C070", 16, ITDB_IPOD_MODEL_NANO_YELLOW, ITDB_IPOD_GENERATION_NANO_5, 14}, |
| {"C072", 16, ITDB_IPOD_MODEL_NANO_ORANGE, ITDB_IPOD_GENERATION_NANO_5, 14}, |
| {"C074", 16, ITDB_IPOD_MODEL_NANO_RED, ITDB_IPOD_GENERATION_NANO_5, 14}, |
| {"C075", 16, ITDB_IPOD_MODEL_NANO_PINK, ITDB_IPOD_GENERATION_NANO_5, 14}, |
| |
| |
| {"C525", 8, ITDB_IPOD_MODEL_NANO_SILVER, ITDB_IPOD_GENERATION_NANO_6, 14}, |
| {"C688", 8, ITDB_IPOD_MODEL_NANO_BLACK, ITDB_IPOD_GENERATION_NANO_6, 14}, |
| {"C689", 8, ITDB_IPOD_MODEL_NANO_BLUE, ITDB_IPOD_GENERATION_NANO_6, 14}, |
| {"C690", 8, ITDB_IPOD_MODEL_NANO_GREEN, ITDB_IPOD_GENERATION_NANO_6, 14}, |
| {"C691", 8, ITDB_IPOD_MODEL_NANO_ORANGE, ITDB_IPOD_GENERATION_NANO_6, 14}, |
| {"C692", 8, ITDB_IPOD_MODEL_NANO_PINK, ITDB_IPOD_GENERATION_NANO_6, 14}, |
| {"C693", 8, ITDB_IPOD_MODEL_NANO_RED, ITDB_IPOD_GENERATION_NANO_6, 14}, |
| |
| {"C526", 16, ITDB_IPOD_MODEL_NANO_SILVER, ITDB_IPOD_GENERATION_NANO_6, 14}, |
| {"C694", 16, ITDB_IPOD_MODEL_NANO_BLACK, ITDB_IPOD_GENERATION_NANO_6, 14}, |
| {"C695", 16, ITDB_IPOD_MODEL_NANO_BLUE, ITDB_IPOD_GENERATION_NANO_6, 14}, |
| {"C696", 16, ITDB_IPOD_MODEL_NANO_GREEN, ITDB_IPOD_GENERATION_NANO_6, 14}, |
| {"C697", 16, ITDB_IPOD_MODEL_NANO_ORANGE, ITDB_IPOD_GENERATION_NANO_6, 14}, |
| {"C698", 16, ITDB_IPOD_MODEL_NANO_PINK, ITDB_IPOD_GENERATION_NANO_6, 14}, |
| {"C699", 16, ITDB_IPOD_MODEL_NANO_RED, ITDB_IPOD_GENERATION_NANO_6, 14}, |
| |
| |
| {"A623", 8, ITDB_IPOD_MODEL_TOUCH_SILVER, ITDB_IPOD_GENERATION_TOUCH_1, 50}, |
| {"A627", 16, ITDB_IPOD_MODEL_TOUCH_SILVER, ITDB_IPOD_GENERATION_TOUCH_1, 50}, |
| {"B376", 32, ITDB_IPOD_MODEL_TOUCH_SILVER, ITDB_IPOD_GENERATION_TOUCH_1, 50}, |
| |
| |
| {"B528", 8, ITDB_IPOD_MODEL_TOUCH_SILVER, ITDB_IPOD_GENERATION_TOUCH_2, 50}, |
| {"B531", 16, ITDB_IPOD_MODEL_TOUCH_SILVER, ITDB_IPOD_GENERATION_TOUCH_2, 50}, |
| {"B533", 32, ITDB_IPOD_MODEL_TOUCH_SILVER, ITDB_IPOD_GENERATION_TOUCH_2, 50}, |
| |
| |
| |
| |
| |
| {"C086", 8, ITDB_IPOD_MODEL_TOUCH_SILVER, ITDB_IPOD_GENERATION_TOUCH_2, 50}, |
| {"C008", 32, ITDB_IPOD_MODEL_TOUCH_SILVER, ITDB_IPOD_GENERATION_TOUCH_3, 50}, |
| {"C011", 64, ITDB_IPOD_MODEL_TOUCH_SILVER, ITDB_IPOD_GENERATION_TOUCH_3, 50}, |
| |
| |
| {"C540", 8, ITDB_IPOD_MODEL_TOUCH_SILVER, ITDB_IPOD_GENERATION_TOUCH_4, 50}, |
| {"C544", 32, ITDB_IPOD_MODEL_TOUCH_SILVER, ITDB_IPOD_GENERATION_TOUCH_4, 50}, |
| {"C547", 64, ITDB_IPOD_MODEL_TOUCH_SILVER, ITDB_IPOD_GENERATION_TOUCH_4, 50}, |
| |
| |
| {"A501", 4, ITDB_IPOD_MODEL_IPHONE_1, ITDB_IPOD_GENERATION_IPHONE_1, 50}, |
| {"A712", 8, ITDB_IPOD_MODEL_IPHONE_1, ITDB_IPOD_GENERATION_IPHONE_1, 50}, |
| {"B384", 16, ITDB_IPOD_MODEL_IPHONE_1, ITDB_IPOD_GENERATION_IPHONE_1, 50}, |
| |
| {"B046", 8, ITDB_IPOD_MODEL_IPHONE_BLACK, ITDB_IPOD_GENERATION_IPHONE_2, 50}, |
| {"B500", 16, ITDB_IPOD_MODEL_IPHONE_WHITE, ITDB_IPOD_GENERATION_IPHONE_2, 50}, |
| {"B048", 16, ITDB_IPOD_MODEL_IPHONE_BLACK, ITDB_IPOD_GENERATION_IPHONE_2, 50}, |
| {"B496", 16, ITDB_IPOD_MODEL_IPHONE_BLACK, ITDB_IPOD_GENERATION_IPHONE_2, 50}, |
| |
| {"C131", 16, ITDB_IPOD_MODEL_IPHONE_BLACK, ITDB_IPOD_GENERATION_IPHONE_3, 50}, |
| {"C133", 32, ITDB_IPOD_MODEL_IPHONE_BLACK, ITDB_IPOD_GENERATION_IPHONE_3, 50}, |
| {"C134", 32, ITDB_IPOD_MODEL_IPHONE_WHITE, ITDB_IPOD_GENERATION_IPHONE_3, 50}, |
| |
| {"C603", 16, ITDB_IPOD_MODEL_IPHONE_BLACK, ITDB_IPOD_GENERATION_IPHONE_4, 50}, |
| {"C605", 32, ITDB_IPOD_MODEL_IPHONE_BLACK, ITDB_IPOD_GENERATION_IPHONE_4, 50}, |
| |
| |
| {"B292", 16, ITDB_IPOD_MODEL_IPAD, ITDB_IPOD_GENERATION_IPAD_1, 50}, |
| {"B293", 32, ITDB_IPOD_MODEL_IPAD, ITDB_IPOD_GENERATION_IPAD_1, 50}, |
| {"B294", 64, ITDB_IPOD_MODEL_IPAD, ITDB_IPOD_GENERATION_IPAD_1, 50}, |
| |
| {"C349", 16, ITDB_IPOD_MODEL_IPAD, ITDB_IPOD_GENERATION_IPAD_1, 50}, |
| {"C496", 32, ITDB_IPOD_MODEL_IPAD, ITDB_IPOD_GENERATION_IPAD_1, 50}, |
| {"C497", 64, ITDB_IPOD_MODEL_IPAD, ITDB_IPOD_GENERATION_IPAD_1, 50}, |
| |
| |
| |
| |
| |
| {"mobile1", -1, ITDB_IPOD_MODEL_MOBILE_1, ITDB_IPOD_GENERATION_MOBILE, 6}, |
| |
| {NULL, 0, 0, 0, 0} |
| }; |
| |
| |
| |
| static const gchar *ipod_model_name_table [] = { |
| N_("Invalid"), |
| N_("Unknown"), |
| N_("Color"), |
| N_("Color U2"), |
| N_("Grayscale"), |
| N_("Grayscale U2"), |
| N_("Mini (Silver)"), |
| N_("Mini (Blue)"), |
| N_("Mini (Pink)"), |
| N_("Mini (Green)"), |
| N_("Mini (Gold)"), |
| N_("Shuffle"), |
| N_("Nano (White)"), |
| N_("Nano (Black)"), |
| N_("Video (White)"), |
| N_("Video (Black)"), |
| N_("Mobile (1)"), |
| N_("Video U2"), |
| N_("Nano (Silver)"), |
| N_("Nano (Blue)"), |
| N_("Nano (Green)"), |
| N_("Nano (Pink)"), |
| N_("Nano (Red)"), |
| N_("Nano (Yellow)"), |
| N_("Nano (Purple)"), |
| N_("Nano (Orange)"), |
| N_("iPhone (1)"), |
| N_("Shuffle (Silver)"), |
| N_("Shuffle (Pink)"), |
| N_("Shuffle (Blue)"), |
| N_("Shuffle (Green)"), |
| N_("Shuffle (Orange)"), |
| N_("Shuffle (Purple)"), |
| N_("Shuffle (Red)"), |
| N_("Classic (Silver)"), |
| N_("Classic (Black)"), |
| N_("Touch (Silver)"), |
| N_("Shuffle (Black)"), |
| N_("iPhone (White)"), |
| N_("iPhone (Black)"), |
| N_("Shuffle (Gold)"), |
| N_("Shuffle (Stainless)"), |
| N_("iPad"), |
| NULL |
| }; |
| |
| |
| static const gchar *ipod_generation_name_table [] = { |
| N_("Unknown"), |
| N_("Regular (1st Gen.)"), |
| N_("Regular (2nd Gen.)"), |
| N_("Regular (3rd Gen.)"), |
| N_("Regular (4th Gen.)"), |
| N_("Photo"), |
| N_("Mobile Phones"), |
| N_("Mini (1st Gen.)"), |
| N_("Mini (2nd Gen.)"), |
| N_("Shuffle (1st Gen.)"), |
| N_("Shuffle (2nd Gen.)"), |
| N_("Shuffle (3rd Gen.)"), |
| N_("Nano (1st Gen.)"), |
| N_("Nano (2nd Gen.)"), |
| N_("Nano Video (3rd Gen.)"), |
| N_("Nano Video (4th Gen.)"), |
| N_("Video (1st Gen.)"), |
| N_("Video (2nd Gen.)"), |
| N_("Classic"), |
| N_("Classic"), |
| N_("Touch"), |
| N_("iPhone"), |
| N_("Shuffle (4th Gen.)"), |
| N_("Touch (2nd Gen.)"), |
| N_("iPhone 3G"), |
| N_("iPhone 3GS"), |
| N_("Classic"), |
| N_("Nano with camera (5th Gen.)"), |
| N_("Touch (3rd Gen.)"), |
| N_("iPad"), |
| N_("iPhone 4"), |
| N_("Touch (4th Gen.)"), |
| N_("Nano touch (6th Gen.)"), |
| NULL |
| }; |
| |
| |
| static const Itdb_ArtworkFormat ipod_photo_cover_art_info[] = { |
| {1017, 56, 56, THUMB_FORMAT_RGB565_LE}, |
| {1016, 140, 140, THUMB_FORMAT_RGB565_LE}, |
| { -1, -1, -1, -1} |
| }; |
| |
| static const Itdb_ArtworkFormat ipod_photo_photo_info[] = { |
| {1009, 42, 30, THUMB_FORMAT_RGB565_LE}, |
| {1015, 130, 88, THUMB_FORMAT_RGB565_LE}, |
| {1013, 220, 176, THUMB_FORMAT_RGB565_BE_90}, |
| {1019, 720, 480, THUMB_FORMAT_UYVY_BE}, |
| { -1, -1, -1, -1} |
| }; |
| |
| static const Itdb_ArtworkFormat ipod_nano_cover_art_info[] = { |
| {1031, 42, 42, THUMB_FORMAT_RGB565_LE}, |
| {1027, 100, 100, THUMB_FORMAT_RGB565_LE}, |
| { -1, -1, -1, -1} |
| }; |
| |
| static const Itdb_ArtworkFormat ipod_nano_photo_info[] = { |
| {1032, 42, 37, THUMB_FORMAT_RGB565_LE}, |
| {1023, 176, 132, THUMB_FORMAT_RGB565_BE}, |
| { -1, -1, -1, -1} |
| }; |
| |
| static const Itdb_ArtworkFormat ipod_nano4g_cover_art_info[] = { |
| {1055, 128, 128, THUMB_FORMAT_RGB565_LE}, |
| {1068, 128, 128, THUMB_FORMAT_RGB565_LE}, |
| {1071, 240, 240, THUMB_FORMAT_RGB565_LE}, |
| {1074, 50, 50, THUMB_FORMAT_RGB565_LE}, |
| {1078, 80, 80, THUMB_FORMAT_RGB565_LE}, |
| {1084, 240, 240, THUMB_FORMAT_RGB565_LE}, |
| { -1, -1, -1, -1} |
| }; |
| |
| static const Itdb_ArtworkFormat ipod_nano4g_photo_info[] = { |
| {1024, 320, 240, THUMB_FORMAT_RGB565_LE}, |
| {1066, 64, 64, THUMB_FORMAT_RGB565_LE}, |
| {1079, 80, 80, THUMB_FORMAT_RGB565_LE}, |
| |
| |
| |
| |
| {1083, 240, 320, THUMB_FORMAT_RGB565_LE}, |
| { -1, -1, -1, -1} |
| }; |
| |
| static const Itdb_ArtworkFormat ipod_nano4g_chapter_image_info[] = { |
| {1071, 240, 240, THUMB_FORMAT_RGB565_LE}, |
| }; |
| |
| static const Itdb_ArtworkFormat ipod_nano5g_cover_art_info[] = { |
| {1056, 128, 128, THUMB_FORMAT_RGB565_LE}, |
| {1078, 80, 80, THUMB_FORMAT_RGB565_LE}, |
| {1073, 240, 240, THUMB_FORMAT_RGB565_LE}, |
| {1074, 50, 50, THUMB_FORMAT_RGB565_LE}, |
| { -1, -1, -1, -1} |
| }; |
| |
| static const Itdb_ArtworkFormat ipod_nano5g_photo_info[] = { |
| {1087, 384, 384, THUMB_FORMAT_RGB565_LE}, |
| |
| |
| |
| |
| {1079, 80, 80, THUMB_FORMAT_RGB565_LE}, |
| {1066, 64, 64, THUMB_FORMAT_RGB565_LE}, |
| { -1, -1, -1, -1} |
| }; |
| |
| static const Itdb_ArtworkFormat ipod_video_cover_art_info[] = { |
| {1028, 100, 100, THUMB_FORMAT_RGB565_LE}, |
| {1029, 200, 200, THUMB_FORMAT_RGB565_LE}, |
| { -1, -1, -1, -1} |
| }; |
| |
| static const Itdb_ArtworkFormat ipod_video_photo_info[] = { |
| {1036, 50, 41, THUMB_FORMAT_RGB565_LE}, |
| {1015, 130, 88, THUMB_FORMAT_RGB565_LE}, |
| {1024, 320, 240, THUMB_FORMAT_RGB565_LE}, |
| {1019, 720, 480, THUMB_FORMAT_UYVY_BE}, |
| { -1, -1, -1, -1} |
| }; |
| |
| static const Itdb_ArtworkFormat ipod_mobile_1_cover_art_info[] = { |
| {2002, 50, 50, THUMB_FORMAT_RGB565_BE}, |
| {2003, 150, 150, THUMB_FORMAT_RGB565_BE}, |
| { -1, -1, -1, -1} |
| }; |
| |
| static const Itdb_ArtworkFormat ipod_touch_1_cover_art_info[] = { |
| {3001, 256, 256, THUMB_FORMAT_REC_RGB555_LE}, |
| {3002, 128, 128, THUMB_FORMAT_REC_RGB555_LE}, |
| {3003, 64, 64, THUMB_FORMAT_REC_RGB555_LE}, |
| {3005, 320, 320, THUMB_FORMAT_RGB555_LE}, |
| {3006, 56, 56, THUMB_FORMAT_RGB555_LE, 8192}, |
| {3007, 88, 88, THUMB_FORMAT_RGB555_LE, 16384}, |
| { -1, -1, -1, -1} |
| }; |
| |
| static const Itdb_ArtworkFormat ipod_touch_1_photo_info[] = { |
| |
| |
| |
| {3004, 56, 55, THUMB_FORMAT_RGB555_LE, 8192, TRUE}, |
| |
| |
| |
| {3011, 80, 79, THUMB_FORMAT_RGB555_LE, 0, TRUE}, |
| {3009, 160, 120, THUMB_FORMAT_RGB555_LE}, |
| |
| |
| |
| |
| {3008, 640, 480, THUMB_FORMAT_RGB555_LE}, |
| { -1, -1, -1, -1} |
| }; |
| |
| |
| static const Itdb_ArtworkFormat ipod_classic_1_cover_art_info[] = { |
| |
| {1061, 56, 56, THUMB_FORMAT_RGB565_LE}, |
| {1055, 128, 128, THUMB_FORMAT_RGB565_LE}, |
| {1068, 128, 128, THUMB_FORMAT_RGB565_LE}, |
| {1060, 320, 320, THUMB_FORMAT_RGB565_LE}, |
| { -1, -1, -1, -1} |
| }; |
| |
| |
| static const Itdb_ArtworkFormat ipod_classic_1_photo_info[] = { |
| {1067, 720, 480, THUMB_FORMAT_I420_LE}, |
| {1024, 320, 240, THUMB_FORMAT_RGB565_LE}, |
| {1066, 64, 64, THUMB_FORMAT_RGB565_LE}, |
| { -1, -1, -1, -1} |
| }; |
| |
| |
| static const Itdb_ArtworkFormat ipod_classic_1_chapter_image_info[] = { |
| |
| |
| {1055, 128, 128, THUMB_FORMAT_RGB565_LE}, |
| {1029, 200, 200, THUMB_FORMAT_RGB565_LE}, |
| { -1, -1, -1, -1} |
| }; |
| |
| enum ArtworkType { |
| ARTWORK_TYPE_COVER_ART, |
| ARTWORK_TYPE_PHOTO, |
| ARTWORK_TYPE_CHAPTER_IMAGE |
| }; |
| |
| struct _ArtworkCapabilities { |
| Itdb_IpodGeneration generation; |
| const Itdb_ArtworkFormat *cover_art_formats; |
| const Itdb_ArtworkFormat *photo_formats; |
| const Itdb_ArtworkFormat *chapter_image_formats; |
| }; |
| typedef struct _ArtworkCapabilities ArtworkCapabilities; |
| |
| static const ArtworkCapabilities ipod_artwork_capabilities[] = { |
| { ITDB_IPOD_GENERATION_PHOTO, ipod_photo_cover_art_info, ipod_photo_photo_info, NULL }, |
| { ITDB_IPOD_GENERATION_VIDEO_1, ipod_video_cover_art_info, ipod_video_photo_info, NULL }, |
| { ITDB_IPOD_GENERATION_VIDEO_2, ipod_video_cover_art_info, ipod_video_photo_info, NULL }, |
| { ITDB_IPOD_GENERATION_NANO_1, ipod_nano_cover_art_info, ipod_nano_photo_info, NULL }, |
| { ITDB_IPOD_GENERATION_NANO_2, ipod_nano_cover_art_info, ipod_nano_photo_info, NULL }, |
| { ITDB_IPOD_GENERATION_NANO_3, ipod_classic_1_cover_art_info, ipod_classic_1_photo_info, ipod_classic_1_chapter_image_info }, |
| { ITDB_IPOD_GENERATION_NANO_4, ipod_nano4g_cover_art_info, ipod_nano4g_photo_info, ipod_nano4g_chapter_image_info }, |
| { ITDB_IPOD_GENERATION_NANO_5, ipod_nano5g_cover_art_info, ipod_nano5g_photo_info, NULL }, |
| { ITDB_IPOD_GENERATION_CLASSIC_1, ipod_classic_1_cover_art_info, ipod_classic_1_photo_info, ipod_classic_1_chapter_image_info }, |
| { ITDB_IPOD_GENERATION_CLASSIC_2, ipod_classic_1_cover_art_info, ipod_classic_1_photo_info, ipod_classic_1_chapter_image_info }, |
| { ITDB_IPOD_GENERATION_CLASSIC_3, ipod_classic_1_cover_art_info, ipod_classic_1_photo_info, ipod_classic_1_chapter_image_info }, |
| { ITDB_IPOD_GENERATION_TOUCH_1, ipod_touch_1_cover_art_info, ipod_touch_1_photo_info, NULL }, |
| { ITDB_IPOD_GENERATION_TOUCH_2, ipod_touch_1_cover_art_info, ipod_touch_1_photo_info, NULL }, |
| { ITDB_IPOD_GENERATION_TOUCH_3, ipod_touch_1_cover_art_info, ipod_touch_1_photo_info, NULL }, |
| { ITDB_IPOD_GENERATION_IPHONE_1, ipod_touch_1_cover_art_info, ipod_touch_1_photo_info, NULL }, |
| { ITDB_IPOD_GENERATION_IPHONE_2, ipod_touch_1_cover_art_info, ipod_touch_1_photo_info, NULL }, |
| { ITDB_IPOD_GENERATION_IPHONE_3, ipod_touch_1_cover_art_info, ipod_touch_1_photo_info, NULL }, |
| { ITDB_IPOD_GENERATION_MOBILE, ipod_mobile_1_cover_art_info, NULL, NULL }, |
| { ITDB_IPOD_GENERATION_UNKNOWN, NULL, NULL, NULL } |
| }; |
| |
| struct _ItdbSerialToModel { |
| const char *serial; |
| const char *model_number; |
| }; |
| typedef struct _ItdbSerialToModel ItdbSerialToModel; |
| |
| |
| |
| |
| static const ItdbSerialToModel serial_to_model_mapping[] = { |
| { "LG6", "8541" }, |
| { "NAM", "8541" }, |
| { "MJ2", "8541" }, |
| { "ML1", "8709" }, |
| { "MME", "8709" }, |
| { "MMB", "8737" }, |
| { "MMC", "8738" }, |
| { "NGE", "8740" }, |
| { "NGH", "8740" }, |
| { "MMF", "8741" }, |
| { "NLW", "8946" }, |
| { "NRH", "8976" }, |
| { "QQF", "9460" }, |
| { "PQ5", "9244" }, |
| { "PNT", "9244" }, |
| { "NLY", "8948" }, |
| { "NM7", "8948" }, |
| { "PNU", "9245" }, |
| { "PS9", "9282" }, |
| { "Q8U", "9282" }, |
| { "V9V", "9787" }, |
| { "S2X", "9787" }, |
| { "PQ7", "9268" }, |
| { "TDU", "A079" }, |
| { "TDS", "A079" }, |
| { "TM2", "A127" }, |
| { "SAZ", "9830" }, |
| { "SB1", "9830" }, |
| { "SAY", "9829" }, |
| { "R5Q", "9585" }, |
| { "R5R", "9586" }, |
| { "R5T", "9586" }, |
| { "PFW", "9160" }, |
| { "PRC", "9160" }, |
| { "QKL", "9436" }, |
| { "QKQ", "9436" }, |
| { "QKK", "9435" }, |
| { "QKP", "9435" }, |
| { "QKJ", "9434" }, |
| { "QKN", "9434" }, |
| { "QKM", "9437" }, |
| { "QKR", "9437" }, |
| { "S41", "9800" }, |
| { "S4C", "9800" }, |
| { "S43", "9802" }, |
| { "S45", "9804" }, |
| { "S47", "9806" }, |
| { "S4J", "9806" }, |
| { "S42", "9801" }, |
| { "S44", "9803" }, |
| { "S48", "9807" }, |
| { "RS9", "9724" }, |
| { "QGV", "9724" }, |
| { "TSX", "9724" }, |
| { "PFV", "9724" }, |
| { "R80", "9724" }, |
| { "RSA", "9725" }, |
| { "TSY", "9725" }, |
| { "C60", "9725" }, |
| { "VTE", "A546" }, |
| { "VTF", "A546" }, |
| { "XQ5", "A947" }, |
| { "XQS", "A947" }, |
| { "XQV", "A949" }, |
| { "XQX", "A949" }, |
| { "YX7", "A949" }, |
| { "XQY", "A951" }, |
| { "YX8", "A951" }, |
| { "XR1", "A953" }, |
| { "YXA", "B233" }, |
| { "YX6", "B225" }, |
| { "YX7", "B228" }, |
| { "YX9", "B225" }, |
| { "8CQ", "C167" }, |
| { "1ZH", "B518" }, |
| { "UNA", "A350" }, |
| { "UNB", "A350" }, |
| { "UPR", "A352" }, |
| { "UPS", "A352" }, |
| { "SZB", "A004" }, |
| { "SZV", "A004" }, |
| { "SZW", "A004" }, |
| { "SZC", "A005" }, |
| { "SZT", "A005" }, |
| { "TJT", "A099" }, |
| { "TJU", "A099" }, |
| { "TK2", "A107" }, |
| { "TK3", "A107" }, |
| { "VQ5", "A477" }, |
| { "VQ6", "A477" }, |
| { "V8T", "A426" }, |
| { "V8U", "A426" }, |
| { "V8W", "A428" }, |
| { "V8X", "A428" }, |
| { "VQH", "A487" }, |
| { "VQJ", "A487" }, |
| { "VQK", "A489" }, |
| { "VKL", "A489" }, |
| { "WL2", "A725" }, |
| { "WL3", "A725" }, |
| { "X9A", "A726" }, |
| { "X9B", "A726" }, |
| { "VQT", "A497" }, |
| { "VQU", "A497" }, |
| { "Y0P", "A978" }, |
| { "Y0R", "A980" }, |
| { "YXR", "B249" }, |
| { "YXV", "B257" }, |
| { "YXT", "B253" }, |
| { "YXX", "B261" }, |
| { "SZ9", "A002" }, |
| { "WEC", "A002" }, |
| { "WED", "A002" }, |
| { "WEG", "A002" }, |
| { "WEH", "A002" }, |
| { "WEL", "A002" }, |
| { "TXK", "A146" }, |
| { "TXM", "A146" }, |
| { "WEE", "A146" }, |
| { "WEF", "A146" }, |
| { "WEJ", "A146" }, |
| { "WEK", "A146" }, |
| { "SZA", "A003" }, |
| { "SZU", "A003" }, |
| { "TXL", "A147" }, |
| { "TXN", "A147" }, |
| { "V9K", "A444" }, |
| { "V9L", "A444" }, |
| { "WU9", "A444" }, |
| { "VQM", "A446" }, |
| { "V9M", "A446" }, |
| { "V9N", "A446" }, |
| { "WEE", "A446" }, |
| { "V9P", "A448" }, |
| { "V9Q", "A448" }, |
| { "V9R", "A450" }, |
| { "V9S", "A450" }, |
| { "V95", "A450" }, |
| { "V96", "A450" }, |
| { "WUC", "A450" }, |
| { "W9G", "A664" }, |
| { "Y5N", "B029" }, |
| { "YMV", "B147" }, |
| { "YMU", "B145" }, |
| { "YMX", "B150" }, |
| { "2C5", "B562" }, |
| { "2C7", "B565" }, |
| { "9ZS", "C293" }, |
| { "9ZU", "C297" }, |
| |
| { "37P", "B663" }, |
| { "37Q", "B666" }, |
| { "37H", "B654" }, |
| { "1P1", "B480" }, |
| { "37K", "B657" }, |
| { "37L", "B660" }, |
| { "2ME", "B598" }, |
| { "3QS", "B732" }, |
| { "3QT", "B735" }, |
| { "3QU", "B739" }, |
| { "3QW", "B742" }, |
| { "3QX", "B745" }, |
| { "3QY", "B748" }, |
| { "3R0", "B754" }, |
| { "3QZ", "B751" }, |
| { "5B7", "B903" }, |
| { "5B8", "B905" }, |
| { "5B9", "B907" }, |
| { "5BA", "B909" }, |
| { "5BB", "B911" }, |
| { "5BC", "B913" }, |
| { "5BD", "B915" }, |
| { "5BE", "B917" }, |
| { "5BF", "B918" }, |
| |
| { "71V", "C027" }, |
| { "71Y", "C031" }, |
| { "721", "C034" }, |
| { "726", "C037" }, |
| { "72A", "C040" }, |
| { "72F", "C046" }, |
| { "72K", "C049" }, |
| { "72L", "C050" }, |
| |
| { "72Q", "C060" }, |
| { "72R", "C062" }, |
| { "72S", "C064" }, |
| { "72X", "C066" }, |
| { "734", "C068" }, |
| { "738", "C070" }, |
| { "739", "C072" }, |
| { "73A", "C074" }, |
| { "73B", "C075" }, |
| |
| { "CMN", "C525" }, |
| { "DVX", "C688" }, |
| { "DVY", "C689" }, |
| { "DW0", "C690" }, |
| { "DW1", "C691" }, |
| { "DW2", "C692" }, |
| { "DW3", "C693" }, |
| { "CMP", "C526" }, |
| { "DW4", "C694" }, |
| { "DW5", "C695" }, |
| { "DW6", "C696" }, |
| { "DW7", "C697" }, |
| { "DW8", "C698" }, |
| { "DW9", "C699" }, |
| |
| { "A1S", "C306" }, |
| { "A78", "C323" }, |
| { "ALB", "C381" }, |
| { "ALD", "C384" }, |
| { "ALG", "C387" }, |
| { "4NZ", "B867" }, |
| { "891", "C164" }, |
| { "A1L", "C303" }, |
| { "A1U", "C307" }, |
| { "A7B", "C328" }, |
| { "A7D", "C331" }, |
| |
| { "CMJ", "C584" }, |
| { "CMK", "C585" }, |
| { "FDM", "C749" }, |
| { "FDN", "C750" }, |
| { "FDP", "C751" }, |
| |
| { "W4N", "A623" }, |
| { "W4T", "A627" }, |
| { "0JW", "B376" }, |
| { "201", "B528" }, |
| { "203", "B531" }, |
| { "75J", "C086" }, |
| { "6K2", "C008" }, |
| { "6K4", "C011" }, |
| { "CP7", "C540" }, |
| { "CP9", "C544" }, |
| { "CPC", "C547" }, |
| |
| { "VR0", "A501" }, |
| { "WH8", "A712" }, |
| { "0KH", "B384" }, |
| { "Y7H", "B046" }, |
| { "Y7K", "B496" }, |
| { "3NP", "C131" }, |
| { "3NR", "C133" }, |
| { "3NS", "C134" }, |
| { "A4S", "C603" }, |
| { "A4T", "C605" }, |
| |
| { "Z38", "B292" }, |
| { "Z39", "B293" }, |
| { "Z3A", "B294" }, |
| { NULL , NULL } |
| }; |
| |
| static const Itdb_IpodInfo *get_ipod_info_from_model_number (const char *model_number); |
| |
| |
| static void itdb_device_reset_sysinfo (Itdb_Device *device) |
| { |
| if (device->sysinfo) |
| g_hash_table_destroy (device->sysinfo); |
| device->sysinfo = g_hash_table_new_full (g_str_hash, g_str_equal, |
| g_free, g_free); |
| device->sysinfo_changed = FALSE; |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| Itdb_Device *itdb_device_new (void) |
| { |
| Itdb_Device *dev; |
| |
| dev = g_new0 (Itdb_Device, 1); |
| itdb_device_reset_sysinfo (dev); |
| return dev; |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| void itdb_device_free (Itdb_Device *device) |
| { |
| if (device) |
| { |
| g_free (device->mountpoint); |
| if (device->sysinfo) |
| g_hash_table_destroy (device->sysinfo); |
| if (device->sysinfo_extended) |
| itdb_sysinfo_properties_free (device->sysinfo_extended); |
| g_free (device); |
| } |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| void itdb_device_set_mountpoint (Itdb_Device *device, const gchar *mp) |
| { |
| g_return_if_fail (device); |
| |
| g_free (device->mountpoint); |
| device->mountpoint = g_strdup (mp); |
| if (mp) { |
| itdb_device_read_sysinfo (device); |
| itdb_device_set_timezone_info (device); |
| } |
| } |
| |
| static void itdb_device_read_sysinfo_extended (Itdb_Device *device) |
| { |
| const gchar *p_sysinfo_ex[] = {"SysInfoExtended", NULL}; |
| gchar *dev_path, *sysinfo_ex_path; |
| |
| if (device->sysinfo_extended != NULL) { |
| itdb_sysinfo_properties_free (device->sysinfo_extended); |
| device->sysinfo_extended = NULL; |
| } |
| |
| dev_path = itdb_get_device_dir (device->mountpoint); |
| if (!dev_path) return; |
| |
| sysinfo_ex_path = itdb_resolve_path (dev_path, p_sysinfo_ex); |
| g_free (dev_path); |
| if (!sysinfo_ex_path) return; |
| device->sysinfo_extended = itdb_sysinfo_extended_parse (sysinfo_ex_path, NULL); |
| g_free (sysinfo_ex_path); |
| |
| if ((device->sysinfo != NULL) && (device->sysinfo_extended != NULL)) { |
| const char *fwid; |
| fwid = itdb_sysinfo_properties_get_firewire_id (device->sysinfo_extended); |
| if (fwid != NULL) { |
| g_hash_table_insert (device->sysinfo, g_strdup ("FirewireGuid"), |
| g_strdup (fwid)); |
| } |
| } |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| gboolean itdb_device_read_sysinfo (Itdb_Device *device) |
| { |
| const gchar *p_sysinfo[] = {"SysInfo", NULL}; |
| gchar *dev_path, *sysinfo_path; |
| FILE *fd; |
| gboolean result = FALSE; |
| gchar buf[1024]; |
| |
| g_return_val_if_fail (device, FALSE); |
| g_return_val_if_fail (device->mountpoint, FALSE); |
| |
| itdb_device_reset_sysinfo (device); |
| |
| g_return_val_if_fail (device->sysinfo, FALSE); |
| |
| dev_path = itdb_get_device_dir (device->mountpoint); |
| |
| if (!dev_path) return FALSE; |
| |
| sysinfo_path = itdb_resolve_path (dev_path, p_sysinfo); |
| |
| if (sysinfo_path) |
| { |
| fd = fopen (sysinfo_path, "r"); |
| if (fd) |
| { |
| result = TRUE; |
| while(fgets(buf, sizeof(buf), fd)) |
| { |
| gchar *ptr; |
| gint len = strlen (buf); |
| |
| if ((len>0) && (buf[len-1]==0x0a)) |
| { |
| buf[len-1] = 0; |
| --len; |
| } |
| ptr = strchr (buf, ':'); |
| if (ptr && (ptr!=buf)) |
| { |
| *ptr = 0; |
| ++ptr; |
| itdb_device_set_sysinfo (device, |
| buf, g_strstrip(ptr)); |
| } |
| } |
| fclose (fd); |
| } |
| g_free (sysinfo_path); |
| } |
| g_free (dev_path); |
| |
| itdb_device_read_sysinfo_extended (device); |
| |
| |
| device->sysinfo_changed = FALSE; |
| return result; |
| } |
| |
| |
| static void write_sysinfo_entry (const gchar *key, |
| const gchar *value, |
| FILE *file) |
| { |
| fprintf (file, "%s: %s\n", key, value); |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| gboolean itdb_device_write_sysinfo (Itdb_Device *device, GError **error) |
| { |
| gchar *devicedir; |
| gboolean success = FALSE; |
| |
| g_return_val_if_fail (device, FALSE); |
| g_return_val_if_fail (device->mountpoint, FALSE); |
| |
| devicedir = itdb_get_device_dir (device->mountpoint); |
| if (devicedir) |
| { |
| gchar *sysfile = g_build_filename (devicedir, "SysInfo", NULL); |
| FILE *sysinfo = fopen (sysfile, "w"); |
| if (sysinfo) |
| { |
| if (device->sysinfo) |
| { |
| g_hash_table_foreach (device->sysinfo, |
| (GHFunc)write_sysinfo_entry, |
| sysinfo); |
| } |
| fclose (sysinfo); |
| success = TRUE; |
| } |
| else |
| { |
| g_set_error (error, 0, -1, |
| _("Could not open '%s' for writing."), |
| sysfile); |
| } |
| g_free (sysfile); |
| g_free (devicedir); |
| } |
| else |
| { |
| g_set_error (error, 0, -1, |
| _("Device directory does not exist.")); |
| } |
| |
| if (success) |
| device->sysinfo_changed = FALSE; |
| |
| return success; |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| gchar *itdb_device_get_sysinfo (const Itdb_Device *device, const gchar *field) |
| { |
| g_return_val_if_fail (device, NULL); |
| g_return_val_if_fail (device->sysinfo, NULL); |
| g_return_val_if_fail (field, NULL); |
| |
| return g_strdup (g_hash_table_lookup (device->sysinfo, field)); |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| void itdb_device_set_sysinfo (Itdb_Device *device, |
| const gchar *field, const gchar *value) |
| { |
| g_return_if_fail (device); |
| g_return_if_fail (device->sysinfo); |
| g_return_if_fail (field); |
| |
| if (value) |
| { |
| g_hash_table_insert (device->sysinfo, |
| g_strdup (field), g_strdup (value)); |
| } |
| else |
| { |
| g_hash_table_remove (device->sysinfo, field); |
| } |
| device->sysinfo_changed = TRUE; |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| const Itdb_IpodInfo * |
| itdb_device_get_ipod_info (const Itdb_Device *device) |
| { |
| gchar *model_num; |
| const Itdb_IpodInfo *info; |
| |
| if (device->sysinfo_extended != NULL) { |
| const char *serial; |
| |
| serial = itdb_sysinfo_properties_get_serial_number (device->sysinfo_extended); |
| info = itdb_ipod_info_from_serial (serial); |
| if (info != NULL) { |
| return info; |
| } |
| } |
| |
| model_num = itdb_device_get_sysinfo (device, "ModelNumStr"); |
| |
| if (!model_num) |
| return &ipod_info_table[0]; |
| |
| info = get_ipod_info_from_model_number (model_num); |
| g_free(model_num); |
| if (info != NULL) { |
| return info; |
| } else { |
| return &ipod_info_table[1]; |
| } |
| } |
| |
| |
| |
| static const ArtworkCapabilities * |
| itdb_device_get_artwork_capabilities (const Itdb_Device *device) |
| { |
| const Itdb_IpodInfo *info; |
| const ArtworkCapabilities *caps; |
| |
| g_return_val_if_fail (device, NULL); |
| |
| info = itdb_device_get_ipod_info (device); |
| |
| g_return_val_if_fail (info, NULL); |
| caps = ipod_artwork_capabilities; |
| while (caps->generation != ITDB_IPOD_GENERATION_UNKNOWN) { |
| if (caps->generation == info->ipod_generation) { |
| break; |
| } |
| caps++; |
| } |
| |
| if (caps->generation == ITDB_IPOD_GENERATION_UNKNOWN) { |
| return NULL; |
| } |
| |
| return caps; |
| } |
| |
| static GList * |
| itdb_device_get_artwork_formats_fallback (const Itdb_Device *device, |
| enum ArtworkType type) |
| { |
| const ArtworkCapabilities *caps; |
| const Itdb_ArtworkFormat *formats = NULL; |
| const Itdb_ArtworkFormat *it; |
| GList *artwork_formats = NULL; |
| |
| caps = itdb_device_get_artwork_capabilities (device); |
| if (caps == NULL) { |
| return NULL; |
| } |
| switch (type) { |
| case ARTWORK_TYPE_COVER_ART: |
| formats = caps->cover_art_formats; |
| break; |
| case ARTWORK_TYPE_PHOTO: |
| formats = caps->photo_formats; |
| break; |
| case ARTWORK_TYPE_CHAPTER_IMAGE: |
| formats = caps->chapter_image_formats; |
| break; |
| } |
| if (formats == NULL) { |
| return NULL; |
| } |
| |
| for (it = formats; it->format_id != -1; it++) { |
| artwork_formats = g_list_prepend (artwork_formats, (gpointer)it); |
| } |
| |
| return artwork_formats; |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| GList *itdb_device_get_photo_formats (const Itdb_Device *device) |
| { |
| g_return_val_if_fail (device != NULL, NULL); |
| |
| if (device->sysinfo_extended == NULL) { |
| return itdb_device_get_artwork_formats_fallback (device, |
| ARTWORK_TYPE_PHOTO); |
| } else { |
| return g_list_copy ((GList *)itdb_sysinfo_properties_get_photo_formats (device->sysinfo_extended)); |
| } |
| g_return_val_if_reached (NULL); |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| GList *itdb_device_get_cover_art_formats (const Itdb_Device *device) |
| { |
| g_return_val_if_fail (device != NULL, NULL); |
| |
| if (device->sysinfo_extended == NULL) { |
| return itdb_device_get_artwork_formats_fallback (device, |
| ARTWORK_TYPE_COVER_ART); |
| } else { |
| return g_list_copy ((GList *)itdb_sysinfo_properties_get_cover_art_formats (device->sysinfo_extended)); |
| } |
| g_return_val_if_reached (NULL); |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| GList *itdb_device_get_chapter_image_formats (const Itdb_Device *device) |
| { |
| g_return_val_if_fail (device != NULL, NULL); |
| |
| if (device->sysinfo_extended == NULL) { |
| return itdb_device_get_artwork_formats_fallback (device, |
| ARTWORK_TYPE_CHAPTER_IMAGE); |
| } else { |
| return g_list_copy ((GList *)itdb_sysinfo_properties_get_chapter_image_formats (device->sysinfo_extended)); |
| } |
| g_return_val_if_reached (NULL); |
| } |
| |
| G_GNUC_INTERNAL gboolean |
| itdb_device_supports_sqlite_db (const Itdb_Device *device) |
| { |
| if (device->sysinfo_extended != NULL) { |
| return itdb_sysinfo_properties_supports_sqlite (device->sysinfo_extended); |
| } else { |
| const Itdb_IpodInfo *info; |
| info = itdb_device_get_ipod_info (device); |
| switch (info->ipod_generation) { |
| case ITDB_IPOD_GENERATION_UNKNOWN: |
| case ITDB_IPOD_GENERATION_FIRST: |
| case ITDB_IPOD_GENERATION_SECOND: |
| case ITDB_IPOD_GENERATION_THIRD: |
| case ITDB_IPOD_GENERATION_FOURTH: |
| case ITDB_IPOD_GENERATION_PHOTO: |
| case ITDB_IPOD_GENERATION_MOBILE: |
| case ITDB_IPOD_GENERATION_MINI_1: |
| case ITDB_IPOD_GENERATION_MINI_2: |
| case ITDB_IPOD_GENERATION_SHUFFLE_1: |
| case ITDB_IPOD_GENERATION_SHUFFLE_2: |
| case ITDB_IPOD_GENERATION_SHUFFLE_3: |
| case ITDB_IPOD_GENERATION_SHUFFLE_4: |
| case ITDB_IPOD_GENERATION_NANO_1: |
| case ITDB_IPOD_GENERATION_NANO_2: |
| case ITDB_IPOD_GENERATION_VIDEO_1: |
| case ITDB_IPOD_GENERATION_VIDEO_2: |
| case ITDB_IPOD_GENERATION_NANO_3: |
| case ITDB_IPOD_GENERATION_NANO_4: |
| case ITDB_IPOD_GENERATION_CLASSIC_1: |
| case ITDB_IPOD_GENERATION_CLASSIC_2: |
| case ITDB_IPOD_GENERATION_CLASSIC_3: |
| return FALSE; |
| case ITDB_IPOD_GENERATION_NANO_5: |
| case ITDB_IPOD_GENERATION_NANO_6: |
| case ITDB_IPOD_GENERATION_TOUCH_1: |
| case ITDB_IPOD_GENERATION_TOUCH_2: |
| case ITDB_IPOD_GENERATION_TOUCH_3: |
| case ITDB_IPOD_GENERATION_TOUCH_4: |
| case ITDB_IPOD_GENERATION_IPHONE_1: |
| case ITDB_IPOD_GENERATION_IPHONE_2: |
| case ITDB_IPOD_GENERATION_IPHONE_3: |
| case ITDB_IPOD_GENERATION_IPHONE_4: |
| case ITDB_IPOD_GENERATION_IPAD_1: |
| |
| return TRUE; |
| } |
| g_return_val_if_reached (FALSE); |
| } |
| } |
| |
| G_GNUC_INTERNAL gboolean |
| itdb_device_supports_compressed_itunesdb (const Itdb_Device *device) |
| { |
| return itdb_device_supports_sqlite_db (device); |
| } |
| |
| G_GNUC_INTERNAL gboolean |
| itdb_device_supports_sparse_artwork (const Itdb_Device *device) |
| { |
| gboolean supports_sparse_artwork = FALSE; |
| |
| g_return_val_if_fail (device != NULL, FALSE); |
| |
| if (device->sysinfo_extended != NULL) { |
| supports_sparse_artwork = itdb_sysinfo_properties_supports_sparse_artwork (device->sysinfo_extended); |
| } |
| |
| if (supports_sparse_artwork == FALSE) { |
| const Itdb_IpodInfo *info; |
| info = itdb_device_get_ipod_info (device); |
| switch (info->ipod_generation) { |
| case ITDB_IPOD_GENERATION_UNKNOWN: |
| case ITDB_IPOD_GENERATION_FIRST: |
| case ITDB_IPOD_GENERATION_SECOND: |
| case ITDB_IPOD_GENERATION_THIRD: |
| case ITDB_IPOD_GENERATION_FOURTH: |
| case ITDB_IPOD_GENERATION_PHOTO: |
| case ITDB_IPOD_GENERATION_MOBILE: |
| case ITDB_IPOD_GENERATION_MINI_1: |
| case ITDB_IPOD_GENERATION_MINI_2: |
| case ITDB_IPOD_GENERATION_SHUFFLE_1: |
| case ITDB_IPOD_GENERATION_SHUFFLE_2: |
| case ITDB_IPOD_GENERATION_SHUFFLE_3: |
| case ITDB_IPOD_GENERATION_SHUFFLE_4: |
| case ITDB_IPOD_GENERATION_NANO_1: |
| case ITDB_IPOD_GENERATION_NANO_2: |
| case ITDB_IPOD_GENERATION_VIDEO_1: |
| case ITDB_IPOD_GENERATION_VIDEO_2: |
| supports_sparse_artwork = FALSE; |
| break; |
| case ITDB_IPOD_GENERATION_NANO_3: |
| case ITDB_IPOD_GENERATION_NANO_4: |
| case ITDB_IPOD_GENERATION_NANO_5: |
| case ITDB_IPOD_GENERATION_NANO_6: |
| case ITDB_IPOD_GENERATION_CLASSIC_1: |
| case ITDB_IPOD_GENERATION_CLASSIC_2: |
| case ITDB_IPOD_GENERATION_CLASSIC_3: |
| case ITDB_IPOD_GENERATION_TOUCH_1: |
| case ITDB_IPOD_GENERATION_TOUCH_2: |
| case ITDB_IPOD_GENERATION_TOUCH_3: |
| case ITDB_IPOD_GENERATION_TOUCH_4: |
| case ITDB_IPOD_GENERATION_IPHONE_1: |
| case ITDB_IPOD_GENERATION_IPHONE_2: |
| case ITDB_IPOD_GENERATION_IPHONE_3: |
| case ITDB_IPOD_GENERATION_IPHONE_4: |
| case ITDB_IPOD_GENERATION_IPAD_1: |
| supports_sparse_artwork = TRUE; |
| break; |
| } |
| } |
| return supports_sparse_artwork; |
| } |
| |
| |
| G_GNUC_INTERNAL gint |
| itdb_musicdirs_number_by_mountpoint (const gchar *mountpoint) |
| { |
| gint dir_num; |
| gchar *music_dir = itdb_get_music_dir (mountpoint); |
| |
| if (!music_dir) return 0; |
| |
| |
| for (dir_num=0; ;++dir_num) |
| { |
| gchar *dir_filename; |
| gchar dir_num_str[6]; |
| |
| g_snprintf (dir_num_str, 6, "F%02d", dir_num); |
| |
| dir_filename = itdb_get_path (music_dir, dir_num_str); |
| |
| g_free (dir_filename); |
| if (!dir_filename) break; |
| } |
| |
| g_free (music_dir); |
| |
| return dir_num; |
| } |
| |
| |
| |
| |
| |
| |
| |
| G_GNUC_INTERNAL gint |
| itdb_device_musicdirs_number (Itdb_Device *device) |
| { |
| g_return_val_if_fail (device, 0); |
| |
| if (device->musicdirs <= 0) |
| { |
| device->musicdirs = itdb_musicdirs_number_by_mountpoint (device->mountpoint); |
| } |
| return device->musicdirs; |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| static guint endianess_check_path (const gchar *path, const gchar *hdr) |
| { |
| guint byte_order = 0; |
| |
| if (path) |
| { |
| int fd = open (path, O_RDONLY); |
| if (fd != -1) |
| { |
| gchar buf[4]; |
| if (read (fd, buf, 4) == 4) |
| { |
| if (strncmp (buf, hdr, 4) == 0) |
| { |
| byte_order = G_LITTLE_ENDIAN; |
| } |
| else |
| { |
| if ((buf[0] == hdr[3]) && |
| (buf[1] == hdr[2]) && |
| (buf[2] == hdr[1]) && |
| (buf[3] == hdr[0])) |
| { |
| byte_order = G_BIG_ENDIAN; |
| } |
| } |
| } |
| close (fd); |
| } |
| } |
| return byte_order; |
| } |
| |
| |
| |
| |
| |
| |
| G_GNUC_INTERNAL void |
| itdb_device_autodetect_endianess (Itdb_Device *device) |
| { |
| guint byte_order = 0; |
| |
| g_return_if_fail (device); |
| |
| if (device->mountpoint) |
| { |
| gchar *path; |
| if (byte_order == 0) |
| { |
| |
| path = itdb_get_itunesdb_path (device->mountpoint); |
| byte_order = endianess_check_path (path, "mhbd"); |
| g_free (path); |
| } |
| if (byte_order == 0) |
| { |
| |
| path = itdb_get_artworkdb_path (device->mountpoint); |
| byte_order = endianess_check_path (path, "mhfd"); |
| g_free (path); |
| } |
| if (byte_order == 0) |
| { |
| |
| path = itdb_get_photodb_path (device->mountpoint); |
| byte_order = endianess_check_path (path, "mhfd"); |
| g_free (path); |
| } |
| if (byte_order == 0) |
| { |
| gchar *control_dir = itdb_get_control_dir (device->mountpoint); |
| if (control_dir) |
| { |
| gchar *cd_l = g_ascii_strdown (control_dir, -1); |
| |
| if (strstr (cd_l, "itunes/itunes_control") == |
| (cd_l + strlen (cd_l) - strlen ("itunes/itunes_control"))) |
| { |
| byte_order = G_BIG_ENDIAN; |
| } |
| g_free (cd_l); |
| g_free (control_dir); |
| } |
| } |
| } |
| |
| |
| if (byte_order == 0) |
| byte_order = G_LITTLE_ENDIAN; |
| |
| device->byte_order = byte_order; |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| const Itdb_IpodInfo *itdb_info_get_ipod_info_table (void) |
| { |
| return &ipod_info_table[2]; |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| const gchar *itdb_info_get_ipod_model_name_string (Itdb_IpodModel model) |
| { |
| gint i=0; |
| |
| |
| |
| while (ipod_model_name_table[i]) |
| { |
| if (i==model) return _(ipod_model_name_table[i]); |
| ++i; |
| } |
| return NULL; |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| const gchar *itdb_info_get_ipod_generation_string (Itdb_IpodGeneration generation) |
| { |
| gint i=0; |
| |
| |
| |
| while (ipod_generation_name_table[i]) |
| { |
| if (i==generation) |
| return _(ipod_generation_name_table[i]); |
| ++i; |
| } |
| return NULL; |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| gboolean itdb_device_supports_artwork (const Itdb_Device *device) |
| { |
| GList *formats; |
| if (device == NULL) { |
| return FALSE; |
| } |
| formats = itdb_device_get_cover_art_formats (device); |
| g_list_free (formats); |
| return (formats != NULL); |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| gboolean itdb_device_supports_video (const Itdb_Device *device) |
| { |
| const Itdb_IpodInfo *info; |
| if (device == NULL) { |
| return FALSE; |
| } |
| |
| info = itdb_device_get_ipod_info (device); |
| switch (info->ipod_generation) { |
| case ITDB_IPOD_GENERATION_UNKNOWN: |
| case ITDB_IPOD_GENERATION_FIRST: |
| case ITDB_IPOD_GENERATION_SECOND: |
| case ITDB_IPOD_GENERATION_THIRD: |
| case ITDB_IPOD_GENERATION_FOURTH: |
| case ITDB_IPOD_GENERATION_PHOTO: |
| case ITDB_IPOD_GENERATION_MOBILE: |
| case ITDB_IPOD_GENERATION_MINI_1: |
| case ITDB_IPOD_GENERATION_MINI_2: |
| case ITDB_IPOD_GENERATION_SHUFFLE_1: |
| case ITDB_IPOD_GENERATION_SHUFFLE_2: |
| case ITDB_IPOD_GENERATION_SHUFFLE_3: |
| case ITDB_IPOD_GENERATION_SHUFFLE_4: |
| case ITDB_IPOD_GENERATION_NANO_1: |
| case ITDB_IPOD_GENERATION_NANO_2: |
| case ITDB_IPOD_GENERATION_NANO_6: |
| return FALSE; |
| case ITDB_IPOD_GENERATION_NANO_3: |
| case ITDB_IPOD_GENERATION_NANO_4: |
| case ITDB_IPOD_GENERATION_NANO_5: |
| case ITDB_IPOD_GENERATION_VIDEO_1: |
| case ITDB_IPOD_GENERATION_VIDEO_2: |
| case ITDB_IPOD_GENERATION_CLASSIC_1: |
| case ITDB_IPOD_GENERATION_CLASSIC_2: |
| case ITDB_IPOD_GENERATION_CLASSIC_3: |
| case ITDB_IPOD_GENERATION_TOUCH_1: |
| case ITDB_IPOD_GENERATION_TOUCH_2: |
| case ITDB_IPOD_GENERATION_TOUCH_3: |
| case ITDB_IPOD_GENERATION_TOUCH_4: |
| case ITDB_IPOD_GENERATION_IPHONE_1: |
| case ITDB_IPOD_GENERATION_IPHONE_2: |
| case ITDB_IPOD_GENERATION_IPHONE_3: |
| case ITDB_IPOD_GENERATION_IPHONE_4: |
| case ITDB_IPOD_GENERATION_IPAD_1: |
| return TRUE; |
| } |
| g_return_val_if_reached (FALSE); |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| gboolean itdb_device_supports_photo (const Itdb_Device *device) |
| { |
| GList *formats; |
| if (device == NULL) { |
| return FALSE; |
| } |
| formats = itdb_device_get_photo_formats (device); |
| g_list_free (formats); |
| return (formats != NULL); |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| gboolean itdb_device_supports_chapter_image (const Itdb_Device *device) |
| { |
| GList *formats; |
| if (device == NULL) { |
| return FALSE; |
| } |
| formats = itdb_device_get_chapter_image_formats (device); |
| g_list_free (formats); |
| return (formats != NULL); |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| const char *itdb_device_get_firewire_id (const Itdb_Device *device) |
| { |
| if (device->sysinfo_extended != NULL) { |
| return itdb_sysinfo_properties_get_firewire_id (device->sysinfo_extended); |
| } |
| |
| return g_hash_table_lookup (device->sysinfo, "FirewireGuid"); |
| } |
| |
| gchar *itdb_device_get_uuid(const Itdb_Device *device) |
| { |
| return g_hash_table_lookup (device->sysinfo, "FirewireGuid"); |
| } |
| |
| static int ord_from_hex_char(const char c) |
| { |
| if ('0' <= c && c <= '9') |
| return c - '0'; |
| else if ('a' <= c && c <= 'f') |
| return 10 + (c - 'a'); |
| else if ('A' <= c && c <= 'F') |
| return 10 + (c - 'A'); |
| else |
| return -1; |
| } |
| |
| static int |
| itdb_hex_from_string(unsigned char *dest, const int array_size, const char *s) |
| { |
| |
| if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X')) |
| s += 2; |
| |
| if (strlen(s) > array_size*2) |
| return -8; |
| |
| do { |
| int low, high; |
| if((high = ord_from_hex_char(s[0])) == -1 || |
| (low = ord_from_hex_char(s[1])) == -1) |
| return -9; |
| *dest++ = high<<4 | low; |
| } while(*(s+=2)); |
| return 0; |
| } |
| |
| gboolean itdb_device_get_hex_uuid (const Itdb_Device *device, unsigned char uuid[20]) |
| { |
| const char *uuid_str; |
| int result; |
| |
| uuid_str = itdb_device_get_firewire_id (device); |
| if (uuid_str == NULL) { |
| return FALSE; |
| } |
| memset (uuid, 0, 20); |
| result = itdb_hex_from_string (uuid, 20, uuid_str); |
| |
| return (result == 0); |
| } |
| |
| ItdbChecksumType itdb_device_get_checksum_type (const Itdb_Device *device) |
| { |
| |
| if (device == NULL) { |
| return ITDB_CHECKSUM_NONE; |
| } |
| |
| if (device->sysinfo_extended != NULL) { |
| gint db_version; |
| db_version = itdb_sysinfo_properties_get_db_version (device->sysinfo_extended); |
| switch (db_version) { |
| case 0: |
| case 1: |
| case 2: |
| return ITDB_CHECKSUM_NONE; |
| case 3: |
| return ITDB_CHECKSUM_HASH58; |
| case 4: |
| return ITDB_CHECKSUM_HASH72; |
| case 5: |
| return ITDB_CHECKSUM_HASHAB; |
| default: |
| return ITDB_CHECKSUM_UNKNOWN; |
| } |
| } else { |
| const Itdb_IpodInfo *info; |
| info = itdb_device_get_ipod_info (device); |
| if (info == NULL) { |
| return ITDB_CHECKSUM_NONE; |
| } |
| |
| switch (info->ipod_generation) { |
| case ITDB_IPOD_GENERATION_CLASSIC_1: |
| case ITDB_IPOD_GENERATION_CLASSIC_2: |
| case ITDB_IPOD_GENERATION_CLASSIC_3: |
| case ITDB_IPOD_GENERATION_NANO_3: |
| case ITDB_IPOD_GENERATION_NANO_4: |
| return ITDB_CHECKSUM_HASH58; |
| |
| case ITDB_IPOD_GENERATION_NANO_5: |
| case ITDB_IPOD_GENERATION_TOUCH_1: |
| case ITDB_IPOD_GENERATION_TOUCH_2: |
| case ITDB_IPOD_GENERATION_TOUCH_3: |
| case ITDB_IPOD_GENERATION_IPHONE_1: |
| case ITDB_IPOD_GENERATION_IPHONE_2: |
| case ITDB_IPOD_GENERATION_IPHONE_3: |
| return ITDB_CHECKSUM_HASH72; |
| |
| case ITDB_IPOD_GENERATION_IPAD_1: |
| case ITDB_IPOD_GENERATION_IPHONE_4: |
| case ITDB_IPOD_GENERATION_TOUCH_4: |
| case ITDB_IPOD_GENERATION_NANO_6: |
| return ITDB_CHECKSUM_HASHAB; |
| |
| case ITDB_IPOD_GENERATION_UNKNOWN: |
| case ITDB_IPOD_GENERATION_FIRST: |
| case ITDB_IPOD_GENERATION_SECOND: |
| case ITDB_IPOD_GENERATION_THIRD: |
| case ITDB_IPOD_GENERATION_FOURTH: |
| case ITDB_IPOD_GENERATION_PHOTO: |
| case ITDB_IPOD_GENERATION_MOBILE: |
| case ITDB_IPOD_GENERATION_MINI_1: |
| case ITDB_IPOD_GENERATION_MINI_2: |
| case ITDB_IPOD_GENERATION_SHUFFLE_1: |
| case ITDB_IPOD_GENERATION_SHUFFLE_2: |
| case ITDB_IPOD_GENERATION_SHUFFLE_3: |
| case ITDB_IPOD_GENERATION_SHUFFLE_4: |
| case ITDB_IPOD_GENERATION_NANO_1: |
| case ITDB_IPOD_GENERATION_NANO_2: |
| case ITDB_IPOD_GENERATION_VIDEO_1: |
| case ITDB_IPOD_GENERATION_VIDEO_2: |
| return ITDB_CHECKSUM_NONE; |
| } |
| } |
| |
| return ITDB_CHECKSUM_NONE; |
| } |
| |
| G_GNUC_INTERNAL gboolean itdb_device_write_checksum (Itdb_Device *device, |
| unsigned char *itdb_data, |
| gsize itdb_len, |
| GError **error) |
| { |
| switch (itdb_device_get_checksum_type (device)) { |
| case ITDB_CHECKSUM_NONE: |
| return TRUE; |
| case ITDB_CHECKSUM_HASH58: |
| return itdb_hash58_write_hash (device, itdb_data, itdb_len, error); |
| case ITDB_CHECKSUM_HASH72: |
| return itdb_hash72_write_hash (device, itdb_data, itdb_len, error); |
| case ITDB_CHECKSUM_HASHAB: |
| return itdb_hashAB_write_hash (device, itdb_data, itdb_len, error); |
| case ITDB_CHECKSUM_UNKNOWN: |
| g_set_error (error, 0, -1, "Unsupported checksum type"); |
| return FALSE; |
| } |
| g_assert_not_reached (); |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| gboolean itdb_device_get_storage_info (Itdb_Device *device, guint64 *capacity, guint64 *free) |
| { |
| |
| ULARGE_INTEGER u_free, u_capacity; |
| |
| struct statvfs info; |
| guint64 block_size; |
| |
| |
| g_return_val_if_fail (device, FALSE); |
| g_return_val_if_fail (capacity, FALSE); |
| g_return_val_if_fail (free, FALSE); |
| |
| |
| if (GetDiskFreeSpaceEx(device->mountpoint, &u_free, &u_capacity, NULL) == 0) { |
| return FALSE; |
| } |
| *free = u_free.QuadPart; |
| *capacity = u_capacity.QuadPart; |
| return TRUE; |
| |
| if (statvfs(device->mountpoint, &info)) |
| return FALSE; |
| |
| if (info.f_frsize > 0) |
| block_size = info.f_frsize; |
| else |
| block_size = info.f_bsize; |
| |
| *capacity = info.f_blocks * block_size; |
| *free = info.f_bfree * block_size; |
| |
| return TRUE; |
| |
| } |
| |
| struct IpodModelTable { |
| GHashTable *serial_hash; |
| GHashTable *model_number_hash; |
| }; |
| |
| static struct IpodModelTable *init_ipod_model_table (void) |
| { |
| const Itdb_IpodInfo *it; |
| struct IpodModelTable *model_table; |
| const ItdbSerialToModel *serial_it; |
| |
| model_table = g_new0 (struct IpodModelTable, 1); |
| model_table->serial_hash = g_hash_table_new (g_str_hash, g_str_equal); |
| model_table->model_number_hash = g_hash_table_new (g_str_hash, g_str_equal); |
| |
| for (it = itdb_info_get_ipod_info_table (); |
| it->model_number != NULL; |
| it++) { |
| g_hash_table_insert (model_table->model_number_hash, |
| (gpointer)it->model_number, (gpointer)it); |
| } |
| |
| for (serial_it = serial_to_model_mapping; |
| serial_it->serial != NULL; |
| serial_it++) { |
| gpointer model_info; |
| model_info = g_hash_table_lookup (model_table->model_number_hash, |
| serial_it->model_number); |
| if (model_info != NULL) { |
| g_hash_table_insert (model_table->serial_hash, |
| (gpointer)serial_it->serial, model_info); |
| } else { |
| g_warning ("Inconsistent ipod model tables, model info is missing for %s (serial %s)", |
| serial_it->model_number, serial_it->serial); |
| } |
| } |
| |
| return model_table; |
| } |
| |
| static struct IpodModelTable *get_model_table (void) |
| { |
| static GOnce my_once = G_ONCE_INIT; |
| |
| g_once (&my_once, (GThreadFunc)init_ipod_model_table, NULL); |
| |
| return my_once.retval; |
| } |
| |
| static const Itdb_IpodInfo * |
| get_ipod_info_from_model_number (const char *model_number) |
| { |
| struct IpodModelTable *model_table; |
| |
| g_return_val_if_fail (model_number != NULL, NULL); |
| |
| model_table = get_model_table (); |
| if(isalpha(model_number[0])) { |
| model_number++; |
| } |
| return g_hash_table_lookup (model_table->model_number_hash, model_number); |
| } |
| |
| const Itdb_IpodInfo * |
| itdb_ipod_info_from_serial (const char *serial) |
| { |
| struct IpodModelTable *model_table; |
| glong len; |
| |
| g_return_val_if_fail (serial != NULL, NULL); |
| |
| len = strlen (serial); |
| if (len < 3) { |
| return NULL; |
| } |
| model_table = get_model_table (); |
| |
| |
| |
| return g_hash_table_lookup (model_table->serial_hash, serial+len-3); |
| } |
| |
| GQuark itdb_device_error_quark (void) |
| { |
| static GQuark quark = 0; |
| if (!quark) { |
| quark = g_quark_from_static_string ("itdb-device-error-quark"); |
| } |
| return quark; |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| gboolean |
| itdb_device_supports_podcast (const Itdb_Device *device) |
| { |
| if (device->sysinfo_extended != NULL) { |
| return itdb_sysinfo_properties_supports_podcast (device->sysinfo_extended); |
| } else { |
| const Itdb_IpodInfo *info; |
| |
| info = itdb_device_get_ipod_info (device); |
| switch (info->ipod_generation) { |
| case ITDB_IPOD_GENERATION_UNKNOWN: |
| case ITDB_IPOD_GENERATION_FIRST: |
| case ITDB_IPOD_GENERATION_SECOND: |
| case ITDB_IPOD_GENERATION_THIRD: |
| case ITDB_IPOD_GENERATION_MOBILE: |
| return FALSE; |
| case ITDB_IPOD_GENERATION_FOURTH: |
| case ITDB_IPOD_GENERATION_PHOTO: |
| case ITDB_IPOD_GENERATION_MINI_1: |
| case ITDB_IPOD_GENERATION_MINI_2: |
| case ITDB_IPOD_GENERATION_NANO_1: |
| case ITDB_IPOD_GENERATION_NANO_2: |
| case ITDB_IPOD_GENERATION_NANO_3: |
| case ITDB_IPOD_GENERATION_NANO_4: |
| case ITDB_IPOD_GENERATION_NANO_5: |
| case ITDB_IPOD_GENERATION_NANO_6: |
| case ITDB_IPOD_GENERATION_SHUFFLE_1: |
| case ITDB_IPOD_GENERATION_SHUFFLE_2: |
| case ITDB_IPOD_GENERATION_SHUFFLE_3: |
| case ITDB_IPOD_GENERATION_SHUFFLE_4: |
| case ITDB_IPOD_GENERATION_VIDEO_1: |
| case ITDB_IPOD_GENERATION_VIDEO_2: |
| case ITDB_IPOD_GENERATION_CLASSIC_1: |
| case ITDB_IPOD_GENERATION_CLASSIC_2: |
| case ITDB_IPOD_GENERATION_CLASSIC_3: |
| case ITDB_IPOD_GENERATION_TOUCH_1: |
| case ITDB_IPOD_GENERATION_TOUCH_2: |
| case ITDB_IPOD_GENERATION_TOUCH_3: |
| case ITDB_IPOD_GENERATION_TOUCH_4: |
| case ITDB_IPOD_GENERATION_IPHONE_1: |
| case ITDB_IPOD_GENERATION_IPHONE_2: |
| case ITDB_IPOD_GENERATION_IPHONE_3: |
| case ITDB_IPOD_GENERATION_IPHONE_4: |
| case ITDB_IPOD_GENERATION_IPAD_1: |
| return TRUE; |
| } |
| g_return_val_if_reached (FALSE); |
| } |
| } |
| |
| gboolean itdb_device_is_shuffle (const Itdb_Device *device) |
| { |
| const Itdb_IpodInfo *info; |
| |
| info = itdb_device_get_ipod_info (device); |
| switch (info->ipod_generation) { |
| case ITDB_IPOD_GENERATION_UNKNOWN: |
| case ITDB_IPOD_GENERATION_FIRST: |
| case ITDB_IPOD_GENERATION_SECOND: |
| case ITDB_IPOD_GENERATION_THIRD: |
| case ITDB_IPOD_GENERATION_MOBILE: |
| case ITDB_IPOD_GENERATION_FOURTH: |
| case ITDB_IPOD_GENERATION_PHOTO: |
| case ITDB_IPOD_GENERATION_MINI_1: |
| case ITDB_IPOD_GENERATION_MINI_2: |
| case ITDB_IPOD_GENERATION_NANO_1: |
| case ITDB_IPOD_GENERATION_NANO_2: |
| case ITDB_IPOD_GENERATION_NANO_3: |
| case ITDB_IPOD_GENERATION_NANO_4: |
| case ITDB_IPOD_GENERATION_NANO_5: |
| case ITDB_IPOD_GENERATION_NANO_6: |
| case ITDB_IPOD_GENERATION_VIDEO_1: |
| case ITDB_IPOD_GENERATION_VIDEO_2: |
| case ITDB_IPOD_GENERATION_CLASSIC_1: |
| case ITDB_IPOD_GENERATION_CLASSIC_2: |
| case ITDB_IPOD_GENERATION_CLASSIC_3: |
| case ITDB_IPOD_GENERATION_TOUCH_1: |
| case ITDB_IPOD_GENERATION_TOUCH_2: |
| case ITDB_IPOD_GENERATION_TOUCH_3: |
| case ITDB_IPOD_GENERATION_TOUCH_4: |
| case ITDB_IPOD_GENERATION_IPHONE_1: |
| case ITDB_IPOD_GENERATION_IPHONE_2: |
| case ITDB_IPOD_GENERATION_IPHONE_3: |
| case ITDB_IPOD_GENERATION_IPHONE_4: |
| case ITDB_IPOD_GENERATION_IPAD_1: |
| return FALSE; |
| case ITDB_IPOD_GENERATION_SHUFFLE_1: |
| case ITDB_IPOD_GENERATION_SHUFFLE_2: |
| case ITDB_IPOD_GENERATION_SHUFFLE_3: |
| case ITDB_IPOD_GENERATION_SHUFFLE_4: |
| return TRUE; |
| } |
| g_return_val_if_reached (FALSE); |
| } |
| |
| gboolean itdb_device_is_iphone_family (const Itdb_Device *device) |
| { |
| if (device->sysinfo_extended != NULL) { |
| return (itdb_sysinfo_properties_get_family_id (device->sysinfo_extended) >= 10000); |
| } else { |
| const Itdb_IpodInfo *info; |
| |
| info = itdb_device_get_ipod_info (device); |
| switch (info->ipod_generation) { |
| case ITDB_IPOD_GENERATION_UNKNOWN: |
| case ITDB_IPOD_GENERATION_FIRST: |
| case ITDB_IPOD_GENERATION_SECOND: |
| case ITDB_IPOD_GENERATION_THIRD: |
| case ITDB_IPOD_GENERATION_MOBILE: |
| case ITDB_IPOD_GENERATION_FOURTH: |
| case ITDB_IPOD_GENERATION_PHOTO: |
| case ITDB_IPOD_GENERATION_MINI_1: |
| case ITDB_IPOD_GENERATION_MINI_2: |
| case ITDB_IPOD_GENERATION_NANO_1: |
| case ITDB_IPOD_GENERATION_NANO_2: |
| case ITDB_IPOD_GENERATION_NANO_3: |
| case ITDB_IPOD_GENERATION_NANO_4: |
| case ITDB_IPOD_GENERATION_NANO_5: |
| case ITDB_IPOD_GENERATION_NANO_6: |
| case ITDB_IPOD_GENERATION_SHUFFLE_1: |
| case ITDB_IPOD_GENERATION_SHUFFLE_2: |
| case ITDB_IPOD_GENERATION_SHUFFLE_3: |
| case ITDB_IPOD_GENERATION_SHUFFLE_4: |
| case ITDB_IPOD_GENERATION_VIDEO_1: |
| case ITDB_IPOD_GENERATION_VIDEO_2: |
| case ITDB_IPOD_GENERATION_CLASSIC_1: |
| case ITDB_IPOD_GENERATION_CLASSIC_2: |
| case ITDB_IPOD_GENERATION_CLASSIC_3: |
| return FALSE; |
| case ITDB_IPOD_GENERATION_TOUCH_1: |
| case ITDB_IPOD_GENERATION_TOUCH_2: |
| case ITDB_IPOD_GENERATION_TOUCH_3: |
| case ITDB_IPOD_GENERATION_TOUCH_4: |
| case ITDB_IPOD_GENERATION_IPHONE_1: |
| case ITDB_IPOD_GENERATION_IPHONE_2: |
| case ITDB_IPOD_GENERATION_IPHONE_3: |
| case ITDB_IPOD_GENERATION_IPHONE_4: |
| case ITDB_IPOD_GENERATION_IPAD_1: |
| return TRUE; |
| } |
| g_return_val_if_reached (FALSE); |
| } |
| } |
| |
| enum ItdbShadowDBVersion itdb_device_get_shadowdb_version (const Itdb_Device *device) |
| { |
| int version; |
| |
| version = 0; |
| if (device->sysinfo_extended != NULL) { |
| version = itdb_sysinfo_properties_get_shadow_db_version (device->sysinfo_extended); |
| } |
| |
| if (version == 0) { |
| const Itdb_IpodInfo *info; |
| |
| info = itdb_device_get_ipod_info (device); |
| switch (info->ipod_generation) { |
| case ITDB_IPOD_GENERATION_UNKNOWN: |
| case ITDB_IPOD_GENERATION_FIRST: |
| case ITDB_IPOD_GENERATION_SECOND: |
| case ITDB_IPOD_GENERATION_THIRD: |
| case ITDB_IPOD_GENERATION_MOBILE: |
| case ITDB_IPOD_GENERATION_FOURTH: |
| case ITDB_IPOD_GENERATION_PHOTO: |
| case ITDB_IPOD_GENERATION_MINI_1: |
| case ITDB_IPOD_GENERATION_MINI_2: |
| case ITDB_IPOD_GENERATION_NANO_1: |
| case ITDB_IPOD_GENERATION_NANO_2: |
| case ITDB_IPOD_GENERATION_NANO_3: |
| case ITDB_IPOD_GENERATION_NANO_4: |
| case ITDB_IPOD_GENERATION_NANO_5: |
| case ITDB_IPOD_GENERATION_NANO_6: |
| case ITDB_IPOD_GENERATION_VIDEO_1: |
| case ITDB_IPOD_GENERATION_VIDEO_2: |
| case ITDB_IPOD_GENERATION_CLASSIC_1: |
| case ITDB_IPOD_GENERATION_CLASSIC_2: |
| case ITDB_IPOD_GENERATION_CLASSIC_3: |
| case ITDB_IPOD_GENERATION_TOUCH_1: |
| case ITDB_IPOD_GENERATION_TOUCH_2: |
| case ITDB_IPOD_GENERATION_TOUCH_3: |
| case ITDB_IPOD_GENERATION_TOUCH_4: |
| case ITDB_IPOD_GENERATION_IPHONE_1: |
| case ITDB_IPOD_GENERATION_IPHONE_2: |
| case ITDB_IPOD_GENERATION_IPHONE_3: |
| case ITDB_IPOD_GENERATION_IPHONE_4: |
| case ITDB_IPOD_GENERATION_IPAD_1: |
| version = ITDB_SHADOW_DB_UNKNOWN; |
| break; |
| case ITDB_IPOD_GENERATION_SHUFFLE_1: |
| case ITDB_IPOD_GENERATION_SHUFFLE_2: |
| version = ITDB_SHADOW_DB_V1; |
| break; |
| case ITDB_IPOD_GENERATION_SHUFFLE_3: |
| case ITDB_IPOD_GENERATION_SHUFFLE_4: |
| version = ITDB_SHADOW_DB_V2; |
| break; |
| } |
| } |
| |
| return version; |
| } |