static public List <SalesforceFileProxy> UnzipPackageFilesRecursive(byte[] zip)
        {
            List <SalesforceFileProxy> sffp = new List <SalesforceFileProxy>();

            foreach (ZipEntry zipEntry in ZipFile.Read((Stream) new MemoryStream(zip)))
            {
                byte[] numArray = new byte[zipEntry.UncompressedSize];
                zipEntry.OpenReader().Read(numArray, 0, numArray.Length);
                SalesforceFileProxy projectFileEntity = new SalesforceFileProxy()
                {
                    BinaryBody = numArray,
                    FileBody   = Encoding.UTF8.GetString(numArray),
                    FileName   = zipEntry.FileName
                };
                sffp.Add(projectFileEntity);

                if (IsZipFile(numArray))
                {
                    List <SalesforceFileProxy> zipList = UnzipStaticResource(numArray, zipEntry.FileName.RemoveExtension());
                    if (zipList.Count > 0)
                    {
                        projectFileEntity.Type = "StaticResourceZip";
                        zipList.AddRange(zipList);
                    }
                    sffp.AddRange(zipList);
                }
            }
            return(sffp);
        }
        static public List <SalesforceFileProxy> UnzipStaticResource(byte[] bytes, string fileName)
        {
            List <SalesforceFileProxy> list = new List <SalesforceFileProxy>();
            ZipFile zipFile = ZipFile.Read((Stream) new MemoryStream(bytes));

            if (zipFile.Count == 0)
            {
                return(list);
            }
            foreach (ZipEntry zipEntry in zipFile)
            {
                byte[] buffer = new byte[zipEntry.UncompressedSize];
                if (!zipEntry.IsDirectory)
                {
                    zipEntry.OpenReader().Read(buffer, 0, buffer.Length);
                    string str = Path.Combine(fileName, zipEntry.FileName).ReplaceUnixDirectorySeparator().ReplaceWebSeparator();
                    SalesforceFileProxy projectFileEntity = new SalesforceFileProxy()
                    {
                        BinaryBody       = buffer,
                        FileName         = str,
                        ResourceFileName = fileName,
                        Type             = "StaticResourceZipItem",
                        PathInResource   = str
                    };
                    list.Add(projectFileEntity);
                }
            }
            return(list);
        }
        static public List <SalesforceFileProxy> UnzipPackageFiles(byte[] zip)
        {
            List <SalesforceFileProxy> list = new List <SalesforceFileProxy>();

            foreach (ZipEntry zipEntry in ZipFile.Read(new MemoryStream(zip)))
            {
                byte[] numArray = new byte[zipEntry.UncompressedSize];
                zipEntry.OpenReader().Read(numArray, 0, numArray.Length);
                SalesforceFileProxy fileProxy = new SalesforceFileProxy()
                {
                    BinaryBody = numArray,
                    FileBody   = Encoding.UTF8.GetString(numArray),
                    FileName   = zipEntry.FileName
                };
                list.Add(fileProxy);
            }
            return(list);
        }
        //private string CreateMetadataContainer()
        //{
        //    return SessionExpirationWrapper(() => _toolingServiceAdapter.Create(new sObject[1]
        //    {
        //        (sObject) new MetadataContainer()
        //        {
        //            Name = Guid.NewGuid().ToString().Substring(0, 32)
        //        }
        //    }))[0].id;
        //}

        //public ContainerAsyncRequest[] CompileApexMetadataContainer(string metadataContainerId, bool noDeploy, string classMemberId = null, IIncrementalSleepPolicy sleepPolicy = null)
        //{
        //    if (sleepPolicy == null)
        //        sleepPolicy = new FixedSleepPolicy();

        //    ContainerAsyncRequest[] compileRequest = { new ContainerAsyncRequest()
        //    {
        //        MetadataContainerId = metadataContainerId,
        //        MetadataContainerMemberId = classMemberId,
        //        IsCheckOnly = noDeploy,
        //        IsCheckOnlySpecified = true
        //    }};

        //    SaveResult[] createCompileResult = SessionExpirationWrapper(() => _toolingServiceAdapter.Create(new sObject[] {compileRequest[0]}));

        //    ContainerAsyncRequest[] containerAsyncRequestArray = TimeoutRunner.RunUntil(() => Compile(createCompileResult), x => x[0].State != "Queued", sleepPolicy, "compiling");
        //    if (containerAsyncRequestArray != null)
        //        return containerAsyncRequestArray;

        //    compileRequest[0] = new ContainerAsyncRequest()
        //    {
        //        MetadataContainerId = metadataContainerId,
        //        MetadataContainerMemberId = classMemberId,
        //        State = "Aborted"
        //    };

        //    SessionExpirationWrapper(() => _toolingServiceAdapter.Create(new sObject[1]
        //    {
        //        compileRequest[0]
        //    }));

        //    throw new BuildAbortedTimeoutException("Time of the request to Salesforce expired. Build aborted.");
        //}

        //private ContainerAsyncRequest[] Compile(SaveResult[] createCompileResult)
        //{
        //    return SessionExpirationWrapper(() => _toolingServiceAdapter.Retrieve("Id, ErrorMsg, CompilerErrors, State", "ContainerAsyncRequest", new string[1]
        //    {
        //        createCompileResult[0].id
        //    }).OfType<ContainerAsyncRequest>().ToArray());
        //}

        //public OperationResult BuildFiles(IEnumerable<ICompilableItem> changedFiles)
        //{
        //    OperationResult operationResult = new OperationResult();
        //    string metadataContainer = this.CreateMetadataContainer();
        //    List<sObject> objects = new List<sObject>();
        //    var compilableItems = changedFiles as IList<ICompilableItem> ?? changedFiles.ToList();

        //    objects.AddRange(GetApexMembers<ApexClassMember>(compilableItems, metadataContainer));
        //    objects.AddRange(GetApexMembers<ApexComponentMember>(compilableItems, metadataContainer));
        //    objects.AddRange(GetApexMembers<ApexTriggerMember>(compilableItems, metadataContainer));
        //    objects.AddRange(GetApexMembers<ApexPageMember>(compilableItems, metadataContainer));


        //    List<SaveResult> saveList = new List<SaveResult>();
        //    if (objects.Count > 0)
        //    {
        //        saveList.AddRange(SessionExpirationWrapper(() => _toolingServiceAdapter.Create(objects.ToArray())));
        //    }

        //    if (saveList.Any(o => o.errors != null))
        //    {
        //        foreach (var saveResult in saveList)
        //        {
        //            if (saveResult.errors != null)
        //            {
        //                List<ErrorDescriptor> errorList = saveResult.errors.Select(e => new ErrorDescriptor()
        //                    {
        //                        Id = e.statusCode.ToString(),
        //                        Name = e.message,
        //                        Problem = e.fields == null ? string.Empty : string.Join(";", e.fields)
        //                    }).ToList();
        //                operationResult.Errors.AddRange(errorList);
        //            }

        //        }
        //    }

        //    ContainerAsyncRequest[] containerAsyncRequestArray = CompileApexMetadataContainer(metadataContainer, false, null);

        //    if (containerAsyncRequestArray.Any(o => o.DeployDetails.componentFailures.Any()))
        //    {
        //        operationResult.Errors.AddRange(containerAsyncRequestArray.SelectMany(sm => sm.DeployDetails.componentFailures)
        //                                                    .Select(s => new ErrorDescriptor
        //                                                    {
        //                                                        Name = s.fullName,
        //                                                        Id = s.id,
        //                                                        Line = s.lineNumber.ToString(),
        //                                                        Problem = s.problem,
        //                                                        ProblemType = s.problemType
        //                                                    }));
        //    }

        //    return operationResult;
        //}

        private static SalesforceFileProxy FileFactory(dynamic sforceObject, string type)
        {
            SalesforceFileProxy salesFileEntity = new SalesforceFileProxy
            {
                CreatedByName   = sforceObject.CreatedById,
                Id              = sforceObject.Id,
                NamespacePrefix = sforceObject.NamespacePrefix,
                Type            = type
            };


            if (sforceObject.CreatedDate != null)
            {
                salesFileEntity.CreatedDateUtcTicks = sforceObject.CreatedDate.ToFileTimeUtc().ToString();
            }

            if (sforceObject.LastModifiedDate != null)
            {
                salesFileEntity.LastModifiedDateUtcTicks = sforceObject.LastModifiedDate.ToFileTimeUtc().ToString();
            }

            try
            {
                if (DynamicExtensions.IsPropertyExist(sforceObject, "Body"))
                {
                    salesFileEntity.FileBody = sforceObject.Body;
                }

                if (DynamicExtensions.IsPropertyExist(sforceObject, "Name"))
                {
                    salesFileEntity.FileName = sforceObject.Name;
                }
            }
            catch
            {
                // ignored
            }
            return(salesFileEntity);
        }
 public OperationResult CreateNewSalesForceFile(SalesforceFileProxy entity)
 {
     throw new NotImplementedException();
 }