// Path: wcs-android-sdk/src/main/java/com/chinanetcenter/wcs/android/listener/SliceUploaderListener.java
// public abstract class SliceUploaderListener {
// 
//     public abstract void onSliceUploadSucceed(JSONObject reponseJSON);
// 
//     public abstract void onSliceUploadFailured(HashSet<String> errorMessages);
// 
//     public void onProgress(long uploaded, long total) {
// 
//     }
// 
// }
// 
// Path: wcs-android-sdk/src/main/java/com/chinanetcenter/wcs/android/utils/WCSLogUtil.java
// public class WCSLogUtil {
// 
//     private static final String TAG = "CNCLog";
// 
//     private static boolean DEBUGGING = Config.DEBUGGING;
// 
//     public static boolean isEnableLog() {
//         return DEBUGGING;
//     }
// 
//     public static String getStackTraceString(Throwable tr) {
//         if (tr == null) {
//             return "Throwable is null";
//         }
// 
//         if (tr.getLocalizedMessage() != null && !"null".equals(tr.getLocalizedMessage())) {
//             return tr.getLocalizedMessage();
//         }
// 
//         tr.getStackTrace();
// 
//         Throwable t = tr;
//         while (t != null) {
//             t = t.getCause();
//         }
// 
//         StringWriter sw = new StringWriter();
//         PrintWriter pw = new PrintWriter(sw);
//         tr.printStackTrace(pw);
//         pw.flush();
//         String stackTrace = sw.toString();
//         try {
//             sw.close();
//         } catch (IOException e) {
//             e.printStackTrace();
//         }
//         pw.close();
//         return stackTrace;
//     }
// 
//     public static void v(String msg) {
//         WCSLogUtil.v(null, msg);
//     }
// 
//     public static void v(Class<?> clazz, String msg) {
//         if (DEBUGGING) {
//             Log.v(null == clazz ? TAG : getTag(clazz), Thread.currentThread().getName() +" "+ msg);
//         }
//     }
// 
//     public static void v(Class<?> clazz, String msg, Throwable tr) {
//         if (DEBUGGING) {
//             Log.v(null == clazz ? TAG : getTag(clazz), Thread.currentThread().getName() +" "+ msg);
//         }
//     }
// 
//     public static void d(Class<?> clazz, String msg) {
//         if (DEBUGGING) {
//             Log.d(null == clazz ? TAG : getTag(clazz), Thread.currentThread().getName() +" "+ msg);
//         }
//     }
// 
//     public static void d(Class<?> clazz, String msg, Throwable tr) {
//         if (DEBUGGING) {
//             Log.d(null == clazz ? TAG : getTag(clazz), Thread.currentThread().getName() +" "+ msg);
//         }
//     }
// 
//     public static void d(String msg) {
//         WCSLogUtil.d(null,  msg);
//     }
// 
//     public static void i(Class<?> clazz, String msg) {
//         if (DEBUGGING) {
//             Log.i(null == clazz ? TAG : getTag(clazz), Thread.currentThread().getName() +" "+ msg);
//         }
//     }
// 
//     public static void i(Class<?> clazz, String msg, Throwable tr) {
//         if (DEBUGGING) {
//             Log.i(null == clazz ? TAG : getTag(clazz), Thread.currentThread().getName() +" "+ msg);
//         }
//     }
// 
//     public static void i(String msg) {
//         WCSLogUtil.i(null, msg);
//     }
// 
//     public static void w(Class<?> clazz, String msg) {
//         if (DEBUGGING) {
//             Log.w(null == clazz ? TAG : getTag(clazz), Thread.currentThread().getName() +" "+ msg);
//         }
//     }
// 
//     public static void w(Class<?> clazz, String msg, Throwable tr) {
//         if (DEBUGGING) {
//             Log.w(null == clazz ? TAG : getTag(clazz), Thread.currentThread().getName() +" "+ msg);
//         }
//     }
// 
//     public static void w(String msg) {
//         WCSLogUtil.w(null, msg);
//     }
// 
//     public static void e(Class<?> clazz, String msg) {
//         if (DEBUGGING) {
//             Log.e(null == clazz ? TAG : getTag(clazz), Thread.currentThread().getName() +" "+ msg);
//         }
//     }
// 
//     public static void e(Class<?> clazz, String msg, Throwable tr) {
//         if (DEBUGGING) {
//             Log.e(null == clazz ? TAG : getTag(clazz), Thread.currentThread().getName() +" "+ msg);
//         }
//     }
// 
//     public static void e(String msg) {
//         WCSLogUtil.e(null,  msg);
//     }
// 
//     private static String getTag(Class<?> clazz) {
//         return "[CNCLog" + clazz.getSimpleName() + "]";
//     }
// }


