sbIPDMap.cpp
Go to the documentation of this file.
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim: set sw=2 :miv */
3 /*
4 //=BEGIN SONGBIRD GPL
5 //
6 // This file is part of the Songbird web player.
7 //
8 // Copyright(c) 2005-2009 POTI, Inc.
9 // http://www.songbirdnest.com
10 //
11 // This file may be licensed under the terms of of the
12 // GNU General Public License Version 2 (the GPL).
13 //
14 // Software distributed under the License is distributed
15 // on an AS IS basis, WITHOUT WARRANTY OF ANY KIND, either
16 // express or implied. See the GPL for the specific language
17 // governing rights and limitations.
18 //
19 // You should have received a copy of the GPL along with this
20 // program. If not, go to http://www.gnu.org/licenses/gpl.html
21 // or write to the Free Software Foundation, Inc.,
22 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
23 //
24 //=END SONGBIRD GPL
25 */
26 
27 //------------------------------------------------------------------------------
28 //
29 // iPod device mapping services.
30 //
31 // These services may only be used within both the connect and request locks.
32 //
33 //------------------------------------------------------------------------------
34 
40 //------------------------------------------------------------------------------
41 //
42 // iPod device mapping imported services.
43 //
44 //------------------------------------------------------------------------------
45 
46 // Local imports.
47 #include "sbIPDDevice.h"
48 
49 // Songbird imports.
50 #include <sbIDatabaseResult.h>
51 
52 // Mozilla imports.
53 #include <nsComponentManagerUtils.h>
54 #include <prprf.h>
55 
56 
57 //------------------------------------------------------------------------------
58 //
59 // iPod device mapping services.
60 //
61 //------------------------------------------------------------------------------
62 
67 nsresult
68 sbIPDDevice::MapInitialize()
69 {
70  nsresult rv;
71 
72  // Create the ID map database query object.
73  nsCOMPtr<sbIDatabaseQuery> idQuery;
74  rv = IDMapCreateDBQuery(getter_AddRefs(idQuery));
75  NS_ENSURE_SUCCESS(rv, rv);
76 
77  // Create the ID map table if it doesn't exist.
78  rv = ExecuteQuery(idQuery,
79  "CREATE TABLE IF NOT EXISTS ipod_id_map "
80  "(ipod_id BLOB NOT NULL, songbird_id BLOB NOT NULL)",
81  nsnull);
82  NS_ENSURE_SUCCESS(rv, rv);
83 
84  return NS_OK;
85 }
86 
87 
92 void
93 sbIPDDevice::MapFinalize()
94 {
95 }
96 
97 
98 //------------------------------------------------------------------------------
99 //
100 // iPod device ID mapping services.
101 //
102 // These services provide support for mapping iPod IDs (e.g., track and
103 // playlist IDs) with Songbird library IDs (e.g., media item and media list
104 // GUIDs). These services provide a persistent mapping.
105 //
106 //------------------------------------------------------------------------------
107 
116 nsresult
117 sbIPDDevice::IDMapAdd(nsAString& aSBID,
118  guint64 aIPodID)
119 {
120  nsresult rv;
121 
122  // Produce the database query string.
123  char queryStr[256];
124  PR_snprintf(queryStr,
125  sizeof(queryStr),
126  "INSERT OR REPLACE INTO ipod_id_map"
127  "(songbird_id, ipod_id) VALUES"
128  "(\"%s\", \"%08x:%08x\")",
129  NS_ConvertUTF16toUTF8(aSBID).get(),
130  (PRUint32) ((aIPodID >> 32) & 0xFFFFFFFF),
131  (PRUint32) (aIPodID & 0xFFFFFFFF));
132 
133  // Create the ID map database query object.
134  nsCOMPtr<sbIDatabaseQuery> idQuery;
135  rv = IDMapCreateDBQuery(getter_AddRefs(idQuery));
136  NS_ENSURE_SUCCESS(rv, rv);
137 
138  // Execute the query.
139  rv = ExecuteQuery(idQuery, queryStr, nsnull);
140  NS_ENSURE_SUCCESS(rv, rv);
141 
142  return NS_OK;
143 }
144 
145 
152 nsresult
153 sbIPDDevice::IDMapRemove(guint64 aIPodID)
154 {
155  nsresult rv;
156 
157  // Produce the database query string.
158  char queryStr[256];
159  PR_snprintf(queryStr,
160  sizeof(queryStr),
161  "DELETE FROM ipod_id_map WHERE ipod_id = \"%08x:%08x\"",
162  (PRUint32) ((aIPodID >> 32) & 0xFFFFFFFF),
163  (PRUint32) (aIPodID & 0xFFFFFFFF));
164 
165  // Create the ID map database query object.
166  nsCOMPtr<sbIDatabaseQuery> idQuery;
167  rv = IDMapCreateDBQuery(getter_AddRefs(idQuery));
168  NS_ENSURE_SUCCESS(rv, rv);
169 
170  // Execute the query.
171  rv = ExecuteQuery(idQuery, queryStr, nsnull);
172  NS_ENSURE_SUCCESS(rv, rv);
173 
174  return NS_OK;
175 }
176 
177 
186 nsresult
187 sbIPDDevice::IDMapGet(nsAString& aSBID,
188  nsTArray<guint64>& aIPodIDList)
189 {
190  nsresult rv;
191 
192  // Produce the database query string.
193  char queryStr[256];
194  PR_snprintf(queryStr,
195  sizeof(queryStr),
196  "SELECT ipod_id FROM ipod_id_map WHERE songbird_id = \"%s\"",
197  NS_ConvertUTF16toUTF8(aSBID).get());
198 
199  // Create the ID map database query object.
200  nsCOMPtr<sbIDatabaseQuery> idQuery;
201  rv = IDMapCreateDBQuery(getter_AddRefs(idQuery));
202  NS_ENSURE_SUCCESS(rv, rv);
203 
204  // Execute the query.
205  nsCOMPtr<sbIDatabaseResult> dbResult;
206  rv = ExecuteQuery(idQuery, queryStr, getter_AddRefs(dbResult));
207  NS_ENSURE_SUCCESS(rv, rv);
208 
209  // Convert results to iPod IDs.
210  PRUint32 rowCount;
211  rv = dbResult->GetRowCount(&rowCount);
212  aIPodIDList.Clear();
213  for (PRUint32 i = 0; i < rowCount; i++) {
214  // Get the next query result string.
215  nsAutoString iPodIDStr;
216  rv = dbResult->GetRowCell(i, 0, iPodIDStr);
217  NS_ENSURE_SUCCESS(rv, rv);
218 
219  // Scan the iPod ID from the ID string.
220  guint32 iPodIDHi, iPodIDLo;
221  int numScanned;
222  numScanned = PR_sscanf(NS_ConvertUTF16toUTF8(iPodIDStr).get(),
223  "%x:%x\n",
224  &iPodIDHi,
225  &iPodIDLo);
226  if (numScanned >= 2) {
227  guint64 iPodID = (((guint64) iPodIDHi) << 32) | ((guint64) iPodIDLo);
228  aIPodIDList.AppendElement(iPodID);
229  }
230  }
231 
232  return NS_OK;
233 }
234 
235 
247 nsresult
248 sbIPDDevice::IDMapGet(nsAString& aSBID,
249  guint64* aIPodID)
250 {
251  // Validate arguments.
252  NS_ASSERTION(aIPodID, "aIPodID is null");
253 
254  // Function variables.
255  nsresult rv;
256 
257  // Get the list of iPod IDs mapped to the Songbird ID.
258  nsTArray<guint64> iPodIDList;
259  rv = IDMapGet(aSBID, iPodIDList);
260  if (NS_FAILED(rv) || (iPodIDList.Length() == 0))
261  return NS_ERROR_NOT_AVAILABLE;
262 
263  // Return the first iPod ID.
264  *aIPodID = iPodIDList[0];
265 
266  return NS_OK;
267 }
268 
269 
280 nsresult
281 sbIPDDevice::IDMapGet(guint64 aIPodID,
282  nsAString& aSBID)
283 {
284  nsresult rv;
285 
286  // Produce the database query string.
287  char queryStr[256];
288  PR_snprintf(queryStr,
289  sizeof(queryStr),
290  "SELECT songbird_id FROM ipod_id_map "
291  "WHERE ipod_id = \"%08x:%08x\"",
292  (PRUint32) ((aIPodID >> 32) & 0xFFFFFFFF),
293  (PRUint32) (aIPodID & 0xFFFFFFFF));
294 
295  // Create the ID map database query object.
296  nsCOMPtr<sbIDatabaseQuery> idQuery;
297  rv = IDMapCreateDBQuery(getter_AddRefs(idQuery));
298  NS_ENSURE_SUCCESS(rv, rv);
299 
300  // Execute the query.
301  nsCOMPtr<sbIDatabaseResult> dbResult;
302  rv = ExecuteQuery(idQuery, queryStr, getter_AddRefs(dbResult));
303  NS_ENSURE_SUCCESS(rv, rv);
304 
305  // Get Songbird ID from the query result.
306  PRUint32 rowCount;
307  rv = dbResult->GetRowCount(&rowCount);
308  if (!(rowCount > 0))
309  return NS_ERROR_NOT_AVAILABLE;
310  rv = dbResult->GetRowCell(0, 0, aSBID);
311  NS_ENSURE_SUCCESS(rv, rv);
312 
313  return NS_OK;
314 }
315 
316 
329 nsresult
330 sbIPDDevice::IDMapGet(guint64 aIPodID,
331  nsAString& aLibraryGUID,
332  nsAString& aResourceGUID)
333 {
334  nsresult rv;
335 
336  // Get the Songbird ID mapped to the iPod item ID.
337  nsAutoString sbID;
338  rv = IDMapGet(aIPodID, sbID);
339  if (NS_FAILED(rv))
340  return NS_ERROR_NOT_AVAILABLE;
341 
342  // Get the library and resource GUIDs.
343  rv = DecodeSBID(sbID, aLibraryGUID, aResourceGUID);
344  NS_ENSURE_SUCCESS(rv, rv);
345 
346  return NS_OK;
347 }
348 
349 
361 nsresult
362 sbIPDDevice::IDMapGet(guint64 aIPodID,
363  sbIMediaItem** aMediaItem)
364 {
365  // Validate arguments.
366  NS_ASSERTION(aMediaItem, "aMediaItem is null");
367 
368  // Function variables.
369  nsresult rv;
370 
371  // Get the Songbird library and item GUIDs mapped to the iPod item ID.
372  nsAutoString libraryGUID;
373  nsAutoString itemGUID;
374  rv = IDMapGet(aIPodID, libraryGUID, itemGUID);
375  NS_ENSURE_SUCCESS(rv, rv);
376 
377  // Search for the mapped media item.
378  nsCOMPtr<sbILibrary> library;
379  nsCOMPtr<sbIMediaItem> mediaItem;
380  rv = mLibraryManager->GetLibrary(libraryGUID, getter_AddRefs(library));
381  if (NS_FAILED(rv))
382  return NS_ERROR_NOT_AVAILABLE;
383  rv = library->GetItemByGuid(itemGUID, getter_AddRefs(mediaItem));
384  if (NS_FAILED(rv))
385  return NS_ERROR_NOT_AVAILABLE;
386 
387  // Return results.
388  NS_ADDREF(*aMediaItem = mediaItem);
389 
390  return NS_OK;
391 }
392 
393 
400 nsresult
401 sbIPDDevice::IDMapCreateDBQuery(sbIDatabaseQuery** aQuery)
402 {
403  // Validate arguments.
404  NS_ASSERTION(aQuery, "aQuery is null");
405 
406  // Function variables.
407  nsresult rv;
408 
409  // Create the ID map database query object.
410  nsCOMPtr<sbIDatabaseQuery>
411  query = do_CreateInstance("@songbirdnest.com/Songbird/DatabaseQuery;1",
412  &rv);
413  NS_ENSURE_SUCCESS(rv, rv);
414 
415  // Set up the database query.
416  rv = query->SetAsyncQuery(PR_FALSE);
417  NS_ENSURE_SUCCESS(rv, rv);
418  rv = query->SetDatabaseGUID(NS_LITERAL_STRING("iPod"));
419  NS_ENSURE_SUCCESS(rv, rv);
420 
421  // Return results.
422  NS_ADDREF(*aQuery = query);
423 
424  return NS_OK;
425 }
426 
427 
435 nsresult
436 sbIPDDevice::GetSBID(sbIMediaItem* aMediaItem,
437  nsAString& aSBID)
438 {
439  // Validate arguments.
440  NS_ASSERTION(aMediaItem, "aMediaItem is null");
441 
442  // Function variables.
443  nsresult rv;
444 
445  // Get the media item library.
446  nsCOMPtr<sbILibrary> library;
447  rv = aMediaItem->GetLibrary(getter_AddRefs(library));
448  NS_ENSURE_SUCCESS(rv, rv);
449 
450  // Get the media item and library GUIDs.
451  nsAutoString libraryGUID;
452  nsAutoString itemGUID;
453  rv = library->GetGuid(libraryGUID);
454  NS_ENSURE_SUCCESS(rv, rv);
455  rv = aMediaItem->GetGuid(itemGUID);
456  NS_ENSURE_SUCCESS(rv, rv);
457 
458  // Encode the Songbird ID.
459  rv = EncodeSBID(aSBID, libraryGUID, itemGUID);
460  NS_ENSURE_SUCCESS(rv, rv);
461 
462  return NS_OK;
463 }
464 
465 
466 //------------------------------------------------------------------------------
467 //
468 // Internal iPod device mapping services.
469 //
470 //------------------------------------------------------------------------------
471 
480 nsresult
481 sbIPDDevice::IPodItemGetID(void* aIPodItem,
482  int aType,
483  guint64* aIPodID)
484 {
485  // Validate parameters.
486  NS_ASSERTION(aIPodItem, "aIPodItem is null");
487  NS_ASSERTION(aIPodID, "aIPodID is null");
488 
489  // Get the iPod item ID.
490  guint64 iPodID;
491  if (aType == TypePlaylist) {
492  Itdb_Playlist* playlist = (Itdb_Playlist*) aIPodItem;
493  iPodID = playlist->id;
494  } else {
495  Itdb_Track* track = (Itdb_Track*) aIPodItem;
496  iPodID = track->dbid;
497  }
498 
499  // Return results.
500  *aIPodID = iPodID;
501 
502  return NS_OK;
503 }
504 
505 
515 nsresult
516 sbIPDDevice::DecodeSBID(const nsAString& aSBID,
517  nsAString& aLibraryGUID,
518  nsAString& aResourceGUID)
519 {
520  // Extract the Songbird library and resource GUID's from the Songbird ID.
521  PRInt32 pos = aSBID.RFindChar(SBIDDelimiter);
522  NS_ENSURE_TRUE(pos != -1, NS_ERROR_INVALID_ARG);
523  aLibraryGUID.Assign(Substring(aSBID, 0, pos));
524  aResourceGUID.Assign(Substring(aSBID, pos + 1));
525 
526  return NS_OK;
527 }
528 
529 
539 nsresult
540 sbIPDDevice::EncodeSBID(nsAString& aSBID,
541  const nsAString& aLibraryGUID,
542  const nsAString& aResourceGUID)
543 {
544  // Produce the Songbird ID from the Songbird library and resource GUID's.
545  aSBID.Assign(aLibraryGUID);
546  nsCAutoString nsDelimiter;
547  char delimiter[2];
548  delimiter[0] = SBIDDelimiter;
549  delimiter[1] = '\0';
550  aSBID.AppendLiteral(delimiter);
551  aSBID.Append(aResourceGUID);
552 
553  return NS_OK;
554 }
555 
556 
567 nsresult
568 sbIPDDevice::ExecuteQuery(sbIDatabaseQuery* aDBQuery,
569  const char* aQueryStr,
570  sbIDatabaseResult** aDBResult)
571 {
572  // Validate arguments.
573  NS_ASSERTION(aDBQuery, "aDBQuery is null");
574  NS_ASSERTION(aQueryStr, "aQueryStr is null");
575 
576  // Function variables.
577  PRInt32 dbError;
578  nsresult rv;
579 
580  // Set up the query.
581  rv = aDBQuery->ResetQuery();
582  NS_ENSURE_SUCCESS(rv, rv);
583  rv = aDBQuery->AddQuery(NS_ConvertUTF8toUTF16(aQueryStr));
584  NS_ENSURE_SUCCESS(rv, rv);
585 
586  // Execute the query.
587  rv = aDBQuery->Execute(&dbError);
588  NS_ENSURE_SUCCESS(rv, rv);
589  NS_ENSURE_FALSE(dbError, NS_ERROR_FAILURE);
590 
591  // Read results or reset query if results not needed.
592  if (aDBResult) {
593  nsCOMPtr<sbIDatabaseResult> dbResult;
594  rv = aDBQuery->GetResultObject(getter_AddRefs(dbResult));
595  NS_ENSURE_TRUE(dbResult, NS_ERROR_FAILURE);
596  NS_ADDREF(*aDBResult = dbResult);
597  } else {
598  rv = aDBQuery->ResetQuery();
599  NS_ENSURE_SUCCESS(rv, rv);
600  }
601 
602  return NS_OK;
603 }
604 
605 
return NS_OK
_dialogDatepicker pos
Songbird iPod Device Definitions.
An object containing the results of a database SELECT query.
An object responsible for executing SQL queries on the database.
Interface that defines a single item of media in the system.
_getSelectedPageStyle s i