with Cmvc_Implementation;
with Directory_Tools;
with Action, System_Utilities;
function Check_Out_Ok (What_Object : String) return Boolean is

    package Ci renames Cmvc_Implementation;
    package Dt renames Directory_Tools;
    package Traversal renames Dt.Traversal;
    package Object renames Dt.Object;
    package Naming renames Dt.Naming;

    Obj : Directory_Tools.Object.Handle := Dt.Naming.Resolution (What_Object);
    Version_Set : Ci.Version_Set;
    Config : Ci.Configuration;
    Element : Ci.Element;
    Db : Ci.Database;
    Status : Ci.Error_Status;
    View : Object.Handle;
    Subsystem : Object.Handle;
    Is_Out : Boolean := False;
begin

    if not Object.Is_Bad (Obj) then
        View := Traversal.Enclosing_World (Obj);
        Subsystem := Traversal.Parent (View);
        Ci.Database_Operations.Open
           (Naming.Full_Name (Subsystem) & ".state.cmvc_database",
            Action.Null_Id, Db, Status);
        if Status = 0 then
            Ci.Configuration_Operations.Open
               (Naming.Simple_Name (View), Config, Status, Db);
            if Status = 0 then
                if Dt.Ada_Object.Is_Visible_Part (Obj) then
                    Ci.Element_Operations.Open
                       ("units." & Naming.Simple_Name (Obj) & "'spec",
                        Element, Status, Db);
                else
                    Ci.Element_Operations.Open
                       ("units." & Naming.Simple_Name (Obj) & "'body",
                        Element, Status, Db);
                end if;
                if Status = 0 then
                    Ci.Version_Set_Operations.Open
                       (Element, Version_Set, Status, Config);
                    if Status = 0 then
                        Is_Out := Ci.History_Operations.Is_Checked_Out
                                     (Version_Set) and
                                  Ci.History_Operations.Who_Checked_Out
                                     (Version_Set) = System_Utilities.User_Name;
                    end if;
                end if;
            end if;
            Ci.Database_Operations.Close
               (Db => Db, Status => Status, Prevent_Commit => False);
        end if;
    end if;
    return Is_Out;
end Check_Out_Ok;