SaveToContainer Method

Topic Last Modified: 2006-06-13

Binds to and saves data into a new item in the folder/container specified by URL. The item name is a generated globally unique identifier (GUID).

Applies To

IDataSource Interface

Type Library

Microsoft CDO for Exchange 2000 Library

DLL Implemented In

CDOEX.DLL

Syntax

Function SaveToContainer(    ContainerURL As String,
    [ActiveConnection As Object],
    [Mode As ConnectModeEnum],
    [CreateOptions As RecordCreateOptionsEnum],
    [Options As RecordOpenOptionsEnum],
    [UserName As String],
    [Password As String])
HRESULT SaveToContainer
(
        BSTR ContainerURL,
        IDispatch* ActiveConnection,
        ConnectModeEnum Mode,
        RecordCreateOptionsEnum CreateOptions,
        RecordOpenOptionsEnum Options,
        BSTR UserName,
        BSTR Password
);

Parameters

  • ContainerURL
    The URL of the folder/collection resource which the item is to be saved.
  • ActiveConnection
    Specifies the optional connection to use when saving. This is an IDispatch interface to a Microsoft® ActiveX® Data Objects (ADO) Connection object. A new Connection (session) object is implicitly created if none is specified.
  • Mode
    Access mode. This value is always ORed with adModeReadWrite. That is, at least read-write access is required to save the item to the container/folder.
  • CreateOptions
    Set of flags to specify creation options. The values adFailIfNotExists and adOpenIfExists should not be used. If used, an E_INVALIDARG exception is raised.
  • Options
    This specifies options flag(s) used when opening the source. Your setting is always ORed with adOpenSource.
  • UserName
    Not Supported - Reserved for future use. Used to pass a user name for authentication.
  • Password
    Not Supported - Reserved for future use. Used to pass a password for authentication.

Return Value

Returns S_OK if successful, or an error value otherwise.

Remarks

The specified URL must identify a valid URL namespace that the OLE DB 2.5 root binder can resolve to a registered provider binder. Once resolved, the URL must conform to that provider binder's URL semantics.

The enumerated values and their semantic definitions are defined as part of the ADO type library and documentation. Consult the ADO 2.5 documentation for a list of valid enumeration values and their intended purposes. Use of various enumerated values and their intended meanings are specific to a particular OLE DB 2.5 provider.

Restrictions on what types of data can be saved into a particular resource and how that data is handled by an implementation of the IDataSource interface is not part of this definition. Consult the appropriate Component Object Model (COM) class reference for further information.

The SaveToContainer method differs from SaveTo in that the name for the resource is automatically generated for you in the container collection specified by URL. The name generated by this method is not defined here and is implementation specific.

After successful completion of this method, you can retrieve the full URL to the new object to which you are currently bound by examining the IDataSource.SourceURL property.

Examples


' Reference to Microsoft CDO for Exchange 2000 Library
' Reference to Microsoft ActiveX Data Objects 2.5 Library

Sub SaveEmbeddedPartsToFolder(iMsg As CDO.message, Url As String)

    Dim iMsgB As New CDO.message
    Dim iDsrcB As CDO.IDataSource
    Dim iFldr As New Folder
    Dim iDsrcFldr As CDO.IDataSource
    Dim Conn As New ADODB.Connection
    Dim iBp As IBodyPart
    Dim iBps As IBodyParts
    Dim ContType As String

    Conn.Provider = "ExOLEDB.DataSource"
    Conn.Open Url

    Set iDsrcFldr = iFldr
    iDsrcFldr.Open Url, Conn

    Set iDsrcB = iMsgB

    Set iBp = iMsg
    Set iBps = iBp.BodyParts

    For Each iBp In iBps
        ContType = iBp.ContentMediaType
        If ContType = "message/rfc822" Then

            iDsrcB.OpenObject iBp, "IBodyPart"
            iDsrcB.SaveToContainer Url, Conn, adModeReadWrite, adCreateOverwrite
            Debug.Print "Saved message has URL " & iDsrcB.SourceURL

        ElseIf ContType = "application/octet-stream" Or _
                    ContType = "application/x-msdownload" Then

            Dim iItem As New Item
            Dim Flds As ADODB.Fields
            Dim Fld As ADODB.Field
            Dim Stm1 As Stream
            Dim Stm2 As Stream

            Set Stm1 = iItem.GetStream

            ' Get Decoded BodyPart stream
            Set Stm2 = iBp.GetDecodedContentStream
            ' Copy bodypart stream to resource stream
            Stm2.CopyTo Stm1

            ' Commit
            Stm1.Flush
            Stm1.Close
            iItem.DataSource.SaveToContainer Url, Conn, adModeReadWrite

        End If
    Next iBp
