private void GetMediaXmlCallback(IAsyncResult ar)
    {
        TransportClassMediaXml oTransportClassMediaXml = ar.AsyncState as TransportClassMediaXml;
        try
        {
            Dictionary<string, string> aMediaXmlMapHash;
            Dictionary<string, string> aMediaXmlMapFilename;
            ErrorTypes eError = oTransportClassMediaXml.m_oAsyncMediaXmlOperation.GetMediaXmlEnd(ar, out aMediaXmlMapHash, out aMediaXmlMapFilename);
            if (ErrorTypes.NoError == eError)
            {
                oTransportClassMediaXml.m_aMediaXmlMapHash = aMediaXmlMapHash;
                oTransportClassMediaXml.m_aMediaXmlMapFilename = aMediaXmlMapFilename;

                string[] aUrls;
                string sSupportedFormats = "";
                if ("imgurl" == oTransportClassMediaXml.m_oInputCommand.c)
                {
                    aUrls = new string[] { oTransportClassMediaXml.m_oInputCommand.data };
                    sSupportedFormats = ConfigurationSettings.AppSettings["limits.image.types.upload"] ?? "jpg";
                }
                else
                {
                    JavaScriptSerializer oJavaScriptSerializer = new JavaScriptSerializer();
                    aUrls = oJavaScriptSerializer.Deserialize<string[]>(oTransportClassMediaXml.m_oInputCommand.data);
                    sSupportedFormats = ConfigurationSettings.AppSettings["limits.image.types.copy"] ?? "jpg";
                }
                TransportClassImgUrl oTransportClassImgUrl = new TransportClassImgUrl(oTransportClassMediaXml, aUrls, sSupportedFormats, DownloadImages);
                DownloadImages(new AsyncOperationData(oTransportClassImgUrl));
            }
            else
                WriteOutputCommand(oTransportClassMediaXml, new OutputCommand(ErrorTypes.Upload));
        }
        catch
        {
            WriteOutputCommand(oTransportClassMediaXml, new OutputCommand(ErrorTypes.Upload));
        }
    }
    private void ProcessImage(byte[] aBuffer, TransportClassImgUrl oTransportClassImgUrl)
    {
        TransportClassMediaXml oTransportClassMediaXml = oTransportClassImgUrl.m_oTransportClassMediaXml;
        int nImageFormat = FormatChecker.GetFileFormat(aBuffer);
        if ((0 != (FileFormats.AVS_OFFICESTUDIO_FILE_IMAGE & nImageFormat) || FileFormats.AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_SVG == nImageFormat) && -1 != oTransportClassImgUrl.m_sSupportedFormats.IndexOf(FileFormats.ToString(nImageFormat)))
        {
            if (FileFormats.AVS_OFFICESTUDIO_FILE_IMAGE_GIF == nImageFormat || FileFormats.AVS_OFFICESTUDIO_FILE_IMAGE_ICO == nImageFormat)
            {
                byte[] aNewBuffer;
                if (Utils.ConvertGifIcoToPng(aBuffer, nImageFormat, out aNewBuffer))
                {
                    nImageFormat = FileFormats.AVS_OFFICESTUDIO_FILE_IMAGE_PNG;
                    aBuffer = aNewBuffer;
                }
            }
            MemoryStream ms = new MemoryStream(aBuffer);
            string sHash = Utils.getMD5HexString(ms);
            string sExistFilename;
            if (oTransportClassMediaXml.m_aMediaXmlMapHash.TryGetValue(sHash, out sExistFilename))
            {

                oTransportClassImgUrl.SetUrl(Constants.mc_sResourceServiceUrlRel + oTransportClassMediaXml.m_oInputCommand.id + "/media/" + sExistFilename);
                oTransportClassImgUrl.SetErrorAndCallback(ErrorTypes.NoError);
            }
            else
            {
                string ext = "." + FileFormats.ToString(nImageFormat);
                string sNewName;
                if(false == oTransportClassImgUrl.m_mapUrlToName.TryGetValue(oTransportClassImgUrl.m_sCurUrl, out sNewName))
                {
                    
                    string sSearchName = "image";
                    List<int> aIndexes = new List<int>();
                    foreach (KeyValuePair<string, string> kvp in oTransportClassMediaXml.m_aMediaXmlMapFilename)
                    {
                        string sFilename = Path.GetFileNameWithoutExtension(kvp.Key);
                        if (0 == sFilename.IndexOf(sSearchName))
                        {
                            int nCurIndex;
                            if (int.TryParse(sFilename.Substring(sSearchName.Length), out nCurIndex))
                                aIndexes.Add(nCurIndex);
                        }
                    }
                    int nMaxIndex = -1;
                    for (int i = 0, length = aIndexes.Count; i < length; ++i)
                    {
                        int nCurIndex = aIndexes[i];
                        if (nMaxIndex < nCurIndex)
                            nMaxIndex = nCurIndex;
                    }
                    int nNewIndex = 1;
                    if (nMaxIndex >= nNewIndex)
                        nNewIndex = nMaxIndex + 1;
                    sNewName = sSearchName + nNewIndex + ext;
                }
                if (FileFormats.AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_SVG == nImageFormat)
                {
                    
                    string sCurUrl = oTransportClassImgUrl.m_sCurUrl;
                    int nExtIndex = sCurUrl.LastIndexOf(".svg");
                    if (-1 != nExtIndex)
                    {
                        string sStart = sCurUrl.Substring(0, nExtIndex);
                        string sEmfUrl = sStart + ".emf";
                        string sWmfUrl = sStart + ".wmf";
                        oTransportClassImgUrl.AddUrls(new string[] { sEmfUrl, sWmfUrl });
                        oTransportClassImgUrl.m_mapUrlToName[sEmfUrl] = Path.ChangeExtension(sNewName, ".emf");
                        oTransportClassImgUrl.m_mapUrlToName[sWmfUrl] = Path.ChangeExtension(sNewName, ".wmf");
                    }
                }
                oTransportClassMediaXml.m_aMediaXmlMapHash.Add(sHash, sNewName);
                oTransportClassMediaXml.m_aMediaXmlMapFilename.Add(sNewName, sHash);
                oTransportClassMediaXml.m_oStorage = new Storage();
                oTransportClassMediaXml.m_oMemoryStream = ms;
                oTransportClassMediaXml.m_oParam = sNewName;
                ms.Position = 0;
                InputCommand cmd = oTransportClassMediaXml.m_oInputCommand;
                oTransportClassMediaXml.m_oStorage.WriteFileBegin(Path.Combine(cmd.id, @"media\" + sNewName), ms, WriteFileCallback, oTransportClassImgUrl);
            }
        }
        else
            oTransportClassImgUrl.SetErrorAndCallback(ErrorTypes.UploadExtension);
    }