static ext::Buffer amp(_B("&amp;")), reserved(_B("&\"=#")); DecentralizedMedia& media(*static_cast< DecentralizedMedia* >(& server)); const _S< net::Mime::Application::XWwwFormUrlencoded > query(_request.uri_.GetQuery()); _R< net::Mime::Document > document(_request.GetDocument()); _R< net::Mime::Application::XWwwFormUrlencoded > form; if (_request.method_ == _B("POST") && !document.IsEmpty()) form = dynamic_cast< net::Mime::Application::XWwwFormUrlencoded* >(document.GetValue()); Decentralized Media | Select Media

Select Media

unsigned page, pages(1); try { page = lexical_cast< unsigned >(query[_B("page")].First()); } catch (const ext::InvalidArgumentException& ) { page = 0; } catch (const ext::NotFoundException& ) { page = 0; } api::Path path(query.Contains(_B("folder")) ? query[_B("folder")].First() : cse::EmptyString); if (!query.Contains(_B("by"))) if(path.IsEmpty()) { _foreach (const _L< MediaFolder >, folder, media.library.GetFolders(page)) { } unsigned pages_(media.library.GetFoldersPages()); if (pages_ > pages) pages = pages_; } else { MediaFolder folder(media.library.GetFolder(path)); _foreach (const _L< MediaFolder >, folder_, folder.GetFolders(page)) { } unsigned pages_(folder.GetFoldersPages()); if (pages_ > pages) pages = pages_; _foreach (const _L< MediaFile >, file, folder.GetFiles(page)) { } pages_ = folder.GetFilesPages(); if (pages_ > pages) pages = pages_; } _L< By > bys; try { _foreach(const _L< cse::String >, by, query[_B("by")]) bys.InsertLast(*by); } catch (const ext::NotFoundException& ) {} if (!query.Contains(_B("folder"))) if (bys.IsEmpty()) _forall (By, by, By::ARTIST, By::LAST) { _forall (By, column, By::ARTIST, By::LAST) if (column == by) { } else { _S< ios::String > query_; _L< cse::String > items; ext::RedBlackMap< By, cse::String > bys_; if (!query.Contains(lexical_cast< cse::String >(bys.Last()))) { _foreach (_L< By >, by, bys) if (by + 1 != _set.End() && query.Contains(lexical_cast< cse::String >(*by))) { cse::String item(query[lexical_cast< cse::String >(*by)].First()); query_ << _B("by=") << *by << amp << *by << _B("=") << ios::Filter< net::Http::QueryEncoder >(item, reserved) << amp; items.InsertLast(item); bys_.Insert(*by, item); } By by(bys.Last()); _S< ios::String > columns; _forall (By, column, By::ARTIST, By::LAST) if (column == by) columns << _B("<th/>"); else columns << _B("<td>") << bys_[column] << _B("</td>"); query_ << _B("by=") << by << amp << by; _foreach (const _L< cse::String >, item, media.library.GetItems(bys, items, page)) { {columns} } unsigned pages_(media.library.GetItemsPages(bys, items)); if (pages_ > pages) pages = pages_; } else { _foreach (_L< By >, by, bys) if (query.Contains(lexical_cast< cse::String >(*by))) { cse::String item(query[lexical_cast< cse::String >(*by)].First()); query_ << _B("by=") << *by; if (by + 1 != _set.End()) query_ << amp << *by << _B("=") << ios::Filter< net::Http::QueryEncoder >(item, reserved) << amp; items.InsertLast(item); bys_.Insert(*by, item); } By by(bys.Last()); cse::String item(items.Last()); query_ << amp << by << _B("=") << ios::Filter< net::Http::QueryEncoder >(item, reserved) << amp; _forall (By, by_, By::ARTIST, By::LAST) if (by_ != by && bys_[by_].IsEmpty()) { _forall (By, column, By::ARTIST, By::LAST) if (column == by_) { } } _foreach (const _L< MediaFile >, file, media.library.GetFiles(bys, items, page)) { } unsigned pages_(media.library.GetFilesPages(bys, items)); if (pages_ > pages) pages = pages_; } }
File/Folder Artist Song Title Album Genre
[folder] {folder->GetName()}
[up] if (folder.path != folder.root) { Up from {folder.GetName()} } else { Up from {folder.GetName()} }
[folder] {folder_->GetName()}
[file] {file->path.GetName()} {file->artist} {file->title} {file->album} {file->genre}
[by] By {by.GetName()} } else { }
[up] if (!query_.IsEmpty()) { Up from By {by.GetName()} } else { Up from By {by.GetName()} }
[item] {*item}
[up] Up from By {by.GetName()}: {item}
[by] By {by_.GetName()} } else { {bys_[column]}
[file] {file->path.GetName()} {file->artist} {file->title} {file->album} {file->genre}

// XXX: hmm, this should be usable this way _S< net::Mime::Application::XWwwFormUrlencoded > query_(query); query_.Remove(_B("page")); if (page != 0) { « Previous } else { « Previous } _forall (unsigned, page_, 0, pages) if (page_ == page) { {page_} } else { {page_} } if (page + 1 != pages) { Next » } else { Next » }

{_request.uri_.GetQuery()}

$Id$