void UpdateWsDocData(ref tagWSDOCUMENT wsDoc, WdDocument wdDoc)
 {
     Logger.LogTrace(string.Format("Update Ws local data from wdDocument. {0}", wdDoc.AsString()));
     wsDoc.bstrDocumentID = WsDocumentID.Create(wdDoc.DocId, wdDoc.VersionNumber);
     wsDoc.bstrDescription = wdDoc.FIleName;
     wsDoc.bstrExtension = wdDoc.Ext;
     wsDoc.bstrType = FileUtils.GetFileTypeFromExt(wdDoc.Ext);
     wsDoc.dModifiedTime = wdDoc.ModifiedTime;
     wsDoc.bstrAuthor = wdDoc.Author;
     wsDoc.bstrClass = wdDoc.SecurityClassName;
     wsDoc.bstrOperator = wdDoc.Operator;
 }
        public WdDocument GetByPath(int sessionhandle, string path)
        {
            Logger.LogTrace(string.Format("Try to get file from WD. SessionHandle={0}. Path={1}", sessionhandle, path));
            var sbDocId = new StringBuilder(MAX_STR);
            var sbrealName = new StringBuilder(MAX_STR);
            var sbExt = new StringBuilder(MAX_STR);
            var sbFilePath = new StringBuilder(MAX_STR);
            var sbVersionNumber = new StringBuilder(MAX_STR);
            var sbUpdated = new StringBuilder(MAX_STR);
            var sbOwner = new StringBuilder(MAX_STR);
            var sbClassName = new StringBuilder(MAX_STR);
            var sbprofileName = new StringBuilder(MAX_STR);
            var res = 0;

            foreach (var p in new[] 
                      {
                new Tuple<int, StringBuilder, bool>(WORLDOX.WDAPI_GF_FILE_FILENAME, sbDocId, true),
                new Tuple<int, StringBuilder, bool>(WORLDOX.WDAPI_GF_FILE_EXTENSION, sbExt, true),
                new Tuple<int, StringBuilder, bool>(WORLDOX.WDAPI_GF_FILE_XNAME, sbrealName, false),
                new Tuple<int, StringBuilder, bool>(WORLDOX.WDAPI_GF_FILE_PATHFILE, sbFilePath, true),
                new Tuple<int, StringBuilder, bool>(WORLDOX.WDAPI_GF_FILE_VERSION, sbVersionNumber, true),
                new Tuple<int, StringBuilder, bool>(WORLDOX.WDAPI_GF_FILE_OWNER, sbOwner, false),
                new Tuple<int, StringBuilder, bool>(WORLDOX.WDAPI_GF_FILE_UPDATED, sbUpdated, false),
                new Tuple<int, StringBuilder, bool>(WORLDOX.WDAPI_GF_FILE_CLASSNAME, sbClassName, false),
                new Tuple<int, StringBuilder, bool>(WORLDOX.WDAPI_GF_FILE_GROUP, sbprofileName, false),
            })
            {
                res = _wdApi.WDAPI_GetProfileField(path, null, res, p.Item1, p.Item2, p.Item2.Capacity);
                if (res == 0)
                {
                    if (p.Item3) //cannot get field and field is critical
                    {
                        throw new WdFileNotFoundException(path,
                            string.Format("GetProfileField|Cannot get Field={0} for Document={1}", p.Item1, path), res, "WDAPI_GetProfileField");
                    }
                    else
                    {
                        Logger.LogError(string.Format("Cannot get Field={0} for Document={1}. ErrorCode={2}. Field Skipped as not important.", p.Item1,
                            path, res));
                    }
 
                }
                
            }
            var sVersionNumber = sbVersionNumber.ToString();
            DateTime dtUpdated;
            if (!DateTime.TryParse(sbUpdated.ToString(), out dtUpdated))
            {
                dtUpdated = DateTime.MinValue;
                Logger.LogError(string.Format("Cannot parse datetime = {0}", sbUpdated.ToString()));
            }

            bool isLocked = false;
            bool isLockedByCurrentUser = true;

            IsCheckedOut(sessionhandle, sbDocId.ToString(),out isLocked, out isLockedByCurrentUser);

            var result= new WdDocument
            {
                DocId = sbDocId.ToString(),
                FIleName = sbrealName.ToString(),
                LocalFilePath = sbFilePath.ToString(),
                VersionNumber = string.IsNullOrEmpty(sVersionNumber) ? LATEST_VERSION : Convert.ToInt32(sVersionNumber),
                Ext = sbExt.ToString().Trim('.'),
                IsLocked = isLocked,
                IsLockedByCurrentUser = isLockedByCurrentUser,
                Owner = sbOwner.ToString(),
                ModifiedTime = dtUpdated,
                Author = sbOwner.ToString(),
                SecurityClassName=sbClassName.ToString(),
                FromLFS = string.Equals(sbprofileName.ToString().ToLowerInvariant(), "<no profile>"),
                Operator = "Operator"
            };

            Logger.LogTrace(string.Format("Found document : {0}", result.AsString()));

            return result;
        }