static PyObject *py_MAPIStoreMGMT_register_message(PyMAPIStoreMGMTObject *self, PyObject *args) { const char *backend; const char *user; const char *uri; const char *messageID; char *registered_uri; PyObject *retlist; uint64_t mid; int ret; if (!PyArg_ParseTuple(args, "ssss", &backend, &user, &uri, &messageID)) { return NULL; } retlist = PyList_New(0); /* Gets a new message ID */ ret = mapistore_indexing_get_new_folderID(self->mgmt_ctx->mstore_ctx, &mid); if (ret) return (PyObject *)retlist; /* Register the message within specified user indexing database */ ret = mapistore_mgmt_register_message(self->mgmt_ctx, backend, user, mid, uri, messageID, ®istered_uri); if (ret) return (PyObject *)retlist; PyList_Append(retlist, PyLong_FromLongLong(mid)); PyList_Append(retlist, PyString_FromString(registered_uri)); talloc_free(registered_uri); return (PyObject *) retlist; }
_PUBLIC_ enum MAPISTATUS EcDoRpc_RopMoveCopyMessages(TALLOC_CTX *mem_ctx, struct emsmdbp_context *emsmdbp_ctx, struct EcDoRpc_MAPI_REQ *mapi_req, struct EcDoRpc_MAPI_REPL *mapi_repl, uint32_t *handles, uint16_t *size) { enum MAPISTATUS retval; uint32_t handle; uint32_t contextID; struct mapi_handles *rec = NULL; void *private_data = NULL; struct emsmdbp_object *destination_object; struct emsmdbp_object *source_object; uint64_t *targetMIDs; uint32_t i; bool mapistore = false; OC_DEBUG(4, "exchange_emsmdb: [OXCFOLD] RopMoveCopyMessages (0x33)\n"); /* Sanity checks */ OPENCHANGE_RETVAL_IF(!emsmdbp_ctx, MAPI_E_NOT_INITIALIZED, NULL); OPENCHANGE_RETVAL_IF(!mapi_req, MAPI_E_INVALID_PARAMETER, NULL); OPENCHANGE_RETVAL_IF(!mapi_repl, MAPI_E_INVALID_PARAMETER, NULL); OPENCHANGE_RETVAL_IF(!handles, MAPI_E_INVALID_PARAMETER, NULL); OPENCHANGE_RETVAL_IF(!size, MAPI_E_INVALID_PARAMETER, NULL); mapi_repl->opnum = mapi_req->opnum; mapi_repl->error_code = MAPI_E_SUCCESS; mapi_repl->handle_idx = mapi_req->handle_idx; mapi_repl->u.mapi_MoveCopyMessages.PartialCompletion = 0; /* Get the destionation information */ handle = handles[mapi_req->u.mapi_MoveCopyMessages.handle_idx]; retval = mapi_handles_search(emsmdbp_ctx->handles_ctx, handle, &rec); if (retval) { mapi_repl->error_code = MAPI_E_INVALID_OBJECT; OC_DEBUG(5, " handle (%x) not found: %x\n", handle, mapi_req->handle_idx); goto end; } retval = mapi_handles_get_private_data(rec, &private_data); /* object is our destination folder */ destination_object = private_data; if (!destination_object) { mapi_repl->error_code = MAPI_E_INVALID_OBJECT; OC_DEBUG(5, " object (%x) not found: %x\n", handle, mapi_req->handle_idx); goto end; } /* Get the source folder information */ handle = handles[mapi_req->handle_idx]; retval = mapi_handles_search(emsmdbp_ctx->handles_ctx, handle, &rec); if (retval) { mapi_repl->error_code = MAPI_E_INVALID_OBJECT; OC_DEBUG(5, " handle (%x) not found: %x\n", handle, mapi_req->handle_idx); goto end; } retval = mapi_handles_get_private_data(rec, &private_data); source_object = private_data; if (!source_object) { mapi_repl->error_code = MAPI_E_INVALID_OBJECT; OC_DEBUG(5, " object (%x) not found: %x\n", handle, mapi_req->u.mapi_MoveCopyMessages.handle_idx); goto end; } contextID = emsmdbp_get_contextID(destination_object); mapistore = emsmdbp_is_mapistore(source_object); if (mapistore) { /* We prepare a set of new MIDs for the backend */ targetMIDs = talloc_array(NULL, uint64_t, mapi_req->u.mapi_MoveCopyMessages.count); for (i = 0; i < mapi_req->u.mapi_MoveCopyMessages.count; i++) { mapistore_indexing_get_new_folderID(emsmdbp_ctx->mstore_ctx, &targetMIDs[i]); } /* We invoke the backend method */ mapistore_folder_move_copy_messages(emsmdbp_ctx->mstore_ctx, contextID, destination_object->backend_object, source_object->backend_object, mem_ctx, mapi_req->u.mapi_MoveCopyMessages.count, mapi_req->u.mapi_MoveCopyMessages.message_id, targetMIDs, NULL, NULL, mapi_req->u.mapi_MoveCopyMessages.WantCopy); talloc_free(targetMIDs); /* /\* The backend might do this for us. In any case, we try to add it ourselves *\/ */ /* mapistore_indexing_record_add_mid(emsmdbp_ctx->mstore_ctx, contextID, targetMID); */ } else { OC_DEBUG(0, "mapistore support not implemented yet - shouldn't occur\n"); mapi_repl->error_code = MAPI_E_NO_SUPPORT; } end: *size += libmapiserver_RopMoveCopyMessages_size(mapi_repl); return MAPI_E_SUCCESS; }
/** \details EcDoRpc CreateFolder (0x1c) Rop. This operation creates a folder on the remote server. \param mem_ctx pointer to the memory context \param emsmdbp_ctx pointer to the emsmdb provider context \param mapi_req pointer to the CreateFolder EcDoRpc_MAPI_REQ structure \param mapi_repl pointer to the CreateFolder EcDoRpc_MAPI_REPL structure \param handles pointer to the MAPI handles array \param size pointer to the mapi_response size to update \return MAPI_E_SUCCESS on success, otherwise MAPI error \note We do not provide support for GhostInfo */ _PUBLIC_ enum MAPISTATUS EcDoRpc_RopCreateFolder(TALLOC_CTX *mem_ctx, struct emsmdbp_context *emsmdbp_ctx, struct EcDoRpc_MAPI_REQ *mapi_req, struct EcDoRpc_MAPI_REPL *mapi_repl, uint32_t *handles, uint16_t *size) { enum MAPISTATUS retval; enum mapistore_error ret; struct mapi_handles *parent = NULL; uint32_t handle; uint64_t parent_fid, fid, cn; struct SPropValue cnValue; struct emsmdbp_object *parent_object = NULL; struct emsmdbp_object *object = NULL; struct CreateFolder_req *request; struct CreateFolder_repl *response; struct SRow *aRow = NULL; void *data; struct mapi_handles *rec = NULL; OC_DEBUG(4, "exchange_emsmdb: [OXCFOLD] CreateFolder (0x1c)\n"); /* Sanity checks */ OPENCHANGE_RETVAL_IF(!emsmdbp_ctx, MAPI_E_NOT_INITIALIZED, NULL); OPENCHANGE_RETVAL_IF(!mapi_req, MAPI_E_INVALID_PARAMETER, NULL); OPENCHANGE_RETVAL_IF(!mapi_repl, MAPI_E_INVALID_PARAMETER, NULL); OPENCHANGE_RETVAL_IF(!handles, MAPI_E_INVALID_PARAMETER, NULL); OPENCHANGE_RETVAL_IF(!size, MAPI_E_INVALID_PARAMETER, NULL); /* Set up sensible values for the reply */ mapi_repl->opnum = mapi_req->opnum; mapi_repl->error_code = MAPI_E_SUCCESS; mapi_repl->handle_idx = mapi_req->u.mapi_CreateFolder.handle_idx; if (!mapi_req->u.mapi_CreateFolder.ulFolderType || mapi_req->u.mapi_CreateFolder.ulFolderType > 0x2) { mapi_repl->error_code = MAPI_E_INVALID_PARAMETER; goto end; } /* Step 1. Retrieve parent handle in the hierarchy */ handle = handles[mapi_req->handle_idx]; retval = mapi_handles_search(emsmdbp_ctx->handles_ctx, handle, &parent); OPENCHANGE_RETVAL_IF(retval, retval, NULL); /* With CreateFolder, the parent object really IS the parent object */ mapi_handles_get_private_data(parent, &data); parent_object = (struct emsmdbp_object *)data; if (!parent_object) { OC_DEBUG(4, "exchange_emsmdb: [OXCFOLD] CreateFolder null object\n"); mapi_repl->error_code = MAPI_E_NO_SUPPORT; goto end; } if (parent_object->type == EMSMDBP_OBJECT_MAILBOX) { mapi_repl->error_code = MAPI_E_NO_SUPPORT; goto end; } if (parent_object->type != EMSMDBP_OBJECT_FOLDER && parent_object->type != EMSMDBP_OBJECT_MAILBOX) { OC_DEBUG(4, "exchange_emsmdb: [OXCFOLD] CreateFolder wrong object type: 0x%x\n", parent_object->type); mapi_repl->error_code = MAPI_E_NO_SUPPORT; goto end; } request = &mapi_req->u.mapi_CreateFolder; response = &mapi_repl->u.mapi_CreateFolder; /* OC_DEBUG(4, ("exchange_emsmdb: [OXCFOLD] CreateFolder parent: 0x%.16"PRIx64"\n", parent_fid)); */ /* OC_DEBUG(4, ("exchange_emsmdb: [OXCFOLD] Creating %s\n", request->FolderName.lpszW)); */ /* if (request->ulFolderType != FOLDER_GENERIC) { */ /* OC_DEBUG(4, ("exchange_emsmdb: [OXCFOLD] Unexpected folder type 0x%x\n", request->ulType)); */ /* mapi_repl->error_code = MAPI_E_NO_SUPPORT; */ /* goto end; */ /* } */ response->IsExistingFolder = false; ret = emsmdbp_object_get_fid_by_name(emsmdbp_ctx, parent_object, request->FolderName.lpszW, &fid); if (ret == MAPISTORE_SUCCESS) { if (oxosfld_is_special_folder(emsmdbp_ctx, fid) || request->ulFlags == OPEN_IF_EXISTS) { response->IsExistingFolder = true; } else { if (emsmdbp_is_mapistore(parent_object)) { OC_DEBUG(5, "Folder %s exists in MAPIStore", request->FolderName.lpszW); } else { OC_DEBUG(5, "Folder %s exists in OpenChangeDB", request->FolderName.lpszW); } mapi_repl->error_code = MAPI_E_COLLISION; goto end; } } mapi_handles_add(emsmdbp_ctx->handles_ctx, 0, &rec); if (response->IsExistingFolder) { retval = emsmdbp_object_open_folder_by_fid(rec, emsmdbp_ctx, parent_object, fid, &object); if (retval != MAPI_E_SUCCESS) { OC_DEBUG(4, "exchange_emsmdb: [OXCFOLD] Failure opening existing folder: %s\n", mapi_get_errstr(retval)); mapi_handles_delete(emsmdbp_ctx->handles_ctx, rec->handle); mapi_repl->error_code = retval; goto end; } } else { /* Step 3. Turn CreateFolder parameters into MAPI property array */ parent_fid = parent_object->object.folder->folderID; if (openchangedb_is_public_folder_id(emsmdbp_ctx->oc_ctx, parent_fid)) { retval = openchangedb_get_new_public_folderID(emsmdbp_ctx->oc_ctx, emsmdbp_ctx->username, &fid); } else { retval = mapistore_error_to_mapi(mapistore_indexing_get_new_folderID(emsmdbp_ctx->mstore_ctx, &fid)); } if (retval != MAPI_E_SUCCESS) { OC_DEBUG(4, "exchange_emsmdb: [OXCFOLD] Could not obtain a new folder id\n"); mapi_repl->error_code = MAPI_E_NO_SUPPORT; goto end; } retval = openchangedb_get_new_changeNumber(emsmdbp_ctx->oc_ctx, emsmdbp_ctx->username, &cn); if (retval != MAPI_E_SUCCESS) { OC_DEBUG(4, "exchange_emsmdb: [OXCFOLD] Could not obtain a new folder cn\n"); mapi_repl->error_code = MAPI_E_NO_SUPPORT; goto end; } aRow = libmapiserver_ROP_request_to_properties(mem_ctx, (void *)&mapi_req->u.mapi_CreateFolder, op_MAPI_CreateFolder); aRow->lpProps = add_SPropValue(mem_ctx, aRow->lpProps, &(aRow->cValues), PR_PARENT_FID, (void *)(&parent_fid)); cnValue.ulPropTag = PidTagChangeNumber; cnValue.value.d = cn; SRow_addprop(aRow, cnValue); retval = emsmdbp_object_create_folder(emsmdbp_ctx, parent_object, rec, fid, aRow, true, &object); if (retval != MAPI_E_SUCCESS) { OC_DEBUG(5, "folder creation failed\n"); mapi_handles_delete(emsmdbp_ctx->handles_ctx, rec->handle); mapi_repl->error_code = retval; goto end; } } handles[mapi_repl->handle_idx] = rec->handle; mapi_handles_set_private_data(rec, object); response->folder_id = fid; if (response->IsExistingFolder == true) { response->GhostUnion.GhostInfo.HasRules = false; response->GhostUnion.GhostInfo.IsGhosted = false; } end: *size += libmapiserver_RopCreateFolder_size(mapi_repl); if (aRow) { talloc_free(aRow); } return MAPI_E_SUCCESS; }