/* -*- Mode: IDL; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */

/*
 *  Copyright (C) 2008 OMC Denmark ApS.
 *
 *  This program is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU Affero General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU Affero General Public License for more details.
 *
 *  You should have received a copy of the GNU Affero General Public License
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

#ifndef F2T_IMAPIPROP_DEF
#define F2T_IMAPIPROP_DEF

#pragma prefix "omc.brutus"

#include "types.idl"
#include "IMAPIProgress.idl"

module BRUTUS {

        interface IMAPIProp : IUnknown {
                BRESULT GetLastError(in BRESULT ReturnCode, 
                                     in BDEFINE ulFlags, 
                                     out MAPIERROR lppMAPIError);

                BRESULT SaveChanges(in BDEFINE ulFlags);

                BRESULT GetProps(in SPropTagArray lpPropTagArray, 
                                 in BDEFINE ulFlags, 
                                 out seq_SPropValue lppPropArray); 

                BRESULT GetPropList(in BDEFINE ulFlags, 
                                    out SPropTagArray lppPropTagArray);

                BRESULT OpenProperty(in unsigned long ulPropTag, 
                                     in GUID lpiid, 
                                     in unsigned long ulInterfaceOptions, 
                                     in BDEFINE ulFlags, 
                                     out IUnknown lppUnk);

                // The behavior is as according to MSDN for a NULL lppProblems 
                // if ProblemInfo is false.
                BRESULT SetProps(in seq_SPropValue lpPropArray, 
                                 in boolean ProblemInfo,
                                 out SPropProblemArray lppProblems);     

                // The behavior is as according to MSDN for a NULL lppProblems 
                // if ProblemInfo is false.
                BRESULT DeleteProps(in SPropTagArray lpPropTagArray, 
                                    in boolean ProblemInfo,
                                    out SPropProblemArray lppProblems); 

                // The lpDestObj parameter has been changed from an interface to an
                // entry id (better design..).
                // The behavior is as according to MSDN for a NULL lppProblems 
                // if ProblemInfo is false.
                BRESULT CopyTo(in seq_GUID rgiidExclude, 
                               in SPropTagArray lpExcludeProps, 
                               in IMAPIProgress lpProgress, 
                               in GUID lpInterface, 
                               in ENTRYID lpDestObj, 
                               in BDEFINE ulFlags, 
                               in boolean ProblemInfo,
                               out SPropProblemArray lppProblems); 

                // The behavior is as according to MSDN for a NULL lppProblems 
                // if ProblemInfo is false.
                BRESULT CopyProps(in SPropTagArray lpIncludeProps, 
                                  in IMAPIProgress lpProgress, 
                                  in GUID lpInterface, 
                                  in ENTRYID lpDestObj, 
                                  in BDEFINE ulFlags, 
                                  in boolean ProblemInfo,
                                  out SPropProblemArray lppProblems); 

                // The behavior is as according to MSDN for a NULL lppPropTags 
                // if lppPropTags has zero length.
                BRESULT GetNamesFromIDs(inout SPropTagArray lppPropTags, 
                                        in GUID lpPropSetGuid, 
                                        in BDEFINE ulFlags, 
                                        out seq_MAPINAMEID lpppPropNames); 

                BRESULT GetIDsFromNames(in seq_MAPINAMEID lppPropNames, 
                                        in BDEFINE ulFlags, 
                                        out SPropTagArray lppPropTags); 

///////////////////////////////////////////////////////////
//                                                       //
// The following functions are generic helper functions. //
// They are *not* a part of IMAPIProp proper.            //
//                                                       //
///////////////////////////////////////////////////////////

		// This will retrieve an SPropValue array for the MNID_ID or
		// MNID_STRING named properties in lpPropTagArray. 
		// See IMAPIProp::GetProps().
                BRESULT GetNamedProps(in GUID PropSetGuid,                    // the property set
				      in seq_NamedPropertyTag lpPropTagArray, // the named property tags
				      in BDEFINE ulFlags,                     // flags given to IMAPIProp::GetProps()
				      out seq_SPropValue lppPropArray);       // the SPropValue return values

		// This will set the SPropValues on an object for the MNID_ID 
		// or MNID_STRING named properties in lpPropArray. 
		// See IMAPIProp::SetProps().
                BRESULT SetNamedProps(in GUID PropSetGuid,                    // the property set
				      in seq_NamedPropertyTag lpPropTagArray, // the named property tags 				      
				      in seq_SPropValue lpPropArray,          // the SPropValues to set
				      in boolean ProblemInfo,                 // return problem info?
				      out SPropProblemArray lppProblems);     // problem info

        }; // End of IMAPIProp::IUnknown

}; // End of module BRUTUS


#endif
