VERSION 1.0 CLASS BEGIN MultiUse = -1 'True END Attribute VB_Name = "stdSharepointSite" Attribute VB_GlobalNameSpace = False Attribute VB_Creatable = False Attribute VB_PredeclaredId = True Attribute VB_Exposed = False 'P.S. Useful information about APIs can be found here: 'http://sharepoint/sub/site/_vti_bin/Lists.asmx Const ListPath As String = "/_vti_bin/Lists.asmx" 'Private data Private pPath As String Private pUser As String Private pPass As String Private pHost As String 'Request object used for reference Public LastReq As Object 'Constructor '@param sSharepointHost:string - The host domain of sharepoint '@param sSharepointPath:string - Path to sharepoint site/subsite '//sharepoint/some/sub/site/ 'E.G. For "http://teams/wholesale/shopping/leicester/SitePages/Home.aspx" the site sharepoint path is "http://teams/wholesale/shopping/leicester/" '@param @optional sUsername: string - The user's username (used for authentication) '@param @optional sPassword: string - The user's password (used for authentication) Public Function Create(ByVal sSharepointHost As String, ByVal sSharePointPath As String, Optional ByVal sUsername As String = Empty, Optional ByVal sPassword As String = Empty) As stdSharepointSite Set Create = New stdSharepointSite Create.Init sSharepointHost, sSharePointPath, sUsername, sPassword End Function Public Sub Init(ByVal sSharepointHost As String, ByVal sSharePointPath As String, ByVal sUsername As String, ByVal sPassword As String) pPath = IIf(Right(sSharePointPath, 1) = "/", Left(sSharePointPath, Len(sSharePointPath) - 1), sSharePointPath) pUser = sUsername pPass = sPassword pHost = sSharepointHost End Sub '@param pageURL: string - Locaiton of the file '@param checkoutToLocal: string - Checkout for local editing or for remote editing? Usually false '@note Missing param lastModified in format: Format(lastModified, "dd mmm yyyy hh:MM:ss") - no way of getting lastModified date yet. Will be wanted in the future. Public Function CheckOutFile(ByVal pageURL As String, ByVal CheckoutToLocal As Boolean) As Boolean Set LastReq = DispatchSOAP("CheckOutFile", pPath & ListPath, Array( _ "pageUrl", pageURL, _ "checkoutToLocal", LCase(CStr(CheckoutToLocal)), _ "lastmodified", "" _ )) CheckOutFile = LastReq.Status = 200 End Function '@param pageURL: string - The file location '@param comment: string - The version comment to add '@param CheckinType: Integer - 0 = MinorCheckIn (+0.1), 1 = MajorCheckIn (+1.0), 2 = OverwriteCheckIn (set v1.0) Public Function CheckInFile(ByVal pageURL As String, ByVal comment As String, Optional ByVal CheckinType As Integer = 0) As Boolean Set LastReq = DispatchSOAP("CheckInFile", pPath & ListPath, Array( _ "pageUrl", pageURL, _ "comment", comment, _ "CheckinType", CheckinType _ )) CheckInFile = LastReq.Status = 200 End Function '@param pageURL: string - The file location Public Function CheckOutDiscard(ByVal pageURL As String) As Boolean Set LastReq = DispatchSOAP("UndoCheckOut", pPath & ListPath, Array( _ "pageUrl", pageURL _ )) CheckOutDiscard = LastReq.Status = 200 End Function 'GetListCollection '@desc Returns all lists implemented on the site specified. Public Function GetListCollection() As Boolean Set LastReq = DispatchSOAP("GetListCollection", pPath & ListPath, Array( _ )) GetListCollection = LastReq.Status = 200 End Function '@param listName: string - List title or GUID '@param query: string - Query to filter on (only return the filtered items) '@param viewName: string - The GUID of the view to get items of '@param viewFields: string - The fields to return '@param rowLimit: string - The number of rows that should be returned. Default is 999999 '@param queryOptions: string - Additional query options (see docs) '@param webID: string - Original web site (see docs) '@docs https://docs.microsoft.com/en-us/previous-versions/office/developer/sharepoint-services/ms772599(v=office.12) Public Function GetListItems(ByVal listName As String, Optional ByVal query As String = "", Optional ByVal viewName As String = "", Optional ByVal viewFields As String = "", Optional ByVal rowLimit As Long = 999999, Optional ByVal queryOptions As String, Optional ByVal webID As String = "") As Object Set LastReq = DispatchSOAP("GetListItems", pPath & ListPath, Array( _ "listName", listName, _ "viewName", viewName, _ "query", query, _ "viewFields", viewFields, _ "rowLimit", rowLimit, _ "QueryOptions", queryOptions, _ "webID", webID _ )) GetListItems = LastReq.Status = 200 End Function '@param listName: string - List title or GUID Public Function GetList(ByVal listName As String) As Boolean Set LastReq = DispatchSOAP("GetList", pPath & ListPath, Array( _ "listName", listName _ )) End Function '@param listName: string - List title or GUID '@param updates: string - A Batch Element containing updates to make '@docs Main - https://docs.microsoft.com/en-us/previous-versions/office/developer/sharepoint-services/ms772668(v=office.12) '@docs BatchElement - https://docs.microsoft.com/en-us/previous-versions/office/developer/sharepoint-services/ms437562(v=office.12) '@docs MethodElement - https://docs.microsoft.com/en-us/previous-versions/office/developer/sharepoint-services/ms459050(v=office.12) Public Function UpdateListItems(ByVal listName As String, ByVal updates As String) As Boolean Set LastReq = DispatchSOAP("UpdateListItems", pPath & ListPath, Array( _ "listName", listName, _ "updates", updates _ )) UpdateListItems = LastReq.Status = 200 End Function '@param col: Collection - A collection of Updates created with CreateUpdate() method. '@param sErrorHandling: string - Either "Continue" or "Return". Changes error handling of the update Public Function UpdateListItems_CreateBatch(ByVal col As Collection, Optional ByVal sErrorHandling As String = "Continue") Dim sData As String: sData = "" sData = sData & "" & vbCrLf Dim vMethod For Each vMethod In col sData = sData & vMethod & vbCrLf Next UpdateListItems_CreateBatch = sData & "" End Function '@param sUpdateID: string - A free text used to create an update identifier. This will be useful when parsing the result of the Sharepoint call '@param sCmd: string - The update command. Can either be "Delete", "Update" or "New" '@param params...: string - An array of FieldName,FieldValue pairs e.g. Array("ID",1,"Title","Car","Price",30.132) Public Function UpdateListItems_CreateMethod(ByVal sUpdateID As String, ByVal sCmd As String, params() As Variant) Dim sMethod As String: sMethod = "" sMethod = sMethod & "" & vbCrLf Dim i As Long: For i = LBound(params) To UBound(params) Step 2 sMethod = sMethod & "" & params(i + 1) & "" & vbCrLf Next UpdateListItems_CreateMethod = sMethod & "" End Function '@param sPrimaryTag: string - Name of operation as per sharepoint specification '@param sSitePath: string - The path to the sharepoint class entry point '@param params: Array(String*2n) - Array of String pairs: ' * Class method parameter name ' * Class method parameter value 'this is used to generate SOAP XML, see #getSoapXML() Private Function DispatchSOAP(ByVal sPrimaryTag As String, ByVal sSitePath As String, params As Variant) As Object Dim sSOAP As String: sSOAP = getSoapXML(sPrimaryTag, params) Set DispatchSOAP = HTTPPost(GetSOAPSchema(sPrimaryTag), pPath & ListPath, sSOAP) End Function '@param sPrimaryTag: string - Name of operation as per sharepoint specification Private Function GetSOAPSchema(ByVal sPrimaryTag As String) As String GetSOAPSchema = "http://schemas.microsoft.com/sharepoint/soap/" & sPrimaryTag End Function 'Generates SOAP XML for calls to SharePoint '@param sPrimaryTag: string - Name of operation as per sharepoint specification '@param params: Array(String*2n) - Array of String pairs: ' * Class method parameter name ' * Class method parameter value Private Function getSoapXML(ByVal sPrimaryTag As String, params As Variant) As String 'SOAP header Dim sData As String: sData = "" sData = sData & "" & vbCrLf sData = sData & "" & vbCrLf sData = sData & " " & vbCrLf 'SOAP Primary wrapper header sData = sData & " <" & sPrimaryTag & " xmlns=""http://schemas.microsoft.com/sharepoint/soap/"">" & vbCrLf 'Loop through and apply params Dim i As Long For i = LBound(params) To UBound(params) Step 2 sData = sData & " <" & params(i) & ">" & params(i + 1) & "" & vbCrLf Next 'SOAP Primary wrapper footer sData = sData & " '" & vbCrLf 'random quote 'SOAP footer sData = sData & " " & vbCrLf sData = sData & "" & vbCrLf 'Return data getSoapXML = sData End Function Private Function HTTPPost(ByVal sSOAPAction As String, ByVal sPath As String, ByVal sData As String, Optional ByVal sContentType As String = "text/xml; charset=utf-8") As Object Dim oHTTP As Object: Set oHTTP = CreateObject("MSXML2.serverXMLHTTP") With oHTTP If pUser = "" And pPass = "" Then .Open "POST", sPath, False Else .Open "POST", sPath, False, pUser, pPass End If .SetRequestHeader "Content-Type", sContentType .SetRequestHeader "Host", pHost .SetRequestHeader "Content-Length", Len(sData) .SetRequestHeader "SOAPAction", sSOAPAction .Send sData End With Set HTTPPost = oHTTP End Function