/// <summary> /// Formats an XML post header for last.fm's api access /// </summary> /// <param name="aMethodType">Is a type of the method to be called: e.g. LoveTrack, BanTrack, etc</param> /// <param name="aUser">The users last.fm username.</param> /// <param name="aChallenge">The current UNIX timestamp.</param> /// <param name="aAuth">The authentication token, a 32-byte ASCII hexadecimal representation of the MD5 hash of the users last.fm password and the timestamp: md5(md5(password) + timestamp)</param> /// <param name="aArtist">The artist to get love/ban.</param> /// <param name="aTitle">The track title to get love/ban.</param> /// <param name="aFriendsUserName">The friends name to remove.</param> /// <returns>The XML data in string format</returns> private string BuildXmlRpcRequest(XmlRpcType aMethodType, string aUser, string aChallenge, string aAuth, string aArtist, string aTitle, string aFriendsUserName) { string ResultXml = String.Empty; List<string> AllParams = new List<string>(5); try { if (!String.IsNullOrEmpty(aUser)) { AllParams.Add(aUser); } if (!String.IsNullOrEmpty(aChallenge)) { AllParams.Add(aChallenge); } if (!String.IsNullOrEmpty(aAuth)) { AllParams.Add(aAuth); } if (aMethodType == XmlRpcType.removeFriend) { if (!String.IsNullOrEmpty(aFriendsUserName)) { AllParams.Add(aFriendsUserName); } } else { if (!String.IsNullOrEmpty(aArtist)) { AllParams.Add(aArtist); } if (!String.IsNullOrEmpty(aTitle)) { AllParams.Add(aTitle); } } using (MemoryStream memoryStream = new MemoryStream()) { XmlWriterSettings settings = new XmlWriterSettings(); //settings.Indent = true; //settings.IndentChars = (" "); settings.CloseOutput = true; // If i use Encodings.UTF8 the BOM will be prepended... settings.Encoding = new UTF8Encoding(false); using (XmlWriter writer = XmlWriter.Create(memoryStream, settings)) { writer.WriteStartElement("methodCall"); writer.WriteElementString("methodName", aMethodType.ToString()); writer.WriteStartElement("params"); foreach (string singleParam in AllParams) { writer.WriteStartElement("param"); writer.WriteStartElement("value"); writer.WriteElementString("string", singleParam); writer.WriteEndElement(); writer.WriteEndElement(); } writer.WriteEndElement(); writer.WriteEndElement(); writer.Flush(); } ResultXml = Encoding.UTF8.GetString(memoryStream.GetBuffer()); Log.Debug("AudioscrobblerUtils: Successfully created XMLRPC call for method {0}", aMethodType.ToString()); } } catch (Exception ex) { Log.Error("AudioscrobblerUtils: Error in BuildXmlRpcRequest - {0}", ex.Message); } return ResultXml; }