//****************************************************************************
//
//  Module:     mmsys.cpl
//  File:       subobj.h
//  Content:    This file contains the subobject (our own object)
//              storage space and manipulation mechanisms.
//
//  History:
//  06/94	VijR      Created
//
//  Copyright (c) Microsoft Corporation 1991-1994
//
//****************************************************************************

#ifndef _SUBOBJ_H_
#define _SUBOBJ_H_

// This structure is used as the LPITEMIDLIST that
// the shell uses to identify objects in a folder.  The
// first two bytes are required to indicate the size,
// the rest of the data is opaque to the shell.
typedef struct _SUBOBJ
    {
    USHORT  cbSize;             // Size of this struct
    UINT    uFlags;             // One of SOF_ values
	short nIconIndex;
	short iSort;
	short iOffsetIconFile;
	short iOffsetDesc;
	short iOffsetClass;
	short iOffsetExtPropFile;
	short iOffsetExtPropFunc;
	short iOffsetExtCLSID;
	short iOffsetPlayCmdLn;
	short iOffsetOpenCmdLn;
	short iOffsetNewCmdLn;
	HICON	hClassIcon;
    struct _SUBOBJ FAR * psoNext;
    TCHAR    szName[1];          // Display name
    } SUBOBJ, FAR * PSUBOBJ;


//  LPCTSTR Subobj_GetName(PSUBOBJ pso);
//
//   Gets the subobject name.
//
#define Subobj_GetName(pso)     ((pso)->szName)

//  UINT Subobj_GetFlags(PSUBOBJ pso);
//
//   Gets the subobject flags.
//
#define Subobj_GetFlags(pso)     ((pso)->uFlags)


//  int Subobj_GetIconIndex(PSUBOBJ pso);
//
//   Gets the subobject icon.
//
#define Subobj_GetIconIndex(pso)     ((pso)->nIconIndex)

//  LPTSTR Subobj_GetIconFile(PSUBOBJ pso);
//
//   Gets the subobject icon Index in file.
//
#define Subobj_GetIconFile(pso)     ((LPTSTR)((pso)->szName + (pso)->iOffsetIconFile))

//  LPTSTR Subobj_GetDesc(PSUBOBJ pso);
//
//   Gets the subobject IconFile name.
//
#define Subobj_GetDesc(pso)     ((LPTSTR)((pso)->szName + (pso)->iOffsetDesc))

//  LPTSTR Subobj_GetClass(PSUBOBJ pso);
//
//   Gets the subobject Clas Name
//
#define Subobj_GetClass(pso)     ((LPTSTR)((pso)->szName + (pso)->iOffsetClass))

//  int Subobj_GetSortIndex(PSUBOBJ pso);
//
//   Gets the subobject Sort order.
//
#define Subobj_GetSortIndex(pso)     ((pso)->iSort)

//  HICON Subobj_GetClassIcon(PSUBOBJ pso);
//
//   Gets the subobject Object Icon.
//
#define Subobj_GetClassIcon(pso)     ((pso)->hClassIcon)

//  LPTSTR Subobj_GetExtPropFile(PSUBOBJ pso);
//
//   Gets the subobject External Class File.
//
#define Subobj_GetExtPropFile(pso)    ((LPTSTR)((pso)->szName + (pso)->iOffsetExtPropFile))

//  LPTSTR Subobj_GetExtPropFunc(PSUBOBJ pso);
//
//   Gets the subobject External Class Func.
//
#define Subobj_GetExtPropFunc(pso)    ((LPTSTR)((pso)->szName + (pso)->iOffsetExtPropFunc))

//  LPTSTR Subobj_GetExtCLSID(PSUBOBJ pso);
//
//   Gets the subobject external CLSID.
//
#define Subobj_GetExtCLSID(pso)    ((LPTSTR)((pso)->szName + (pso)->iOffsetExtCLSID))

//  LPTSTR Subobj_GetPlayCmdLn(PSUBOBJ pso);
//
//   Gets the subobject command line
//
#define Subobj_GetPlayCmdLn(pso)    ((LPTSTR)((pso)->szName + (pso)->iOffsetPlayCmdLn))

//  LPTSTR Subobj_GetOpenCmdLn(PSUBOBJ pso);
//
//   Gets the subobject command line
//
#define Subobj_GetOpenCmdLn(pso)    ((LPTSTR)((pso)->szName + (pso)->iOffsetOpenCmdLn))

//  LPTSTR Subobj_GetNewCmdLn(PSUBOBJ pso);
//
//   Gets the subobject command line.
//
#define Subobj_GetNewCmdLn(pso)    ((LPTSTR)((pso)->szName + (pso)->iOffsetNewCmdLn))

