jsonrpc: use CFileItemPtr instead of CFileItem in FillFileItem() to fix crashes
authormontellese <montellese@xbmc.org>
Wed, 28 Nov 2012 07:56:32 +0000 (08:56 +0100)
committermontellese <montellese@xbmc.org>
Wed, 28 Nov 2012 07:56:32 +0000 (08:56 +0100)
xbmc/interfaces/json-rpc/AudioLibrary.cpp
xbmc/interfaces/json-rpc/AudioLibrary.h
xbmc/interfaces/json-rpc/FileOperations.cpp
xbmc/interfaces/json-rpc/FileOperations.h
xbmc/interfaces/json-rpc/PlayerOperations.cpp
xbmc/interfaces/json-rpc/VideoLibrary.cpp
xbmc/interfaces/json-rpc/VideoLibrary.h

index 8692a5e..f234b33 100644 (file)
@@ -557,7 +557,7 @@ JSONRPC_STATUS CAudioLibrary::Clean(const CStdString &method, ITransportLayer *t
   return ACK;
 }
 
-bool CAudioLibrary::FillFileItem(const CStdString &strFilename, CFileItem &item, const CVariant &parameterObject /* = CVariant(CVariant::VariantTypeArray) */)
+bool CAudioLibrary::FillFileItem(const CStdString &strFilename, CFileItemPtr &item, const CVariant &parameterObject /* = CVariant(CVariant::VariantTypeArray) */)
 {
   CMusicDatabase musicdatabase;
   if (strFilename.empty() || !musicdatabase.Open())
@@ -570,10 +570,10 @@ bool CAudioLibrary::FillFileItem(const CStdString &strFilename, CFileItem &item,
     if (!musicdatabase.GetAlbumInfo(albumid, album, NULL))
       return false;
 
-    item.SetFromAlbum(album);
+    item->SetFromAlbum(album);
 
     CFileItemList items;
-    items.Add(CFileItemPtr(&item));
+    items.Add(item);
     if (GetAdditionalAlbumDetails(parameterObject, items, musicdatabase) != OK)
       return false;
   }
@@ -583,10 +583,10 @@ bool CAudioLibrary::FillFileItem(const CStdString &strFilename, CFileItem &item,
     if (!musicdatabase.GetSongByFileName(strFilename, song))
       return false;
 
-    item.SetFromSong(song);
+    item->SetFromSong(song);
 
     CFileItemList items;
-    items.Add(CFileItemPtr(&item));
+    items.Add(item);
     if (GetAdditionalSongDetails(parameterObject, items, musicdatabase) != OK)
       return false;
   }
@@ -606,11 +606,11 @@ bool CAudioLibrary::FillFileItemList(const CVariant &parameterObject, CFileItemL
   int genreID = (int)parameterObject["genreid"].asInteger(-1);
 
   bool success = false;
-  CFileItem fileItem;
+  CFileItemPtr fileItem(new CFileItem());
   if (FillFileItem(file, fileItem, parameterObject))
   {
     success = true;
-    list.Add(CFileItemPtr(new CFileItem(fileItem)));
+    list.Add(fileItem);
   }
 
   if (artistID != -1 || albumID != -1 || genreID != -1)
index 82a971f..c091c15 100644 (file)
@@ -53,7 +53,7 @@ namespace JSONRPC
     static JSONRPC_STATUS Export(const CStdString &method, ITransportLayer *transport, IClient *client, const CVariant &parameterObject, CVariant &result);
     static JSONRPC_STATUS Clean(const CStdString &method, ITransportLayer *transport, IClient *client, const CVariant &parameterObject, CVariant &result);
 
-    static bool FillFileItem(const CStdString &strFilename, CFileItem &item, const CVariant &parameterObject = CVariant(CVariant::VariantTypeArray));
+    static bool FillFileItem(const CStdString &strFilename, CFileItemPtr &item, const CVariant &parameterObject = CVariant(CVariant::VariantTypeArray));
     static bool FillFileItemList(const CVariant &parameterObject, CFileItemList &list);
 
     static JSONRPC_STATUS GetAdditionalAlbumDetails(const CVariant &parameterObject, CFileItemList &items, CMusicDatabase &musicdatabase);
index 8d3ea6b..e4f4a55 100644 (file)
@@ -138,13 +138,13 @@ JSONRPC_STATUS CFileOperations::GetDirectory(const CStdString &method, ITranspor
       }
       else
       {
-        CFileItem fileItem;
+        CFileItemPtr fileItem(new CFileItem());
         if (FillFileItem(items[i], fileItem, media, parameterObject))
         {
           if (items[i]->m_bIsFolder)
-            filteredDirectories.Add(CFileItemPtr(new CFileItem(fileItem)));
+            filteredDirectories.Add(fileItem);
           else
-            filteredFiles.Add(CFileItemPtr(new CFileItem(fileItem)));
+            filteredFiles.Add(fileItem);
         }
         else
         {
@@ -214,7 +214,7 @@ JSONRPC_STATUS CFileOperations::GetFileDetails(const CStdString &method, ITransp
 
   CFileItemPtr item = items.Get(file);
   if (!URIUtils::IsUPnP(file))
-    FillFileItem(item, *item.get(), parameterObject["media"].asString(), parameterObject);
+    FillFileItem(item, item, parameterObject["media"].asString(), parameterObject);
 
   // Check if the "properties" list exists
   // and make sure it contains the "file"
@@ -263,24 +263,24 @@ JSONRPC_STATUS CFileOperations::Download(const CStdString &method, ITransportLay
   return transport->Download(parameterObject["path"].asString().c_str(), result) ? OK : InvalidParams;
 }
 
-bool CFileOperations::FillFileItem(const CFileItemPtr &originalItem, CFileItem &item, CStdString media /* = "" */, const CVariant &parameterObject /* = CVariant(CVariant::VariantTypeArray) */)
+bool CFileOperations::FillFileItem(const CFileItemPtr &originalItem, CFileItemPtr &item, CStdString media /* = "" */, const CVariant &parameterObject /* = CVariant(CVariant::VariantTypeArray) */)
 {
   if (originalItem.get() == NULL)
     return false;
 
   // copy all the available details
-  item = *originalItem;
+  *item = *originalItem;
 
   bool status = false;
   CStdString strFilename = originalItem->GetPath();
   if (!strFilename.empty() && (CDirectory::Exists(strFilename) || CFile::Exists(strFilename)))
   {
     if (media.Equals("video"))
-      status = CVideoLibrary::FillFileItem(strFilename, item);
+      status = CVideoLibrary::FillFileItem(strFilename, item, parameterObject);
     else if (media.Equals("music"))
       status = CAudioLibrary::FillFileItem(strFilename, item, parameterObject);
 
-    if (status && item.GetLabel().empty())
+    if (status && item->GetLabel().empty())
     {
       CStdString label = originalItem->GetLabel();
       if (label.empty())
@@ -291,7 +291,7 @@ bool CFileOperations::FillFileItem(const CFileItemPtr &originalItem, CFileItem &
           label = URIUtils::GetFileName(strFilename);
       }
 
-      item.SetLabel(label);
+      item->SetLabel(label);
     }
     else if (!status)
     {
@@ -302,12 +302,12 @@ bool CFileOperations::FillFileItem(const CFileItemPtr &originalItem, CFileItem &
         if (label.empty())
           return false;
 
-        item.SetLabel(label);
-        item.SetPath(strFilename);
-        item.m_bIsFolder = isDir;
+        item->SetLabel(label);
+        item->SetPath(strFilename);
+        item->m_bIsFolder = isDir;
       }
       else
-        item = *originalItem.get();
+        *item = *originalItem;
 
       status = true;
     }
@@ -363,9 +363,9 @@ bool CFileOperations::FillFileItemList(const CVariant &parameterObject, CFileIte
             list.Add(items[i]);
           else
           {
-            CFileItem fileItem;
+            CFileItemPtr fileItem(new CFileItem());
             if (FillFileItem(items[i], fileItem, media, parameterObject))
-              list.Add(CFileItemPtr(new CFileItem(fileItem)));
+              list.Add(fileItem);
             else if (media == "files")
               list.Add(items[i]);
           }
index 6e51354..674aca9 100644 (file)
@@ -35,7 +35,7 @@ namespace JSONRPC
     static JSONRPC_STATUS PrepareDownload(const CStdString &method, ITransportLayer *transport, IClient *client, const CVariant &parameterObject, CVariant &result);
     static JSONRPC_STATUS Download(const CStdString &method, ITransportLayer *transport, IClient *client, const CVariant &parameterObject, CVariant &result);
 
-    static bool FillFileItem(const CFileItemPtr &originalItem, CFileItem &item, CStdString media = "", const CVariant &parameterObject = CVariant(CVariant::VariantTypeArray));
+    static bool FillFileItem(const CFileItemPtr &originalItem, CFileItemPtr &item, CStdString media = "", const CVariant &parameterObject = CVariant(CVariant::VariantTypeArray));
     static bool FillFileItemList(const CVariant &parameterObject, CFileItemList &list);
   };
 }
index ad22377..f1bc3dd 100644 (file)
@@ -107,36 +107,32 @@ JSONRPC_STATUS CPlayerOperations::GetItem(const CStdString &method, ITransportLa
     case Video:
     case Audio:
     {
-      if (g_application.CurrentFileItem().GetLabel().empty())
+      fileItem = CFileItemPtr(new CFileItem(g_application.CurrentFileItem()));
+      if (fileItem->GetLabel().empty())
       {
-        CFileItem tmpItem = g_application.CurrentFileItem();
         if (IsPVRChannel())
         {
           CPVRChannelPtr currentChannel;
           if (g_PVRManager.GetCurrentChannel(currentChannel))
-            tmpItem = CFileItem(*currentChannel.get());
+            fileItem = CFileItemPtr(new CFileItem(*currentChannel.get()));
         }
         else if (player == Video)
         {
-          if (!CVideoLibrary::FillFileItem(g_application.CurrentFile(), tmpItem))
+          if (!CVideoLibrary::FillFileItem(g_application.CurrentFile(), fileItem, parameterObject))
           {
-            tmpItem = CFileItem(*g_infoManager.GetCurrentMovieTag());
-            tmpItem.SetPath(g_application.CurrentFileItem().GetPath());
+            fileItem = CFileItemPtr(new CFileItem(*g_infoManager.GetCurrentMovieTag()));
+            fileItem->SetPath(g_application.CurrentFileItem().GetPath());
           }
         }
         else
         {
-          if (!CAudioLibrary::FillFileItem(g_application.CurrentFile(), tmpItem, parameterObject))
+          if (!CAudioLibrary::FillFileItem(g_application.CurrentFile(), fileItem, parameterObject))
           {
-            tmpItem = CFileItem(*g_infoManager.GetCurrentSongTag());
-            tmpItem.SetPath(g_application.CurrentFileItem().GetPath());
+            fileItem = CFileItemPtr(new CFileItem(*g_infoManager.GetCurrentSongTag()));
+            fileItem->SetPath(g_application.CurrentFileItem().GetPath());
           }
         }
-
-        fileItem = CFileItemPtr(new CFileItem(tmpItem));
       }
-      else
-        fileItem = CFileItemPtr(new CFileItem(g_application.CurrentFileItem()));
 
       if (IsPVRChannel())
         break;
index 705889b..d0d18ca 100644 (file)
@@ -701,7 +701,7 @@ JSONRPC_STATUS CVideoLibrary::Clean(const CStdString &method, ITransportLayer *t
   return ACK;
 }
 
-bool CVideoLibrary::FillFileItem(const CStdString &strFilename, CFileItem &item)
+bool CVideoLibrary::FillFileItem(const CStdString &strFilename, CFileItemPtr &item, const CVariant &parameterObject /* = CVariant(CVariant::VariantTypeArray) */)
 {
   CVideoDatabase videodatabase;
   if (strFilename.empty() || !videodatabase.Open())
@@ -711,7 +711,7 @@ bool CVideoLibrary::FillFileItem(const CStdString &strFilename, CFileItem &item)
   if (!videodatabase.LoadVideoInfo(strFilename, details))
     return false;
 
-  item.SetFromVideoInfoTag(details);
+  item->SetFromVideoInfoTag(details);
   return true;
 }
 
@@ -727,11 +727,11 @@ bool CVideoLibrary::FillFileItemList(const CVariant &parameterObject, CFileItemL
   int musicVideoID = (int)parameterObject["musicvideoid"].asInteger(-1);
 
   bool success = false;
-  CFileItem fileItem;
+  CFileItemPtr fileItem(new CFileItem());
   if (FillFileItem(file, fileItem))
   {
     success = true;
-    list.Add(CFileItemPtr(new CFileItem(fileItem)));
+    list.Add(fileItem);
   }
 
   if (movieID > 0)
index 76734ac..81eb17f 100644 (file)
@@ -65,7 +65,7 @@ namespace JSONRPC
     static JSONRPC_STATUS Export(const CStdString &method, ITransportLayer *transport, IClient *client, const CVariant &parameterObject, CVariant &result);
     static JSONRPC_STATUS Clean(const CStdString &method, ITransportLayer *transport, IClient *client, const CVariant &parameterObject, CVariant &result);
 
-    static bool FillFileItem(const CStdString &strFilename, CFileItem &item);
+    static bool FillFileItem(const CStdString &strFilename, CFileItemPtr &item, const CVariant &parameterObject = CVariant(CVariant::VariantTypeArray));
     static bool FillFileItemList(const CVariant &parameterObject, CFileItemList &list);
 
   private: