TaglibChannelFileIOManager.cpp
Go to the documentation of this file.
1 /*
2 //
3 // BEGIN SONGBIRD GPL
4 //
5 // This file is part of the Songbird web player.
6 //
7 // Copyright(c) 2005-2008 POTI, Inc.
8 // http://songbirdnest.com
9 //
10 // This file may be licensed under the terms of of the
11 // GNU General Public License Version 2 (the "GPL").
12 //
13 // Software distributed under the License is distributed
14 // on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
15 // express or implied. See the GPL for the specific language
16 // governing rights and limitations.
17 //
18 // You should have received a copy of the GPL along with this
19 // program. If not, go to http://www.gnu.org/licenses/gpl.html
20 // or write to the Free Software Foundation, Inc.,
21 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
22 //
23 // END SONGBIRD GPL
24 //
25 */
26 
27 /* *****************************************************************************
28  *******************************************************************************
29  *
30  * TagLib sbISeekableChannel file IO manager.
31  *
32  *******************************************************************************
33  ******************************************************************************/
34 
40 /* *****************************************************************************
41  *
42  * TagLib sbISeekable file I/O manager imported services.
43  *
44  ******************************************************************************/
45 
46 /* Self imports. */
48 
49 /* Mozilla imports. */
50 #include <nsServiceManagerUtils.h>
51 #include <prlog.h>
52 
53 
54 /* *****************************************************************************
55  *
56  * TagLib sbISeekable file I/O manager logging services.
57  *
58  ******************************************************************************/
59 
60 #ifdef PR_LOGGING
61 static PRLogModuleInfo* gLog = PR_NewLogModule("sbTagLibChannelFileIOManager");
62 #define TRACE(args) PR_LOG(gLog, PR_LOG_DEBUG, args)
63 #define LOG(args) PR_LOG(gLog, PR_LOG_WARN, args)
64 #else
65 #define TRACE(args) /* nothing */
66 #define LOG(args) /* nothing */
67 #endif
68 
69 
70 /*******************************************************************************
71  *
72  * TagLib sbISeekableChannel file I/O manager nsISupports implementation.
73  *
74  ******************************************************************************/
75 
78 
79 
80 /*******************************************************************************
81  *
82  * TagLib sbISeekableChannel file I/O manager sbITagLibChannelFileIOManager
83  * implementation.
84  *
85  ******************************************************************************/
86 
87 
94 NS_IMETHODIMP sbTagLibChannelFileIOManager::AddChannel(
95  const nsACString &aChannelID,
96  sbISeekableChannel *aChannel)
97 {
98  nsAutoPtr<sbTagLibChannelFileIOManager::Channel> pChannel;
99  PRBool success;
100 
101  /* Validate parameters. */
102  NS_ENSURE_FALSE(aChannelID.IsEmpty(), NS_ERROR_INVALID_ARG);
103  NS_ENSURE_ARG_POINTER(aChannel);
104 
105  /* Create a new channel object. */
106  pChannel = new sbTagLibChannelFileIOManager::Channel(aChannel);
107  NS_ENSURE_TRUE(pChannel, NS_ERROR_OUT_OF_MEMORY);
108 
109  /* Add the channel to the channel map. */
110  success = mChannelMap.Put(aChannelID, pChannel);
111  NS_ENSURE_TRUE(success, NS_ERROR_FAILURE);
112  pChannel.forget();
113 
114  return (NS_OK);
115 }
116 
117 
124 NS_IMETHODIMP sbTagLibChannelFileIOManager::RemoveChannel(
125  const nsACString &aChannelID)
126 {
127  /* Validate parameters. */
128  NS_ENSURE_FALSE(aChannelID.IsEmpty(), NS_ERROR_INVALID_ARG);
129 
130  /* Remove the channel map entry. */
131  mChannelMap.Remove(aChannelID);
132 
133  return (NS_OK);
134 }
135 
136 
144 NS_IMETHODIMP sbTagLibChannelFileIOManager::GetChannel(
145  const nsACString &aChannelID,
146  sbISeekableChannel **_retval)
147 {
148  sbTagLibChannelFileIOManager::Channel *pChannel;
149  nsresult rv;
150 
151  /* Validate parameters. */
152  NS_ENSURE_FALSE(aChannelID.IsEmpty(), NS_ERROR_INVALID_ARG);
153  NS_ENSURE_ARG_POINTER(_retval);
154 
155  /* Get the metadata channel. */
156  rv = GetChannel(aChannelID, &pChannel);
157  if (NS_FAILED(rv))
158  return (rv);
159 
160  /* Return results. */
161  NS_ADDREF(*_retval = pChannel->pSeekableChannel);
162 
163  return (NS_OK);
164 }
165 
166 
178 NS_IMETHODIMP sbTagLibChannelFileIOManager::GetChannelSize(
179  const nsACString &aChannelID,
180  PRUint64 *_retval)
181 {
182  sbTagLibChannelFileIOManager::Channel *pChannel;
183  PRUint64 size = 0;
184  nsresult rv;
185 
186  /* Validate parameters. */
187  NS_ENSURE_FALSE(aChannelID.IsEmpty(), NS_ERROR_INVALID_ARG);
188  NS_ENSURE_ARG_POINTER(_retval);
189 
190  /* Get the channel size. */
191  rv = GetChannel(aChannelID, &pChannel);
192  NS_ENSURE_SUCCESS(rv, rv);
193  rv = pChannel->pSeekableChannel->GetSize(&size);
194  NS_ENSURE_SUCCESS(rv, rv);
195 
196  /* Return results. */
197  *_retval = size;
198 
199  return (NS_OK);
200 }
201 
202 
210 NS_IMETHODIMP sbTagLibChannelFileIOManager::GetChannelRestart(
211  const nsACString &aChannelID,
212  PRBool *_retval)
213 {
214  sbTagLibChannelFileIOManager::Channel *pChannel;
215  PRBool restart;
216  nsresult rv;
217 
218  /* Validate parameters. */
219  NS_ENSURE_FALSE(aChannelID.IsEmpty(), NS_ERROR_INVALID_ARG);
220  NS_ENSURE_ARG_POINTER(_retval);
221 
222  /* Get the channel restart flag. */
223  rv = GetChannel(aChannelID, &pChannel);
224  NS_ENSURE_SUCCESS(rv, rv);
225  restart = pChannel->restart;
226 
227  /* Return results. */
228  *_retval = restart;
229 
230  return (NS_OK);
231 }
232 
233 
241 NS_IMETHODIMP sbTagLibChannelFileIOManager::SetChannelRestart(
242  const nsACString &aChannelID,
243  PRBool aRestart)
244 {
245  sbTagLibChannelFileIOManager::Channel *pChannel;
246  nsresult rv;
247 
248  /* Validate parameters. */
249  NS_ENSURE_FALSE(aChannelID.IsEmpty(), NS_ERROR_INVALID_ARG);
250 
251  /* Set the channel restart flag. */
252  rv = GetChannel(aChannelID, &pChannel);
253  NS_ENSURE_SUCCESS(rv, rv);
254  pChannel->restart = aRestart;
255 
256  return (NS_OK);
257 }
258 
259 
260 /*******************************************************************************
261  *
262  * Public TagLib sbISeekableChannel file I/O manager services.
263  *
264  ******************************************************************************/
265 
266 /*
267  * sbTagLibChannelFileIOManager
268  *
269  * This function constructs a TagLib sbISeekable file I/O manager object.
270  */
271 
273 {
274 }
275 
276 
277 /*
278  * ~TagLibChannelFileIO
279  *
280  * This function is the destructor for TagLib sbISeekable file I/O manager
281  * objects.
282  */
283 
285 {
286 }
287 
288 
289 /*
290  * FactoryInit
291  *
292  * This function is called by the component factory to initialize the
293  * component.
294  */
295 
297 {
298  PRBool success;
299 
300  /* Initialize the channel map. */
301  success = mChannelMap.Init();
302  NS_ENSURE_TRUE(success, NS_ERROR_FAILURE);
303 
304  return (NS_OK);
305 }
306 
307 
308 /*******************************************************************************
309  *
310  * Private TagLib sbISeekableChannel file I/O manager services.
311  *
312  ******************************************************************************/
313 
314 /*
315  * Channel
316  *
317  * This function constructs a TagLib sbISeekable file I/O manager channel
318  * object.
319  */
320 
321 sbTagLibChannelFileIOManager::Channel::Channel(
322  nsCOMPtr<sbISeekableChannel> apSeekableChannel)
323 :
324  pSeekableChannel(apSeekableChannel),
325  restart(PR_FALSE)
326 {
327  MOZ_COUNT_CTOR(sbTagLibChannelFileIOManager::Channel);
328  TRACE(("sbTagLibChannelFileIOManager::Channel[0x%.8x] - ctor", this));
329 }
330 
331 
332 /*
333  * ~Channel
334  *
335  * This function is the destructor for TagLib sbISeekable file I/O manager
336  * channel objects.
337  */
338 
339 sbTagLibChannelFileIOManager::Channel::~Channel()
340 {
341  MOZ_COUNT_DTOR(sbTagLibChannelFileIOManager::Channel);
342  TRACE(("sbTagLibChannelFileIOManager::Channel[0x%.8x] - dtor", this));
343 }
344 
345 
346 /*
347  * GetChannel
348  *
349  * --> aChannelID Channel identifier.
350  * <-- appChannel TagLib channel.
351  *
352  * <-- NS_ERROR_NOT_AVAILABLE No channel with the specified identifier is
353  * available.
354  *
355  * This function returns in appChannel a TagLib channel corresponding to the
356  * channel identifier specified by aChannelID. If no channels can be found,
357  * this function returns NS_ERROR_NOT_AVAILABLE.
358  */
359 
360 nsresult sbTagLibChannelFileIOManager::GetChannel(
361  const nsACString &aChannelID,
362  sbTagLibChannelFileIOManager::Channel
363  **appChannel)
364 {
365  sbTagLibChannelFileIOManager::Channel *pChannel;
366  PRBool success;
367 
368  /* Validate parameters. */
369  NS_ASSERTION(!aChannelID.IsEmpty(), "aChannelID is empty");
370  NS_ASSERTION(appChannel, "appChannel is null");
371 
372  /* Get the channel from the channel map. */
373  success = mChannelMap.Get(aChannelID, &pChannel);
374  if (!success)
375  return (NS_ERROR_NOT_AVAILABLE);
376 
377  /* Return results. */
378  *appChannel = pChannel;
379 
380  return (NS_OK);
381 }
return NS_OK
#define TRACE(args)
A service for providing sbISeekableChannel file IO support in TagLib.
A seekable wrapper for an nsIChannel.
NS_IMPL_THREADSAFE_ISUPPORTS1(sbTagLibChannelFileIOManager, sbITagLibChannelFileIOManager) NS_IMETHODIMP sbTagLibChannelFileIOManager
Add an sbISeekableChannel to be used for TagLib file IO.
NS_DECL_ISUPPORTS NS_DECL_SBITAGLIBCHANNELFILEIOMANAGER sbTagLibChannelFileIOManager()