12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040 |
- #include "api.h"
- #include "iPodInfo.h"
- #include "resource.h"
- #include "../../General/gen_ml/ml.h"
- #include "../../Library/ml_pmp/pmp.h"
- #include "../xml/obj_xml.h"
- #include "../plist/loader.h"
- #include <api/service/waservicefactory.h>
- #include <stdio.h>
- #include <windows.h>
- #include <strsafe.h>
- extern PMPDevicePlugin plugin;
- static const ArtworkFormat ipod_color_artwork_info[] =
- {
- {THUMB_COVER_SMALL, 56, 56, 1017, RGB_565, 4, 4},
- {THUMB_COVER_LARGE, 140, 140, 1016, RGB_565, 4, 4},
- {THUMB_PHOTO_TV_SCREEN, 720, 480, 1019, RGB_565, 4, 4},
- {THUMB_PHOTO_LARGE, 130, 88, 1015, RGB_565, 4, 4},
- {THUMB_PHOTO_FULL_SCREEN, 220, 176, 1013, RGB_565, 4, 4},
- {THUMB_PHOTO_SMALL, 42, 30, 1009, RGB_565, 4, 4},
- {THUMB_INVALID, -1, -1, -1, RGB_565, 4, 4}
- };
- static const ArtworkFormat ipod_nano_artwork_info[] =
- {
- {THUMB_COVER_SMALL, 42, 42, 1031, RGB_565, 4, 4},
- {THUMB_COVER_LARGE, 100, 100, 1027, RGB_565, 4, 4},
- {THUMB_PHOTO_LARGE, 42, 37, 1032, RGB_565, 4, 4},
- {THUMB_PHOTO_FULL_SCREEN, 176, 132, 1023, RGB_565, 4, 4},
- {THUMB_INVALID, -1, -1, -1, RGB_565, 4, 4}
- };
- static const ArtworkFormat ipod_video_artwork_info[] =
- {
- {THUMB_COVER_SMALL, 100, 100, 1028, RGB_565, 4, 4},
- {THUMB_COVER_LARGE, 200, 200, 1029, RGB_565, 4, 4},
- {THUMB_PHOTO_TV_SCREEN, 720, 480, 1019, RGB_565, 4, 4},
- {THUMB_PHOTO_LARGE, 130, 88, 1015, RGB_565, 4, 4},
- {THUMB_PHOTO_FULL_SCREEN, 320, 240, 1024, RGB_565, 4, 4},
- {THUMB_PHOTO_SMALL, 50, 41, 1036, RGB_565, 4, 4},
- {THUMB_INVALID, -1, -1, -1, RGB_565, 4, 4}
- };
- static const ArtworkFormat ipod_7g_artwork_info[] =
- {
- {THUMB_COVER_SMALL, 55, 55, 1061, RGB_565, 4, 4},
- {THUMB_COVER_MEDIUM1, 128, 128, 1055, RGB_565, 4, 4},
- {THUMB_COVER_LARGE, 320, 320, 1060, RGB_565, 4, 4},
- {THUMB_INVALID, -1, -1, -1, RGB_565, 4, 4}
- };
- static const ArtworkFormat ipod_touch_artwork_info[] =
- {
- {THUMB_COVER_SMALL, 55, 55, 3006, RGB_555, 16, 4096},
- {THUMB_COVER_MEDIUM1, 64, 64, 3003, RGB_555_REC, 16, 4096},
- {THUMB_COVER_MEDIUM2, 88, 88, 3007, RGB_555, 16, 4096},
- {THUMB_COVER_MEDIUM3, 128, 128, 3002, RGB_555_REC, 16, 4096},
- {THUMB_COVER_MEDIUM4, 256, 256, 3001, RGB_555_REC, 16, 4096},
- {THUMB_COVER_LARGE, 320, 320, 3005, RGB_555, 16, 4096},
- {THUMB_INVALID, -1, -1, -1, RGB_555, 4, 4}
- };
- /*
- static const ArtworkFormat ipod_mobile_1_artwork_info[] = {
- {THUMB_COVER_SMALL, 50, 50, 2002},
- {THUMB_COVER_LARGE, 150, 150, 2003},
- {THUMB_INVALID, -1, -1, -1}
- };
- */
- //maps model to artwork format
- static const ArtworkFormat *ipod_artwork_info_table[] =
- {
- NULL, // invalid
- ipod_color_artwork_info, // color
- NULL, // regular
- NULL, // mini
- NULL, // shuffle
- ipod_video_artwork_info, // video
- ipod_nano_artwork_info, // nano
- ipod_7g_artwork_info, // classic
- ipod_7g_artwork_info, // fat nano
- ipod_touch_artwork_info, // touch
- };
- // this list compiled from http://www.thismuchiknow.co.uk/?page_id=27 and is kept in the same order as that table for easy updating
- // when new ipods come out, let's keep this up to date.
- // at the moment this is just used as a mapping from part number to model, for album art
- static const iPodModelInfo ipod_info_table[] =
- {
- //1st gen ipods
- {L"8513", IPOD_MODEL_REGULAR, IPOD_COLOR_WHITE, IDB_CLASSIC_16, IDB_CLASSIC_160}, //mac
- {L"8541", IPOD_MODEL_REGULAR, IPOD_COLOR_WHITE, IDB_CLASSIC_16, IDB_CLASSIC_160}, //mac
- {L"8697", IPOD_MODEL_REGULAR, IPOD_COLOR_WHITE, IDB_CLASSIC_16, IDB_CLASSIC_160}, //pc
- {L"8709", IPOD_MODEL_REGULAR, IPOD_COLOR_WHITE, IDB_CLASSIC_16, IDB_CLASSIC_160}, //mac
- //2nd gen ipods
- {L"8737", IPOD_MODEL_REGULAR, IPOD_COLOR_WHITE, IDB_CLASSIC_16, IDB_CLASSIC_160}, //mac
- {L"8740", IPOD_MODEL_REGULAR, IPOD_COLOR_WHITE, IDB_CLASSIC_16, IDB_CLASSIC_160}, //pc
- {L"8738", IPOD_MODEL_REGULAR, IPOD_COLOR_WHITE, IDB_CLASSIC_16, IDB_CLASSIC_160}, //mac
- {L"8741", IPOD_MODEL_REGULAR, IPOD_COLOR_WHITE, IDB_CLASSIC_16, IDB_CLASSIC_160}, //pc
- //3rd gen ipods
- {L"8976", IPOD_MODEL_REGULAR, IPOD_COLOR_WHITE, IDB_CLASSIC_16, IDB_CLASSIC_160},
- {L"8946", IPOD_MODEL_REGULAR, IPOD_COLOR_WHITE, IDB_CLASSIC_16, IDB_CLASSIC_160},
- {L"8948", IPOD_MODEL_REGULAR, IPOD_COLOR_WHITE, IDB_CLASSIC_16, IDB_CLASSIC_160},
- {L"9244", IPOD_MODEL_REGULAR, IPOD_COLOR_WHITE, IDB_CLASSIC_16, IDB_CLASSIC_160},
- {L"9245", IPOD_MODEL_REGULAR, IPOD_COLOR_WHITE, IDB_CLASSIC_16, IDB_CLASSIC_160},
- {L"9460", IPOD_MODEL_REGULAR, IPOD_COLOR_WHITE, IDB_CLASSIC_16, IDB_CLASSIC_160},
- //1st gen mini
- {L"9160", IPOD_MODEL_MINI, IPOD_COLOR_SILVER, IDB_CLASSIC_16, IDB_CLASSIC_160},
- {L"9436", IPOD_MODEL_MINI, IPOD_COLOR_BLUE, IDB_CLASSIC_16, IDB_CLASSIC_160},
- {L"9435", IPOD_MODEL_MINI, IPOD_COLOR_PINK, IDB_CLASSIC_16, IDB_CLASSIC_160},
- {L"9434", IPOD_MODEL_MINI, IPOD_COLOR_GREEN, IDB_CLASSIC_16, IDB_CLASSIC_160},
- {L"9437", IPOD_MODEL_MINI, IPOD_COLOR_GOLD, IDB_CLASSIC_16, IDB_CLASSIC_160},
- //4th gen ipods
- {L"9282", IPOD_MODEL_REGULAR, IPOD_COLOR_WHITE, IDB_CLASSIC_16, IDB_CLASSIC_160},
- {L"9268", IPOD_MODEL_REGULAR, IPOD_COLOR_WHITE, IDB_CLASSIC_16, IDB_CLASSIC_160},
- {L"E435", IPOD_MODEL_REGULAR, IPOD_COLOR_WHITE, IDB_CLASSIC_16, IDB_CLASSIC_160}, //HP branded
- {L"E436", IPOD_MODEL_REGULAR, IPOD_COLOR_WHITE, IDB_CLASSIC_16, IDB_CLASSIC_160}, //HP branded
- {L"9787", IPOD_MODEL_REGULAR, IPOD_COLOR_U2, IDB_CLASSIC_16, IDB_CLASSIC_160},
- //4th gen ipod photos
- {L"9585", IPOD_MODEL_COLOR, IPOD_COLOR_WHITE, IDB_CLASSIC_16, IDB_CLASSIC_160},
- {L"9586", IPOD_MODEL_COLOR, IPOD_COLOR_WHITE, IDB_CLASSIC_16, IDB_CLASSIC_160},
- //shuffles
- {L"A133", IPOD_MODEL_SHUFFLE, IPOD_COLOR_WHITE, IDB_SHUFFLE1G_16, IDB_SHUFFLE1G_160},
- {L"9724", IPOD_MODEL_SHUFFLE, IPOD_COLOR_WHITE, IDB_SHUFFLE1G_16, IDB_SHUFFLE1G_160},
- {L"9725", IPOD_MODEL_SHUFFLE, IPOD_COLOR_WHITE, IDB_SHUFFLE1G_16, IDB_SHUFFLE1G_160},
- // more ipod photos
- {L"9829", IPOD_MODEL_COLOR, IPOD_COLOR_WHITE, IDB_CLASSIC_16, IDB_CLASSIC_160},
- {L"9830", IPOD_MODEL_COLOR, IPOD_COLOR_WHITE, IDB_CLASSIC_16, IDB_CLASSIC_160},
- // ipod mini 2nd gen
- {L"9959", IPOD_MODEL_MINI, IPOD_COLOR_SILVER, IDB_CLASSIC_16, IDB_CLASSIC_160}, // pepsi giveaway ipod
- {L"9800", IPOD_MODEL_MINI, IPOD_COLOR_SILVER, IDB_CLASSIC_16, IDB_CLASSIC_160},
- {L"9802", IPOD_MODEL_MINI, IPOD_COLOR_BLUE, IDB_CLASSIC_16, IDB_CLASSIC_160},
- {L"9804", IPOD_MODEL_MINI, IPOD_COLOR_PINK, IDB_CLASSIC_16, IDB_CLASSIC_160},
- {L"9806", IPOD_MODEL_MINI, IPOD_COLOR_GREEN, IDB_CLASSIC_16, IDB_CLASSIC_160},
- {L"9801", IPOD_MODEL_MINI, IPOD_COLOR_SILVER, IDB_CLASSIC_16, IDB_CLASSIC_160},
- {L"9803", IPOD_MODEL_MINI, IPOD_COLOR_BLUE, IDB_CLASSIC_16, IDB_CLASSIC_160},
- {L"9805", IPOD_MODEL_MINI, IPOD_COLOR_PINK, IDB_CLASSIC_16, IDB_CLASSIC_160},
- {L"9807", IPOD_MODEL_MINI, IPOD_COLOR_GREEN, IDB_CLASSIC_16, IDB_CLASSIC_160},
- //HP colour ipods
- {L"S492", IPOD_MODEL_COLOR, IPOD_COLOR_WHITE, IDB_CLASSIC_16, IDB_CLASSIC_160},
- {L"S493", IPOD_MODEL_COLOR, IPOD_COLOR_WHITE, IDB_CLASSIC_16, IDB_CLASSIC_160},
- //HP ipod mini 2nd gen
- {L"W753", IPOD_MODEL_MINI, IPOD_COLOR_SILVER, IDB_CLASSIC_16, IDB_CLASSIC_160},
- {L"X762", IPOD_MODEL_MINI, IPOD_COLOR_SILVER, IDB_CLASSIC_16, IDB_CLASSIC_160},
- //more 4th gen ipod photos
- {L"A079", IPOD_MODEL_COLOR, IPOD_COLOR_WHITE, IDB_CLASSIC_16, IDB_CLASSIC_160},
- {L"A127", IPOD_MODEL_COLOR, IPOD_COLOR_U2, IDB_CLASSIC_16, IDB_CLASSIC_160},
- //HP ipod shuffles
- {L"X765", IPOD_MODEL_SHUFFLE, IPOD_COLOR_WHITE, IDB_CLASSIC_16, IDB_CLASSIC_160},
- {L"X766", IPOD_MODEL_SHUFFLE, IPOD_COLOR_WHITE, IDB_CLASSIC_16, IDB_CLASSIC_160},
- /*
- //harry potter ipod 4G, don't know serial number. but that's ok because it was only on sale for a month, so fuck it.
- {L"????", IPOD_MODEL_COLOR, IPOD_COLOR_WHITE, IDB_CLASSIC_16, IDB_CLASSIC_160},
- */
- //ipod nano 1st gen
- {L"A004", IPOD_MODEL_NANO, IPOD_COLOR_WHITE, IDB_NANO1G_16, IDB_NANO1G_160},
- {L"A099", IPOD_MODEL_NANO, IPOD_COLOR_BLACK, IDB_NANO1G_16, IDB_NANO1G_160},
- {L"A005", IPOD_MODEL_NANO, IPOD_COLOR_WHITE, IDB_NANO1G_16, IDB_NANO1G_160},
- {L"A107", IPOD_MODEL_NANO, IPOD_COLOR_BLACK, IDB_NANO1G_16, IDB_NANO1G_160},
- //ipod video
- {L"A002", IPOD_MODEL_VIDEO, IPOD_COLOR_WHITE, IDB_CLASSIC_16, IDB_CLASSIC_160},
- {L"A146", IPOD_MODEL_VIDEO, IPOD_COLOR_BLACK, IDB_CLASSIC_16, IDB_CLASSIC_160},
- {L"A003", IPOD_MODEL_VIDEO, IPOD_COLOR_WHITE, IDB_CLASSIC_16, IDB_CLASSIC_160},
- {L"A147", IPOD_MODEL_VIDEO, IPOD_COLOR_BLACK, IDB_CLASSIC_16, IDB_CLASSIC_160},
- {L"A253", IPOD_MODEL_VIDEO, IPOD_COLOR_WHITE, IDB_CLASSIC_16, IDB_CLASSIC_160}, //harry potter ipod 5G
- //1gig nano
- {L"A350", IPOD_MODEL_NANO, IPOD_COLOR_WHITE, IDB_NANO1G_16, IDB_NANO1G_160},
- {L"A352", IPOD_MODEL_NANO, IPOD_COLOR_BLACK, IDB_NANO1G_16, IDB_NANO1G_160},
- // U2 ipod video
- {L"A452", IPOD_MODEL_VIDEO, IPOD_COLOR_U2, IDB_CLASSIC_16, IDB_CLASSIC_160},
- //2nd gen nano
- {L"A477", IPOD_MODEL_NANO, IPOD_COLOR_SILVER, IDB_NANO2G_16, IDB_NANO2G_160},
- {L"A426", IPOD_MODEL_NANO, IPOD_COLOR_SILVER, IDB_NANO2G_16, IDB_NANO2G_160},
- {L"A428", IPOD_MODEL_NANO, IPOD_COLOR_BLUE, IDB_NANO2G_16, IDB_NANO2G_160},
- {L"A487", IPOD_MODEL_NANO, IPOD_COLOR_GREEN, IDB_NANO2G_16, IDB_NANO2G_160},
- {L"A489", IPOD_MODEL_NANO, IPOD_COLOR_PINK, IDB_NANO2G_16, IDB_NANO2G_160},
- {L"A497", IPOD_MODEL_NANO, IPOD_COLOR_BLACK, IDB_NANO2G_16, IDB_NANO2G_160},
- // ipod video 6th gen
- {L"A444", IPOD_MODEL_VIDEO, IPOD_COLOR_WHITE, IDB_CLASSIC_16, IDB_CLASSIC_160},
- {L"A446", IPOD_MODEL_VIDEO, IPOD_COLOR_BLACK, IDB_CLASSIC_16, IDB_CLASSIC_160},
- {L"A448", IPOD_MODEL_VIDEO, IPOD_COLOR_WHITE, IDB_CLASSIC_16, IDB_CLASSIC_160},
- {L"A450", IPOD_MODEL_VIDEO, IPOD_COLOR_BLACK, IDB_CLASSIC_16, IDB_CLASSIC_160},
- //2nd gen shuffle
- {L"A564", IPOD_MODEL_SHUFFLE, IPOD_COLOR_SILVER, IDB_SHUFFLE2G_16, IDB_SHUFFLE2G_160},
- // ipod video u2 6th gen
- {L"A664", IPOD_MODEL_VIDEO, IPOD_COLOR_U2, IDB_CLASSIC_16, IDB_CLASSIC_160},
- //product red ipod nano
- {L"A725", IPOD_MODEL_NANO, IPOD_COLOR_RED, IDB_CLASSIC_16, IDB_CLASSIC_160},
- {L"A899", IPOD_MODEL_NANO, IPOD_COLOR_RED, IDB_CLASSIC_16, IDB_CLASSIC_160},
- // coloured versions of ipod shuffle 2nd gen
- {L"A947", IPOD_MODEL_SHUFFLE, IPOD_COLOR_PINK, IDB_SHUFFLE2G_16, IDB_SHUFFLE2G_160},
- {L"A949", IPOD_MODEL_SHUFFLE, IPOD_COLOR_BLUE, IDB_SHUFFLE2G_16, IDB_SHUFFLE2G_160},
- {L"A951", IPOD_MODEL_SHUFFLE, IPOD_COLOR_GREEN, IDB_SHUFFLE2G_16, IDB_SHUFFLE2G_160},
- {L"A953", IPOD_MODEL_SHUFFLE, IPOD_COLOR_ORANGE, IDB_SHUFFLE2G_16, IDB_SHUFFLE2G_160},
- // fat nanos
- {L"A978", IPOD_MODEL_FATNANO, IPOD_COLOR_SILVER, IDB_CLASSIC_16, IDB_CLASSIC_160},
- {L"A980", IPOD_MODEL_FATNANO, IPOD_COLOR_SILVER, IDB_CLASSIC_16, IDB_CLASSIC_160},
- {L"B249", IPOD_MODEL_FATNANO, IPOD_COLOR_BLUE, IDB_CLASSIC_16, IDB_CLASSIC_160},
- {L"B253", IPOD_MODEL_FATNANO, IPOD_COLOR_GREEN, IDB_CLASSIC_16, IDB_CLASSIC_160},
- {L"B261", IPOD_MODEL_FATNANO, IPOD_COLOR_BLACK, IDB_CLASSIC_16, IDB_CLASSIC_160},
- {L"B257", IPOD_MODEL_FATNANO, IPOD_COLOR_RED, IDB_CLASSIC_16, IDB_CLASSIC_160},
- // ipod classic
- {L"B147", IPOD_MODEL_CLASSIC, IPOD_COLOR_BLACK, IDB_CLASSIC_16, IDB_CLASSIC_160},
- {L"B029", IPOD_MODEL_CLASSIC, IPOD_COLOR_WHITE, IDB_CLASSIC_16, IDB_CLASSIC_160},
- {L"B150", IPOD_MODEL_CLASSIC, IPOD_COLOR_BLACK, IDB_CLASSIC_16, IDB_CLASSIC_160},
- {L"B145", IPOD_MODEL_CLASSIC, IPOD_COLOR_WHITE, IDB_CLASSIC_16, IDB_CLASSIC_160},
- // ipod touch
- {L"A623", IPOD_MODEL_TOUCH, IPOD_COLOR_BLACK, IDB_CLASSIC_16, IDB_CLASSIC_160},
- {L"A627", IPOD_MODEL_TOUCH, IPOD_COLOR_BLACK, IDB_CLASSIC_16, IDB_CLASSIC_160},
- //insert info about new models here (be sure to take first char off the product code)...
- };
- static const iPodModelInfo
- shuffle1g_info = {L"XXXX", IPOD_MODEL_SHUFFLE, IPOD_COLOR_PINK, IDB_SHUFFLE1G_16, IDB_SHUFFLE1G_160},
- shuffle2g_info = {L"XXXX", IPOD_MODEL_SHUFFLE, IPOD_COLOR_PINK, IDB_SHUFFLE2G_16, IDB_SHUFFLE2G_160},
- shuffle3g_info = {L"XXXX", IPOD_MODEL_SHUFFLE, IPOD_COLOR_SILVER, IDB_SHUFFLE3G_16, IDB_SHUFFLE3G_160},
- shuffle4g_info = {L"XXXX", IPOD_MODEL_SHUFFLE, IPOD_COLOR_SILVER, IDB_SHUFFLE4G_16, IDB_SHUFFLE4G_160},
- classic_info = {L"XXXX", IPOD_MODEL_CLASSIC, IPOD_COLOR_WHITE, IDB_CLASSIC_16, IDB_CLASSIC_160},
- video_info = {L"XXXX", IPOD_MODEL_VIDEO, IPOD_COLOR_WHITE, IDB_CLASSIC_16, IDB_CLASSIC_160},
- nano1g_info = {L"XXXX", IPOD_MODEL_NANO, IPOD_COLOR_WHITE, IDB_NANO1G_16, IDB_NANO1G_160},
- nano2g_info = {L"XXXX", IPOD_MODEL_NANO, IPOD_COLOR_WHITE, IDB_NANO2G_16, IDB_NANO2G_160},
- nano3g_info = {L"XXXX", IPOD_MODEL_NANO, IPOD_COLOR_WHITE, IDB_NANO3G_16, IDB_NANO3G_160},
- nano4g_info = {L"XXXX", IPOD_MODEL_NANO, IPOD_COLOR_WHITE, IDB_NANO4G_16, IDB_NANO4G_160};
- static INT_PTR CALLBACK selectipodtype_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam,LPARAM lParam)
- {
- switch (uMsg)
- {
- case WM_INITDIALOG:
- {
- BringWindowToTop(hwndDlg);
- wchar_t * sysinfo = (wchar_t*)lParam;
- SetWindowLongPtr(hwndDlg,GWLP_USERDATA,lParam);
- wchar_t path[] = {sysinfo[0],L":\\"};
- wchar_t name[32] = {0};
- GetVolumeInformation(path,name,32,NULL,NULL,NULL,NULL,0);
- wchar_t buf[100] = {0};
- wchar_t s[32] = {0};
- GetDlgItemText(hwndDlg,IDC_IPODINFO,s,32);
- StringCchPrintf(buf,100,L"%s (%s) %s",path,name,s);
- SetDlgItemText(hwndDlg,IDC_IPODINFO,buf);
- }
- break;
- case WM_COMMAND:
- switch (LOWORD(wParam))
- {
- case IDC_RADIO1:
- case IDC_RADIO2:
- case IDC_RADIO3:
- case IDC_RADIO4:
- case IDC_RADIO5:
- case IDC_RADIO6:
- case IDC_RADIO7:
- case IDC_RADIO8:
- EnableWindow(GetDlgItem(hwndDlg,IDOK),TRUE);
- break;
- case IDCANCEL:
- EndDialog(hwndDlg,1);
- break;
- case IDOK:
- {
- char *m;
- if (IsDlgButtonChecked(hwndDlg,IDC_RADIO1)) m = "A133"; //shuffle
- else if (IsDlgButtonChecked(hwndDlg,IDC_RADIO2)) m = "9586"; //photo
- else if (IsDlgButtonChecked(hwndDlg,IDC_RADIO3)) m = "A002"; //video
- else if (IsDlgButtonChecked(hwndDlg,IDC_RADIO4)) m = "A005"; //nano
- else if (IsDlgButtonChecked(hwndDlg,IDC_RADIO6)) m = "A623"; //touch
- else if (IsDlgButtonChecked(hwndDlg,IDC_RADIO7)) m = "B145"; //classic
- else if (IsDlgButtonChecked(hwndDlg,IDC_RADIO8)) m = "B257"; //fatnano
- else m = "8976"; //other
- wchar_t * sysinfo = (wchar_t*)GetWindowLongPtr(hwndDlg,GWLP_USERDATA);
- FILE *f = _wfopen(sysinfo,L"a+b");
- if (f)
- {
- fprintf(f,"ModelNumStr: M%s\n",m);
- fclose(f);
- }
- }
- EndDialog(hwndDlg,0);
- break;
- }
- break;
- }
- return 0;
- }
- /* This table was extracted from ipod-model-table from podsleuth svn trunk
- * on 2008-06-14 (which seems to match podsleuth 0.6.2)
- */
- static const iPodSerialToModel serial_to_model_mapping[] =
- {
- { L"LG6", L"8541" },
- { L"NAM", L"8541" },
- { L"MJ2", L"8541" },
- { L"ML1", L"8709" },
- { L"MME", L"8709" },
- { L"MMB", L"8737" },
- { L"MMC", L"8738" },
- { L"NGE", L"8740" },
- { L"NGH", L"8740" },
- { L"MMF", L"8741" },
- { L"NLW", L"8946" },
- { L"NRH", L"8976" },
- { L"QQF", L"9460" },
- { L"PQ5", L"9244" },
- { L"PNT", L"9244" },
- { L"NLY", L"8948" },
- { L"NM7", L"8948" },
- { L"PNU", L"9245" },
- { L"PS9", L"9282" },
- { L"Q8U", L"9282" },
- { L"V9V", L"9787" },
- { L"S2X", L"9787" },
- { L"PQ7", L"9268" },
- { L"TDU", L"A079" },
- { L"TDS", L"A079" },
- { L"TM2", L"A127" },
- { L"SAZ", L"9830" },
- { L"SB1", L"9830" },
- { L"SAY", L"9829" },
- { L"R5Q", L"9585" },
- { L"R5R", L"9586" },
- { L"R5T", L"9586" },
- { L"PFW", L"9160" },
- { L"PRC", L"9160" },
- { L"QKL", L"9436" },
- { L"QKQ", L"9436" },
- { L"QKK", L"9435" },
- { L"QKP", L"9435" },
- { L"QKJ", L"9434" },
- { L"QKN", L"9434" },
- { L"QKM", L"9437" },
- { L"QKR", L"9437" },
- { L"S41", L"9800" },
- { L"S4C", L"9800" },
- { L"S43", L"9802" },
- { L"S45", L"9804" },
- { L"S47", L"9806" },
- { L"S4J", L"9806" },
- { L"S42", L"9801" },
- { L"S44", L"9803" },
- { L"S48", L"9807" },
- { L"RS9", L"9724" },
- { L"QGV", L"9724" },
- { L"TSX", L"9724" },
- { L"PFV", L"9724" },
- { L"R80", L"9724" },
- { L"RSA", L"9725" },
- { L"TSY", L"9725" },
- { L"C60", L"9725" },
- { L"VTE", L"A546" },
- { L"VTF", L"A546" },
- { L"XQ5", L"A947" },
- { L"XQS", L"A947" },
- { L"XQV", L"A949" },
- { L"XQX", L"A949" },
- { L"YX7", L"A949" },
- { L"XQY", L"A951" },
- { L"YX8", L"A951" },
- { L"XR1", L"A953" },
- { L"YXA", L"B233" },
- { L"YX6", L"B225" },
- { L"YX7", L"B228" },
- { L"YX9", L"B225" },
- { L"UNA", L"A350" },
- { L"UNB", L"A350" },
- { L"UPR", L"A352" },
- { L"UPS", L"A352" },
- { L"SZB", L"A004" },
- { L"SZV", L"A004" },
- { L"SZW", L"A004" },
- { L"SZC", L"A005" },
- { L"SZT", L"A005" },
- { L"TJT", L"A099" },
- { L"TJU", L"A099" },
- { L"TK2", L"A107" },
- { L"TK3", L"A107" },
- { L"VQ5", L"A477" },
- { L"VQ6", L"A477" },
- { L"V8T", L"A426" },
- { L"V8U", L"A426" },
- { L"V8W", L"A428" },
- { L"V8X", L"A428" },
- { L"VQH", L"A487" },
- { L"VQJ", L"A487" },
- { L"VQK", L"A489" },
- { L"VKL", L"A489" },
- { L"WL2", L"A725" },
- { L"WL3", L"A725" },
- { L"X9A", L"A726" },
- { L"X9B", L"A726" },
- { L"VQT", L"A497" },
- { L"VQU", L"A497" },
- { L"Y0P", L"A978" },
- { L"Y0R", L"A980" },
- { L"YXR", L"B249" },
- { L"YXV", L"B257" },
- { L"YXT", L"B253" },
- { L"YXX", L"B261" },
- { L"SZ9", L"A002" },
- { L"WEC", L"A002" },
- { L"WED", L"A002" },
- { L"WEG", L"A002" },
- { L"WEH", L"A002" },
- { L"WEL", L"A002" },
- { L"TXK", L"A146" },
- { L"TXM", L"A146" },
- { L"WEE", L"A146" },
- { L"WEF", L"A146" },
- { L"WEJ", L"A146" },
- { L"WEK", L"A146" },
- { L"SZA", L"A003" },
- { L"SZU", L"A003" },
- { L"TXL", L"A147" },
- { L"TXN", L"A147" },
- { L"V9K", L"A444" },
- { L"V9L", L"A444" },
- { L"WU9", L"A444" },
- { L"VQM", L"A446" },
- { L"V9M", L"A446" },
- { L"V9N", L"A446" },
- { L"WEE", L"A446" },
- { L"V9P", L"A448" },
- { L"V9Q", L"A448" },
- { L"V9R", L"A450" },
- { L"V9S", L"A450" },
- { L"V95", L"A450" },
- { L"V96", L"A450" },
- { L"WUC", L"A450" },
- { L"W9G", L"A664" }, /* 30GB iPod Video U2 5.5g */
- { L"Y5N", L"B029" }, /* Silver Classic 80GB */
- { L"YMV", L"B147" }, /* Black Classic 80GB */
- { L"YMU", L"B145" }, /* Silver Classic 160GB */
- { L"YMX", L"B150" }, /* Black Classic 160GB */
- { L"2C5", L"B562" }, /* Silver Classic 120GB */
- { L"2C7", L"B565" }, /* Black Classic 120GB */
- { L"9ZS", L"C293" }, /* Silver Classic 160GB (2009) */
- { L"9ZU", L"C297" }, /* Black Classic 160GB (2009) */
- { L"37P", L"B663" }, /* 4GB Green Nano 4g */
- { L"37Q", L"B666" }, /* 4GB Yellow Nano 4g */
- { L"37H", L"B654" }, /* 4GB Pink Nano 4g */
- { L"1P1", L"B480" }, /* 4GB Silver Nano 4g */
- { L"37K", L"B657" }, /* 4GB Purple Nano 4g */
- { L"37L", L"B660" }, /* 4GB Orange Nano 4g */
- { L"2ME", L"B598" }, /* 8GB Silver Nano 4g */
- { L"3QS", L"B732" }, /* 8GB Blue Nano 4g */
- { L"3QT", L"B735" }, /* 8GB Pink Nano 4g */
- { L"3QU", L"B739" }, /* 8GB Purple Nano 4g */
- { L"3QW", L"B742" }, /* 8GB Orange Nano 4g */
- { L"3QX", L"B745" }, /* 8GB Green Nano 4g */
- { L"3QY", L"B748" }, /* 8GB Yellow Nano 4g */
- { L"3R0", L"B754" }, /* 8GB Black Nano 4g */
- { L"3QZ", L"B751" }, /* 8GB Red Nano 4g */
- { L"5B7", L"B903" }, /* 16GB Silver Nano 4g */
- { L"5B8", L"B905" }, /* 16GB Blue Nano 4g */
- { L"5B9", L"B907" }, /* 16GB Pink Nano 4g */
- { L"5BA", L"B909" }, /* 16GB Purple Nano 4g */
- { L"5BB", L"B911" }, /* 16GB Orange Nano 4g */
- { L"5BC", L"B913" }, /* 16GB Green Nano 4g */
- { L"5BD", L"B915" }, /* 16GB Yellow Nano 4g */
- { L"5BE", L"B917" }, /* 16GB Red Nano 4g */
- { L"5BF", L"B918" }, /* 16GB Black Nano 4g */
- { L"71V", L"C027" }, /* 8GB Silver Nano 5g */
- { L"71Y", L"C031" }, /* 8GB Black Nano 5g */
- { L"721", L"C034" }, /* 8GB Purple Nano 5g */
- { L"726", L"C037" }, /* 8GB Blue Nano 5g */
- { L"72A", L"C040" }, /* 8GB Green Nano 5g */
- { L"72F", L"C046" }, /* 8GB Orange Nano 5g */
- { L"72L", L"C050" }, /* 8GB Pink Nano 5g */
- { L"72Q", L"C060" }, /* 16GB Silver Nano 5g */
- { L"72R", L"C062" }, /* 16GB Black Nano 5g */
- { L"72S", L"C064" }, /* 16GB Purple Nano 5g */
- { L"72X", L"C066" }, /* 16GB Blue Nano 5g */
- { L"734", L"C068" }, /* 16GB Green Nano 5g */
- { L"738", L"C070" }, /* 16GB Yellow Nano 5g */
- { L"739", L"C072" }, /* 16GB Orange Nano 5g */
- { L"73A", L"C074" }, /* 16GB Red Nano 5g */
- { L"73B", L"C075" }, /* 16GB Pink Nano 5g */
- { L"4NZ", L"B867" }, /* 4GB Silver Shuffle 4g */
- { L"891", L"C164" }, /* 4GB Black Shuffle 4g */
- { L"W4T", L"A627" }, /* 16GB Silver iPod Touch (1st gen) */
- { L"0JW", L"B376" }, /* 32GB Silver iPod Touch (1st gen) */
- { L"201", L"B528" }, /* 8GB Silver iPod Touch (2nd gen) */
- { L"203", L"B531" }, /* 16GB Silver iPod Touch (2nd gen) */
- { L"75J", L"C086" }, /* 8GB Silver iPod Touch (3rd gen) */
- { L"6K2", L"C008" }, /* 32GB Silver iPod Touch (3rd gen) */
- { L"6K4", L"C011" }, /* 64GB Silver iPod Touch (3rd gen) */
- { L"VR0", L"A501" }, /* 4GB Silver iPhone 1st gen */
- { L"WH8", L"A712" }, /* 8GB Silver iPhone */
- { L"0KH", L"B384" }, /* 16GB Silver iPhone */
- { L"Y7H", L"B046" }, /* 8GB Black iPhone 3G */
- { L"Y7K", L"B496" }, /* 16GB Black iPhone 3G */
- { L"3NP", L"C131" }, /* 16GB Black iPhone 3GS */
- { L"3NR", L"C133" } /* 32GB Black iPhone 3GS */
- };
- static const wchar_t *GetModelStrForFamilyID(unsigned int familyID)
- {
- switch (familyID)
- {
- case 4: // iPod 4
- return L"9282";
- case 5: // iPod 4 (photo)
- return L"9830";
- case 6: // iPod 5
- return L"A002";
- case 7: // nano 1
- return L"A004";
- case 9: // nano 2
- return L"A477";
- case 11: // classic
- return L"B147";
- case 12: // fat nano
- return L"A978";
- case 128: // shuffle
- return L"A133";
- case 130: // shuffle 2
- return L"A947";
- default:
- return 0;
- }
- }
- static const iPodModelInfo *GetiPodInfoForModelStr(const wchar_t *modelstr)
- {
- // now locate this ipod in our table
- int l = sizeof(ipod_info_table)/sizeof(ipod_info_table[0]);
- for (int i=0; i<l; i++)
- {
- if (_wcsnicmp(ipod_info_table[i].model_number,modelstr,wcslen(ipod_info_table[i].model_number))==0)
- return &ipod_info_table[i]; // success!
- }
- return 0;
- }
- static const iPodModelInfo *GetiPodInfoForFamilyID(unsigned int familyID)
- {
- switch(familyID)
- {
- case 6:
- return &video_info;
- case 7:
- return &nano1g_info;
- case 9:
- return &nano2g_info;
- case 11:
- return &classic_info;
- case 12:
- return &nano3g_info;
- case 15:
- return &nano4g_info;
- case 128:
- return &shuffle1g_info;
- case 130: // shuffle 2G
- return &shuffle2g_info;
- case 132: // shuffle 3G
- return &shuffle3g_info;
- case 133: // shuffle 4G
- return &shuffle4g_info;
- }
- return 0;
- }
- const wchar_t* GetModelStrForSerialNumber(const wchar_t *serialNumber)
- {
- // now locate this ipod in our table
- int l = sizeof(serial_to_model_mapping)/sizeof(iPodSerialToModel);
- INT serialNumberLen = lstrlen(serialNumber);
- if (serialNumberLen < 3)
- {
- return NULL;
- }
- const wchar_t *last3OfSerialNumber = &serialNumber[serialNumberLen-3];
- for (int i=0; i<l; i++)
- {
- int compareRet = CompareString(LOCALE_USER_DEFAULT, NORM_IGNORECASE, last3OfSerialNumber, -1, serial_to_model_mapping[i].serial, -1)-2;
- if (compareRet==0)
- return serial_to_model_mapping[i].model_number; // success!
- }
- return 0;
- }
- extern bool ParseSysInfoXML(wchar_t drive_letter, char * xml, int xmllen);
- iPodInfo::iPodInfo(const iPodModelInfo *_model)
- {
- family_id = 0;
- color = _model->color;
- model = _model->model;
- model_number = _wcsdup(_model->model_number);
- image16 = _model->image16;
- image160 = _model->image160;
- fwid=0;
- supportedArtworkFormats=0;
- numberOfSupportedFormats=0;
- shadow_db_version=0;
- }
- iPodInfo::~iPodInfo()
- {
- free(fwid);
- free(model_number);
- delete supportedArtworkFormats;
- }
- void iPodInfo::SetFWID(const uint8_t *new_fwid)
- {
- fwid = (uint8_t *)malloc(8);
- memcpy(fwid, new_fwid, 8);
- }
- iPodInfo *GetiPodInfo(wchar_t drive)
- {
- static const iPodModelInfo unknown = {NULL, IPOD_MODEL_INVALID, IPOD_COLOR_WHITE};
- unsigned char fwid[8]={0};
- bool have_fwid=false;
- char xml[65536] = {0};
- if (ParseSysInfoXML(drive, xml, sizeof(xml)/sizeof(char)))
- {
- // go fetch the FamilyID so we can construct a model string
- DWORD bytesRead = strlen(xml);//sizeof(xml)/sizeof(char);
- // use the plist handler here instead of fishing for the familyid string
- // in the xml
- // instantiate the plist loader
- plistLoader it;
- obj_xml *parser=0;
- waServiceFactory *factory = plugin.service->service_getServiceByGuid(obj_xmlGUID);
- if (factory)
- {
- parser = (obj_xml *)factory->getInterface();
- }
- if (parser)
- {
- // load the XML, this creates an iTunes DB in memory, and returns the root key
- parser->xmlreader_open();
- parser->xmlreader_registerCallback(L"plist\f*", &it);
- parser->xmlreader_feed(xml, bytesRead);
- parser->xmlreader_feed(0, 0);
- parser->xmlreader_unregisterCallback(&it);
- parser->xmlreader_close();
- plistKey *root_key = ⁢
- plistData *root_dict = root_key->getData();
- if (root_dict)
- {
- // get Firewire ID
- plistKey *fwidKey = ((plistDict*)root_dict)->getKey(L"FireWireGUID");
- if (fwidKey)
- {
- plistData *fwidData = fwidKey->getData();
- if (fwidData)
- {
- const wchar_t* p = fwidData->getString();
- for (int i=0; i<8 && *p; i++)
- {
- char num[3]={0,0,0};
- num[0] = *(p++);
- num[1] = *(p++);
- fwid[i] = (uint8_t)strtoul(num,NULL,16);
- }
- have_fwid=true;
- }
- }
- // check for the existance of sqlite
- plistKey *sqliteKey = ((plistDict*)root_dict)->getKey(L"SQLiteDB");
- if (sqliteKey)
- {
- plistData *sqliteData = sqliteKey->getData();
- if (sqliteData)
- {
- const wchar_t* sqliteString = sqliteData->getString();
- if (sqliteString)
- {
- int compareRet = CompareString(LOCALE_USER_DEFAULT, NORM_IGNORECASE, sqliteString, -1, L"1", -1)-2;
- // At this point we dont want to support the sqlite family of ipods
- // so, return unknown if sqlite found
- if (compareRet == 0)
- {
- return 0;
- }
- }
- }
- } // end sqlite check
- // check for FamilyID
- plistKey *familyKey = ((plistDict*)root_dict)->getKey(L"FamilyID");
- if (familyKey)
- {
- plistData *familyData = familyKey->getData();
- if (familyData)
- {
- const wchar_t* familyIDString = familyData->getString();
- if (familyIDString)
- {
- const wchar_t *modelStr = NULL;
- unsigned int familyID = _wtoi(familyIDString);
- // first, try to look up the iPod by family ID
- const iPodModelInfo *info = GetiPodInfoForFamilyID(familyID);
- if (!info)
- {
- modelStr = GetModelStrForFamilyID(familyID);
- // if modelString not apparent, as the case is in most
- // 5th gen nanos and classics
- if (!info && !modelStr)
- {
- plistKey *serialNumberKey = ((plistDict*)root_dict)->getKey(L"SerialNumber");
- if (serialNumberKey)
- {
- plistData *serialNumberData = serialNumberKey->getData();
- if (serialNumberData)
- {
- const wchar_t* serialNumberString = serialNumberData->getString();
- if (serialNumberString)
- {
- modelStr = GetModelStrForSerialNumber(serialNumberString);
- }
- }
- }
- }
- }
- if (modelStr || info)
- {
- if (!info)
- info = GetiPodInfoForModelStr(modelStr);
- if (info)
- {
- iPodInfo* retInfo = new iPodInfo(info);
- if (have_fwid)
- retInfo->SetFWID(fwid);
-
- plistKey *shadow_db_key = ((plistDict*)root_dict)->getKey(L"ShadowDB");
- if (shadow_db_key)
- {
- plistData *shadow_db_data = shadow_db_key->getData();
- if (shadow_db_data && shadow_db_data->getType() == PLISTDATA_BOOLEAN)
- {
- plistBoolean *shadow_db_boolean = (plistBoolean *)shadow_db_data;
- if (shadow_db_boolean->getValue())
- retInfo->shadow_db_version = 1;
- plistKey *shadow_db_version_key = ((plistDict*)root_dict)->getKey(L"ShadowDBVersion");
- if (shadow_db_version_key)
- {
- plistData *shadow_db_version_data = shadow_db_version_key->getData();
- if (shadow_db_version_data && shadow_db_version_data->getType() == PLISTDATA_INTEGER)
- {
- plistInteger *shadow_db_version_integer= (plistInteger *)shadow_db_version_data;
- retInfo->shadow_db_version = shadow_db_version_integer->getValue();
- }
- }
- }
- }
- // now try and populate the ArtworkFormats from the plist
- // looks something like this
- /*****************************************************
- <key>AlbumArt</key>
- <array>
- <key>1069</key>
- <dict>
- <key>FormatId</key>
- <integer>1069</integer>
- <key>RenderWidth</key>
- <integer>142</integer>
- <key>RenderHeight</key>
- <integer>142</integer>
- <key>PixelFormat</key>
- <string>4C353635</string>
- <key>Interlaced</key>
- <false/>
- <key>ColorAdjustment</key>
- <integer>0</integer>
- <key>GammaAdjustment</key>
- <real>2.2</real>
- <key>Crop</key>
- <false/>
- <key>AlignRowBytes</key>
- <true/>
- <key>BackColor</key>
- <string>00000000</string>
- <key>AssociatedFormat</key>
- <integer>131072</integer>
- <key>ExcludedFormats</key>
- <integer>-1</integer>
- </dict>
- <key>1055</key>
- <dict>
- <key>FormatId</key>
- <integer>1055</integer>
- <key>RenderWidth</key>
- <integer>128</integer>
- <key>RenderHeight</key>
- <integer>128</integer>
- <key>PixelFormat</key>
- <string>4C353635</string>
- <key>Interlaced</key>
- <false/>
- <key>ColorAdjustment</key>
- <integer>0</integer>
- <key>GammaAdjustment</key>
- <real>2.2</real>
- <key>Crop</key>
- <true/>
- <key>AlignRowBytes</key>
- <true/>
- <key>BackColor</key>
- <string>00000000</string>
- <key>AssociatedFormat</key>
- <integer>0</integer>
- </dict>
- </array>
- *******************************************************************/
- // look for the AlbumArt dict
- plistKey *albumArtKey = ((plistDict*)root_dict)->getKey(L"AlbumArt");
- if (albumArtKey)
- {
- plistArray* albumArtArray = (plistArray *) albumArtKey->getData();
- if (albumArtArray)
- {
- int numFormats = albumArtArray->getNumItems();
- ArtworkFormat* artworkFormats = new ArtworkFormat[numFormats];
- retInfo->supportedArtworkFormats = &artworkFormats[0];
- retInfo->numberOfSupportedFormats = numFormats;
- for (int i=0;i<numFormats;i++)
- {
- // we need to populate this structure
- /**
- static const ArtworkFormat ipod_color_artwork_info[] = {
- {THUMB_COVER_SMALL, 56, 56, 1017, RGB_565, 4, 4},
- {THUMB_COVER_LARGE, 140, 140, 1016, RGB_565, 4, 4},
- {THUMB_PHOTO_TV_SCREEN, 720, 480, 1019, RGB_565, 4, 4},
- {THUMB_PHOTO_LARGE, 130, 88, 1015, RGB_565, 4, 4},
- {THUMB_PHOTO_FULL_SCREEN, 220, 176, 1013, RGB_565, 4, 4},
- {THUMB_PHOTO_SMALL, 42, 30, 1009, RGB_565, 4, 4},
- {THUMB_INVALID, -1, -1, -1, RGB_565, 4, 4}
- };
- */
- plistDict *albumArtFormatDict = 0;
- plistData *albumArtFormatKey = (plistKey *)albumArtArray->enumItem(i);
- if (albumArtFormatKey->getType() == PLISTDATA_KEY)
- {
- albumArtFormatDict = (plistDict *)((plistKey *)albumArtFormatKey)->getData();
- }
- else
- { // Nano 4G doesn't store keys in the AlbumArt array
- albumArtFormatDict = (plistDict *)albumArtFormatKey;
- }
- int numKeys = albumArtFormatDict->getNumKeys();
- if (numKeys)
- {
- for (int j=0; j<numKeys; j++)
- {
- plistKey *albumArtFormatItemKey = albumArtFormatDict->enumKey(j);
- const wchar_t* albumArtFormatKeyName = albumArtFormatItemKey->getName();
- // we need all the arwork formats under AlbumArt, just use
- // a thumb type that we know is accepted
- artworkFormats[i].type = THUMB_COVER_SMALL;
- // these are 4, they just are
- artworkFormats[i].row_align = 4;
- artworkFormats[i].image_align = 4;
- // gather the FormatId
- if (CompareString(LOCALE_USER_DEFAULT, NORM_IGNORECASE, albumArtFormatKeyName, -1, L"FormatId", -1)-2 == 0)
- {
- const wchar_t* albumArtFormatValue = albumArtFormatItemKey->getData()->getString();
- if (albumArtFormatValue != NULL)
- {
- artworkFormats[i].correlation_id = _wtoi(albumArtFormatValue);
- }
- }
- // gather the RenderWidth
- if (CompareString(LOCALE_USER_DEFAULT, NORM_IGNORECASE, albumArtFormatKeyName, -1, L"RenderWidth", -1)-2 == 0)
- {
- const wchar_t* albumArtFormatValue = albumArtFormatItemKey->getData()->getString();
- if (albumArtFormatValue != NULL)
- {
- artworkFormats[i].width = _wtoi(albumArtFormatValue);
- }
- }
- // gather the RenderHeight
- if (CompareString(LOCALE_USER_DEFAULT, NORM_IGNORECASE, albumArtFormatKeyName, -1, L"RenderHeight", -1)-2 == 0)
- {
- const wchar_t* albumArtFormatValue = albumArtFormatItemKey->getData()->getString();
- if (albumArtFormatValue != NULL)
- {
- artworkFormats[i].height = _wtoi(albumArtFormatValue);
- }
- }
- // gather the PixelFormat
- if (CompareString(LOCALE_USER_DEFAULT, NORM_IGNORECASE, albumArtFormatKeyName, -1, L"PixelFormat", -1)-2 == 0)
- {
- const wchar_t* albumArtFormatValue = albumArtFormatItemKey->getData()->getString();
- if (albumArtFormatValue != NULL)
- {
- artworkFormats[i].format = RGB_565;
- }
- }
- }
- }
- }
- }
- }
- retInfo->family_id = familyID;
- return retInfo;
- }
- }
- }
- }
- } // end familyid
- }
- } // end plist parser
- }
- for (int yy=0; yy<2; yy++)
- {
- wchar_t sysinfo[] = {drive,L":\\iPod_Control\\Device\\SysInfo"};
- FILE *f = _wfopen(sysinfo,L"rt");
- if (f)
- {
- wchar_t *modelnr=NULL;
- wchar_t buf[1024] = {0};
- while (fgetws(buf,1024,f))
- {
- int len = wcslen(buf);
- //snip off trailing newline
- if (len>0 && buf[len-1]==10)
- {
- buf[len-1]=0; len--;
- }
- wchar_t *colon = wcschr(buf,L':');
- if (colon)
- {
- *colon=0;
- if (!wcscmp(L"ModelNumStr",buf)) // found ModelNumStr line..
- {
- modelnr = colon+1;
- while (modelnr && *modelnr == L' ') modelnr++;
- if (!(*modelnr >= L'0' && *modelnr <= L'9')) modelnr++;
- break; // modelnr found, so we're done
- }
- }
- }
- fclose(f);
- if (modelnr && *modelnr)
- {
- const iPodModelInfo *info = GetiPodInfoForModelStr(modelnr);
- if (info)
- {
- iPodInfo* retInfo = new iPodInfo(info);
- if (have_fwid)
- retInfo->SetFWID(fwid);
- return retInfo;
- }
- }
- }
- if (!yy)
- {
- int d = WASABI_API_DIALOGBOXPARAM(IDD_SELECTIPODTYPE,plugin.hwndWinampParent,selectipodtype_dlgproc,(LPARAM)sysinfo);
- if (d) return NULL;
- }
- }
- return new iPodInfo(&unknown);
- }
- const ArtworkFormat* GetArtworkFormats(const iPodInfo* info)
- {
- if (!info) return NULL;
- return ipod_artwork_info_table[info->model];
- }
|