. * */ namespace OCA\Contacts; use Sabre\VObject\Component; use OCA\Contacts\Connector\ImportCsvConnector; use OCA\Contacts\Connector\ImportVCardConnector; use OCA\Contacts\Connector\ImportLdifConnector; use OCA\Contacts\Addressbook; /** * Manages the import with basic functionalities */ class ImportManager { private function loadXmlFile($path) { if (file_exists($path)) { $format = simplexml_load_file ( $path ); if ($format) { if (isset($format->import_core) && isset($format->import_core->name) && isset($format->import_core->display_name) && isset($format->import_core->type) && isset($format->import_core->active) && $format->import_core->active == '1') { return $format; } } } return false; } /** * @brief return the different import formats available by scanning the contacts/formats folder * @return array(string, string) */ public function getTypes() { $prefix = "import_"; $suffix = "_connector.xml"; $path = __DIR__ . "/../formats/"; $files = scandir($path); $formats = array(); foreach ($files as $file) { if (!strncmp($file, $prefix, strlen($prefix)) && substr($file, - strlen($suffix)) === $suffix) { $format = $this->loadXmlFile(realpath($path.$file)); if ($format) { $formats[(string)$format->import_core->name] = (string)$format->import_core->display_name; } } } return $formats; } /** * @brief get all the preferences for the addressbook * @param string $id * @return SimpleXml */ public function getType($typeName) { $path = __DIR__ . "/../formats/import_" . $typeName . "_connector.xml"; return $this->loadXmlFile($path); } /** * @brief imports the file with the selected type, and converts into VCards * @param $file the path to the file * @param $typeName the type name to use as stored into the app settings * @param $limit the number of elements to import * @return an array containing VCard elements|false if empty of error */ public function importFile($file, $typeName, $limit=-1) { \OCP\Util::writeLog('contacts import manager', __METHOD__.' importing as '.$typeName, \OCP\Util::INFO); $connector = $this->getConnector($typeName); if ($connector) { $elements = $connector->getElementsFromInput($file, $limit); if (count($elements) > 0) { return $elements; } else { return false; } } else { return false; } } public function getConnector($type) { $importType = $this->getType($type); $elements = array(); if (!$importType) { return false; } if ((string)$importType->import_core->type == 'csv') { // use class ImportCsvConnector return new ImportCsvConnector($importType); } else if ((string)$importType->import_core->type == 'vcard') { // use class importVcardConnector return new ImportVCardConnector($importType); } else if ((string)$importType->import_core->type == 'ldif') { // use class importVcardConnector return new ImportLdifConnector($importType); } return false; } /** * @brief import the first element of the file with all the types * detects wich imported type has the least elements "X-Unknown-Element" * then returns the corresponding type * @param $file the path to the file * @return array containing the probability for each format */ public function detectFileType($file) { $types = $this->getTypes(); $probability = array(); foreach ($types as $type => $description) { $connector = $this->getConnector($type); if ($connector) { $probability[$type] = $connector->getFormatMatch($file); } } return $probability; } /** * @brief get the raw entries from the input file * @param $file the path to the file * @param $limit the maximum number of entries to return (-1: no limit) * @return array|false */ public function getEntries($file, $limit=-1) { return $connector->getElementsFromInput($file, $limit); } } ?>