You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
622 lines
20 KiB
622 lines
20 KiB
//+---------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1992 - 1995.
|
|
//
|
|
// File: ActX.idl
|
|
//
|
|
// Contents:
|
|
//
|
|
// Classes:
|
|
//
|
|
// Functions:
|
|
//
|
|
// History: 11-17-1996 JohannP (Johann Posch) Created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
import "objidl.idl";
|
|
import "oleidl.idl";
|
|
import "ocidl.idl";
|
|
//import "propbag2.idl";
|
|
|
|
interface IPackage;
|
|
interface IAcceptor;
|
|
interface ICourier;
|
|
interface IPackageFilter;
|
|
|
|
typedef GUID DESTID;
|
|
typedef REFGUID REFDESTID;
|
|
|
|
typedef [unique] IAcceptor *LPACCEPTOR;
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Copyright (C) Microsoft Corporation, 1995 - 1996.
|
|
//
|
|
// Contents: The package description and IPackage interface definition
|
|
//
|
|
// Description:
|
|
//
|
|
// Each package (IPackage) has an idendifier (ITEMID) which is a guid and
|
|
// itentifies the package type
|
|
//
|
|
// An package is an object which can be send to a distination object via
|
|
// a particular interface. The delivery mechanism can be a
|
|
// scheduler or an advisor.
|
|
//
|
|
// The sources of an package can be any any object or module.
|
|
//
|
|
// An package can scheduled and delivered to the destination(s) according
|
|
// the trigger time.
|
|
//
|
|
// An package might be as simple as an alert or notification. It can
|
|
// be a full object form the cache or the docfile. It can be an
|
|
// announcment and data might not be available yet.
|
|
//
|
|
// Many packages will in fact arrive with all data.
|
|
//
|
|
// The same object will expose I(Async)Moniker and the client
|
|
// can call BindToXXX to bind to the object of the data.
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
typedef GUID PACKAGEID, *PPACKAGEID;
|
|
typedef REFGUID REFPACKAGEID;
|
|
|
|
cpp_quote("")
|
|
cpp_quote("////////////////////////////////////////////////////////////////////////////")
|
|
cpp_quote("// Standard Package IDs ")
|
|
cpp_quote("EXTERN_C const PACKAGEID PACKAGEID_NULL ;")
|
|
cpp_quote("EXTERN_C const PACKAGEID PACKAGEID_ANOUNCMENT ;")
|
|
cpp_quote("EXTERN_C const PACKAGEID PACKAGEID_TASK ;")
|
|
cpp_quote("EXTERN_C const PACKAGEID PACKAGEID_ALERT ;")
|
|
cpp_quote("EXTERN_C const PACKAGEID PACKAGEID_NOTIFICATION_INET_IDLE ;")
|
|
cpp_quote("EXTERN_C const PACKAGEID PACKAGEID_NOTIFICATION_INET_OFFLINE ;")
|
|
cpp_quote("EXTERN_C const PACKAGEID PACKAGEID_NOTIFICATION_INET_ONLINE ;")
|
|
cpp_quote("")
|
|
cpp_quote("EXTERN_C const PACKAGEID PACKAGEID_TASKS_SUSPEND ;")
|
|
cpp_quote("EXTERN_C const PACKAGEID PACKAGEID_TASKS_RESUME ;")
|
|
cpp_quote("EXTERN_C const PACKAGEID PACKAGEID_TASKS_ABORT ;")
|
|
cpp_quote("EXTERN_C const PACKAGEID PACKAGEID_TASKS_COMPLETED ;")
|
|
cpp_quote("EXTERN_C const PACKAGEID PACKAGEID_TASKS_PROGRESS ;")
|
|
cpp_quote("")
|
|
|
|
|
|
cpp_quote("#ifndef _LPPACKAGEOBJ")
|
|
cpp_quote("#define _LPPACKAGEOBJ")
|
|
|
|
[
|
|
local,
|
|
object,
|
|
uuid(79eacbe1-baf9-11ce-8c82-00aa004ba90b),
|
|
pointer_default(unique)
|
|
]
|
|
|
|
interface IPackageObj : IPropertyBag
|
|
{
|
|
typedef [unique] IPackageObj *LPPACKAGEOBJ;
|
|
|
|
//
|
|
// information about the package itself
|
|
// passed on by the creator of the package to the scheduler
|
|
// and to the advisor
|
|
typedef enum _tagPACKAGE_FLAGS
|
|
{
|
|
// the package is very simple and has no object, eg. alert
|
|
PF_NO_OBJECT = 0x00000001
|
|
// the package is not a simple object - is a derived object form Package
|
|
,PF_NO_SIMPLE_OBJECT = 0x00000002
|
|
// package can not be persisted
|
|
,PF_NOT_PERSISTABLE = 0x00000004
|
|
// the sender of the package wants to notified when done
|
|
// the the package task
|
|
,PF_NEED_COMPLETIONREPORT = 0x00000004
|
|
// the send wants progress report
|
|
,PF_NEED_PROGRESSREPORT = 0x00000008
|
|
// the sender provides cookie
|
|
,PF_USE_COOKIE = 0x00000010
|
|
// member of group - the packages
|
|
// are delivered sequentiall - meaning
|
|
// a completion report is send by each one
|
|
,PF_GROUP_SEQUENTIAL = 0x00000100
|
|
// member of group - the packages
|
|
// are delivered at the same time
|
|
,PF_GROUP_PARALLEL = 0x00000200
|
|
|
|
} PACKAGE_FLAGS;
|
|
|
|
//
|
|
// Package data specific information
|
|
// an package may have the following data components
|
|
//
|
|
typedef enum _tagPACKAGEDATA_FLAGS
|
|
{
|
|
// the package has data via the storage medium
|
|
PD_DATA = 0x00000001
|
|
// package has a URL
|
|
,PD_URL = 0x00000002
|
|
// package has a name
|
|
,PD_NAME = 0x00000004
|
|
// mime of package data is known
|
|
,PD_MIME = 0x00000008
|
|
// class if package data is know
|
|
,PD_CLASSID = 0x00000010
|
|
// package has a group id - obtained with GetTickCount
|
|
,PD_GRUPPID = 0x00000020
|
|
// package is coming from the cache
|
|
,PD_FROMCACHE = 0x00010000
|
|
// other flags
|
|
,PD_VOLATILE = 0x00020000
|
|
|
|
} PACKAGEDATA_FLAGS;
|
|
|
|
|
|
typedef struct _tagPackageData
|
|
{
|
|
ULONG cbSize;
|
|
PACKAGE_FLAGS packageF;
|
|
PACKAGEDATA_FLAGS packagedataF;
|
|
|
|
// package specific information
|
|
// what does the basic package need?
|
|
LPOLESTR wzName;
|
|
LPOLESTR wzUrl;
|
|
LPOLESTR wzMime;
|
|
CLSID clsid;
|
|
|
|
// the prefered tymed the client wants the data
|
|
TYMED tymedPrefered;
|
|
STGMEDIUM stgmed;
|
|
} PACKAGEDATA, *LPPACKAGEDATA;
|
|
|
|
|
|
|
|
//
|
|
// the package cookie is the time the package was scheduled
|
|
// or created. the scheduler might map the cookie
|
|
// the package cookie can be NULL.
|
|
//
|
|
typedef SYSTEMTIME PACKAGECOOKIE, *PPACKAGECOOKIE;
|
|
|
|
//
|
|
// the adivse mode indicates how the adivse should be done
|
|
//
|
|
typedef enum _tagDELIVERMODE
|
|
{
|
|
// packages are advised async be default
|
|
//AM_ASYNCHRONOUS = 0x00000000
|
|
|
|
// the package should be delivered sync
|
|
DM_SYNCHRONOUS = 0x00000001
|
|
// the package should be delivered input-sync
|
|
,DM_INPUTSYNCHRONOUS = 0x00000001
|
|
// deliver package only if class is registered
|
|
,DM_ONLY_IF_RUNNING = 0x00000002
|
|
// advise and close/release the class
|
|
,DM_RUN_AND_CLOSE = 0x00000004
|
|
// send it delayed and compress
|
|
// meaning all the package is delayed for
|
|
// a certainrDestReports time - the last package of this kind
|
|
// gets send
|
|
,DM_DELAY_AND_COMPRESS = 0x00000008
|
|
// always deliver the package
|
|
// even on was transmited just imedialty before
|
|
,DM_DELIVER_ALWAYS = 0x00000010
|
|
|
|
} DELIVERMODE;
|
|
|
|
|
|
typedef struct _tagPackage_X
|
|
{
|
|
ULONG cbSize;
|
|
REFPACKAGEID rpackageid;
|
|
LPPACKAGEOBJ pPackageObj;
|
|
PACKAGE_FLAGS packageFlags;
|
|
PACKAGEDATA_FLAGS packagedataFlags;
|
|
PACKAGECOOKIE packageCookie;
|
|
DELIVERMODE deliverMode;
|
|
//REFDESTID rPackageDest;
|
|
|
|
REFDESTID rReportDest;
|
|
//LPACCEPTOR pAcceptorDest;
|
|
|
|
DWORD dwReserved;
|
|
|
|
} PACKAGE_X;
|
|
|
|
|
|
typedef struct _tagDeliveryPackage
|
|
{
|
|
ULONG cbSize;
|
|
// info about the package
|
|
PPACKAGEID pPackageid;
|
|
LPPACKAGEOBJ pPackageObj;
|
|
PACKAGE_FLAGS PackageFlags;
|
|
PACKAGECOOKIE PackageCookie;
|
|
DWORD dwReserved;
|
|
|
|
// info about transmiter
|
|
// the acceptor can be NULL meaning
|
|
// the tranmiter does not want progress
|
|
LPACCEPTOR pAcceptorDest;
|
|
|
|
} PACKAGE, *PPACKAGE;
|
|
|
|
}
|
|
cpp_quote("#endif")
|
|
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Copyright (C) Microsoft Corporation, 1995 - 1996.
|
|
//
|
|
// Contents: IAcceptor interface definition
|
|
//
|
|
// Description:
|
|
//
|
|
// The Acceptor is the interface where an package gets delivered too.
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
cpp_quote("#ifndef _LPACCEPTOR_DEFINED")
|
|
cpp_quote("#define _LPACCEPTOR_DEFINED")
|
|
|
|
[
|
|
local,
|
|
object,
|
|
uuid(79eacbe2-baf9-11ce-8c82-00aa004ba90b),
|
|
pointer_default(unique)
|
|
]
|
|
|
|
interface IAcceptor : IUnknown
|
|
{
|
|
// typedef [unique] IAcceptor *LPACCEPTOR;
|
|
|
|
HRESULT OnPackage(
|
|
[in] PPACKAGE pPackage,
|
|
[in] DWORD dwReserved
|
|
);
|
|
}
|
|
cpp_quote("#endif")
|
|
|
|
//
|
|
// An acceptor can return the following scode, which means the sink support
|
|
// the IAcceptor interface and it will send notifications on the task
|
|
// progress
|
|
//
|
|
|
|
cpp_quote("#define AX_S_CAN_ADVISEON _HRESULT_TYPEDEF_(0x000401E9L) ")
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Copyright (C) Microsoft Corporation, 1995 - 1996.
|
|
//
|
|
// Contents: IPackageObj destination definition
|
|
//
|
|
// Description:
|
|
//
|
|
// Each Package needs to be delivered to one or more destinations.
|
|
// A destination is indendified (DESTID) by a class id.
|
|
//
|
|
// The interface of the destination is an IAcceptor interface which
|
|
// is described below.
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
//typedef GUID DESTID;
|
|
//typedef REFGUID REFDESTID;
|
|
cpp_quote("")
|
|
cpp_quote("////////////////////////////////////////////////////////////////////////////")
|
|
cpp_quote("// Default Destinations ")
|
|
cpp_quote("EXTERN_C const DESTID DESTID_GLOBAL_COURIER ;")
|
|
cpp_quote("EXTERN_C const DESTID DESTID_PROCESS_COURIER ;")
|
|
cpp_quote("EXTERN_C const DESTID DESTID_THREAD_COURIER ;")
|
|
cpp_quote("")
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Copyright (C) Microsoft Corporation, 1995 - 1996.
|
|
//
|
|
// Contents: IEnumPackage interface definition
|
|
//
|
|
// Description:
|
|
//
|
|
// Enumerator overn Packages.
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
cpp_quote("#ifndef _LPENUMPACKAGE_DEFINED")
|
|
cpp_quote("#define _LPENUMPACKAGE_DEFINED")
|
|
|
|
[
|
|
local,
|
|
object,
|
|
uuid(79eacbe4-baf9-11ce-8c82-00aa004ba90b),
|
|
pointer_default(unique)
|
|
]
|
|
|
|
interface IEnumPackage : IUnknown
|
|
{
|
|
typedef [unique] IEnumPackage *LPENUMPACKAGE;
|
|
|
|
[local]
|
|
HRESULT Next(
|
|
[in] ULONG celt,
|
|
[out, size_is(celt), length_is(*pceltFetched)]
|
|
PACKAGE *rgelt,
|
|
[out] ULONG *pceltFetched);
|
|
|
|
[call_as(Next)]
|
|
HRESULT RemoteNext(
|
|
[in] ULONG celt,
|
|
[out, size_is(celt), length_is(*pceltFetched)]
|
|
PACKAGE *rgelt,
|
|
[out] ULONG *pceltFetched);
|
|
|
|
|
|
HRESULT Skip(
|
|
[in] ULONG celt);
|
|
|
|
HRESULT Reset();
|
|
|
|
HRESULT Clone(
|
|
[out] IEnumPackage **ppenum);
|
|
}
|
|
|
|
cpp_quote("#endif")
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Copyright (C) Microsoft Corporation, 1995 - 1996.
|
|
//
|
|
// Contents: ICourier interface definition
|
|
//
|
|
// Description:
|
|
//
|
|
// This is the object provide by webcheck will can start listening on
|
|
// different protocols (APP) by using the custom verb "listen".
|
|
//
|
|
// The clien can also add an package to the agents scheduler or spooler which
|
|
// will the package deliver to a distination at a given "WHEN"
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
cpp_quote("#ifndef _LPCOURIER_DEFINED")
|
|
cpp_quote("#define _LPCOURIER_DEFINED")
|
|
|
|
[
|
|
local,
|
|
object,
|
|
uuid(79eacbe6-baf9-11ce-8c82-00aa004ba90b),
|
|
pointer_default(unique)
|
|
]
|
|
|
|
interface ICourier : IUnknown
|
|
{
|
|
typedef [unique] ICourier *LPCOURIER;
|
|
|
|
typedef enum _tagACCEPTOR_MODE
|
|
{
|
|
//AM_All = 0x00000001
|
|
// exclusive means deliver only
|
|
// package of the registered type
|
|
AM_Exclusive = 0x00000001
|
|
// launch me if an package of
|
|
// registered types arrives
|
|
,AM_Intantiate = 0x00000002
|
|
|
|
} ACCEPTORMODE;
|
|
|
|
#define TASK_SUNDAY (0x1)
|
|
#define TASK_MONDAY (0x2)
|
|
#define TASK_TUESDAY (0x4)
|
|
#define TASK_WEDNESDAY (0x8)
|
|
#define TASK_THURSDAY (0x10)
|
|
#define TASK_FRIDAY (0x20)
|
|
#define TASK_SATURDAY (0x40)
|
|
#define TASK_FIRST_WEEK (1)
|
|
#define TASK_SECOND_WEEK (2)
|
|
#define TASK_THIRD_WEEK (3)
|
|
#define TASK_FOURTH_WEEK (4)
|
|
#define TASK_LAST_WEEK (5)
|
|
#define TASK_JANUARY (0x1)
|
|
#define TASK_FEBRUARY (0x2)
|
|
#define TASK_MARCH (0x4)
|
|
#define TASK_APRIL (0x8)
|
|
#define TASK_MAY (0x10)
|
|
#define TASK_JUNE (0x20)
|
|
#define TASK_JULY (0x40)
|
|
#define TASK_AUGUST (0x80)
|
|
#define TASK_SEPTEMBER (0x100)
|
|
#define TASK_OCTOBER (0x200)
|
|
#define TASK_NOVEMBER (0x400)
|
|
#define TASK_DECEMBER (0x800)
|
|
#define TASK_FLAG_INTERACTIVE (0x1)
|
|
#define TASK_FLAG_DELETE_WHEN_DONE (0x2)
|
|
#define TASK_FLAG_DISABLED (0x4)
|
|
#define TASK_FLAG_HALT_ON_ERROR (0x8)
|
|
#define TASK_FLAG_START_ONLY_IF_IDLE (0x10)
|
|
#define TASK_FLAG_KILL_ON_IDLE_END (0x20)
|
|
#define TASK_FLAG_DONT_START_IF_ON_BATTERIES (0x40)
|
|
#define TASK_FLAG_KILL_IF_GOING_ON_BATTERIES (0x80)
|
|
#define TASK_FLAG_RUN_ONLY_IF_DOCKED (0x100)
|
|
#define TASK_FLAG_HIDDEN (0x200)
|
|
#define TASK_TRIGGER_FLAG_HAS_END_DATE (0x1)
|
|
#define TASK_TRIGGER_FLAG_KILL_AT_DURATION_END (0x2)
|
|
#define TASK_TRIGGER_FLAG_DISABLED (0x4)
|
|
#define TASK_TRIGGER_FLAG_LAST_DAY_OF_MONTH (0x8)
|
|
#define TASK_MAX_RUN_TIMES ( 1440 )
|
|
|
|
typedef
|
|
enum _TASK_TRIGGER_TYPE
|
|
{ TASK_TIME_TRIGGER_ONCE = 0,
|
|
TASK_TIME_TRIGGER_DAILY = 1,
|
|
TASK_TIME_TRIGGER_WEEKLY = 2,
|
|
TASK_TIME_TRIGGER_MONTHLYDATE = 3,
|
|
TASK_TIME_TRIGGER_MONTHLYDOW = 4,
|
|
TASK_EVENT_TRIGGER_ON_IDLE = 5,
|
|
TASK_EVENT_TRIGGER_AT_SYSTEMSTART = 6,
|
|
TASK_EVENT_TRIGGER_AT_LOGON = 7
|
|
} TASK_TRIGGER_TYPE;
|
|
|
|
typedef enum _TASK_TRIGGER_TYPE *PTASK_TRIGGER_TYPE;
|
|
|
|
typedef struct _DAILY
|
|
{
|
|
WORD DaysInterval;
|
|
} DAILY;
|
|
|
|
typedef struct _WEEKLY
|
|
{
|
|
WORD WeeksInterval;
|
|
WORD rgfDaysOfTheWeek;
|
|
} WEEKLY;
|
|
|
|
typedef struct _MONTHLYDATE
|
|
{
|
|
DWORD rgfDays;
|
|
WORD rgfMonths;
|
|
} MONTHLYDATE;
|
|
|
|
typedef struct _MONTHLYDOW
|
|
{
|
|
WORD wWhichWeek;
|
|
WORD rgfDaysOfTheWeek;
|
|
WORD rgfMonths;
|
|
} MONTHLYDOW;
|
|
|
|
typedef union _TRIGGER_TYPE_UNION
|
|
{
|
|
DAILY Daily;
|
|
WEEKLY Weekly;
|
|
MONTHLYDATE MonthlyDate;
|
|
MONTHLYDOW MonthlyDOW;
|
|
} TRIGGER_TYPE_UNION;
|
|
|
|
typedef struct _TASK_TRIGGER
|
|
{
|
|
WORD cbTriggerSize;
|
|
WORD Reserved;
|
|
WORD wBeginYear;
|
|
WORD wBeginMonth;
|
|
WORD wBeginDay;
|
|
WORD wEndYear;
|
|
WORD wEndMonth;
|
|
WORD wEndDay;
|
|
WORD wStartHour;
|
|
WORD wStartMinute;
|
|
DWORD MinutesDuration;
|
|
DWORD MinutesInterval;
|
|
DWORD rgFlags;
|
|
TASK_TRIGGER_TYPE TriggerType;
|
|
TRIGGER_TYPE_UNION Type;
|
|
} TASK_TRIGGER;
|
|
|
|
typedef struct _TASK_TRIGGER *PTASK_TRIGGER;
|
|
|
|
|
|
HRESULT Register(
|
|
[in] LPACCEPTOR pAcceptor, // can be null - see mode
|
|
[in] REFDESTID rPackageDest,
|
|
[in] ACCEPTORMODE asMode,
|
|
[in] ULONG cPackages,
|
|
[in] PPACKAGEID pPackageIDs,
|
|
[in] DWORD dwReserved
|
|
);
|
|
|
|
HRESULT Unregister(
|
|
[in] REFDESTID rPackageDest,
|
|
[in] ULONG cPackages,
|
|
[in] PPACKAGEID pPackageIDs
|
|
);
|
|
|
|
// deliver a package to a specific class object such as mail
|
|
// the class object will be instantiated
|
|
HRESULT DeliverPackage(
|
|
// info about who the sender
|
|
[in] REFCLSID rclsidSender, // class of sender
|
|
[in] LPACCEPTOR pAcceptor, // can be null - see mode
|
|
// the package
|
|
[in] PPACKAGE pPackage,
|
|
// deliver and schedule data
|
|
[in] DELIVERMODE deliverMode,
|
|
[in] PTASK_TRIGGER pschdata,
|
|
// destination
|
|
[in] REFDESTID rPackageDest,
|
|
// return info - cookie of package
|
|
[in, out] PPACKAGECOOKIE ppackageCookie,
|
|
[in] DWORD dwReserved
|
|
);
|
|
|
|
|
|
HRESULT CreatePackage(
|
|
[in] PPACKAGEID pPackageid,
|
|
[in] PACKAGE_FLAGS PackageFlags,
|
|
[in] PACKAGECOOKIE packageCookie,
|
|
// return info - the new package
|
|
[in] ULONG cPackages,
|
|
[out] PPACKAGE pPackage,
|
|
[in] DWORD dwReserved
|
|
|
|
);
|
|
|
|
HRESULT RevokePackage(
|
|
[in] PPACKAGECOOKIE ppackageCookie,
|
|
[in] DWORD dwMode
|
|
);
|
|
|
|
HRESULT GetEnumPackage(
|
|
[out] LPENUMPACKAGE pEnumPackage
|
|
);
|
|
|
|
}
|
|
cpp_quote("#endif")
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Copyright (C) Microsoft Corporation, 1995 - 1996.
|
|
//
|
|
// Contents: IPackageObjFilter interface definition
|
|
//
|
|
// Description: Not done yet!
|
|
//
|
|
// Used to filter anouncment of mc protocols.
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
cpp_quote("#ifndef _LPPACKAGEOBJFILTER_DEFINED")
|
|
cpp_quote("#define _LPPACKAGEOBJFILTER_DEFINED")
|
|
|
|
[
|
|
local,
|
|
object,
|
|
uuid(79eacbe7-baf9-11ce-8c82-00aa004ba90b),
|
|
pointer_default(unique)
|
|
]
|
|
|
|
interface IPackageObjFilter : IUnknown
|
|
{
|
|
typedef [unique] IPackageObjFilter *LPPACKAGEOBJFILTER;
|
|
|
|
typedef struct _tagAnouncmentData
|
|
{
|
|
ULONG cbSize;
|
|
// more info about category etc.
|
|
DWORD dwCategory;
|
|
LPWSTR pwzFriendlyName;
|
|
LPCWSTR pwzUrl;
|
|
|
|
} ANOUNCMENTDATA, *LPANOUNCMENTDATA;
|
|
|
|
|
|
HRESULT Anouncment(
|
|
[in] ANOUNCMENTDATA *pAnouncementData,
|
|
[in] DWORD dwReserved
|
|
);
|
|
}
|
|
cpp_quote("#endif")
|
|
|
|
|
|
|