private bool AddDirectoryEx(DvMediaContainer container, DirectoryInfo directory)
        {
            if (directory.Exists == false) return false;

            MediaBuilder.storageFolder storageInfo = new MediaBuilder.storageFolder(directory.Name);
            storageInfo.Searchable = true;
            storageInfo.IsRestricted = false;
            DvMediaContainer newContainer = DvMediaBuilder.CreateContainer(storageInfo);
            newContainer.OnChildrenRemoved += new DvDelegates.Delegate_OnChildrenRemove(this.Sink_OnChildRemoved);
            newContainer.Callback_UpdateMetadata = new DvMediaContainer.Delegate_UpdateMetadata(this.Sink_UpdateContainerMetadata);

            InnerMediaDirectory mediadir = new InnerMediaDirectory();
            mediadir.directory = directory;
            mediadir.directoryname = directory.FullName;
            mediadir.watcher = new FileSystemWatcher(directory.FullName);
            mediadir.watcher.Changed += new FileSystemEventHandler(OnDirectoryChangedSink);
            mediadir.watcher.Created += new FileSystemEventHandler(OnDirectoryCreatedSink);
            mediadir.watcher.Deleted += new FileSystemEventHandler(OnDirectoryDeletedSink);
            mediadir.watcher.Renamed += new RenamedEventHandler(OnFileSystemRenameSink);
            mediadir.restricted = true;
            mediadir.readOnly = true;

            watcherTable.Add(mediadir.watcher,newContainer);
            mediadir.watcher.EnableRaisingEvents = true;

            newContainer.Tag = mediadir;

            FileInfo[] files = directory.GetFiles();
            ArrayList addedFiles = new ArrayList(files.Length);
            foreach (FileInfo file in files)
            {
                IDvMedia newObj = CreateObjFromFile(file, new ArrayList());
                if (newObj != null)
                {
                    addedFiles.Add(newObj);
                    totalFileCount++;
                }
            }

            newContainer.AddObjects(addedFiles, true);

            // Add the new container to an existing container.
            container.AddObject(newContainer, true);

            foreach (IDvMedia item in addedFiles)
            {
                if (item.Class.IsA(MediaBuilder.StandardMediaClasses.AudioItem))
                {
                    this.m_AudioItems.AddReference((DvMediaItem)item);
                }
                else if (item.Class.IsA(MediaBuilder.StandardMediaClasses.ImageItem))
                {
                    this.m_ImageItems.AddReference((DvMediaItem)item);
                }
                else if (item.Class.IsA(MediaBuilder.StandardMediaClasses.VideoItem))
                {
                    this.m_VideoItems.AddReference((DvMediaItem)item);
                }
                else if (item.Class.IsA(MediaBuilder.StandardMediaClasses.PlaylistContainer))
                {
                    // References to playlists are not allowed, so we have to build
                    // completely new instances of the container and its resources.
                    // However the new container can have references to the items.
                    DvMediaContainer originalC = (DvMediaContainer) item;

                    MediaBuilder.playlistContainer plcInfo = new MediaBuilder.playlistContainer(originalC.Title);
                    DvMediaContainer newC = DvMediaBuilder.CreateContainer(plcInfo);

                    foreach (DvMediaResource res in originalC.Resources)
                    {
                        ResourceBuilder.AllResourceAttributes resAttribs = new ResourceBuilder.AllResourceAttributes();
                        resAttribs.contentUri = res.ContentUri;
                        foreach (string attribute in res.ValidAttributes)
                        {
                            object obj = res[attribute];
                            _RESATTRIB attribName = (_RESATTRIB) Enum.Parse(typeof(_RESATTRIB), attribute, true);

                            switch (attribName)
                            {
                                case _RESATTRIB.bitrate:
                                    resAttribs.bitrate = (_UInt) obj;
                                    break;
                                case _RESATTRIB.bitsPerSample:
                                    resAttribs.bitsPerSample = (_UInt) obj;
                                    break;
                                case _RESATTRIB.colorDepth:
                                    resAttribs.colorDepth = (_UInt) obj;
                                    break;
                                case _RESATTRIB.duration:
                                    resAttribs.duration = (_TimeSpan) obj;
                                    break;
                                case _RESATTRIB.importUri:
                                    //do not allow import
                                    break;
                                case _RESATTRIB.nrAudioChannels:
                                    resAttribs.nrAudioChannels = (_UInt) obj;
                                    break;
                                case _RESATTRIB.protection:
                                    resAttribs.protection = (string) obj;
                                    break;
                                case _RESATTRIB.protocolInfo:
                                    resAttribs.protocolInfo = new ProtocolInfoString(((ProtocolInfoString)obj).ToString());
                                    break;
                                case _RESATTRIB.resolution:
                                    resAttribs.resolution = (ImageDimensions) obj;
                                    break;
                                case _RESATTRIB.sampleFrequency:
                                    resAttribs.sampleFrequency = (_UInt) obj;
                                    break;
                                case _RESATTRIB.size:
                                    resAttribs.size = (_ULong) obj;
                                    break;
                            }
                        }
                        DvMediaResource newCR = DvResourceBuilder.CreateResource(resAttribs, false);
                        newCR.AllowImport = res.AllowImport;
                        newCR.CheckAutomapFileExists = res.CheckAutomapFileExists;
                        newCR.HideContentUri = res.HideContentUri;
                        newCR.MakeStreamAtHttpGetTime = res.MakeStreamAtHttpGetTime;
                        newCR.Tag = res.Tag;

                        newC.AddResource(newCR);
                    }

                    // The child container should only have items.
                    // If the child-container has child containers, then
                    // then this is bad because those child playlists
                    // should have been converted to a flat list
                    // in the recursive building of the hierarchy
                    foreach (DvMediaItem childItem in originalC.CompleteList)
                    {
                        newC.AddReference(childItem);
                    }

                    this.m_Playlists.AddObject(newC, true);
                }
            }

            DirectoryInfo[] directories = directory.GetDirectories();
            foreach (DirectoryInfo dir in directories)
            {
                AddDirectoryEx(newContainer,dir);
            }

            totalDirectoryCount++;
            if (OnStatsChanged != null) OnStatsChanged(this);
            return true;
        }
        private DvMediaResource BuildM3uResource(FileInfo file, string protInfo)
        {
            ResourceBuilder.AllResourceAttributes resInfo = new ResourceBuilder.AllResourceAttributes();
            resInfo.contentUri = MediaResource.AUTOMAPFILE + file.FullName + "?format=m3u";
            resInfo.protocolInfo = new ProtocolInfoString(protInfo);
            DvMediaResource newRes = DvResourceBuilder.CreateResource(resInfo, true);
            newRes.AllowImport = false;
            newRes.MakeStreamAtHttpGetTime = true;
            newRes.Tag = file;

            return newRes;
        }
        private DvMediaItem CreateItemFromGenericVideoFile(FileInfo file)
        {
            string mime, mediaClass;
            MimeTypes.ExtensionToMimeType(file.Extension, out mime, out mediaClass);

            string protInfo = new System.Text.StringBuilder().AppendFormat("http-get:*:{0}:*", mime).ToString();
            string title = Path.GetFileNameWithoutExtension(file.Name);
            string creator = file.Directory.Name;

            string genre = null;
            string album = null;
            long duration = 0;
            int bitrate = 0;
            long fileSize = file.Length;

            /*
            if ((file.Extension.ToUpper() == ".WMV") || (file.Extension.ToUpper() == ".ASF"))
            {
                MetadataParser.CMediaMetadataClass mp = new MetadataParser.CMediaMetadataClass();
                mp.ParseMetadata_WindowsMediaPlayerFriendly(file.FullName, out title, out creator, out album, out genre, out duration, out bitrate, out fileSize);
            }
            */

            if ((title == null) || (title == ""))
            {
                title = Path.GetFileNameWithoutExtension(file.Name);
                creator = file.Directory.Name;
            }

            MediaBuilder.videoItem info = new MediaBuilder.videoItem(title);
            info.creator = creator;
            if (genre != null)
            {
                info.genre = new string[1];
                info.genre[0] = genre;
            }
            DvMediaItem newMedia = DvMediaBuilder.CreateItem(info);

            //DvMediaResource res = DvResourceBuilder.CreateResource_HttpGet(file,false);
            ResourceBuilder.AllResourceAttributes resInfo = new ResourceBuilder.AllResourceAttributes();
            resInfo.contentUri = DvMediaResource.AUTOMAPFILE + file.FullName;
            resInfo.protocolInfo = new ProtocolInfoString(protInfo);
            resInfo.size = new _ULong((ulong)fileSize);
            if (bitrate > 0)
            {
                resInfo.bitrate = new _UInt((uint)bitrate/8);
            }
            if (duration > 0)
            {
                resInfo.duration = new _TimeSpan(new TimeSpan(duration));
            }
            DvMediaResource res = DvResourceBuilder.CreateResource(resInfo, true);
            res.Tag = file;

            newMedia.AddResource(res);

            return newMedia;
        }