Switch Attachment to memory based data
authorAndre Heinecke <aheinecke@intevation.de>
Wed, 14 Sep 2016 15:05:55 +0000 (17:05 +0200)
committerAndre Heinecke <aheinecke@intevation.de>
Wed, 14 Sep 2016 15:05:55 +0000 (17:05 +0200)
* src/attachment.cpp, src/attachment.h: Use gpgme_data instead
of mapi temporary file.

--
This enables us to be sure that no plaintext is left over in
the temporary directory. While this might cost some memory
it should not be problematic in practice.

src/attachment.cpp
src/attachment.h

index b052d00..2dac020 100644 (file)
  */
 
 #include "config.h"
-#include "common.h"
+#include "common_indep.h"
 #include "attachment.h"
-#include "mymapitags.h"
-#include "mapihelp.h"
-#include "gpgolstr.h"
 
 #include <climits>
-#include <gpg-error.h>
-#include <gpgme++/error.h>
 
 Attachment::Attachment()
 {
-  HRESULT hr;
-  hr = OpenStreamOnFile (MAPIAllocateBuffer, MAPIFreeBuffer,
-                        (SOF_UNIQUEFILENAME | STGM_DELETEONRELEASE
-                         | STGM_CREATE | STGM_READWRITE),
-                        NULL, GpgOLStr("GPG"), &m_stream);
-  if (FAILED (hr))
-    {
-      log_error ("%s:%s: can't create attachment: hr=%#lx\n",
-                 SRCNAME, __func__, hr);
-      m_stream = NULL;
-    }
-}
-
-Attachment::Attachment(LPSTREAM stream)
-{
-  if (stream)
-    {
-      stream->AddRef ();
-    }
-  m_stream = stream;
 }
 
 Attachment::~Attachment()
 {
   log_debug ("%s:%s", SRCNAME, __func__);
-  gpgol_release (m_stream);
-}
-
-LPSTREAM
-Attachment::get_stream()
-{
-  return m_stream;
 }
 
 std::string
@@ -95,113 +63,18 @@ Attachment::isSupported(GpgME::DataProvider::Operation op) const
 ssize_t
 Attachment::read(void *buffer, size_t bufSize)
 {
-  if (!bufSize)
-    {
-      return 0;
-    }
-  if (!buffer || bufSize >= ULONG_MAX)
-    {
-      log_error ("%s:%s: Read invalid",
-                 SRCNAME, __func__);
-      GpgME::Error::setSystemError (GPG_ERR_EINVAL);
-      return -1;
-    }
-  if (!m_stream)
-    {
-      log_error ("%s:%s: Read on null stream.",
-                 SRCNAME, __func__);
-      GpgME::Error::setSystemError (GPG_ERR_EIO);
-      return -1;
-    }
-
-  ULONG cb = static_cast<size_t> (bufSize);
-  ULONG bRead = 0;
-  HRESULT hr = m_stream->Read (buffer, cb, &bRead);
-  if (hr != S_OK && hr != S_FALSE)
-    {
-      log_error ("%s:%s: Read failed",
-                 SRCNAME, __func__);
-      GpgME::Error::setSystemError (GPG_ERR_EIO);
-      return -1;
-    }
-  return static_cast<size_t>(bRead);
+  return m_data.read (buffer, bufSize);
 }
 
 ssize_t
 Attachment::write(const void *data, size_t size)
 {
-  if (!size)
-    {
-      return 0;
-    }
-  if (!data || size >= ULONG_MAX)
-    {
-      GpgME::Error::setSystemError (GPG_ERR_EINVAL);
-      return -1;
-    }
-  if (!m_stream)
-    {
-      log_error ("%s:%s: Write on NULL stream. ",
-                 SRCNAME, __func__);
-      GpgME::Error::setSystemError (GPG_ERR_EIO);
-      return -1;
-    }
-  ULONG written = 0;
-  if (m_stream->Write (data, static_cast<ULONG>(size), &written) != S_OK)
-    {
-      GpgME::Error::setSystemError (GPG_ERR_EIO);
-      log_error ("%s:%s: Write failed.",
-                 SRCNAME, __func__);
-      return -1;
-    }
-  if (m_stream->Commit (0) != S_OK)
-    {
-      log_error ("%s:%s: Commit failed. ",
-                 SRCNAME, __func__);
-      GpgME::Error::setSystemError (GPG_ERR_EIO);
-      return -1;
-    }
-  return static_cast<ssize_t> (written);
+  return m_data.write (data, size);
 }
 
 off_t Attachment::seek(off_t offset, int whence)
 {
-  DWORD dwOrigin;
-  switch (whence)
-    {
-      case SEEK_SET:
-          dwOrigin = STREAM_SEEK_SET;
-          break;
-      case SEEK_CUR:
-          dwOrigin = STREAM_SEEK_CUR;
-          break;
-      case SEEK_END:
-          dwOrigin = STREAM_SEEK_END;
-          break;
-      default:
-          GpgME::Error::setSystemError (GPG_ERR_EINVAL);
-          return (off_t) - 1;
-   }
-  if (!m_stream)
-    {
-      log_error ("%s:%s: Seek on null stream.",
-                 SRCNAME, __func__);
-      GpgME::Error::setSystemError (GPG_ERR_EIO);
-      return (off_t) - 1;
-    }
-  LARGE_INTEGER move = {0, 0};
-  move.QuadPart = offset;
-  ULARGE_INTEGER result;
-  HRESULT hr = m_stream->Seek (move, dwOrigin, &result);
-
-  if (hr != S_OK)
-    {
-      log_error ("%s:%s: Seek failed. ",
-                 SRCNAME, __func__);
-      GpgME::Error::setSystemError (GPG_ERR_EINVAL);
-      return (off_t) - 1;
-    }
-  return result.QuadPart;
+  return m_data.seek (offset, whence);
 }
 
 void Attachment::release()
index ae1fb49..f2ba143 100644 (file)
 #ifndef ATTACHMENT_H
 #define ATTACHMENT_H
 
-#include <windows.h>
-#include "oomhelp.h"
-#include "mapihelp.h"
 #include <string>
 
 #include <gpgme++/interfaces/dataprovider.h>
+#include <gpgme++/data.h>
 
 /** Helper class for attachment actions. */
 class Attachment : public GpgME::DataProvider
 {
 public:
-  /** Creates and opens a new temporary stream. */
+  /** Creates and opens a new in memory attachment. */
   Attachment();
-
-  /** Creates the attachment wrapper for an existing stream. */
-  Attachment(LPSTREAM stream);
-
-  /** Deletes the attachment and the underlying temporary file. */
   ~Attachment();
 
-  /** Get an assoicated ISteam ptr or NULL. */
-  LPSTREAM get_stream();
-
   /** Set the display name */
   void set_display_name(const char *name);
   std::string get_display_name() const;
@@ -57,7 +47,7 @@ public:
   void release();
 
 private:
-  LPSTREAM m_stream;
+  GpgME::Data m_data;
   std::string m_utf8DisplayName;
   attachtype_t m_type;
 };