import com.chinanetcenter.wcs.android.listener.SliceUploaderListener;
import com.chinanetcenter.wcs.android.utils.WCSLogUtil;
import java.util.Locale;
import java.util.concurrent.atomic.AtomicLong;
package com.chinanetcenter.wcs.android.api;



public class ProgressNotifier {

    private SliceUploaderListener mUploaderListener;

    private long mTotal;

    //    private long mWritten;
    private AtomicLong mWritten;

    public ProgressNotifier(long total, SliceUploaderListener uploaderListener) {
        mUploaderListener = uploaderListener;
        mTotal = total;
        mWritten = new AtomicLong();
    }

    public void decreaseProgress(long decrease) {
//        mWritten -= decrease;
        mWritten.addAndGet(-decrease);
    }

    public void increaseProgressAndNotify(long written) {
        mWritten.addAndGet(written);
//        mWritten += written;
        if (mWritten.get() <= mTotal) {
            mUploaderListener.onProgress(mWritten.get(), mTotal);
        } else {
// Path: wcs-android-sdk/src/main/java/com/chinanetcenter/wcs/android/listener/SliceUploaderListener.java
// public abstract class SliceUploaderListener {
// 
//     public abstract void onSliceUploadSucceed(JSONObject reponseJSON);
// 
//     public abstract void onSliceUploadFailured(HashSet<String> errorMessages);
// 
//     public void onProgress(long uploaded, long total) {
// 
//     }
// 
// }
// 
// Path: wcs-android-sdk/src/main/java/com/chinanetcenter/wcs/android/utils/WCSLogUtil.java
// public class WCSLogUtil {
// 
//     private static final String TAG = "CNCLog";
// 
//     private static boolean DEBUGGING = Config.DEBUGGING;
// 
//     public static boolean isEnableLog() {
//         return DEBUGGING;
//     }
// 
//     public static String getStackTraceString(Throwable tr) {
//         if (tr == null) {
//             return "Throwable is null";
//         }
// 
//         if (tr.getLocalizedMessage() != null && !"null".equals(tr.getLocalizedMessage())) {
//             return tr.getLocalizedMessage();
//         }
// 
//         tr.getStackTrace();
// 
//         Throwable t = tr;
//         while (t != null) {
//             t = t.getCause();
//         }
// 
//         StringWriter sw = new StringWriter();
//         PrintWriter pw = new PrintWriter(sw);
//         tr.printStackTrace(pw);
//         pw.flush();
//         String stackTrace = sw.toString();
//         try {
//             sw.close();
//         } catch (IOException e) {
//             e.printStackTrace();
//         }
//         pw.close();
//         return stackTrace;
//     }
// 
//     public static void v(String msg) {
//         WCSLogUtil.v(null, msg);
//     }
// 
//     public static void v(Class<?> clazz, String msg) {
//         if (DEBUGGING) {
//             Log.v(null == clazz ? TAG : getTag(clazz), Thread.currentThread().getName() +" "+ msg);
//         }
//     }
// 
//     public static void v(Class<?> clazz, String msg, Throwable tr) {
//         if (DEBUGGING) {
//             Log.v(null == clazz ? TAG : getTag(clazz), Thread.currentThread().getName() +" "+ msg);
//         }
//     }
// 
//     public static void d(Class<?> clazz, String msg) {
//         if (DEBUGGING) {
//             Log.d(null == clazz ? TAG : getTag(clazz), Thread.currentThread().getName() +" "+ msg);
//         }
//     }
// 
//     public static void d(Class<?> clazz, String msg, Throwable tr) {
//         if (DEBUGGING) {
//             Log.d(null == clazz ? TAG : getTag(clazz), Thread.currentThread().getName() +" "+ msg);
//         }
//     }
// 
//     public static void d(String msg) {
//         WCSLogUtil.d(null,  msg);
//     }
// 
//     public static void i(Class<?> clazz, String msg) {
//         if (DEBUGGING) {
//             Log.i(null == clazz ? TAG : getTag(clazz), Thread.currentThread().getName() +" "+ msg);
//         }
//     }
// 
//     public static void i(Class<?> clazz, String msg, Throwable tr) {
//         if (DEBUGGING) {
//             Log.i(null == clazz ? TAG : getTag(clazz), Thread.currentThread().getName() +" "+ msg);
//         }
//     }
// 
//     public static void i(String msg) {
//         WCSLogUtil.i(null, msg);
//     }
// 
//     public static void w(Class<?> clazz, String msg) {
//         if (DEBUGGING) {
//             Log.w(null == clazz ? TAG : getTag(clazz), Thread.currentThread().getName() +" "+ msg);
//         }
//     }
// 
//     public static void w(Class<?> clazz, String msg, Throwable tr) {
//         if (DEBUGGING) {
//             Log.w(null == clazz ? TAG : getTag(clazz), Thread.currentThread().getName() +" "+ msg);
//         }
//     }
// 
//     public static void w(String msg) {
//         WCSLogUtil.w(null, msg);
//     }
// 
//     public static void e(Class<?> clazz, String msg) {
//         if (DEBUGGING) {
//             Log.e(null == clazz ? TAG : getTag(clazz), Thread.currentThread().getName() +" "+ msg);
//         }
//     }
// 
//     public static void e(Class<?> clazz, String msg, Throwable tr) {
//         if (DEBUGGING) {
//             Log.e(null == clazz ? TAG : getTag(clazz), Thread.currentThread().getName() +" "+ msg);
//         }
//     }
// 
//     public static void e(String msg) {
//         WCSLogUtil.e(null,  msg);
//     }
// 
//     private static String getTag(Class<?> clazz) {
//         return "[CNCLog" + clazz.getSimpleName() + "]";
//     }
// }


// Path: wcs-android-sdk/src/main/java/com/chinanetcenter/wcs/android/api/ProgressNotifier.java
import com.chinanetcenter.wcs.android.listener.SliceUploaderListener;
import com.chinanetcenter.wcs.android.utils.WCSLogUtil;
import java.util.Locale;
import java.util.concurrent.atomic.AtomicLong;

package com.chinanetcenter.wcs.android.api;



public class ProgressNotifier {

    private SliceUploaderListener mUploaderListener;

    private long mTotal;

    //    private long mWritten;
    private AtomicLong mWritten;

    public ProgressNotifier(long total, SliceUploaderListener uploaderListener) {
        mUploaderListener = uploaderListener;
        mTotal = total;
        mWritten = new AtomicLong();
    }

    public void decreaseProgress(long decrease) {
//        mWritten -= decrease;
        mWritten.addAndGet(-decrease);
    }

    public void increaseProgressAndNotify(long written) {
        mWritten.addAndGet(written);
//        mWritten += written;
        if (mWritten.get() <= mTotal) {
            mUploaderListener.onProgress(mWritten.get(), mTotal);
        } else {
            WCSLogUtil.w(String.format(Locale.CHINA, "written (%d) greater than total (%d)", mWritten.get(), mTotal));