KnowledgeBase Archive

An Archive of Early Microsoft KnowledgeBase Articles

View on GitHub

Q257990: HOWTO: Obtain List of Pinned Files from OLE Automation in VC++

Article: Q257990
Product(s): Microsoft SourceSafe
Version(s): 5.0,6.0
Operating System(s): 
Keyword(s): kbAutomation kbSSafe500 kbSSafe600 kbDSupport kbGrpDSSSafe
Last Modified: 01-MAY-2001

-------------------------------------------------------------------------------
The information in this article applies to:

- Microsoft Visual SourceSafe for Windows, versions 5.0, 6.0 
-------------------------------------------------------------------------------

SUMMARY
=======

The Visual SourceSafe OLE Automation does not directly expose any pinning
functionality. Because of this, there is no direct way to tell if a file it
pinned from OLE Automation. The following sample code shows how to work around
this problem and obtain this information from a Visual C++ program.

NOTE: This sample code assumes that you reference the Visual SourceSafe OLE
Automation by using the following:

  #import "path to ssapi.dll" no_namespace

MORE INFORMATION
================

The following code assumes that you have a Visual Basic project and, when you
want to get the path information, that you call the CheckPaths function. It
could easily be modified to take a project as a parameter and also to do
something different with the results.

  void CheckPaths()
  {
     // Reference to the VSS objects
     IVSSDatabasePtr   objVSSDatabase;
     IVSSItemPtr       objItem;
     IVSSItemsPtr      objItems;
     IVSSItemPtr       vssItem;
     IUnknownPtr       lpunk;
     IEnumVARIANTPtr   ppvobj;
     ULONG             fetched;
     VARIANT           st;

     try {
        // Create the database object and open a connection to our database
        objVSSDatabase.CreateInstance(__uuidof(VSSDatabase));
        objVSSDatabase->Open(L"C:\\Program Files\\Microsoft Visual Studio\\Common\\VSS60a\\srcsafe.ini", L"Admin", L"");

        // Create the Item object and set it to be $/ (the root project)
        objItem = objVSSDatabase->GetVSSItem("$/", false);

        // Check for pinned files in this project
        Links(objItem);

        // Get the items for this project
        objItems = objItem->GetItems(false);

        // Prepare to loop through the items
        lpunk = objItems->_NewEnum();
        lpunk.QueryInterface(IID_IEnumVARIANT, (void **)&ppvobj);

        // Loop through the items
        do {
           ppvobj->Next( 1UL, &st, &fetched );
           if( fetched != 0 ) {
              // Try to get the item
              if(!FAILED(st.punkVal->
                 QueryInterface(__uuidof(IVSSItem), (void**)&vssItem))) {
                 // If the item is a project, call the function to check if there
                 // are subprojects in this project
                 if (vssItem->GetType() == 0)
                    CheckSubProjects(vssItem);
              }
              st.punkVal->Release();
           }
        } while (fetched != 0);

        ppvobj->Release();
        lpunk->Release();

        // Inform the user that you are finished
        AfxMessageBox("All Done!");

     } catch (_com_error e) {
        // Some error handlers
     }
  }

  void CheckSubProjects(IVSSItemPtr objVSSProject)
  {
     // Reference to the VSS objects
     IVSSItemsPtr     objItems;
     IVSSItemPtr      vssItem;
     IUnknownPtr      lpunk;
     IEnumVARIANTPtr  ppvobj;
     ULONG            fetched;
     VARIANT          st;

     try {
        // Check for pinned files in this project
        Links(objVSSProject);

        // Get the items for this project
        objItems = objVSSProject->GetItems(false);

        // Prepare to loop through the items
        lpunk = objItems->_NewEnum();
        lpunk.QueryInterface(IID_IEnumVARIANT, (void **)&ppvobj);

        // Loop through the items
        do {
           ppvobj->Next( 1UL, &st, &fetched );
           if( fetched != 0 ) {
              // Try to get the item
              if(!FAILED(st.punkVal->
                 QueryInterface(__uuidof(IVSSItem), (void**)&vssItem))) {
                 // If the item is a project, call the function to check if there
                 // are subprojects in this project
                 if (vssItem->GetType() == 0)
                    CheckSubProjects(vssItem);
              }
              st.punkVal->Release();
           }
        } while (fetched != 0);

        ppvobj->Release();
        lpunk->Release();
     } catch (_com_error e) {
        // Some error handlers
     }
  }

  void Links(IVSSItemPtr objVSSFile)
  {
     // Reference to the VSS objects
     IVSSVersionsPtr   objVersions;
     IVSSVersionPtr    objVersion;
     CString           UnpinArray[40];
     CString           vssAction;
     IUnknownPtr       lpunk;
     IEnumVARIANTPtr   ppvobj;
     ULONG             fetched;
     VARIANT           st;
     int               i, j, found;

     try {
        // Initialize variables
        found = i = j = 0;

        // Get the items for this project
        objVersions = objVSSFile->GetVersions(0L);

        // Prepare to loop through the items
        lpunk = objVersions->_NewEnum();
        lpunk.QueryInterface(IID_IEnumVARIANT, (void **)&ppvobj);

        // Loop through the items
        do {
           ppvobj->Next( 1UL, &st, &fetched );
           if( fetched != 0 ) {
              // Try to get the item
              if(!FAILED(st.punkVal->
                 QueryInterface(__uuidof(IVSSVersion), (void**)&objVersion))) {
                 // See what the event is that you are looking at
                 vssAction = (LPCTSTR) objVersion->GetAction();
                 // If it is a pin, check if you already have an unpin for this file
                 if (vssAction.Left(6) == "Pinned") {
                    for (j = 0; j <= i; j++) {
                       if ((!UnpinArray[j].IsEmpty()) && (vssAction.Find(UnpinArray[j], 0) != -1)) {
                          // Set found to 1, the file is not pinned.
                          found = 1;
                          break;
                       }
                    }

                    // If you found it, print it out
                    if (found == 0)
                       OutputDebugString(vssAction);

                 } else if (vssAction.Left(8) == "Unpinned") {
                    UnpinArray[i] = vssAction.Right(vssAction.GetLength() - 10);
                    i++;
                 }
              }
              st.punkVal->Release();
           }
        } while (fetched != 0);

        ppvobj->Release();
        lpunk->Release();
     } catch (_com_error e) {
        // Some error handlers
     }
  }

REFERENCES
==========

For more information, see the Visual SourceSafe 6.0 Automation topic on the
following MSDN Web site at:

  http://msdn.microsoft.com/library/techart/vssauto.htm

For additional information, click the article number below to view the article in
the Microsoft Knowledge Base:

  Q257989 HOWTO: Pin and Unpin Files in SourceSafe from OLE Automation

Additional query words:

======================================================================
Keywords          : kbAutomation kbSSafe500 kbSSafe600 kbDSupport kbGrpDSSSafe 
Technology        : kbSSafeSearch kbAudDeveloper kbSSafe600 kbSSafe500
Version           : :5.0,6.0
Issue type        : kbhowto

=============================================================================

THE INFORMATION PROVIDED IN THE MICROSOFT KNOWLEDGE BASE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MICROSOFT DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL MICROSOFT CORPORATION OR ITS SUPPLIERS BE LIABLE FOR ANY DAMAGES WHATSOEVER INCLUDING DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL, LOSS OF BUSINESS PROFITS OR SPECIAL DAMAGES, EVEN IF MICROSOFT CORPORATION OR ITS SUPPLIERS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES SO THE FOREGOING LIMITATION MAY NOT APPLY.

Copyright Microsoft Corporation 1986-2002.