2 // Tizen Web Device API
3 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
5 // Licensed under the Apache License, Version 2.0 (the License);
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
9 // http://www.apache.org/licenses/LICENSE-2.0
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an "AS IS" BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
28 #include <dpl/scoped_ptr.h>
30 #include <Commons/Exception.h>
31 #include <Commons/Regex.h>
32 #include "PathUtils.h"
33 #include "StorageProperties.h"
40 const char* PATH_DOWNLOADS = "/opt/usr/media/Downloads";
41 const char* PATH_DOCUMENTS = "/opt/usr/media/Documents";
42 const char* PATH_SOUNDS = "/opt/usr/media/Sounds";
43 const char* PATH_IMAGES = "/opt/usr/media/Images";
44 const char* PATH_VIDEOS = "/opt/usr/media/Videos";
45 const char* PATH_RINGTONE = "/opt/usr/share/settings/Ringtones";
48 using namespace WrtDeviceApis;
49 using namespace WrtDeviceApis::Commons;
52 namespace Filesystem {
53 Manager::Locations Manager::m_locations;
54 Manager::RootList Manager::m_rootlist;
55 Manager::SubRootList Manager::m_subrootlist;
56 const std::size_t Manager::m_maxPathLength = 256;
57 NodeList Manager::m_openedNodes;
58 std::vector<Manager::WatcherPtr> Manager::m_watchers;
60 bool Manager::fileExists(const std::string &file)
64 memset(&info, 0, sizeof(struct stat));
65 int status = lstat(file.c_str(), &info);
68 } else if (errno == ENOENT) {
71 ThrowMsg(Commons::PlatformException, "Cannot stat file.");
74 bool Manager::getSupportedDeviceCB(int storage, storage_type_e type, storage_state_e state, const char *path, void *user_data)
76 std::vector<StoragePropertiesPtr>* storageVector = (std::vector<StoragePropertiesPtr>*)user_data;
77 StoragePropertiesPtr storageItem(new StorageProperties());
82 std::string fullpath(path);
83 if (type == STORAGE_TYPE_INTERNAL) {
84 snprintf(buf, size, "internal%d", storage);
86 } else if (type == STORAGE_TYPE_EXTERNAL) {
87 snprintf(buf, size, "removable%d", storage);
90 LoggerD(lable << "state" << state);
92 storageItem->setId(storage);
93 storageItem->setLabel(lable);
94 storageItem->setType((short)type);
95 storageItem->setState((short)state);
96 storageItem->setFullPath(fullpath);
98 storageVector->insert(storageVector->end(), storageItem);
103 void Manager::storageStateChangedCB(int storage, storage_state_e state, void *user_data)
105 if (user_data != NULL) {
106 watcherList* m_watcherList = (watcherList *)user_data;
107 watcherList::iterator it = m_watcherList->begin();
108 for(; it!= m_watcherList->end(); ++it) {
109 (*it)->StorageStateHasChanged(storage, state);
114 void Manager::addOpenedNode(const INodePtr& node)
116 NodeListIterator it = m_openedNodes.begin();
117 for (; it != m_openedNodes.end(); ++it) {
118 if (node.Get() == (*it).Get()) {
119 //node is added already
123 m_openedNodes.push_back(node);
126 void Manager::removeOpenedNode(const INodePtr& node)
128 NodeListIterator it = m_openedNodes.begin();
129 for (; it != m_openedNodes.end(); ++it) {
130 if ((*it).Get() == node.Get()) {
131 m_openedNodes.erase(it);
137 bool Manager::checkIfOpened(const IPathPtr& path) const
139 NodeListIterator it = m_openedNodes.begin();
140 for (; it != m_openedNodes.end(); ++it) {
141 if (*path == *(*it)->getPath()) {
150 static bool initialized = init();
158 StorageList Manager::getStorageList() const
163 IPathPtr Manager::getBasePath() const
165 Locations::const_iterator it = m_locations.find(m_subrootlist.find(LT_ROOT)->second);
166 if (it == m_locations.end()) {
167 ThrowMsg(Commons::PlatformException, "Base path not available.");
172 IPathPtr Manager::getLocationPath(LocationType type) const
174 Locations::const_iterator it = m_locations.find(m_subrootlist.find(type)->second);
175 if (it != m_locations.end()) {
176 return it->second->clone();
181 LocationPaths Manager::getLocationPaths() const
183 LocationPaths result;
184 Locations::const_iterator it = m_locations.begin();
185 for (; it != m_locations.end(); ++it) {
186 result.push_back(it->second->clone());
191 LocationTypes Manager::getLocations() const
193 LocationTypes result;
194 SubRootList::const_iterator it = m_subrootlist.begin();
195 for (; it != m_subrootlist.end(); ++it) {
196 result.push_back(it->first);
201 void Manager::getNode(const EventResolvePtr& event)
203 EventRequestReceiver<EventResolve>::PostRequest(event);
206 void Manager::getStorage(const EventGetStoragePtr& event)
208 EventRequestReceiver<EventGetStorage>::PostRequest(event);
211 void Manager::listStorages(const EventListStoragesPtr& event)
213 EventRequestReceiver<EventListStorages>::PostRequest(event);
216 std::size_t Manager::getMaxPathLength() const
218 return m_maxPathLength;
221 void Manager::copy(const EventCopyPtr& event)
223 EventRequestReceiver<EventCopy>::PostRequest(event);
226 void Manager::move(const EventMovePtr& event)
228 EventRequestReceiver<EventMove>::PostRequest(event);
231 void Manager::create(const EventCreatePtr& event)
233 EventRequestReceiver<EventCreate>::PostRequest(event);
236 void Manager::remove(const EventRemovePtr& event)
238 EventRequestReceiver<EventRemove>::PostRequest(event);
241 void Manager::find(const EventFindPtr& event)
243 EventRequestReceiver<EventFind>::PostRequest(event);
246 void Manager::find(const IPathPtr& path,
247 const FiltersMap& filters,
249 const EventFindPtr& event)
252 DIR* dir = opendir(path->getFullPath().c_str());
258 struct dirent* entry = NULL;
259 while ((entry = readdir(dir))) {
260 if (event && event->checkCancelled()) {
263 if (!strcmp(entry->d_name, ".") || !strncmp(entry->d_name, "..", 2)) {
266 IPathPtr childPath = *path + entry->d_name;
268 memset(&info, 0, sizeof(struct stat));
269 if (lstat(childPath->getFullPath().c_str(), &info) == 0) {
270 if (matchFilters(entry->d_name, info, filters)) {
271 result.push_back(Node::resolve(childPath));
273 if (S_ISDIR(info.st_mode)) {
274 find(childPath, filters, result, event);
280 ThrowMsg(Commons::PlatformException,
281 "Error while reading directory.");
284 if (closedir(dir) != 0) {
285 ThrowMsg(Commons::PlatformException,
286 "Could not close platform node.");
289 Catch(WrtDeviceApis::Commons::Exception) {
293 void Manager::copyElement(
294 const std::string &src, const std::string &dest, bool recursive) const
296 LoggerD("Copying src: " << src << " to: " << dest);
299 if (EINA_TRUE != ecore_file_is_dir(src.c_str())) {
300 if (EINA_TRUE != ecore_file_cp(src.c_str(), dest.c_str())) {
301 ThrowMsg(Commons::PlatformException, "Failed to copy file");
305 //element is a directory -> create it:
306 if (EINA_TRUE != ecore_file_is_dir(dest.c_str())) {
307 if (EINA_TRUE != ecore_file_mkdir(dest.c_str())) {
308 LoggerD("Failed to create destination directory");
309 ThrowMsg(Commons::PlatformException, "Failed to copy directory");
312 //copy all elements of directory:
314 Eina_List* list = ecore_file_ls(src.c_str());
316 EINA_LIST_FREE(list, data)
320 copyElement((src + '/' + static_cast<char*>(data)).c_str(),
321 (dest + '/' + static_cast<char*>(data)).c_str());
324 Catch (Commons::Exception)
326 //remove rest of the list
327 EINA_LIST_FREE(list, data)
331 LoggerE("Exception: " << _rethrown_exception.GetMessage());
332 ReThrowMsg(Commons::PlatformException, "Failed to copy element");
340 /*bool Manager::access(const IPathPtr& path,
341 int accessType) const
344 if (accessType & AT_EXISTS) { amode |= F_OK; }
345 if (accessType & AT_READ) { amode |= R_OK; }
346 if (accessType & AT_WRITE) { amode |= W_OK; }
347 if (accessType & AT_EXEC) { amode |= X_OK; }
348 return (::access(path->getFullPath().c_str(), amode) == 0);
351 long Manager::addStorageStateChangeListener(
352 const EventStorageStateChangedEmitterPtr& emitter)
354 RootList::const_iterator it = m_rootlist.begin();
355 WatcherPtr watcher(new Watcher(emitter));
356 Manager::m_watchers.push_back(watcher);
358 for (; it != m_rootlist.end(); ++it) {
359 storage_set_state_changed_cb(it->second, Manager::storageStateChangedCB, (void *)(&m_watchers));
362 watcher->getCurrentStoargeStateForWatch();
363 return static_cast<long>(emitter->getId());
366 void Manager::removeStorageStateChangeListener(EventStorageStateChangedEmitter::IdType id)
368 watcherList::iterator itWatcher = Manager::m_watchers.begin();
370 for (;itWatcher != Manager::m_watchers.end();) {
371 if (id == (*itWatcher)->getEmitter()->getId()) {
372 itWatcher = Manager::m_watchers.erase(itWatcher);
379 if (Manager::m_watchers.size() == 0) {
380 RootList::const_iterator itRoot;
381 for (itRoot = m_rootlist.begin(); itRoot != m_rootlist.end(); ++itRoot) {
382 storage_unset_state_changed_cb(itRoot->second);
386 if (found == false) {
387 // LoggerD("no exist" << id);
388 ThrowMsg(Commons::NotFoundException, "The " << id << "is not exist");
392 bool Manager::matchFilters(const std::string& name,
393 const struct stat& info,
394 const FiltersMap& filters)
396 FiltersMap::const_iterator it = filters.begin();
397 for (; it != filters.end(); ++it) {
398 if (it->first == FF_NAME) {
399 if (!pcrecpp::RE(it->second).PartialMatch(name)) { return false; }
400 } else if (it->first == FF_SIZE) {
402 std::stringstream ss(it->second);
405 (size != static_cast<size_t>(info.st_size))) { return false; }
406 } else if (it->first == FF_CREATED) {
408 std::stringstream ss(it->second);
410 if (!ss || (created != info.st_ctime)) { return false; }
411 } else if (it->first == FF_MODIFIED) {
412 std::time_t modified;
413 std::stringstream ss(it->second);
415 if (!ss || (modified != info.st_mtime)) { return false; }
421 void Manager::OnRequestReceived(const EventResolvePtr& event)
424 INodePtr node = Node::resolve(event->getPath());
425 if (node->checkPermission(event->getPath(), event->getMode(), node->getType()) == false)
427 ThrowMsg(Commons::SecurityException, "Permission Denied Error");
429 event->setResult(node);
431 catch (const Commons::Exception& ex)
433 LoggerE("Exception: " << ex.GetMessage());
434 event->setExceptionCode(ex.getCode());
438 void Manager::OnRequestReceived(const EventGetStoragePtr& event)
442 StoragePropertiesPtr storage(new StorageProperties());
444 RootList::const_iterator it = m_rootlist.find(event->getLabel());
445 if (it == m_rootlist.end()) {
446 Locations::const_iterator itL = m_locations.find(event->getLabel());
447 if (itL == m_locations.end()) {
448 ThrowMsg(Commons::NotFoundException, "Base path not available.");
450 storage->setId(0xff);
451 storage->setLabel(event->getLabel());
452 storage->setType(StorageProperties::TYPE_INTERNAL);
453 storage->setState(StorageProperties::STATE_MOUNTED);
458 storage_type_e currentType;
459 storage_state_e currentState;
461 storage_get_type(id, ¤tType);
462 storage_get_state(id, ¤tState);
465 storage->setLabel(event->getLabel());
466 storage->setType((short)currentType);
467 storage->setState((short)currentState);
470 event->setResult(storage);
471 } catch (const Commons::Exception& ex)
473 event->setExceptionCode(ex.getCode());
477 void Manager::OnRequestReceived(const EventListStoragesPtr& event)
480 std::vector<StoragePropertiesPtr> storageList;
482 storage_foreach_device_supported(Manager::getSupportedDeviceCB, &storageList);
484 SubRootList::const_iterator it = m_subrootlist.begin();
485 for (; it != m_subrootlist.end(); ++it) {
486 if (it->first == LT_ROOT)
488 if (it->first == LT_SDCARD)
490 if (it->first == LT_USBHOST)
493 addLocalStorage(it->second, storageList);
497 event->setResult(storageList);
498 } catch (const Commons::Exception& ex)
500 event->setExceptionCode(ex.getCode());
504 void Manager::OnRequestReceived(const EventCopyPtr& event)
507 INodePtr srcNode = Node::resolve(event->getSource());
508 LoggerD(std::hex << srcNode->getMode() << " " << std::hex << PM_USER_READ);
509 if ((srcNode->getMode() & PM_USER_READ/*PERM_READ*/) == 0) {
510 ThrowMsg(Commons::SecurityException,
511 "Not enough permissions to read source node.");
514 IPathPtr src = event->getSource();
515 IPathPtr dest = event->getDestination();
516 if (!dest->isAbsolute()) {
517 dest = src->getPath() + *dest;
522 parent = Node::resolve(IPath::create(dest->getPath()));
524 Catch(Commons::NotFoundException)
526 event->setExceptionCode(_rethrown_exception.getCode());
527 ReThrowMsg(Commons::NotFoundException, "could not find a destination path.");
529 Catch (Commons::Exception)
531 event->setExceptionCode(_rethrown_exception.getCode());
532 ReThrowMsg(Commons::PlatformException,
533 "Could not get destination's parent node.");
536 if (parent->getType() != NT_DIRECTORY) {
537 ThrowMsg(Commons::PlatformException,
538 "Destination's parent node is not directory.");
541 std::string realSrc = src->getFullPath();
542 std::string realDest = dest->getFullPath();
544 if (realSrc == realDest) {
545 ThrowMsg(Commons::PlatformException,
546 "Destination is same as source.");
552 memset(&info, 0, sizeof(struct stat));
553 int status = lstat(realDest.c_str(), &info);
554 if ((status != 0) && (errno != ENOENT)) {
555 ThrowMsg(Commons::PlatformException,
556 "No access to platform destination node.");
559 if (S_ISDIR(info.st_mode) && srcNode->getType() == NT_FILE) {
560 dest->append("/" + src->getName());
561 realDest = dest->getFullPath();
562 memset(&info, 0, sizeof(struct stat));
563 status = lstat(realDest.c_str(), &info);
564 if ((status != 0) && (errno != ENOENT)) {
565 ThrowMsg(Commons::PlatformException,
566 "No access to platform destination node.");
571 //no owerwrite flag setted -> exception
572 if ((event->getOptions() & OPT_OVERWRITE) == 0) {
573 ThrowMsg(Commons::PlatformException, "Overwrite is not set.");
576 if (event->checkCancelled()) {
577 //file is not copied yet, so we can cancel it now.
578 event->setCancelAllowed(true);
582 //destination exist. Need to be removed
584 INodePtr node = Node::resolve(dest);
586 // only remove if dest is file.
587 if (node->getType() == NT_FILE) {
588 node->remove(event->getOptions());
591 // destination exist and src & dest are directory and dest path ends with '/'
592 if (srcNode->getType() == NT_DIRECTORY && realDest[realDest.length() - 1] == '/') {
593 realDest += src->getName();
597 catch (const Commons::Exception& ex)
599 LoggerE("Exception: " << ex.GetMessage());
600 event->setExceptionCode(ex.getCode());
603 //Destination is not exist. Start copy now.
604 LoggerD(dest->getFullPath().c_str());
605 copyElement(realSrc, realDest);
607 event->setResult(Node::resolve(dest));
609 catch (const Commons::Exception& ex)
611 LoggerE("Exception: " << ex.GetMessage());
612 event->setExceptionCode(ex.getCode());
614 //file is copied already so we don't allow cancelling anymore.
615 event->setCancelAllowed(false);
618 void Manager::OnRequestReceived(const EventMovePtr& event)
621 IPathPtr src = event->getSource();
622 IPathPtr dest = event->getDestination();
624 INodePtr srcNode = Node::resolve(src);
625 LoggerD(std::hex << srcNode->getMode() << " " << std::hex << PM_USER_WRITE);
626 if ((srcNode->getMode() & PM_USER_WRITE/*PERM_WRITE*/) == 0)
628 ThrowMsg(Commons::SecurityException,
629 "Not enough permissions to move source node.");
632 if (!dest->isAbsolute()) {
633 dest = src->getPath() + *dest;
637 ThrowMsg(Commons::PlatformException,
638 "Destination is same as source.");
643 parent = Node::resolve(IPath::create(dest->getPath()));
646 Catch(Commons::NotFoundException)
648 event->setExceptionCode(_rethrown_exception.getCode());
649 ReThrowMsg(Commons::NotFoundException, "could not find a destination path.");
651 Catch(Commons::Exception)
653 LoggerE("Exception: " << _rethrown_exception.GetMessage());
654 ReThrowMsg(Commons::PlatformException,
655 "Could not get destination's parent node.");
658 if (parent->getType() != NT_DIRECTORY) {
659 ThrowMsg(Commons::PlatformException,
660 "Destination's parent node is not directory.");
665 memset(&info, 0, sizeof(info));
666 int status = lstat(dest->getFullPath().c_str(), &info);
667 if ((status != 0) && (errno != ENOENT)) {
668 ThrowMsg(Commons::PlatformException,
669 "No access to platform destination node.");
672 LoggerD(dest->getFullPath().c_str());
674 if (S_ISDIR(info.st_mode) && srcNode->getType() == NT_FILE) {
675 dest->append("/" + src->getName());
676 memset(&info, 0, sizeof(info));
677 status = lstat(dest->getFullPath().c_str(), &info);
678 if ((status != 0) && (errno != ENOENT)) {
679 ThrowMsg(Commons::PlatformException,
680 "No access to platform destination node.");
684 if (status == 0 && 0 == (event->getOptions() & OPT_OVERWRITE)) {
685 ThrowMsg(Commons::PlatformException, "Overwrite is not set.");
688 if (event->checkCancelled()) {
689 //file is not moved yet, so we can cancel it now.
690 event->setCancelAllowed(true);
696 LoggerD(dest->getFullPath().c_str());
698 if (0 != ::rename(src->getFullPath().c_str(), dest->getFullPath().c_str()))
705 LoggerD(std::hex << srcNode->getMode() << " " << std::hex << PM_USER_READ);
706 if ((srcNode->getMode() & PM_USER_READ /*PERM_READ*/) == 0)
708 ThrowMsg(Commons::SecurityException,
709 "Not enough permissions to move source node.");
712 //destination exist. Need to be removed
714 INodePtr node = Node::resolve(dest);
715 node->remove(event->getOptions());
717 catch (const Commons::Exception& ex)
719 LoggerE("Exception: " << ex.GetMessage());
720 event->setExceptionCode(ex.getCode());
721 LoggerE("Exception while removing dest directory");
725 copyElement(src->getFullPath(),
726 dest->getFullPath());
727 //remove source files
729 INodePtr node = Node::resolve(event->getSource());
730 node->remove(event->getOptions());
732 Catch(Commons::Exception) {
733 LoggerE("Exception: "
734 << _rethrown_exception.GetMessage());
740 ThrowMsg(Commons::PlatformException,
741 "Error on rename: " /*<< DPL::GetErrnoString(error)*/);
746 event->setResult(Node::resolve(dest));
748 catch (const Commons::Exception& ex)
750 LoggerE("Exception: " << ex.GetMessage());
751 event->setExceptionCode(ex.getCode());
754 event->setCancelAllowed(false);
757 void Manager::OnRequestReceived(const EventCreatePtr& event)
761 catch (const Commons::Exception& ex)
763 LoggerE("Exception: " << ex.GetMessage());
764 event->setExceptionCode(ex.getCode());
768 void Manager::OnRequestReceived(const EventRemovePtr& event)
770 if (!event->checkCancelled()) {
772 INodePtr node = Node::resolve(event->getPath());
773 node->remove(event->getOptions());
775 catch (const Commons::Exception& ex)
777 LoggerE("Exception: " << ex.GetMessage());
778 event->setExceptionCode(ex.getCode());
780 event->setCancelAllowed(false);
782 event->setCancelAllowed(true);
786 void Manager::OnRequestReceived(const EventFindPtr& event)
790 find(event->getPath(), event->getFilters(), result, event);
791 event->setResult(result);
793 catch (const Commons::Exception& ex) {
794 LoggerE("Exception: " << ex.GetMessage());
795 event->setExceptionCode(Commons::ExceptionCodes::PlatformException);
797 event->setCancelAllowed(true);
800 void Manager::addLocalStorage(std::string label, std::vector<StoragePropertiesPtr> &storageList)
802 StoragePropertiesPtr storage(new StorageProperties());
803 storage->setId(0xff);
804 storage->setLabel(label);
805 storage->setType(StorageProperties::TYPE_INTERNAL);
807 storage_state_e currentState;
808 storage_get_state(0, ¤tState);
809 storage->setState((short)currentState);
811 storageList.insert(storageList.end(), storage);
814 void Manager::addWidgetStorage(const std::string &key, const std::string &value)
816 setupLocation(key, value.c_str());
818 if (key == "wgt-package")
820 m_subrootlist[LT_WGTPKG] = key;
822 else if (key == "wgt-private")
824 m_subrootlist[LT_WGTPRV] = key;
826 else if (key == "wgt-private-tmp")
828 m_subrootlist[LT_WGTPRVTMP] = key;
834 std::vector<StoragePropertiesPtr> storageList;
835 storage_foreach_device_supported(Manager::getSupportedDeviceCB, &storageList);
837 for (size_t i = 0; i < storageList.size(); i++) {
838 m_locations[storageList[i]->getLabel()] = IPath::create(storageList[i]->getFullPath());
839 m_rootlist[storageList[i]->getLabel()] = storageList[i]->getId();
843 setupLocation("downloads", PATH_DOWNLOADS);
844 setupLocation("documents", PATH_DOCUMENTS);
845 setupLocation("music", PATH_SOUNDS);
846 setupLocation("images", PATH_IMAGES);
847 setupLocation("videos", PATH_VIDEOS);
848 setupLocation("ringtones", PATH_RINGTONE);
850 m_subrootlist[LT_ROOT] = "internal0";
851 m_subrootlist[LT_SDCARD] = "removable1";
852 m_subrootlist[LT_USBHOST] = "removable2";
853 m_subrootlist[LT_DOWNLOADS] = "downloads";
854 m_subrootlist[LT_DOCUMENTS] = "documents";
855 m_subrootlist[LT_SOUNDS] = "music";
856 m_subrootlist[LT_IMAGES] = "images";
857 m_subrootlist[LT_VIDEOS] = "videos";
858 m_subrootlist[LT_RINGTONES] = "ringtones";
863 void Manager::setupLocation(std::string location, const char* path)
865 if (!nodeExists(path)) {
867 makePath(path, 0755);
869 catch (const Commons::Exception& ex)
871 LoggerE("Exception: " << ex.GetMessage());
875 m_locations[location] = IPath::create(path);
878 void Manager::Watcher::getCurrentStoargeStateForWatch()
880 std::string label("");
882 storage_state_e state;
883 RootList::const_iterator it = m_rootlist.begin();
884 for (; it != m_rootlist.end(); ++it) {
886 if (label.compare("") != 0) {
887 StoragePropertiesPtr storageItem(new StorageProperties());
889 if (storage_get_type(it->second, &type) != STORAGE_ERROR_NONE) {
890 Throw(Commons::PlatformException);
892 if (storage_get_state(it->second, &state) != STORAGE_ERROR_NONE) {
893 Throw(Commons::PlatformException);
896 storageItem->setId(it->second);
897 storageItem->setLabel(it->first);
898 storageItem->setType(static_cast<short>(type));
899 storageItem->setState(static_cast<short>(state));
901 EventStorageStateChangedPtr event(new EventStorageStateChanged());
903 event->setResult(storageItem);
909 void Manager::Watcher::StorageStateHasChanged(int storage, storage_state_e state)
911 StoragePropertiesPtr storageItem(new StorageProperties());
916 RootList::const_iterator it = m_rootlist.begin();
917 for (; it != m_rootlist.end(); ++it) {
918 if (it->second == storage) {
924 if (storage_get_type(storage, &type) != STORAGE_ERROR_NONE) {
925 Throw(Commons::PlatformException);
928 if (label.compare("") != 0) {
929 storageItem->setId(storage);
930 storageItem->setLabel(label);
931 storageItem->setType(static_cast<short>(type));
932 storageItem->setState(static_cast<short>(state));
934 EventStorageStateChangedPtr event(new EventStorageStateChanged());
936 event->setResult(storageItem);