/** * ======================== legal notice ====================== * * File: FilesystemScanner.cc * Created: 2. Juli 2012, 13 * Author: Geronimo * Project: libfsScan: mediatypes and filesystem scanning * * CMP - compound media player * * is a client/server mediaplayer intended to play any media from any workstation * without the need to export or mount shares. cmps is an easy to use backend * with a (ready to use) HTML-interface. Additionally the backend supports * authentication via HTTP-digest authorization. * cmpc is a client with vdr-like osd-menues. * * Copyright (c) 2012 Reinhard Mantey, some rights reserved! * published under Creative Commons by-sa * For details see http://creativecommons.org/licenses/by-sa/3.0/ * * The cmp project's homepage is at http://projects.vdr-developer.org/projects/cmp * * -------------------------------------------------------------- */ #include #include #include #include #include #include #include #include #include #include #include #include void freeMediaCallback(void *elem) { delete (cAbstractMedia *)elem; } cFilesystemScanner::cFilesystemScanner() : fileBufSize(512) , pool(freeMediaCallback) , mediaFactory(NULL) { } cFilesystemScanner::~cFilesystemScanner() { pool.clear(); if (mediaFactory) delete mediaFactory; } void cFilesystemScanner::SetMediaFactory(cMediaFactory* factory) { mediaFactory = factory; } // return true if "a" should be ordered before "b" bool defaultMediaSortOrder(void *a, void *b) { if (a == b) return false; if (!a) return false; if (!b) return true; cAbstractMedia *m0 = (cAbstractMedia *)a; cAbstractMedia *m1 = (cAbstractMedia *)b; bool rv = false; if (m0->MediaType() == m1->MediaType()) rv = strcasecmp(m0->Name(), m1->Name()) < 0; else rv = (m0->MediaType() - m1->MediaType()) < 0; return rv; } void cFilesystemScanner::Refresh() { if (!mediaFactory) return; pool.clear(); categories.clear(); mediaFactory->Scan4Media(pool); cAbstractMedia::SupportedMediaType ot = cAbstractMedia::Invalid; cAbstractMedia *m; pool.sort(defaultMediaSortOrder); for (size_t i=0; i < pool.size(); ++i) { m = (cAbstractMedia *) pool[i]; if (m->MediaType() != ot) { ot = m->MediaType(); categories[ot] = i; } } } cAbstractMedia *cFilesystemScanner::FindMedia(const char *Path) { cAbstractMedia *rv = NULL, *tmp; for (size_t i=0; i < pool.size(); ++i) { tmp = (cAbstractMedia *) pool[i]; if (!strcmp(tmp->LogicalPath(), Path)) { rv = tmp; break; } } return rv; }