bool CPlaylistOperations::FillFileItemList(const Value &parameterObject, CFileItemList &list)
{
  bool found = false;

  if (parameterObject["playlist"].isMember(PLAYLIST_MEMBER_FILE) && parameterObject["playlist"][PLAYLIST_MEMBER_FILE].isString())
  {
    CStdString file = parameterObject["playlist"][PLAYLIST_MEMBER_FILE].asString();
    CPlayListPtr playlist = CPlayListPtr(CPlayListFactory::Create(file));
    if (playlist && playlist->Load(file))
    {
      for (int i = 0; i < playlist->size(); i++)
        list.Add((*playlist)[i]);

      found = true;
    }
  }

  CSingleLock lock(VirtualCriticalSection);
  if (parameterObject["playlist"].isMember(PLAYLIST_MEMBER_VIRTUAL) && parameterObject["playlist"][PLAYLIST_MEMBER_VIRTUAL].isString())
  {
    CStdString id = parameterObject["playlist"][PLAYLIST_MEMBER_VIRTUAL].asString();
    CPlayListPtr playlist = VirtualPlaylists[id];
    if (playlist)
    {
      for (int i = 0; i < playlist->size(); i++)
        list.Add((*playlist)[i]);

      found = true;
    }
  }

  return found;
}
JSON_STATUS CPlaylistOperations::Swap(const CStdString &method, ITransportLayer *transport, IClient *client, const Value &parameterObject, Value &result)
{
  CSingleLock lock(VirtualCriticalSection);
  CPlayListPtr playlist = GetPlaylist(parameterObject);

  if (playlist && playlist->Swap(parameterObject["item1"].asInt(), parameterObject["item2"].asInt()))
    return ACK;

  return InvalidParams;
}
JSON_STATUS CPlaylistOperations::UnShuffle(const CStdString &method, ITransportLayer *transport, IClient *client, const Value &parameterObject, Value &result)
{
  CSingleLock lock(VirtualCriticalSection);
  CPlayListPtr playlist = GetPlaylist(parameterObject);

  if (playlist)
  {
    playlist->UnShuffle();
    return ACK;
  }

  return InvalidParams;
}
CPlayListPtr CPlaylistOperations::GetPlaylist(const Value &parameterObject)
{
  if (parameterObject["playlist"].isMember(PLAYLIST_MEMBER_VIRTUAL) && parameterObject["playlist"][PLAYLIST_MEMBER_VIRTUAL].isString())
  {
    CStdString id = parameterObject["playlist"][PLAYLIST_MEMBER_VIRTUAL].asString();
    return VirtualPlaylists[id];
  }
  else if (parameterObject["playlist"].isMember(PLAYLIST_MEMBER_FILE) && parameterObject["playlist"][PLAYLIST_MEMBER_FILE].isString())
  {
    CStdString file = parameterObject["playlist"][PLAYLIST_MEMBER_FILE].asString();
    CPlayListPtr playlist = CPlayListPtr(CPlayListFactory::Create(file));
    if (playlist && playlist->Load(file))
      return playlist;
  }

  return CPlayListPtr();
}
JSON_STATUS CPlaylistOperations::Remove(const CStdString &method, ITransportLayer *transport, IClient *client, const Value &parameterObject, Value &result)
{
  CSingleLock lock(VirtualCriticalSection);
  CPlayListPtr playlist = GetPlaylist(parameterObject);

  if (playlist)
  {
    if (parameterObject["item"].isInt())
      playlist->Remove(parameterObject["item"].asInt());
    else if (parameterObject["item"].isString())
      playlist->Remove(parameterObject["item"].asString());

    return ACK;
  }

  return InvalidParams;
}
JSON_STATUS CPlaylistOperations::Add(const CStdString &method, ITransportLayer *transport, IClient *client, const Value &parameterObject, Value &result)
{
  CSingleLock lock(VirtualCriticalSection);
  CPlayListPtr playlist = GetPlaylist(parameterObject);
  //parameterObject.removeMember(PLAYLIST_MEMBER_VIRTUAL);

  if (playlist)
  {
    CFileItemList list;
    if (CFileItemHandler::FillFileItemList(parameterObject, list) && list.Size() > 0)
      playlist->Add(list);

    return ACK;
  }

  return InvalidParams;
}
JSON_STATUS CPlaylistOperations::Create(const CStdString &method, ITransportLayer *transport, IClient *client, const Value &parameterObject, Value &result)
{
  if (!(parameterObject.isString() || parameterObject.isNull() || parameterObject.isObject()))
    return InvalidParams;

  CStdString file = "";
  CStdString id   = "";

  if (parameterObject.isObject())
  {
    if (parameterObject.isMember(PLAYLIST_MEMBER_FILE) && parameterObject[PLAYLIST_MEMBER_FILE].isString())
      file = parameterObject[PLAYLIST_MEMBER_FILE].asString();

    if (parameterObject.isMember(PLAYLIST_MEMBER_VIRTUAL) && parameterObject[PLAYLIST_MEMBER_VIRTUAL].isString())
      id = parameterObject[PLAYLIST_MEMBER_VIRTUAL].asString();
  }

  CPlayListPtr playlist;

  if (file.size() > 0)
  {
    CPlayListPtr playlist = CPlayListPtr(CPlayListFactory::Create(file));
    if (playlist == NULL || !playlist->Load(file))
      return playlist == NULL ? InvalidParams : InternalError;
  }
  else
    playlist = CPlayListPtr(new CPlayList());

  if (id.size() == 0)
  {
    do
    {
      id = StringUtils::CreateUUID();
    } while (VirtualPlaylists.find(id) != VirtualPlaylists.end());
  }

  CSingleLock lock(VirtualCriticalSection);
  VirtualPlaylists[id] = playlist;
  result[PLAYLIST_MEMBER_VIRTUAL] = id;

  return OK;
}
JSON_STATUS CPlaylistOperations::GetItems(const CStdString &method, ITransportLayer *transport, IClient *client, const Value &parameterObject, Value &result)
{
  CSingleLock lock(VirtualCriticalSection);
  CPlayListPtr playlist = GetPlaylist(parameterObject);

  if (playlist)
  {
    CFileItemList items;
    for (int i = 0; i < playlist->size(); i++)
      items.Add((*playlist)[i]);

    CStdString name = playlist->GetName();
    if (!name.IsEmpty())
      result["name"] = playlist->GetName();

    HandleFileItemList(NULL, true, "items", items, parameterObject, result);

    return OK;
  }

  return InvalidParams;
}