public List <ListItemCreator> GetListItems(ClientContext ctx, Web web, string listName)
        {
            List list = web.Lists.GetByTitle(listName);

            CamlQuery query = CamlQuery.CreateAllItemsQuery(2000);

            ListItemCollection items = list.GetItems(query);

            //{67df98f4-9dec-48ff-a553-29bece9c5bf4} is Attachments
            var attachmentsFieldId = Guid.Parse("{67df98f4-9dec-48ff-a553-29bece9c5bf4}");

            //ContentTypeId is hidden
            ctx.Load(list.Fields, fields => fields.Where(f => (!f.Hidden && !f.ReadOnlyField && f.Id != attachmentsFieldId) || f.InternalName == "ContentTypeId"));
            ctx.Load(items, itemCol => itemCol.Include(item => item.FieldValuesForEdit, item => item.FieldValuesAsText, item => item.FieldValuesAsHtml, item => item.ContentType));
            ctx.ExecuteQueryRetry();
            var listItems = new List <ListItemCreator>();

            var listItemCreatorBuilder = new ListItemCreatorBuilder(ctx, web, list);

            foreach (ListItem listItem in items)
            {
                var itemCreator = listItemCreatorBuilder.GetListItemCreator(listItem);
                listItems.Add(itemCreator);
            }
            return(listItems);
        }
Esempio n. 2
0
        private FoldersAndFileCreator GetFoldersAndFileCreatorFromSite(ClientContext ctx, Web web,
                                                                       string fileWebRelativeUrl, string downloadFolderPath, bool getRelatedFileCreators,
                                                                       AppManifestBase appManifest)
        {
            OnVerboseNotify("Getting file from site " + fileWebRelativeUrl);

            var retVal = new FoldersAndFileCreator
            {
                Folders      = new List <string>(),
                FileCreators = new Dictionary <string, FileCreator>()
            };

            if (!fileWebRelativeUrl.StartsWith("/"))
            {
                fileWebRelativeUrl = "/" + fileWebRelativeUrl;
            }

            var parts      = fileWebRelativeUrl.Split('/');
            var lastFolder = string.Empty;

            for (var i = 1; i < parts.Length - 1; i++)
            {
                lastFolder = lastFolder + "/" + parts[i];
                retVal.Folders.Add(lastFolder);
            }

            ctx.Load(web, w => w.ServerRelativeUrl);
            ctx.ExecuteQueryRetry();

            var fileUrl = fileWebRelativeUrl;

            if (web.ServerRelativeUrl != "/")
            {
                fileUrl = web.ServerRelativeUrl + fileWebRelativeUrl;
            }

            //Get the file
            var file = web.GetFileByServerRelativeUrl(fileUrl);

            ctx.Load(file, f => f.Exists);
            ctx.ExecuteQueryRetry();

            if (file.Exists)
            {
                OnVerboseNotify("Got file from site " + fileWebRelativeUrl);

                //Try to load the list items, if the list doesn't exist, ie. it's a folder there will be an exception
                ctx.Load(file, f => f.ListItemAllFields);
                ctx.Load(file.ListItemAllFields, l => l.ParentList, l => l.HasUniqueRoleAssignments,
                         l => l.FieldValuesForEdit, l => l.ContentType);

                var couldGetListItem = false;
                try
                {
                    ctx.ExecuteQueryRetry();
                    couldGetListItem = file.ListItemAllFields.ServerObjectIsNull != null &&
                                       !(bool)file.ListItemAllFields.ServerObjectIsNull;
                }
                catch
                {
                    // ignored
                }

                var fileName = parts[parts.Length - 1];

                retVal.FileCreators.Add(fileWebRelativeUrl, new FileCreator
                {
                    Name           = fileName,
                    ForceOverwrite = true,
                    Url            = fileWebRelativeUrl
                });

                var newFileCreator = retVal.FileCreators[fileWebRelativeUrl];

                newFileCreator.RelativeFilePath = fileWebRelativeUrl.Replace(@"/", @"\");

                if (couldGetListItem && file.ListItemAllFields.FieldValues.Count > 0)
                {
                    newFileCreator.List = file.ListItemAllFields.ParentList.Title;
                    AnalyzeSecurityConfiguration(newFileCreator, file.ListItemAllFields, ctx);

                    var listItemCreatorBuilder = new ListItemCreatorBuilder(ctx, web, file.ListItemAllFields.ParentList);

                    newFileCreator.ListItemFieldValues = listItemCreatorBuilder.GetListItemCreator(file.ListItemAllFields).FieldValues;

                    //Some item types have a list value, but a server null content type, such as dwp files
                    if (file.ListItemAllFields.ContentType.ServerObjectIsNull != true)
                    {
                        newFileCreator.ContentType   = file.ListItemAllFields.ContentType.Name;
                        newFileCreator.ContentTypeId = file.ListItemAllFields.ContentType.StringId;

                        if (newFileCreator.ContentTypeId.StartsWith(WikiPageContentTypeId) || newFileCreator.ContentTypeId.StartsWith(PublishingPageContentTypeId))
                        {
                            var contentFieldName = newFileCreator.ContentTypeId.StartsWith(WikiPageContentTypeId) ? WikiPageContentFieldName : PublishingPageContentFieldName;
                            ProcessWikiOrPublishingPage(ctx, web, fileUrl, file, contentFieldName, newFileCreator);

                            if (getRelatedFileCreators)
                            {
                                var contentField = file.ListItemAllFields[contentFieldName]?.ToString() ?? string.Empty;
                                GetRelatedFileCreators(ctx, web, appManifest, downloadFolderPath, contentField);
                            }

                            newFileCreator.IsHomePage = IsHomePage(ctx, fileUrl);

                            //Wiki pages don't get downloaded, they are created from a template
                            return(retVal);
                        }
                        //0x010107 is declarative workflow document
                        if (file.ListItemAllFields.ContentType.Id.StringValue.StartsWith(DeclarativeWorkflowDocumentContentTypeId))
                        {
                            DownloadWorkflowFile(ctx, web, downloadFolderPath, fileUrl, newFileCreator, appManifest);
                            newFileCreator.ContentType = "Workflow";
                            return(retVal);
                        }
                    }
                }
                if (fileName.ToLowerInvariant().EndsWith(".aspx"))
                {
                    var listIds = GetWebListIds(ctx, web);
                    ProcessWebPartPage(ctx, web, fileUrl, file, newFileCreator, listIds);
                    DownloadAspxFile(ctx, downloadFolderPath, fileUrl, newFileCreator, listIds, appManifest);
                    if (newFileCreator.WebParts != null && newFileCreator.WebParts.Count > 0)
                    {
                        newFileCreator.ContentType = "Web Part Page";
                    }
                    newFileCreator.IsHomePage = IsHomePage(ctx, newFileCreator.Url);
                }
                else
                {
                    var listIds = GetWebListIds(ctx, web);
                    DownloadFile(ctx, downloadFolderPath, fileUrl, newFileCreator, listIds, appManifest);
                }
            }

            return(retVal);
        }