End Sub
' Reference to Microsoft CDO for Exchange 2000 Library
' Reference to Microsoft ActiveX Data Objects 2.5 Library

Function CreateAndSaveMessageToContainer(Url1 As String) As CDO.message

    Dim iDsrc As CDO.IDataSource
    Dim Conn As New ADODB.Connection
    Conn.Provider = "ExOLEDB.DataSource"
    Conn.Open Url1

    Dim iMsg As New CDO.message

    With iMsg
        .To = "someone@microsoft.com"
        .From = "another@microsoft.com"
        .Subject = "Here is the subject"
        .TextBody = "Here is the text of the message"
    End With

    Set iDsrc = iMsg

    iDsrc.SaveToContainer Url1, _
                Conn, _
                adModeReadWrite

    Set CreateAndSaveMessageToContainer = iMsg

End Function



/*
 You must have the following paths in your
 INCLUDE path.
 %CommonProgramFiles%\system\ado
 %CommonProgramFiles%\microsoft shared\cdo

*/
#ifndef _CORE_EXAMPLE_HEADERS_INCLUDED
#define _CORE_EXAMPLE_HEADERS_INCLUDED
#import <msado15.dll> no_namespace
#import <cdoex.dll> no_namespace
#include <iostream.h>
#endif

void SaveMessageToFolder2(IMessagePtr pMsg, bstr_t url) {

   _ConnectionPtr pConn(__uuidof(Connection));

   if(pMsg == NULL)
      throw _com_error(E_INVALIDARG);
   // for passing optional variants, we may need this
   _variant_t varOpt(DISP_E_PARAMNOTFOUND,VT_ERROR);
   IDataSourcePtr pDsrc = pMsg;

   pConn->Provider = "ExOLEDB.DataSource";
   try {
      pConn->Open(url,bstr_t(),bstr_t(),-1);
   }
   catch(_com_error e) {
      throw e;
   }

   try {
      pDsrc->SaveToContainer(
            url,
            variant_t((IDispatch*)pConn,true), //Connection from Folder bind above
            adModeReadWrite,
            adCreateNonCollection,
            (RecordOpenOptionsEnum) NULL,
            bstr_t(),
            bstr_t()
            );
   }
   catch(_com_error e) {
      cerr << "Error saving message to folder!" << endl;
      throw e;
   }
}


<job id="idatasource_savetocontainer">
<reference object="adodb.record"/>
<reference object="cdo.message"/>
<script language="vbscript">

    Dim iDsrc
    Dim iMsg
    Dim Conn
    Dim InfoNT
    Dim Info
    Dim sFolderUrl

    Set Info   = CreateObject("ADSystemInfo")
    Set InfoNT = CreateObject("WinNTSystemInfo")
    Set Conn   = CreateObject("ADODB.Connection")
    Set iMsg   = CreateObject("CDO.Message")

    sFolderUrl = "http://" & InfoNt.ComputerName & "." & Info.DomainDNSName &  _
           "/public/test_folder/"

    Conn.Provider = "ExOLEDB.DataSource"
    Conn.Open sFolderUrl

    ' ...

    With iMsg
        .To   = "someone@microsoft.com"
        .From = "another@microsoft.com"
        .Subject = "Here is the subject"
        .TextBody = "Here is the text of the message"
    End With

    Set iDsrc = iMsg.DataSource
    iDsrc.SaveToContainer sFolderUrl, Conn
    Wscript.Echo "Saved To and bound to item at URL: " & iDsrc.SourceURL

    iMsg.TextBody = iMsg.TextBody & vbCrLf & "And this is another line."
    iDsrc.Save

</script>
</job>