Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Setting ExtendedProperties related to a Room

I am very new to EWS and Exchange in general, so not really sure what is the best approach.

Background

I am trying to set configuration information about a room. I was hoping that the EWS API provided me with a Room object that I can add ExtendedProperties on, however, it appears that rooms are just an email address.

I then saw that each room had a CalendarFolder associated with it, so I am now trying to set the room configuration in the CalendarFolder, which is what the original question below refers to.

Original Question

I am trying to do a simple update of a CalendarFolder using:

var folderId = new FolderId(WellKnownFolderName.Calendar, new Mailbox(roomEmail.Address));
var myCalendar = CalendarFolder.Bind(service, folderId, PropertySet.FirstClassProperties);

myCalendar.DisplayName += "Updated";
myCalendar.Update();

However, when I call .Update() I get "The folder save operation failed due to invalid property values."

I believe that the problem might have something to do with myCalendar not having all of the properties that the calendar folder has on the server. So when I update the object it is only sending a partial object which is causing validation errors.

How would I go about updating a CalendarFolder?

After further research

I also stumbled across the following, which does work:

FindFoldersResults root = service.FindFolders(WellKnownFolderName.Calendar, new FolderView(500));

foreach (var folder in root.Folders)
{
     folder.DisplayName = "confRoom1";
     folder.Update();
}

I'm sure there is a difference between the two approaches, but I don't understand the differences between the folder that I get using the different query methods:

new FolderId(WellKnownFolderName.Calendar, new Mailbox(roomEmail.Address));
var myCalendar = CalendarFolder.Bind(service, folderId, PropertySet.FirstClassProperties);

and

service.FindFolders(WellKnownFolderName.Calendar, new FolderView(500));

Which approach would give me the correct CalendarFolder where I can set the ExtendedProperties for the room?

like image 687
Cloud SME Avatar asked Nov 08 '22 10:11

Cloud SME


1 Answers

I'm sure there is a difference between the two approaches, but I don't understand the differences between the folder that I get using the different query methods:

new FolderId(WellKnownFolderName.Calendar, new Mailbox(roomEmail.Address)); var myCalendar = CalendarFolder.Bind(service, folderId, PropertySet.FirstClassProperties); and

service.FindFolders(WellKnownFolderName.Calendar, new FolderView(500));

The First binds to the default calendar folder in a Mailbox and the second get the subfolders within the Default calendar folder. You can rename the subfolders within the default calendar folder because they are user created. You cannot rename the Default calendar folder in a Mailbox because its a special folder. If you want to set a Extended property (which you can do on a special folder then it easy just define it and set it) eg

ExtendedPropertyDefinition MyCustomProp = new ExtendedPropertyDefinition(DefaultExtendedPropertySet.PublicStrings, "MyCustomProp", MapiPropertyType.String);

CalendarFolder CalendarFolder = CalendarFolder.Bind(service,new FolderId(WellKnownFolderName.Calendar, "[email protected]"));
CalendarFolder.SetExtendedProperty(MyCustomProp, "My Value");
CalendarFolder.Update();

What you want to get that value you must define a propertySet that tells exchange to return that value when you either Bind or use FindItems (Exchange will not return your property by default) eg

PropertySet MyPropSet = new PropertySet(BasePropertySet.FirstClassProperties);
MyPropSet.Add(MyCustomProp);
CalendarFolder = CalendarFolder.Bind(service, new FolderId(WellKnownFolderName.Calendar, "[email protected]"),MyPropSet);
Object PropValue = null;
if (CalendarFolder.TryGetProperty(MyCustomProp, out PropValue)) 
{
    Console.WriteLine(PropValue);
}
like image 126
Glen Scales Avatar answered Nov 14 '22 21:11

Glen Scales