xref: /haiku/src/apps/mediaplayer/playlist/CopyPLItemsCommand.cpp (revision 1cfb79d74aab3d3b8ba1e81e8c13a5e154856a59)
1415ef601SStephan Aßmus /*
2c60fcc87SStephan Aßmus  * Copyright © 2007-2009 Stephan Aßmus <superstippi@gmx.de>.
3c60fcc87SStephan Aßmus  * All rights reserved. Distributed under the terms of the MIT License.
4415ef601SStephan Aßmus  */
5415ef601SStephan Aßmus #include "CopyPLItemsCommand.h"
6415ef601SStephan Aßmus 
7415ef601SStephan Aßmus #include <new>
8415ef601SStephan Aßmus #include <stdio.h>
9415ef601SStephan Aßmus 
10415ef601SStephan Aßmus #include <Autolock.h>
11238df8fbSAdrien Destugues #include <Catalog.h>
12238df8fbSAdrien Destugues #include <Locale.h>
13415ef601SStephan Aßmus 
14415ef601SStephan Aßmus #include "Playlist.h"
15415ef601SStephan Aßmus 
16415ef601SStephan Aßmus 
17546208a5SOliver Tappe #undef B_TRANSLATION_CONTEXT
18546208a5SOliver Tappe #define B_TRANSLATION_CONTEXT "MediaPlayer-CopyPLItemsCmd"
19238df8fbSAdrien Destugues 
20238df8fbSAdrien Destugues 
21415ef601SStephan Aßmus using std::nothrow;
22415ef601SStephan Aßmus 
23415ef601SStephan Aßmus 
CopyPLItemsCommand(Playlist * playlist,BList indices,int32 toIndex)24415ef601SStephan Aßmus CopyPLItemsCommand::CopyPLItemsCommand(Playlist* playlist,
25*1cfb79d7SJaidyn Ann 		 BList indices, int32 toIndex)
26c60fcc87SStephan Aßmus 	:
27c60fcc87SStephan Aßmus 	PLItemsCommand(),
28c60fcc87SStephan Aßmus 	fPlaylist(playlist),
29*1cfb79d7SJaidyn Ann 	fCount(indices.CountItems()),
30*1cfb79d7SJaidyn Ann 	fItems(fCount > 0 ? new (nothrow) PlaylistItem*[fCount] : NULL),
31c60fcc87SStephan Aßmus 	fToIndex(toIndex),
32c60fcc87SStephan Aßmus 	fItemsCopied(false)
33415ef601SStephan Aßmus {
34*1cfb79d7SJaidyn Ann 	if (indices.IsEmpty() || !fPlaylist || !fItems) {
35415ef601SStephan Aßmus 		// indicate a bad object state
36c60fcc87SStephan Aßmus 		delete[] fItems;
37c60fcc87SStephan Aßmus 		fItems = NULL;
38415ef601SStephan Aßmus 		return;
39415ef601SStephan Aßmus 	}
40415ef601SStephan Aßmus 
41cabb897aSStephan Aßmus 	memset(fItems, 0, sizeof(PlaylistItem*) * fCount);
42c60fcc87SStephan Aßmus 
43415ef601SStephan Aßmus 	// init original entries and
44415ef601SStephan Aßmus 	for (int32 i = 0; i < fCount; i++) {
45*1cfb79d7SJaidyn Ann 		PlaylistItem* item =
46*1cfb79d7SJaidyn Ann 			fPlaylist->ItemAt((int32)(addr_t)indices.ItemAt(i));
47c60fcc87SStephan Aßmus 		if (item != NULL)
48c60fcc87SStephan Aßmus 			fItems[i] = item->Clone();
49c60fcc87SStephan Aßmus 		if (fItems[i] == NULL) {
50c60fcc87SStephan Aßmus 			// indicate a bad object state
51c60fcc87SStephan Aßmus 			_CleanUp(fItems, fCount, true);
52415ef601SStephan Aßmus 			return;
53415ef601SStephan Aßmus 		}
54415ef601SStephan Aßmus 	}
55415ef601SStephan Aßmus }
56415ef601SStephan Aßmus 
57415ef601SStephan Aßmus 
~CopyPLItemsCommand()58415ef601SStephan Aßmus CopyPLItemsCommand::~CopyPLItemsCommand()
59415ef601SStephan Aßmus {
60c60fcc87SStephan Aßmus 	_CleanUp(fItems, fCount, !fItemsCopied);
61415ef601SStephan Aßmus }
62415ef601SStephan Aßmus 
63415ef601SStephan Aßmus 
64415ef601SStephan Aßmus status_t
InitCheck()65415ef601SStephan Aßmus CopyPLItemsCommand::InitCheck()
66415ef601SStephan Aßmus {
67c60fcc87SStephan Aßmus 	if (!fPlaylist || !fItems)
68415ef601SStephan Aßmus 		return B_NO_INIT;
69415ef601SStephan Aßmus 	return B_OK;
70415ef601SStephan Aßmus }
71415ef601SStephan Aßmus 
72415ef601SStephan Aßmus 
73415ef601SStephan Aßmus status_t
Perform()74415ef601SStephan Aßmus CopyPLItemsCommand::Perform()
75415ef601SStephan Aßmus {
76415ef601SStephan Aßmus 	BAutolock _(fPlaylist);
77415ef601SStephan Aßmus 
78415ef601SStephan Aßmus 	status_t ret = B_OK;
79415ef601SStephan Aßmus 
80c60fcc87SStephan Aßmus 	fItemsCopied = true;
81c60fcc87SStephan Aßmus 
82415ef601SStephan Aßmus 	// add refs to playlist at the insertion index
83415ef601SStephan Aßmus 	int32 index = fToIndex;
84415ef601SStephan Aßmus 	for (int32 i = 0; i < fCount; i++) {
85c60fcc87SStephan Aßmus 		if (!fPlaylist->AddItem(fItems[i], index++)) {
86415ef601SStephan Aßmus 			ret = B_NO_MEMORY;
87415ef601SStephan Aßmus 			break;
88415ef601SStephan Aßmus 		}
89415ef601SStephan Aßmus 	}
90415ef601SStephan Aßmus 	return ret;
91415ef601SStephan Aßmus }
92415ef601SStephan Aßmus 
93415ef601SStephan Aßmus 
94415ef601SStephan Aßmus status_t
Undo()95415ef601SStephan Aßmus CopyPLItemsCommand::Undo()
96415ef601SStephan Aßmus {
97415ef601SStephan Aßmus 	BAutolock _(fPlaylist);
98415ef601SStephan Aßmus 
99c60fcc87SStephan Aßmus 	fItemsCopied = false;
100c60fcc87SStephan Aßmus 	// remember currently playling item in case we copy items over it
101c60fcc87SStephan Aßmus 	PlaylistItem* current = fPlaylist->ItemAt(fPlaylist->CurrentItemIndex());
102415ef601SStephan Aßmus 
103415ef601SStephan Aßmus 	// remove refs from playlist
104415ef601SStephan Aßmus 	int32 index = fToIndex;
105415ef601SStephan Aßmus 	for (int32 i = 0; i < fCount; i++) {
106c60fcc87SStephan Aßmus 		fPlaylist->RemoveItem(index++, false);
107415ef601SStephan Aßmus 	}
108415ef601SStephan Aßmus 
109c60fcc87SStephan Aßmus 	// take care about currently played item
110c60fcc87SStephan Aßmus 	if (current != NULL)
111a5a013caSPhilippe Saint-Pierre 		fPlaylist->SetCurrentItemIndex(fPlaylist->IndexOf(current), false);
112415ef601SStephan Aßmus 
113415ef601SStephan Aßmus 	return B_OK;
114415ef601SStephan Aßmus }
115415ef601SStephan Aßmus 
116415ef601SStephan Aßmus 
117415ef601SStephan Aßmus void
GetName(BString & name)118415ef601SStephan Aßmus CopyPLItemsCommand::GetName(BString& name)
119415ef601SStephan Aßmus {
120415ef601SStephan Aßmus 	if (fCount > 1)
121238df8fbSAdrien Destugues 		name << B_TRANSLATE("Copy Entries");
122415ef601SStephan Aßmus 	else
123238df8fbSAdrien Destugues 		name << B_TRANSLATE("Copy Entry");
124415ef601SStephan Aßmus }
125