// Some other Subobj functions...
//
BOOL    PUBLIC Subobj_New(PSUBOBJ FAR * ppso, LPCTSTR pszClass, LPCTSTR pszName, 	LPCTSTR pszDesc, LPCTSTR pszIconFile, 	LPCTSTR pszExtPropFile, 
							LPCTSTR pszExtPropFunc,LPCTSTR pszExtCLSID, LPCTSTR pszPlayCmdLn, LPCTSTR pszOpenCmdLn,
							LPCTSTR pszNewCmdLn,short nIconIndex, UINT uFlags, short iSort);
void    PUBLIC Subobj_Destroy(PSUBOBJ pso);
BOOL    PUBLIC Subobj_Dup(PSUBOBJ FAR * ppso, PSUBOBJ psoArgs);

#ifdef DEBUG

void PUBLIC Subobj_Dump(PSUBOBJ pso);

#endif

typedef struct _SUBOBJSPACE
    {
    PSUBOBJ     psoFirst;
    PSUBOBJ     psoLast;
    int         cItems;
	int			cRef;

    } SUBOBJSPACE, FAR * PSUBOBJSPACE;

//  PSUBOBJ Sos_FirstItem(void);
//
//   Returns the first object in the subobject space.  NULL if empty.
//
#define Sos_FirstItem(psos)         (psos->psoFirst)

//  PSUBOBJ Sos_NextItem(PSUBOBJ pso);
//
//   Returns the next object in the subobject space.  NULL if no more 
//   objects.
//
#define Sos_NextItem(pso)       (pso ? pso->psoNext : NULL)


// Other subobject space functions
//
PSUBOBJ PUBLIC Sos_FindItem(PSUBOBJSPACE psos, LPCTSTR pszName);
BOOL    PUBLIC Sos_AddItem(PSUBOBJSPACE psos, PSUBOBJ pso);
USHORT  PUBLIC Sos_GetMaxSize(PSUBOBJSPACE psos);
PSUBOBJ PUBLIC Sos_RemoveItem(PSUBOBJSPACE psos, LPCTSTR pszName);
void    PUBLIC Sos_Destroy(PSUBOBJSPACE psos);
int     PUBLIC Sos_FillFromRegistry(PSUBOBJSPACE psos, LPITEMIDLIST pidl);
BOOL    PUBLIC Sos_Init(PSUBOBJSPACE psos, LPITEMIDLIST pidl, BOOL fAdvancedFolder);
HRESULT PUBLIC Sos_AddRef(PSUBOBJSPACE psos, LPITEMIDLIST pidl, BOOL fAdvancedFolder);
void    PUBLIC Sos_Release(PSUBOBJSPACE psos);


#define SOF_ISFOLDER		0x0001
#define SOF_ISDROPTARGET	0x0002
#define SOF_CANDELETE		0x0004
#define SOF_HASEXTPROPSHEET	0x0008
#define SOF_ISEXTOBJECT		0x0010
#define SOF_DOESPLAY		0x0020
#define SOF_DOESOPEN		0x0040
#define SOF_DOESNEW			0x0080


#define SOUNDEVENTS TEXT("Sound Events")
#define WAVE		TEXT("Wave")
#define MIDI		TEXT("MIDI")
#define MIXER		TEXT("Mixer")
#define AUX			TEXT("Aux")
#define ACM			TEXT("ACM")
#define ICM			TEXT("ICM")
#define MCI			TEXT("MCI")
#define AUDIO		TEXT("Audio")
#define CDAUDIO		TEXT("CDAudio")
#define VIDEO		TEXT("Video")
#define VOICE		TEXT("Voice")
#define ADVANCEDFOLDER TEXT("Advanced Folder")

#ifdef DEBUG

void PUBLIC Sos_DumpList(void);

#endif

//extern SUBOBJSPACE g_sos;

//
// Other prototypes...
//

HRESULT PUBLIC mmseObj_CreateInstance(LPSHELLFOLDER psf, UINT cidl, BOOL fInAdvancedFolder, LPCITEMIDLIST FAR * ppidl, LPCITEMIDLIST pidlRoot, LPSHELLVIEW csv, REFIID riid, LPVOID FAR * ppvOut);
HRESULT NEAR PASCAL mmseView_Command(LPSHELLVIEW psv, HWND hwnd,  UINT uID);


LPTSTR   PUBLIC lmemset(LPTSTR dst, char val, UINT count);
LPTSTR   PUBLIC lmemmove(LPTSTR dst, LPTSTR src, int count);
int     PUBLIC AnsiToInt(LPCTSTR pszString);

int     PUBLIC DoModal (HWND hwndParent, DLGPROC lpfnDlgProc, UINT uID, LPARAM lParam);

HMENU   PUBLIC LoadPopupMenu(UINT id, UINT uSubOffset);
UINT    PUBLIC MergePopupMenu(HMENU FAR *phMenu, UINT idResource, UINT uSubOffset, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast);
HMENU   PUBLIC GetMenuFromID(HMENU hmMain, UINT uID);

#endif // _SUBOBJ_H_
