From 6e190ec6a4db9279ae83ad063a24154d3e5f77f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20A=C3=9Fmus?= Date: Thu, 19 Nov 2009 22:55:43 +0000 Subject: [PATCH] * Created icons for MediaPlayer playlists * Properly register playlist mimetype in MediaPlayer. Double clicking them will now open them in MediaPlayer. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@34143 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- data/artwork/icons/File_Playlist | Bin 0 -> 15323 bytes src/apps/mediaplayer/MainApp.cpp | 89 +++++++++++++++++++++ src/apps/mediaplayer/MainApp.h | 2 + src/apps/mediaplayer/MediaPlayer.rdef | 23 ++++++ src/apps/mediaplayer/playlist/Playlist.cpp | 7 +- src/apps/mediaplayer/playlist/Playlist.h | 5 ++ 6 files changed, 122 insertions(+), 4 deletions(-) create mode 100644 data/artwork/icons/File_Playlist diff --git a/data/artwork/icons/File_Playlist b/data/artwork/icons/File_Playlist new file mode 100644 index 0000000000000000000000000000000000000000..25edd2125dd6d904e7142892a426073bc457836d GIT binary patch literal 15323 zcmeHN3yf4(89u|n^5{~Q@+glQCQ4l>q-9wa3F6Mfg*nweZof%#Q z+ergr3qstA(6k2B(l**!wU*jeg_JacskId<7)22^0eqAeE0q|=?>pz7JLlfsfy>J_ z?%w3j%>B;u{@;K8^Z)1GnX{W}>t@fW5V!)6e39!@9~UBs@?NewxRvb!qD0izHqB-q z4MT~lz5=4RjW-PtVlK*hpv=U-HbjW;-m2<%G-ul~Vis!onbkkgk|XL_=~4AV1W>|R z-H3uysH@94ir9~qeg=6Htx6zz5O&UvIIwz@UgFNVO`qib4J^P#RRz&%Zo`~dZ~UJE zDTAeo@cPC^*$?}A9isXv6~s9%<%ET|H!qJv>q2DOnp;z= zL`N#op2ck_Cd6vU80&Wee%C>AkW$D($jPV>gYlb%+#-Kv>rkToDmzH6xbi8qq}to# zE!lXh2&jwng<6uS459Df+5OOX1W(|X#!}SfWzxvD6CeX2CXE`e1#Z%)@f>iIM>g zAYL^7+`=V|eQ=X$i^sE}3Y*6<5h0!fPdlO_*BcxSfQ*ZYTpNBL1lAwFB`ALl5{Vf6 zsfH)MULGAkjzl{f{_H?i>~O;ZS3|{{9`ZO!X%^0w&)xG@v~}bUF)cNun=c1lodJJz z{S;45HThX}UUaeD7>JuLjfbti^{Uf&2XK=v;*@Vfyy*JAg}dmQ=%DKy^hUbME!{O* zbRDv^Jv8c~>0I=}*xRDt2n@PJg91Gqf}}=@ws6tX6urs>n*MrLv4-CD#}C zwB$`LR?whF^&QcjWfhlbV6%c2_iy@b^hn>&6>V`bR-Ov@TPweT4f65YLU)uCAc9! z9;-(2Gtkm@p&^~y(#LnZ8rnQzNX1k5JuT_ne$aoG-O|NZz_EjGeZ-`OI3b1PB0dCsgA<L0RjH}!>>gP~v_2*dq%K|k+l1`P3q zNvWTTimHp(bW-5ZerXSX+Mg2euYKA(FLU8>KbZsJ24^ljjkf|fwXgA?05`QyoN_bf zLH~5VjYv&iFN;u4jfjA+8mN@+}$%rJsBPT=%m=dVWaS$ zk8r@FXHL6M%xMWSV-pU0m=W-24{4~@?`rf)yL+I0nI)z@X#ArnGwng+ObkqWAWr!V z#LFJy7B209X?HTw9yi=DcR#W{2eQN51-%N?T630|8Z|X3x`rkTUX7;AH8Ta0Gd1Z| zP}pD!O}e-y3)#;T&?G&Sv`bTyUIj{%&XO*!$w{`qr_VkKq00@Kn)E7Ansk^F z7bTlpmWh^BGL`1;o8JP=&xA&xp5F=S{nl$j+;fTB`=NCVZO^E)5ySYI5fA7Y;b|3d zcD(rL9KlqPJ_01}R*^me3?QM>?XGv(#@@jIF8RBMtwhX zej0r;2++o(=U$j|iKLa!!aRYOn)3iLy*^gMdOTVg24NljEYt&^@zW9`-doIVte>Ir z1aK9#;Eji29_xV9DuRfMO?(3|HSW!hmk8S}yd~M3$w*DhEVNeZA)9V)&n!-*mp5k< zsdh1B?ZS%Zx96;^{;- zlHQW_@*UM5AdyiDo~ zz`ab0@3DycG^w`0h4Z7f918z+{j=LLe?gOqyihqU zg5Tqd228L_>gb=(=U098V8NVn;mx<7ua>5y4CnvElq$PT$+szecHNOxn;(5WeB+2$ zzclUqvGC-oHE&KocXV%6rgh1`7AaG@uPIDZiY#lHrcLR@*?h}}m#%>+)%)~H`!2&P z>EmFv(wwn?J`OfFI(nrL9+36rMkkMPvwWp!9pl;?b78mZc1>#6cWpDfM$haVJ@W)z zkmH&suQx1wYD5<1qS~IEuIaUsd#}_r)%dihA67z6+dtz`)+-*+`PKZl;VuT}) zz-&9}?B3$k*?qC7>B6XB{h_M;;im@8e`MQ;gL^mM+u8Kt*zdw~o}B;8!JX2MBB#$! zia@jC_zjaSJ7O?jUS3}CODw*kXlc4nJ9_>y?8r}!;VXs!T4ND4kNyTx%nAo zH(HzVGA)cTE#rQDuxqA5fMue?@3Kss-j7CUrkPB9b&MZG?ro-Q<4{It7(`TUewVcr z80QcaLuATE6>}b$BKT$tm*)wgbbPU#ojm#F4KH_Y?b@eg9dYJ8`&2Q!4U8w+mk6;u z(H>fv$Rrjel8Nk^P^P6h$t(Z`&8xi%a*=vy)ek9kV1UU66~s%ELPaR0^>Zknb*LyW zQb?{z%3$1+6cQXjmaKF9E$CnpFr|DaS+Al@B{5F2`eUA6WDPBX-(leevM``};X$%E zB}o=fMbyjl$`B5(=;(yaT0AWtz({Y4}NpY4jgLU5*>Xr;H{}<5v1Av5lVdm}=KAb>MY2ev<=V2%P+Jk?6(4epXub zZOd-Trc=w}>Sanxa|ep8H!Dl=IitKw;H$uNNZwKts}imFs8d~Kk>v^auuw9AUmH^m z%#yJSx4!hwm^0x_TPmH6t8Q7{W=5Sns2=_&>#5VS0}gpHJ9rG`*UQQAoT-?T8;>%z zUY+Y^8E|DcPA5n0d*M7LC0GpEoQA5}Da&&CAm$TPR!OKnT_HrN8SdQDV%ga@Cd%12eS2Q>3x?YZs&GvHkx+!?M ziucjW-3b@$Cu42ELvY4dnz6DSGgBTTxHDEBmNBE^Zs5*X3mKI&V?7K#dS$GGFi)=t z`<5bjm4z1~Z_dtUi)SyK9+O8V0(@N{y&lI_=W}*;)Sb6pRWiC>y@|Cbc^M!V^QXnx3&TIT0NgHfFP1AgN(k+{ile#z0_z0SJOBUy literal 0 HcmV?d00001 diff --git a/src/apps/mediaplayer/MainApp.cpp b/src/apps/mediaplayer/MainApp.cpp index 091827449a..ca4c1ba1ad 100644 --- a/src/apps/mediaplayer/MainApp.cpp +++ b/src/apps/mediaplayer/MainApp.cpp @@ -28,7 +28,9 @@ #include #include #include +#include #include +#include #include #include @@ -36,6 +38,7 @@ #include #include "EventQueue.h" +#include "Playlist.h" #include "Settings.h" #include "SettingsWindow.h" @@ -161,6 +164,8 @@ MainApp::ReadyToRun() fSettingsWindow = new SettingsWindow(BRect(150, 150, 450, 520)); fSettingsWindow->Hide(); fSettingsWindow->Show(); + + _InstallPlaylistMimeType(); } @@ -549,6 +554,90 @@ MainApp::_RestoreCurrentPlaylist(BMessage* message) const return message->Unflatten(&file); } +void +MainApp::_InstallPlaylistMimeType() +{ + // install mime type of documents + BMimeType mime(kBinaryPlaylistMimeString); + status_t ret = mime.InitCheck(); + if (ret != B_OK) { + fprintf(stderr, "Could not init native document mime type (%s): %s.\n", + kBinaryPlaylistMimeString, strerror(ret)); + return; + } + + if (mime.IsInstalled() && !(modifiers() & B_SHIFT_KEY)) { + // mime is already installed, and the user is not + // pressing the shift key to force a re-install + return; + } + + ret = mime.Install(); + if (ret != B_OK && ret != B_FILE_EXISTS) { + fprintf(stderr, "Could not install native document mime type (%s): %s.\n", + kBinaryPlaylistMimeString, strerror(ret)); + return; + } + // set preferred app + ret = mime.SetPreferredApp(kAppSig); + if (ret != B_OK) { + fprintf(stderr, "Could not set native document preferred app: %s\n", + strerror(ret)); + } + + // set descriptions + ret = mime.SetShortDescription("MediaPlayer Playlist"); + if (ret != B_OK) { + fprintf(stderr, "Could not set short description of mime type: %s\n", + strerror(ret)); + } + ret = mime.SetLongDescription("MediaPlayer binary playlist file"); + if (ret != B_OK) { + fprintf(stderr, "Could not set long description of mime type: %s\n", + strerror(ret)); + } + + // set extensions + BMessage message('extn'); + message.AddString("extensions", "playlist"); + ret = mime.SetFileExtensions(&message); + if (ret != B_OK) { + fprintf(stderr, "Could not set extensions of mime type: %s\n", + strerror(ret)); + } + + // set sniffer rule + char snifferRule[32]; + uint32 bigEndianMagic = B_HOST_TO_BENDIAN_INT32(kPlaylistMagicBytes); + sprintf(snifferRule, "0.9 ('%4s')", (const char*)&bigEndianMagic); + ret = mime.SetSnifferRule(snifferRule); + if (ret != B_OK) { + BString parseError; + BMimeType::CheckSnifferRule(snifferRule, &parseError); + fprintf(stderr, "Could not set sniffer rule of mime type: %s\n", + parseError.String()); + } + + // set playlist icon + BResources* resources = AppResources(); + // does not need to be freed (belongs to BApplication base) + if (resources != NULL) { + size_t size; + const void* iconData = resources->LoadResource('VICN', "PlaylistIcon", + &size); + if (iconData != NULL && size > 0) { + if (mime.SetIcon(reinterpret_cast(iconData), size) + != B_OK) { + fprintf(stderr, "Could not set vector icon of mime type.\n"); + } + } else { + fprintf(stderr, "Could not find icon in app resources " + "(data: %p, size: %ld).\n", iconData, size); + } + } else + fprintf(stderr, "Could not find app resources.\n"); +} + // #pragma mark - main diff --git a/src/apps/mediaplayer/MainApp.h b/src/apps/mediaplayer/MainApp.h index 5a08bade7c..8510e9cbad 100644 --- a/src/apps/mediaplayer/MainApp.h +++ b/src/apps/mediaplayer/MainApp.h @@ -98,6 +98,8 @@ private: status_t _RestoreCurrentPlaylist( BMessage* message) const; + void _InstallPlaylistMimeType(); + private: int32 fPlayerCount; SettingsWindow* fSettingsWindow; diff --git a/src/apps/mediaplayer/MediaPlayer.rdef b/src/apps/mediaplayer/MediaPlayer.rdef index 0d0d8c697f..4b5cbe769a 100644 --- a/src/apps/mediaplayer/MediaPlayer.rdef +++ b/src/apps/mediaplayer/MediaPlayer.rdef @@ -14,6 +14,8 @@ resource app_version { resource app_flags B_SINGLE_LAUNCH; resource file_types message { + "types" = "application/x-vnd.haiku-playlist", + "types" = "application/ogg", "types" = "application/x-ogg", "types" = "application/x-asf", @@ -95,3 +97,24 @@ resource vector_icon { $"020E0F1815FF01178400040A09020E0F0815FF" }; +resource("PlaylistIcon") #'VICN' array { + $"6E6369660805010401920200060338D2F73CD163BF82B23B84A94B885046E193" + $"00A5C5FFBDEAF2FFFFD5E3FF020106023C71C43DE4E9BCEEA63BAE5F49867748" + $"01ECFFD8E4FA7C7794C9020106023C34913DBF47BD1EE83BAC5E49EA70498C6D" + $"FFD8E2F37C6385C2020106023E49240000000000003CAAAA4940004A3000FED8" + $"E4FA7C7794C9020016023A66BABB23523D88443CB3F9489F5D48C17C0001FF27" + $"020106023A7E6FBB109D3DA2AF3CF54A495C2B486FDC00485C85FFBBCFF70E0A" + $"07485E4A5E4C5F6043573D455D475D0606AE0BB40BBC1D33C07FB72CBE903C47" + $"C13EC408CA28BA52C118B656C51BB876BF07B53E3A230605AE02B40BBF4D33C3" + $"AFB73CC1A43D50C13EC79ECA28BD823AB6BC0605AE02B40BC27D33C6DFB75DC4" + $"A3BDEFC937C13ECB34CA28C0B23AB9EC0606AE0BB40BBF4D33C3AFB75DC173BD" + $"EFC607C13EC804CA28BD82C118B920C51BBB40BF07B8083AB6BC0605AE02B57D" + $"3EB9B9C3EFB7BB44BBB751BD75C936CA8EC1B1402F0A093B593D5BBFCDC93E45" + $"5BC516C5F160465B435D4544510A045A425E3F5A3D5740060AAFBF0E3B4A3848" + $"BF6AC4D6414145443D3E363CBF4DBB374B3C4B3C483D49454643C4FEC2D84F3C" + $"533F4B393B302E3A3D413D413A4208024049543308023B454E3008023541492D" + $"0802303D432A08022A393E25090A010100000A0001031001178400040A040103" + $"000A0001021001178400040A030102000A0001011001178400040A020101000A" + $"0705090A0B0C0D1815FF01178100040A060108202018" +}; + diff --git a/src/apps/mediaplayer/playlist/Playlist.cpp b/src/apps/mediaplayer/playlist/Playlist.cpp index a28bcaa911..d6af7ca738 100644 --- a/src/apps/mediaplayer/playlist/Playlist.cpp +++ b/src/apps/mediaplayer/playlist/Playlist.cpp @@ -166,10 +166,9 @@ Playlist::Archive(BMessage* into) const } -static const uint32 kPlaylistMagicBytes = 'MPPL'; -static const char* kTextPlaylistMimeString = "text/x-playlist"; -static const char* kBinaryPlaylistMimeString - = "application/x-vnd.haiku-playlist"; +const uint32 kPlaylistMagicBytes = 'MPPL'; +const char* kTextPlaylistMimeString = "text/x-playlist"; +const char* kBinaryPlaylistMimeString = "application/x-vnd.haiku-playlist"; status_t Playlist::Unflatten(BDataIO* stream) diff --git a/src/apps/mediaplayer/playlist/Playlist.h b/src/apps/mediaplayer/playlist/Playlist.h index 0cd3dfa17d..cada300fe3 100644 --- a/src/apps/mediaplayer/playlist/Playlist.h +++ b/src/apps/mediaplayer/playlist/Playlist.h @@ -33,6 +33,11 @@ class BString; struct entry_ref; +extern const uint32 kPlaylistMagicBytes; +extern const char* kTextPlaylistMimeString; +extern const char* kBinaryPlaylistMimeString; + + class Playlist : public BLocker { public: class Listener {