Example console specification fetcher application

This is a console application that connects to a P4 Server and returns P4 specific information based on user input of 2 words: specification type, specification name. It uses Connection.Login(password) for working with a server at security level 3. Lower security levels should also work and connecting with a user without a password can be done by passing a blank string for password. There is minimal error handling for failed P4 commands. Since -o is used, specifications that do not yet exist may be returned on entry of a non-existent specification name.

Create a new C# Console Application project and paste the following code into Program.cs:

Copy

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Perforce.P4;
namespace apiConsoleApplication
{
    class Program
    {
        static void Main()
        {
            string uri = "";
            string user = "";
            string workspace = "";
            string pass = "";

            bool exit = false;

            Server server = new Server(new ServerAddress(uri));
            Repository rep = new Repository(server);

            // establish a connection to a server
            while(rep.Connection.Status==ConnectionStatus.Disconnected)
            {
                // get user input for connection
                Console.WriteLine("port:");
                uri = Console.ReadLine();
                Console.WriteLine("");
                Console.WriteLine("user:");
                user = Console.ReadLine();
                Console.WriteLine("");
                Console.WriteLine("client:");
                workspace = Console.ReadLine();
                Console.WriteLine("");
                Console.WriteLine("password:");
                pass = Console.ReadLine();
                Console.WriteLine("");

                server = new Server(new ServerAddress(uri));
                rep = new Repository(server);
                Connection con = rep.Connection;
                con.UserName = user;
                con.Client = new Client();
                con.Client.Name = workspace;

                // connect
                bool connected = con.Connect(null);
                if (connected)
                {
                    try
                    {
                        // attempt a login
                        Credential cred = con.Login(pass);
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex.Message);
                        con.Disconnect();
                        continue;
                    }
                    // get p4 info and show successful connection
                    ServerMetaData info = rep.GetServerMetaData(null);
                    Console.WriteLine("CONNECTED TO " + info.Address.Uri);
                    Console.WriteLine("");
                }
                else
                {
                    // retry the prompt for connection info
                    continue;
                }
            }
            while(rep.Connection.Status==ConnectionStatus.Connected&&!(exit))
            {
                Options opts= new Options();
                opts["-o"] = null;
                string input = Console.ReadLine();
                exit = (input == "exit");
                string[] command = input.Split(' ');
                switch (command[0])
                {
                        // on user input of job <job name> get job
                        // and output to console
                    case "job":
                        try
                        {
                            Job job = rep.GetJob(command[1], opts);
                            Console.WriteLine("");
                            Console.WriteLine(job.ToString());
                            Console.WriteLine("");
                            break;
                        }
                        catch (Exception ex)
                        {
                            Console.WriteLine("");
                            Console.WriteLine(ex.Message);
                            Console.WriteLine("");
                            break;
                        }
 
                        // on user input of change <change number> get
                        // change and output to console
                    case "change":
                        try
                        {
                            opts = new Options();
                            int id = 0;
                            int.TryParse(command[1], out id);

                            Changelist change = rep.GetChangelist(id, opts);
                            Console.WriteLine("");
                            Console.WriteLine(change.ToString());
                            Console.WriteLine("");
                            break;
                        }
                        catch (Exception ex)
                        {
                            Console.WriteLine("");
                            Console.WriteLine(ex.Message);
                            Console.WriteLine("");
                            break;
                        }
 
                        // on user input of client <client name> get
                        // client and output to console
                    case "client":
                        try
                        {
                            Client client = rep.GetClient(command[1]);
                            Console.WriteLine("");
                            Console.WriteLine(client.ToString());
                            Console.WriteLine("");
                            break;
                        }
                        catch (Exception ex)
                        {
                            Console.WriteLine("");
                            Console.WriteLine(ex.Message);
                            Console.WriteLine("");
                            break;
                        }
 
                        // on user input of label <label name> get
                        // label and output to console
                    case "label":
                        try
                        {
                            Label label = rep.GetLabel(command[1]);
                            Console.WriteLine("");
                            Console.WriteLine(label.ToString());
                            Console.WriteLine("");
                            break;
                        }
                        catch (Exception ex)
                        {
                            Console.WriteLine("");
                            Console.WriteLine(ex.Message);
                            Console.WriteLine("");
                            break;
                        }
 
                        // on user input of stream <stream path>get
                        // stream and output to console
                    case "stream":
                        try
                        {
                            Stream stream = rep.GetStream(command[1]);
                            Console.WriteLine("");
                            Console.WriteLine(stream.ToString());
                            Console.WriteLine("");
                            break;
                        }
                        catch (Exception ex)
                        {
                            Console.WriteLine("");
                            Console.WriteLine(ex.Message);
                            Console.WriteLine("");
                            break;
                        }
 
                        // on user input of branch <branch name> get
                        // branch and output to console
                    case "branch":
                        try
                        {
                            BranchSpec branch = rep.GetBranchSpec(command[1]);
                            Console.WriteLine("");
                            Console.WriteLine(branch.ToString());
                            Console.WriteLine("");
                            break;
                        }
                        catch (Exception ex)
                        {
                            Console.WriteLine("");
                            Console.WriteLine(ex.Message);
                            Console.WriteLine("");
                            break;
                        }
                }
            }
        }
    }
}