int MTPDevice::dirCreateNew(const std::string &path) { const std::string tmp_basename(smtpfs_basename(path)); const std::string tmp_dirname(smtpfs_dirname(path)); const TypeDir *dir_parent = dirFetchContent(tmp_dirname); if (!dir_parent || dir_parent->id() == 0) { logerr("Can not remove directory '", path, "'.\n"); return -EINVAL; } char *c_name = strdup(tmp_basename.c_str()); criticalEnter(); uint32_t new_id = LIBMTP_Create_Folder(m_device, c_name, dir_parent->id(), dir_parent->storageid()); criticalLeave(); if (new_id == 0) { logerr("Could not create directory '", path, "'.\n"); LIBMTP_Dump_Errorstack(m_device); LIBMTP_Clear_Errorstack(m_device); } else { const_cast<TypeDir*>(dir_parent)->addDir(TypeDir(new_id, dir_parent->id(), dir_parent->storageid(), tmp_basename)); logmsg("Directory '", path, "' created.\n"); } free(static_cast<void*>(c_name)); return new_id != 0 ? 0 : -EINVAL; }
// Device.create_folder {{{ static PyObject * Device_create_folder(Device *self, PyObject *args) { PyObject *errs, *fo = NULL; unsigned long storage_id, parent_id; uint32_t folder_id; char *name; ENSURE_DEV(NULL); ENSURE_STORAGE(NULL); if (!PyArg_ParseTuple(args, "kks", &storage_id, &parent_id, &name)) return NULL; errs = PyList_New(0); if (errs == NULL) { PyErr_NoMemory(); return NULL; } Py_BEGIN_ALLOW_THREADS; folder_id = LIBMTP_Create_Folder(self->device, name, (uint32_t)parent_id, (uint32_t)storage_id); Py_END_ALLOW_THREADS; if (folder_id == 0) dump_errorstack(self->device, errs); else fo = file_metadata(self->device, errs, folder_id, storage_id); if (fo == NULL) { fo = Py_None; Py_INCREF(fo); } return Py_BuildValue("NN", fo, errs); } // }}}